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

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


The following commit has been merged in the master branch:
commit e993233ef72a3aa39c3c2310d120ccc36ba51fe8
Author: Stuart Prescott <stuart at debian.org>
Date:   Fri Jan 17 23:03:43 2014 +1100

    Imported Upstream version 1.2.2.ds1

diff --git a/3rdparty/qxt/CMakeLists.txt b/3rdparty/qxt/CMakeLists.txt
new file mode 100644
index 0000000..345c45c
--- /dev/null
+++ b/3rdparty/qxt/CMakeLists.txt
@@ -0,0 +1,32 @@
+cmake_minimum_required(VERSION 2.6)
+
+set(QXT-SOURCES
+  qxtglobal.cpp
+  qxtglobalshortcut.cpp
+)
+
+set(QXT-MOC-HEADERS
+  qxtglobalshortcut.h
+)
+
+find_package(X11)
+include_directories(${X11_INCLUDE_DIR})
+
+if(WIN32)
+  set(QXT-SOURCES ${QXT-SOURCES} qxtglobalshortcut_win.cpp)
+elseif(APPLE)
+  set(QXT-SOURCES ${QXT-SOURCES} qxtglobalshortcut_mac.cpp)
+else(WIN32)
+  set(QXT-SOURCES ${QXT-SOURCES} qxtglobalshortcut_x11.cpp)
+endif(WIN32)
+
+if (ENABLE_QT5)
+    QT5_WRAP_CPP(QXT-SOURCES-MOC ${QXT-MOC-HEADERS})
+else (ENABLE_QT5)
+    QT4_WRAP_CPP(QXT-SOURCES-MOC ${QXT-MOC-HEADERS})
+endif (ENABLE_QT5)
+
+ADD_LIBRARY(qxt STATIC
+  ${QXT-SOURCES}
+  ${QXT-SOURCES-MOC}
+)
diff --git a/3rdparty/qxt/LICENSE b/3rdparty/qxt/LICENSE
new file mode 100644
index 0000000..91a9970
--- /dev/null
+++ b/3rdparty/qxt/LICENSE
@@ -0,0 +1,89 @@
+Qt Extension Library 
+Copyright (C) 2007 Qxt Foundation
+
+------------------- Disclaimer ------------------------------------------------
+
+Until the Qxt Foundation is legally established, copyright for the
+source code falls back to the original contributor. For information about the
+status of the Qxt Foundation, or about the copyright status of any part of Qxt,
+contact the Qxt project maintainers at <foundation at libqxt.org>
+
+Once the Qxt Foundation has been legally established, all contributors must
+transfer all copyright interest to the Qxt Foundation before their submissions
+will be added to the project.
+
+------------------- License ---------------------------------------------------
+
+This library is free software; you can redistribute it and/or modify it
+under the terms of the Common Public License, version 1.0, as published by IBM 
+or under  the terms of the  GNU Lesser General Public License, version 2.1, 
+as published by the Free Software Foundation
+
+This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+FITNESS FOR A PARTICULAR PURPOSE.
+
+You should have received a copy of the CPL along with this file.
+See the LICENSE file and the cpl1.0.txt file included with the source
+distribution for more information. If you did not receive a copy of the
+license, contact the Qxt Foundation.
+
+You should have received a copy of the LGPL along with this file.
+See the LICENSE file and the lgpl-2.1.txt file included with the source
+distribution for more information. If you did not receive a copy of the
+license, contact the Qxt Foundation.
+
+Parts of Qxt depend on Qt 4 and/or other libraries that have their own
+licenses. Qxt is independent of these licenses; however, use of these other
+libraries is subject to their respective license agreements.
+
+------------------- Intent ----------------------------------------------------
+
+The following section describes the opinions and intent of the Qxt Foundation
+with regards to the licensing and use of the Qxt source code and library. In
+the event that the CPL is found to be illegal or invalid, or if any application
+or clause of the license is subjected to question or abuse, this section is a
+general statement of the desired interpretation.
+
+This section has no legal standing and the statements made here are strictly
+subject to the text of the CPL; that is, if this section and the CPL are in
+disagreement, the text of the CPL takes precedence. In no way does this
+intent grant you any additional rights or impose any additional restrictions.
+
+If you have questions about licensing, contact the maintainers.
+
+Qxt is built and supported by open-source enthusiasts.
+- Please respect the open-source background of the contributors. The code is
+  provided for everyone's use; you may not restrict the rights of anyone to
+  use it.
+      - No individual may claim ownership of any part of the code. It belongs
+        to the community.
+      - You may modify the source code to suit your needs, but these changes
+        must be made free. If you distribute a modified form of Qxt, you must
+        also distribute the entire source code of the modified form.
+      - Digital Rights Management (DRM) puts unfair, unfree restrictions on
+        users and developers. It is the opposite of Free Software. We can't
+        stop you from using it, but please don't use the Qxt name for software
+        restricted by DRM.
+- Please respect the time and effort put into the project by the developers.
+      - If you find Qxt useful, it would be appreciated if you would include
+        text in your application (for instance, in the About dialog) giving
+        acknowledgement to Qxt.
+      - If you make modifications to the source code, you must not call the
+        modified version "Qxt." It's okay to include "Qxt" in the name, but
+        anyone who receives the modified version needs to know that it's not
+        the same as the version distributed by the Qxt Foundation.
+- We want everyone to be able to use Qxt without restrictions.
+      - If you distribute Qxt in compiled binary form, please ensure that
+        everyone who receives it can get the source code used to create it.
+      - You are free to use Qxt in closed-source applications as long as you
+        distribute Qxt in an open-source fashion. This does not require you
+        to make your entire application open-source.
+- The Qxt Foundation is a non-profit, non-political organization.
+      - Please don't use the Qxt name in any political or semi-political
+        propaganda or publication. We don't like it.
+- Qxt is distributed "as-is," with no warranty.
+      - If it makes your program crash, your computer blow up, or tiny demons
+        fly out of your nose, please don't sue us.
+
diff --git a/3rdparty/qxt/keymapper_x11.h b/3rdparty/qxt/keymapper_x11.h
new file mode 100644
index 0000000..dec8285
--- /dev/null
+++ b/3rdparty/qxt/keymapper_x11.h
@@ -0,0 +1,364 @@
+#ifndef KEYMAPPER_X11_H
+#define KEYMAPPER_X11_H
+
+// (davidsansome) Nicked from qkeymapper_x11.cpp
+
+#include <Qt>
+
+#define XK_MISCELLANY
+#define XK_LATIN1
+#define XK_KOREAN
+#define XK_XKB_KEYS
+#include <X11/keysymdef.h>
+
+//
+// Keyboard event translation
+//
+
+#ifndef XK_ISO_Left_Tab
+#define XK_ISO_Left_Tab         0xFE20
+#endif
+
+#ifndef XK_dead_hook
+#define XK_dead_hook            0xFE61
+#endif
+
+#ifndef XK_dead_horn
+#define XK_dead_horn            0xFE62
+#endif
+
+#ifndef XK_Codeinput
+#define XK_Codeinput            0xFF37
+#endif
+
+#ifndef XK_Kanji_Bangou
+#define XK_Kanji_Bangou         0xFF37 /* same as codeinput */
+#endif
+
+// Fix old X libraries
+#ifndef XK_KP_Home
+#define XK_KP_Home              0xFF95
+#endif
+#ifndef XK_KP_Left
+#define XK_KP_Left              0xFF96
+#endif
+#ifndef XK_KP_Up
+#define XK_KP_Up                0xFF97
+#endif
+#ifndef XK_KP_Right
+#define XK_KP_Right             0xFF98
+#endif
+#ifndef XK_KP_Down
+#define XK_KP_Down              0xFF99
+#endif
+#ifndef XK_KP_Prior
+#define XK_KP_Prior             0xFF9A
+#endif
+#ifndef XK_KP_Next
+#define XK_KP_Next              0xFF9B
+#endif
+#ifndef XK_KP_End
+#define XK_KP_End               0xFF9C
+#endif
+#ifndef XK_KP_Insert
+#define XK_KP_Insert            0xFF9E
+#endif
+#ifndef XK_KP_Delete
+#define XK_KP_Delete            0xFF9F
+#endif
+
+// the next lines are taken from XFree > 4.0 (X11/XF86keysyms.h), defining some special
+// multimedia keys. They are included here as not every system has them.
+#define XF86XK_Standby          0x1008FF10
+#define XF86XK_AudioLowerVolume 0x1008FF11
+#define XF86XK_AudioMute        0x1008FF12
+#define XF86XK_AudioRaiseVolume 0x1008FF13
+#define XF86XK_AudioPlay        0x1008FF14
+#define XF86XK_AudioStop        0x1008FF15
+#define XF86XK_AudioPrev        0x1008FF16
+#define XF86XK_AudioNext        0x1008FF17
+#define XF86XK_HomePage         0x1008FF18
+#define XF86XK_Calculator       0x1008FF1D
+#define XF86XK_Mail             0x1008FF19
+#define XF86XK_Start            0x1008FF1A
+#define XF86XK_Search           0x1008FF1B
+#define XF86XK_AudioRecord      0x1008FF1C
+#define XF86XK_Back             0x1008FF26
+#define XF86XK_Forward          0x1008FF27
+#define XF86XK_Stop             0x1008FF28
+#define XF86XK_Refresh          0x1008FF29
+#define XF86XK_Favorites        0x1008FF30
+#define XF86XK_AudioPause       0x1008FF31
+#define XF86XK_AudioMedia       0x1008FF32
+#define XF86XK_MyComputer       0x1008FF33
+#define XF86XK_OpenURL          0x1008FF38
+#define XF86XK_Launch0          0x1008FF40
+#define XF86XK_Launch1          0x1008FF41
+#define XF86XK_Launch2          0x1008FF42
+#define XF86XK_Launch3          0x1008FF43
+#define XF86XK_Launch4          0x1008FF44
+#define XF86XK_Launch5          0x1008FF45
+#define XF86XK_Launch6          0x1008FF46
+#define XF86XK_Launch7          0x1008FF47
+#define XF86XK_Launch8          0x1008FF48
+#define XF86XK_Launch9          0x1008FF49
+#define XF86XK_LaunchA          0x1008FF4A
+#define XF86XK_LaunchB          0x1008FF4B
+#define XF86XK_LaunchC          0x1008FF4C
+#define XF86XK_LaunchD          0x1008FF4D
+#define XF86XK_LaunchE          0x1008FF4E
+#define XF86XK_LaunchF          0x1008FF4F
+// end of XF86keysyms.h
+
+// Special keys used by Qtopia, mapped into the X11 private keypad range.
+#define QTOPIAXK_Select         0x11000601
+#define QTOPIAXK_Yes            0x11000602
+#define QTOPIAXK_No             0x11000603
+#define QTOPIAXK_Cancel         0x11000604
+#define QTOPIAXK_Printer        0x11000605
+#define QTOPIAXK_Execute        0x11000606
+#define QTOPIAXK_Sleep          0x11000607
+#define QTOPIAXK_Play           0x11000608
+#define QTOPIAXK_Zoom           0x11000609
+#define QTOPIAXK_Context1       0x1100060A
+#define QTOPIAXK_Context2       0x1100060B
+#define QTOPIAXK_Context3       0x1100060C
+#define QTOPIAXK_Context4       0x1100060D
+#define QTOPIAXK_Call           0x1100060E
+#define QTOPIAXK_Hangup         0x1100060F
+#define QTOPIAXK_Flip           0x11000610
+
+// keyboard mapping table
+static const unsigned int KeyTbl[] = {
+
+    // misc keys
+
+    XK_Escape,                  Qt::Key_Escape,
+    XK_Tab,                     Qt::Key_Tab,
+    XK_ISO_Left_Tab,            Qt::Key_Backtab,
+    XK_BackSpace,               Qt::Key_Backspace,
+    XK_Return,                  Qt::Key_Return,
+    XK_Insert,                  Qt::Key_Insert,
+    XK_Delete,                  Qt::Key_Delete,
+    XK_Clear,                   Qt::Key_Delete,
+    XK_Pause,                   Qt::Key_Pause,
+    XK_Print,                   Qt::Key_Print,
+    0x1005FF60,                 Qt::Key_SysReq,         // hardcoded Sun SysReq
+    0x1007ff00,                 Qt::Key_SysReq,         // hardcoded X386 SysReq
+
+    // cursor movement
+
+    XK_Home,                    Qt::Key_Home,
+    XK_End,                     Qt::Key_End,
+    XK_Left,                    Qt::Key_Left,
+    XK_Up,                      Qt::Key_Up,
+    XK_Right,                   Qt::Key_Right,
+    XK_Down,                    Qt::Key_Down,
+    XK_Prior,                   Qt::Key_PageUp,
+    XK_Next,                    Qt::Key_PageDown,
+
+    // modifiers
+
+    XK_Shift_L,                 Qt::Key_Shift,
+    XK_Shift_R,                 Qt::Key_Shift,
+    XK_Shift_Lock,              Qt::Key_Shift,
+    XK_Control_L,               Qt::Key_Control,
+    XK_Control_R,               Qt::Key_Control,
+    XK_Meta_L,                  Qt::Key_Meta,
+    XK_Meta_R,                  Qt::Key_Meta,
+    XK_Alt_L,                   Qt::Key_Alt,
+    XK_Alt_R,                   Qt::Key_Alt,
+    XK_Caps_Lock,               Qt::Key_CapsLock,
+    XK_Num_Lock,                Qt::Key_NumLock,
+    XK_Scroll_Lock,             Qt::Key_ScrollLock,
+    XK_Super_L,                 Qt::Key_Super_L,
+    XK_Super_R,                 Qt::Key_Super_R,
+    XK_Menu,                    Qt::Key_Menu,
+    XK_Hyper_L,                 Qt::Key_Hyper_L,
+    XK_Hyper_R,                 Qt::Key_Hyper_R,
+    XK_Help,                    Qt::Key_Help,
+    0x1000FF74,                 Qt::Key_Backtab,        // hardcoded HP backtab
+    0x1005FF10,                 Qt::Key_F11,            // hardcoded Sun F36 (labeled F11)
+    0x1005FF11,                 Qt::Key_F12,            // hardcoded Sun F37 (labeled F12)
+
+    // numeric and function keypad keys
+
+    XK_KP_Space,                Qt::Key_Space,
+    XK_KP_Tab,                  Qt::Key_Tab,
+    XK_KP_Enter,                Qt::Key_Enter,
+    //XK_KP_F1,                 Qt::Key_F1,
+    //XK_KP_F2,                 Qt::Key_F2,
+    //XK_KP_F3,                 Qt::Key_F3,
+    //XK_KP_F4,                 Qt::Key_F4,
+    XK_KP_Home,                 Qt::Key_Home,
+    XK_KP_Left,                 Qt::Key_Left,
+    XK_KP_Up,                   Qt::Key_Up,
+    XK_KP_Right,                Qt::Key_Right,
+    XK_KP_Down,                 Qt::Key_Down,
+    XK_KP_Prior,                Qt::Key_PageUp,
+    XK_KP_Next,                 Qt::Key_PageDown,
+    XK_KP_End,                  Qt::Key_End,
+    XK_KP_Begin,                Qt::Key_Clear,
+    XK_KP_Insert,               Qt::Key_Insert,
+    XK_KP_Delete,               Qt::Key_Delete,
+    XK_KP_Equal,                Qt::Key_Equal,
+    XK_KP_Multiply,             Qt::Key_Asterisk,
+    XK_KP_Add,                  Qt::Key_Plus,
+    XK_KP_Separator,            Qt::Key_Comma,
+    XK_KP_Subtract,             Qt::Key_Minus,
+    XK_KP_Decimal,              Qt::Key_Period,
+    XK_KP_Divide,               Qt::Key_Slash,
+
+    // International input method support keys
+
+    // International & multi-key character composition
+    XK_ISO_Level3_Shift,        Qt::Key_AltGr,
+    XK_Multi_key,		Qt::Key_Multi_key,
+    XK_Codeinput,		Qt::Key_Codeinput,
+    XK_SingleCandidate,		Qt::Key_SingleCandidate,
+    XK_MultipleCandidate,	Qt::Key_MultipleCandidate,
+    XK_PreviousCandidate,	Qt::Key_PreviousCandidate,
+
+    // Misc Functions
+    XK_Mode_switch,		Qt::Key_Mode_switch,
+    XK_script_switch,		Qt::Key_Mode_switch,
+
+    // Japanese keyboard support
+    XK_Kanji,			Qt::Key_Kanji,
+    XK_Muhenkan,		Qt::Key_Muhenkan,
+    //XK_Henkan_Mode,		Qt::Key_Henkan_Mode,
+    XK_Henkan_Mode,		Qt::Key_Henkan,
+    XK_Henkan,			Qt::Key_Henkan,
+    XK_Romaji,			Qt::Key_Romaji,
+    XK_Hiragana,		Qt::Key_Hiragana,
+    XK_Katakana,		Qt::Key_Katakana,
+    XK_Hiragana_Katakana,	Qt::Key_Hiragana_Katakana,
+    XK_Zenkaku,			Qt::Key_Zenkaku,
+    XK_Hankaku,			Qt::Key_Hankaku,
+    XK_Zenkaku_Hankaku,		Qt::Key_Zenkaku_Hankaku,
+    XK_Touroku,			Qt::Key_Touroku,
+    XK_Massyo,			Qt::Key_Massyo,
+    XK_Kana_Lock,		Qt::Key_Kana_Lock,
+    XK_Kana_Shift,		Qt::Key_Kana_Shift,
+    XK_Eisu_Shift,		Qt::Key_Eisu_Shift,
+    XK_Eisu_toggle,		Qt::Key_Eisu_toggle,
+    //XK_Kanji_Bangou,		Qt::Key_Kanji_Bangou,
+    //XK_Zen_Koho,		Qt::Key_Zen_Koho,
+    //XK_Mae_Koho,		Qt::Key_Mae_Koho,
+    XK_Kanji_Bangou,		Qt::Key_Codeinput,
+    XK_Zen_Koho,		Qt::Key_MultipleCandidate,
+    XK_Mae_Koho,		Qt::Key_PreviousCandidate,
+
+#ifdef XK_KOREAN
+    // Korean keyboard support
+    XK_Hangul,			Qt::Key_Hangul,
+    XK_Hangul_Start,		Qt::Key_Hangul_Start,
+    XK_Hangul_End,		Qt::Key_Hangul_End,
+    XK_Hangul_Hanja,		Qt::Key_Hangul_Hanja,
+    XK_Hangul_Jamo,		Qt::Key_Hangul_Jamo,
+    XK_Hangul_Romaja,		Qt::Key_Hangul_Romaja,
+    //XK_Hangul_Codeinput,	Qt::Key_Hangul_Codeinput,
+    XK_Hangul_Codeinput,	Qt::Key_Codeinput,
+    XK_Hangul_Jeonja,		Qt::Key_Hangul_Jeonja,
+    XK_Hangul_Banja,		Qt::Key_Hangul_Banja,
+    XK_Hangul_PreHanja,		Qt::Key_Hangul_PreHanja,
+    XK_Hangul_PostHanja,	Qt::Key_Hangul_PostHanja,
+    //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,
+    //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,
+    //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,
+    XK_Hangul_SingleCandidate,	Qt::Key_SingleCandidate,
+    XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,
+    XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,
+    XK_Hangul_Special,		Qt::Key_Hangul_Special,
+    //XK_Hangul_switch,		Qt::Key_Hangul_switch,
+    XK_Hangul_switch,		Qt::Key_Mode_switch,
+#endif  // XK_KOREAN
+
+    // dead keys
+    XK_dead_grave,              Qt::Key_Dead_Grave,
+    XK_dead_acute,              Qt::Key_Dead_Acute,
+    XK_dead_circumflex,         Qt::Key_Dead_Circumflex,
+    XK_dead_tilde,              Qt::Key_Dead_Tilde,
+    XK_dead_macron,             Qt::Key_Dead_Macron,
+    XK_dead_breve,              Qt::Key_Dead_Breve,
+    XK_dead_abovedot,           Qt::Key_Dead_Abovedot,
+    XK_dead_diaeresis,          Qt::Key_Dead_Diaeresis,
+    XK_dead_abovering,          Qt::Key_Dead_Abovering,
+    XK_dead_doubleacute,        Qt::Key_Dead_Doubleacute,
+    XK_dead_caron,              Qt::Key_Dead_Caron,
+    XK_dead_cedilla,            Qt::Key_Dead_Cedilla,
+    XK_dead_ogonek,             Qt::Key_Dead_Ogonek,
+    XK_dead_iota,               Qt::Key_Dead_Iota,
+    XK_dead_voiced_sound,       Qt::Key_Dead_Voiced_Sound,
+    XK_dead_semivoiced_sound,   Qt::Key_Dead_Semivoiced_Sound,
+    XK_dead_belowdot,           Qt::Key_Dead_Belowdot,
+    XK_dead_hook,               Qt::Key_Dead_Hook,
+    XK_dead_horn,               Qt::Key_Dead_Horn,
+
+    // Special multimedia keys
+    // currently only tested with MS internet keyboard
+
+    // browsing keys
+    XF86XK_Back,                Qt::Key_Back,
+    XF86XK_Forward,             Qt::Key_Forward,
+    XF86XK_Stop,                Qt::Key_Stop,
+    XF86XK_Refresh,             Qt::Key_Refresh,
+    XF86XK_Favorites,           Qt::Key_Favorites,
+    XF86XK_AudioMedia,          Qt::Key_LaunchMedia,
+    XF86XK_OpenURL,             Qt::Key_OpenUrl,
+    XF86XK_HomePage,            Qt::Key_HomePage,
+    XF86XK_Search,              Qt::Key_Search,
+
+    // media keys
+    XF86XK_AudioLowerVolume,    Qt::Key_VolumeDown,
+    XF86XK_AudioMute,           Qt::Key_VolumeMute,
+    XF86XK_AudioRaiseVolume,    Qt::Key_VolumeUp,
+    XF86XK_AudioPlay,           Qt::Key_MediaPlay,
+    XF86XK_AudioStop,           Qt::Key_MediaStop,
+    XF86XK_AudioPrev,           Qt::Key_MediaPrevious,
+    XF86XK_AudioNext,           Qt::Key_MediaNext,
+    XF86XK_AudioRecord,         Qt::Key_MediaRecord,
+
+    // launch keys
+    XF86XK_Mail,                Qt::Key_LaunchMail,
+    XF86XK_MyComputer,          Qt::Key_Launch0,
+    XF86XK_Calculator,          Qt::Key_Launch1,
+    XF86XK_Standby,             Qt::Key_Standby,
+
+    XF86XK_Launch0,             Qt::Key_Launch2,
+    XF86XK_Launch1,             Qt::Key_Launch3,
+    XF86XK_Launch2,             Qt::Key_Launch4,
+    XF86XK_Launch3,             Qt::Key_Launch5,
+    XF86XK_Launch4,             Qt::Key_Launch6,
+    XF86XK_Launch5,             Qt::Key_Launch7,
+    XF86XK_Launch6,             Qt::Key_Launch8,
+    XF86XK_Launch7,             Qt::Key_Launch9,
+    XF86XK_Launch8,             Qt::Key_LaunchA,
+    XF86XK_Launch9,             Qt::Key_LaunchB,
+    XF86XK_LaunchA,             Qt::Key_LaunchC,
+    XF86XK_LaunchB,             Qt::Key_LaunchD,
+    XF86XK_LaunchC,             Qt::Key_LaunchE,
+    XF86XK_LaunchD,             Qt::Key_LaunchF,
+
+    // Qtopia keys
+    QTOPIAXK_Select,            Qt::Key_Select,
+    QTOPIAXK_Yes,               Qt::Key_Yes,
+    QTOPIAXK_No,                Qt::Key_No,
+    QTOPIAXK_Cancel,            Qt::Key_Cancel,
+    QTOPIAXK_Printer,           Qt::Key_Printer,
+    QTOPIAXK_Execute,           Qt::Key_Execute,
+    QTOPIAXK_Sleep,             Qt::Key_Sleep,
+    QTOPIAXK_Play,              Qt::Key_Play,
+    QTOPIAXK_Zoom,              Qt::Key_Zoom,
+    QTOPIAXK_Context1,          Qt::Key_Context1,
+    QTOPIAXK_Context2,          Qt::Key_Context2,
+    QTOPIAXK_Context3,          Qt::Key_Context3,
+    QTOPIAXK_Context4,          Qt::Key_Context4,
+    QTOPIAXK_Call,              Qt::Key_Call,
+    QTOPIAXK_Hangup,            Qt::Key_Hangup,
+    QTOPIAXK_Flip,              Qt::Key_Flip,
+
+    0,                          0
+};
+
+#endif // KEYMAPPER_X11_H
diff --git a/3rdparty/qxt/media-keys.patch b/3rdparty/qxt/media-keys.patch
new file mode 100644
index 0000000..31e52f3
--- /dev/null
+++ b/3rdparty/qxt/media-keys.patch
@@ -0,0 +1,432 @@
+diff -ru libqxt-old/src/gui/keymapper_x11.h libqxt/src/gui/keymapper_x11.h
+--- libqxt-old/src/gui/keymapper_x11.h	2010-04-21 15:17:56.000000000 +0100
++++ libqxt/src/gui/keymapper_x11.h	2010-04-21 15:18:16.000000000 +0100
+@@ -0,0 +1,364 @@
++#ifndef KEYMAPPER_X11_H
++#define KEYMAPPER_X11_H
++
++// (davidsansome) Nicked from qkeymapper_x11.cpp
++
++#include <Qt>
++
++#define XK_MISCELLANY
++#define XK_LATIN1
++#define XK_KOREAN
++#define XK_XKB_KEYS
++#include <X11/keysymdef.h>
++
++//
++// Keyboard event translation
++//
++
++#ifndef XK_ISO_Left_Tab
++#define XK_ISO_Left_Tab         0xFE20
++#endif
++
++#ifndef XK_dead_hook
++#define XK_dead_hook            0xFE61
++#endif
++
++#ifndef XK_dead_horn
++#define XK_dead_horn            0xFE62
++#endif
++
++#ifndef XK_Codeinput
++#define XK_Codeinput            0xFF37
++#endif
++
++#ifndef XK_Kanji_Bangou
++#define XK_Kanji_Bangou         0xFF37 /* same as codeinput */
++#endif
++
++// Fix old X libraries
++#ifndef XK_KP_Home
++#define XK_KP_Home              0xFF95
++#endif
++#ifndef XK_KP_Left
++#define XK_KP_Left              0xFF96
++#endif
++#ifndef XK_KP_Up
++#define XK_KP_Up                0xFF97
++#endif
++#ifndef XK_KP_Right
++#define XK_KP_Right             0xFF98
++#endif
++#ifndef XK_KP_Down
++#define XK_KP_Down              0xFF99
++#endif
++#ifndef XK_KP_Prior
++#define XK_KP_Prior             0xFF9A
++#endif
++#ifndef XK_KP_Next
++#define XK_KP_Next              0xFF9B
++#endif
++#ifndef XK_KP_End
++#define XK_KP_End               0xFF9C
++#endif
++#ifndef XK_KP_Insert
++#define XK_KP_Insert            0xFF9E
++#endif
++#ifndef XK_KP_Delete
++#define XK_KP_Delete            0xFF9F
++#endif
++
++// the next lines are taken from XFree > 4.0 (X11/XF86keysyms.h), defining some special
++// multimedia keys. They are included here as not every system has them.
++#define XF86XK_Standby          0x1008FF10
++#define XF86XK_AudioLowerVolume 0x1008FF11
++#define XF86XK_AudioMute        0x1008FF12
++#define XF86XK_AudioRaiseVolume 0x1008FF13
++#define XF86XK_AudioPlay        0x1008FF14
++#define XF86XK_AudioStop        0x1008FF15
++#define XF86XK_AudioPrev        0x1008FF16
++#define XF86XK_AudioNext        0x1008FF17
++#define XF86XK_HomePage         0x1008FF18
++#define XF86XK_Calculator       0x1008FF1D
++#define XF86XK_Mail             0x1008FF19
++#define XF86XK_Start            0x1008FF1A
++#define XF86XK_Search           0x1008FF1B
++#define XF86XK_AudioRecord      0x1008FF1C
++#define XF86XK_Back             0x1008FF26
++#define XF86XK_Forward          0x1008FF27
++#define XF86XK_Stop             0x1008FF28
++#define XF86XK_Refresh          0x1008FF29
++#define XF86XK_Favorites        0x1008FF30
++#define XF86XK_AudioPause       0x1008FF31
++#define XF86XK_AudioMedia       0x1008FF32
++#define XF86XK_MyComputer       0x1008FF33
++#define XF86XK_OpenURL          0x1008FF38
++#define XF86XK_Launch0          0x1008FF40
++#define XF86XK_Launch1          0x1008FF41
++#define XF86XK_Launch2          0x1008FF42
++#define XF86XK_Launch3          0x1008FF43
++#define XF86XK_Launch4          0x1008FF44
++#define XF86XK_Launch5          0x1008FF45
++#define XF86XK_Launch6          0x1008FF46
++#define XF86XK_Launch7          0x1008FF47
++#define XF86XK_Launch8          0x1008FF48
++#define XF86XK_Launch9          0x1008FF49
++#define XF86XK_LaunchA          0x1008FF4A
++#define XF86XK_LaunchB          0x1008FF4B
++#define XF86XK_LaunchC          0x1008FF4C
++#define XF86XK_LaunchD          0x1008FF4D
++#define XF86XK_LaunchE          0x1008FF4E
++#define XF86XK_LaunchF          0x1008FF4F
++// end of XF86keysyms.h
++
++// Special keys used by Qtopia, mapped into the X11 private keypad range.
++#define QTOPIAXK_Select         0x11000601
++#define QTOPIAXK_Yes            0x11000602
++#define QTOPIAXK_No             0x11000603
++#define QTOPIAXK_Cancel         0x11000604
++#define QTOPIAXK_Printer        0x11000605
++#define QTOPIAXK_Execute        0x11000606
++#define QTOPIAXK_Sleep          0x11000607
++#define QTOPIAXK_Play           0x11000608
++#define QTOPIAXK_Zoom           0x11000609
++#define QTOPIAXK_Context1       0x1100060A
++#define QTOPIAXK_Context2       0x1100060B
++#define QTOPIAXK_Context3       0x1100060C
++#define QTOPIAXK_Context4       0x1100060D
++#define QTOPIAXK_Call           0x1100060E
++#define QTOPIAXK_Hangup         0x1100060F
++#define QTOPIAXK_Flip           0x11000610
++
++// keyboard mapping table
++static const unsigned int KeyTbl[] = {
++
++    // misc keys
++
++    XK_Escape,                  Qt::Key_Escape,
++    XK_Tab,                     Qt::Key_Tab,
++    XK_ISO_Left_Tab,            Qt::Key_Backtab,
++    XK_BackSpace,               Qt::Key_Backspace,
++    XK_Return,                  Qt::Key_Return,
++    XK_Insert,                  Qt::Key_Insert,
++    XK_Delete,                  Qt::Key_Delete,
++    XK_Clear,                   Qt::Key_Delete,
++    XK_Pause,                   Qt::Key_Pause,
++    XK_Print,                   Qt::Key_Print,
++    0x1005FF60,                 Qt::Key_SysReq,         // hardcoded Sun SysReq
++    0x1007ff00,                 Qt::Key_SysReq,         // hardcoded X386 SysReq
++
++    // cursor movement
++
++    XK_Home,                    Qt::Key_Home,
++    XK_End,                     Qt::Key_End,
++    XK_Left,                    Qt::Key_Left,
++    XK_Up,                      Qt::Key_Up,
++    XK_Right,                   Qt::Key_Right,
++    XK_Down,                    Qt::Key_Down,
++    XK_Prior,                   Qt::Key_PageUp,
++    XK_Next,                    Qt::Key_PageDown,
++
++    // modifiers
++
++    XK_Shift_L,                 Qt::Key_Shift,
++    XK_Shift_R,                 Qt::Key_Shift,
++    XK_Shift_Lock,              Qt::Key_Shift,
++    XK_Control_L,               Qt::Key_Control,
++    XK_Control_R,               Qt::Key_Control,
++    XK_Meta_L,                  Qt::Key_Meta,
++    XK_Meta_R,                  Qt::Key_Meta,
++    XK_Alt_L,                   Qt::Key_Alt,
++    XK_Alt_R,                   Qt::Key_Alt,
++    XK_Caps_Lock,               Qt::Key_CapsLock,
++    XK_Num_Lock,                Qt::Key_NumLock,
++    XK_Scroll_Lock,             Qt::Key_ScrollLock,
++    XK_Super_L,                 Qt::Key_Super_L,
++    XK_Super_R,                 Qt::Key_Super_R,
++    XK_Menu,                    Qt::Key_Menu,
++    XK_Hyper_L,                 Qt::Key_Hyper_L,
++    XK_Hyper_R,                 Qt::Key_Hyper_R,
++    XK_Help,                    Qt::Key_Help,
++    0x1000FF74,                 Qt::Key_Backtab,        // hardcoded HP backtab
++    0x1005FF10,                 Qt::Key_F11,            // hardcoded Sun F36 (labeled F11)
++    0x1005FF11,                 Qt::Key_F12,            // hardcoded Sun F37 (labeled F12)
++
++    // numeric and function keypad keys
++
++    XK_KP_Space,                Qt::Key_Space,
++    XK_KP_Tab,                  Qt::Key_Tab,
++    XK_KP_Enter,                Qt::Key_Enter,
++    //XK_KP_F1,                 Qt::Key_F1,
++    //XK_KP_F2,                 Qt::Key_F2,
++    //XK_KP_F3,                 Qt::Key_F3,
++    //XK_KP_F4,                 Qt::Key_F4,
++    XK_KP_Home,                 Qt::Key_Home,
++    XK_KP_Left,                 Qt::Key_Left,
++    XK_KP_Up,                   Qt::Key_Up,
++    XK_KP_Right,                Qt::Key_Right,
++    XK_KP_Down,                 Qt::Key_Down,
++    XK_KP_Prior,                Qt::Key_PageUp,
++    XK_KP_Next,                 Qt::Key_PageDown,
++    XK_KP_End,                  Qt::Key_End,
++    XK_KP_Begin,                Qt::Key_Clear,
++    XK_KP_Insert,               Qt::Key_Insert,
++    XK_KP_Delete,               Qt::Key_Delete,
++    XK_KP_Equal,                Qt::Key_Equal,
++    XK_KP_Multiply,             Qt::Key_Asterisk,
++    XK_KP_Add,                  Qt::Key_Plus,
++    XK_KP_Separator,            Qt::Key_Comma,
++    XK_KP_Subtract,             Qt::Key_Minus,
++    XK_KP_Decimal,              Qt::Key_Period,
++    XK_KP_Divide,               Qt::Key_Slash,
++
++    // International input method support keys
++
++    // International & multi-key character composition
++    XK_ISO_Level3_Shift,        Qt::Key_AltGr,
++    XK_Multi_key,		Qt::Key_Multi_key,
++    XK_Codeinput,		Qt::Key_Codeinput,
++    XK_SingleCandidate,		Qt::Key_SingleCandidate,
++    XK_MultipleCandidate,	Qt::Key_MultipleCandidate,
++    XK_PreviousCandidate,	Qt::Key_PreviousCandidate,
++
++    // Misc Functions
++    XK_Mode_switch,		Qt::Key_Mode_switch,
++    XK_script_switch,		Qt::Key_Mode_switch,
++
++    // Japanese keyboard support
++    XK_Kanji,			Qt::Key_Kanji,
++    XK_Muhenkan,		Qt::Key_Muhenkan,
++    //XK_Henkan_Mode,		Qt::Key_Henkan_Mode,
++    XK_Henkan_Mode,		Qt::Key_Henkan,
++    XK_Henkan,			Qt::Key_Henkan,
++    XK_Romaji,			Qt::Key_Romaji,
++    XK_Hiragana,		Qt::Key_Hiragana,
++    XK_Katakana,		Qt::Key_Katakana,
++    XK_Hiragana_Katakana,	Qt::Key_Hiragana_Katakana,
++    XK_Zenkaku,			Qt::Key_Zenkaku,
++    XK_Hankaku,			Qt::Key_Hankaku,
++    XK_Zenkaku_Hankaku,		Qt::Key_Zenkaku_Hankaku,
++    XK_Touroku,			Qt::Key_Touroku,
++    XK_Massyo,			Qt::Key_Massyo,
++    XK_Kana_Lock,		Qt::Key_Kana_Lock,
++    XK_Kana_Shift,		Qt::Key_Kana_Shift,
++    XK_Eisu_Shift,		Qt::Key_Eisu_Shift,
++    XK_Eisu_toggle,		Qt::Key_Eisu_toggle,
++    //XK_Kanji_Bangou,		Qt::Key_Kanji_Bangou,
++    //XK_Zen_Koho,		Qt::Key_Zen_Koho,
++    //XK_Mae_Koho,		Qt::Key_Mae_Koho,
++    XK_Kanji_Bangou,		Qt::Key_Codeinput,
++    XK_Zen_Koho,		Qt::Key_MultipleCandidate,
++    XK_Mae_Koho,		Qt::Key_PreviousCandidate,
++
++#ifdef XK_KOREAN
++    // Korean keyboard support
++    XK_Hangul,			Qt::Key_Hangul,
++    XK_Hangul_Start,		Qt::Key_Hangul_Start,
++    XK_Hangul_End,		Qt::Key_Hangul_End,
++    XK_Hangul_Hanja,		Qt::Key_Hangul_Hanja,
++    XK_Hangul_Jamo,		Qt::Key_Hangul_Jamo,
++    XK_Hangul_Romaja,		Qt::Key_Hangul_Romaja,
++    //XK_Hangul_Codeinput,	Qt::Key_Hangul_Codeinput,
++    XK_Hangul_Codeinput,	Qt::Key_Codeinput,
++    XK_Hangul_Jeonja,		Qt::Key_Hangul_Jeonja,
++    XK_Hangul_Banja,		Qt::Key_Hangul_Banja,
++    XK_Hangul_PreHanja,		Qt::Key_Hangul_PreHanja,
++    XK_Hangul_PostHanja,	Qt::Key_Hangul_PostHanja,
++    //XK_Hangul_SingleCandidate,Qt::Key_Hangul_SingleCandidate,
++    //XK_Hangul_MultipleCandidate,Qt::Key_Hangul_MultipleCandidate,
++    //XK_Hangul_PreviousCandidate,Qt::Key_Hangul_PreviousCandidate,
++    XK_Hangul_SingleCandidate,	Qt::Key_SingleCandidate,
++    XK_Hangul_MultipleCandidate,Qt::Key_MultipleCandidate,
++    XK_Hangul_PreviousCandidate,Qt::Key_PreviousCandidate,
++    XK_Hangul_Special,		Qt::Key_Hangul_Special,
++    //XK_Hangul_switch,		Qt::Key_Hangul_switch,
++    XK_Hangul_switch,		Qt::Key_Mode_switch,
++#endif  // XK_KOREAN
++
++    // dead keys
++    XK_dead_grave,              Qt::Key_Dead_Grave,
++    XK_dead_acute,              Qt::Key_Dead_Acute,
++    XK_dead_circumflex,         Qt::Key_Dead_Circumflex,
++    XK_dead_tilde,              Qt::Key_Dead_Tilde,
++    XK_dead_macron,             Qt::Key_Dead_Macron,
++    XK_dead_breve,              Qt::Key_Dead_Breve,
++    XK_dead_abovedot,           Qt::Key_Dead_Abovedot,
++    XK_dead_diaeresis,          Qt::Key_Dead_Diaeresis,
++    XK_dead_abovering,          Qt::Key_Dead_Abovering,
++    XK_dead_doubleacute,        Qt::Key_Dead_Doubleacute,
++    XK_dead_caron,              Qt::Key_Dead_Caron,
++    XK_dead_cedilla,            Qt::Key_Dead_Cedilla,
++    XK_dead_ogonek,             Qt::Key_Dead_Ogonek,
++    XK_dead_iota,               Qt::Key_Dead_Iota,
++    XK_dead_voiced_sound,       Qt::Key_Dead_Voiced_Sound,
++    XK_dead_semivoiced_sound,   Qt::Key_Dead_Semivoiced_Sound,
++    XK_dead_belowdot,           Qt::Key_Dead_Belowdot,
++    XK_dead_hook,               Qt::Key_Dead_Hook,
++    XK_dead_horn,               Qt::Key_Dead_Horn,
++
++    // Special multimedia keys
++    // currently only tested with MS internet keyboard
++
++    // browsing keys
++    XF86XK_Back,                Qt::Key_Back,
++    XF86XK_Forward,             Qt::Key_Forward,
++    XF86XK_Stop,                Qt::Key_Stop,
++    XF86XK_Refresh,             Qt::Key_Refresh,
++    XF86XK_Favorites,           Qt::Key_Favorites,
++    XF86XK_AudioMedia,          Qt::Key_LaunchMedia,
++    XF86XK_OpenURL,             Qt::Key_OpenUrl,
++    XF86XK_HomePage,            Qt::Key_HomePage,
++    XF86XK_Search,              Qt::Key_Search,
++
++    // media keys
++    XF86XK_AudioLowerVolume,    Qt::Key_VolumeDown,
++    XF86XK_AudioMute,           Qt::Key_VolumeMute,
++    XF86XK_AudioRaiseVolume,    Qt::Key_VolumeUp,
++    XF86XK_AudioPlay,           Qt::Key_MediaPlay,
++    XF86XK_AudioStop,           Qt::Key_MediaStop,
++    XF86XK_AudioPrev,           Qt::Key_MediaPrevious,
++    XF86XK_AudioNext,           Qt::Key_MediaNext,
++    XF86XK_AudioRecord,         Qt::Key_MediaRecord,
++
++    // launch keys
++    XF86XK_Mail,                Qt::Key_LaunchMail,
++    XF86XK_MyComputer,          Qt::Key_Launch0,
++    XF86XK_Calculator,          Qt::Key_Launch1,
++    XF86XK_Standby,             Qt::Key_Standby,
++
++    XF86XK_Launch0,             Qt::Key_Launch2,
++    XF86XK_Launch1,             Qt::Key_Launch3,
++    XF86XK_Launch2,             Qt::Key_Launch4,
++    XF86XK_Launch3,             Qt::Key_Launch5,
++    XF86XK_Launch4,             Qt::Key_Launch6,
++    XF86XK_Launch5,             Qt::Key_Launch7,
++    XF86XK_Launch6,             Qt::Key_Launch8,
++    XF86XK_Launch7,             Qt::Key_Launch9,
++    XF86XK_Launch8,             Qt::Key_LaunchA,
++    XF86XK_Launch9,             Qt::Key_LaunchB,
++    XF86XK_LaunchA,             Qt::Key_LaunchC,
++    XF86XK_LaunchB,             Qt::Key_LaunchD,
++    XF86XK_LaunchC,             Qt::Key_LaunchE,
++    XF86XK_LaunchD,             Qt::Key_LaunchF,
++
++    // Qtopia keys
++    QTOPIAXK_Select,            Qt::Key_Select,
++    QTOPIAXK_Yes,               Qt::Key_Yes,
++    QTOPIAXK_No,                Qt::Key_No,
++    QTOPIAXK_Cancel,            Qt::Key_Cancel,
++    QTOPIAXK_Printer,           Qt::Key_Printer,
++    QTOPIAXK_Execute,           Qt::Key_Execute,
++    QTOPIAXK_Sleep,             Qt::Key_Sleep,
++    QTOPIAXK_Play,              Qt::Key_Play,
++    QTOPIAXK_Zoom,              Qt::Key_Zoom,
++    QTOPIAXK_Context1,          Qt::Key_Context1,
++    QTOPIAXK_Context2,          Qt::Key_Context2,
++    QTOPIAXK_Context3,          Qt::Key_Context3,
++    QTOPIAXK_Context4,          Qt::Key_Context4,
++    QTOPIAXK_Call,              Qt::Key_Call,
++    QTOPIAXK_Hangup,            Qt::Key_Hangup,
++    QTOPIAXK_Flip,              Qt::Key_Flip,
++
++    0,                          0
++};
++
++#endif // KEYMAPPER_X11_H
+diff -ru libqxt-old/src/gui/qxtglobalshortcut_win.cpp libqxt/src/gui/qxtglobalshortcut_win.cpp
+--- libqxt-old/src/gui/qxtglobalshortcut_win.cpp	2010-04-21 15:17:56.000000000 +0100
++++ libqxt/src/gui/qxtglobalshortcut_win.cpp	2010-04-21 15:18:16.000000000 +0100
+@@ -156,6 +156,21 @@
+     case Qt::Key_Slash:
+         return VK_DIVIDE;
+ 
++    case Qt::Key_MediaNext:
++        return VK_MEDIA_NEXT_TRACK;
++    case Qt::Key_MediaPrevious:
++        return VK_MEDIA_PREV_TRACK;
++    case Qt::Key_MediaStop:
++        return VK_MEDIA_STOP;
++    case Qt::Key_MediaPlay:
++        return VK_MEDIA_PLAY_PAUSE;
++    case Qt::Key_VolumeDown:
++        return VK_VOLUME_DOWN;
++    case Qt::Key_VolumeUp:
++        return VK_VOLUME_UP;
++    case Qt::Key_VolumeMute:
++        return VK_VOLUME_MUTE;
++
+         // numbers
+     case Qt::Key_0:
+     case Qt::Key_1:
+diff -ru libqxt-old/src/gui/qxtglobalshortcut_x11.cpp libqxt/src/gui/qxtglobalshortcut_x11.cpp
+--- libqxt-old/src/gui/qxtglobalshortcut_x11.cpp	2010-04-21 15:17:56.000000000 +0100
++++ libqxt/src/gui/qxtglobalshortcut_x11.cpp	2010-04-21 15:18:16.000000000 +0100
+@@ -26,6 +26,8 @@
+ #include <QX11Info>
+ #include <X11/Xlib.h>
+ 
++#include "keymapper_x11.h"
++
+ static int (*original_x_errhandler)(Display* display, XErrorEvent* event);
+ 
+ static int qxt_x_errhandler(Display* display, XErrorEvent *event)
+@@ -81,8 +83,25 @@
+ 
+ quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key)
+ {
++    // (davidsansome) Try the table from QKeyMapper first - this seems to be
++    // the only way to get Keysyms for the media keys.
++    unsigned int keysym = 0;
++    int i = 0;
++    while (KeyTbl[i]) {
++      if (KeyTbl[i+1] == static_cast<uint>(key)) {
++        keysym = KeyTbl[i];
++        break;
++      }
++      i += 2;
++    }
++
++    // If that didn't work then fall back on XStringToKeysym
++    if (!keysym) {
++      keysym = XStringToKeysym(QKeySequence(key).toString().toLatin1().data());
++    }
++
+     Display* display = QX11Info::display();
+-    return XKeysymToKeycode(display, XStringToKeysym(QKeySequence(key).toString().toLatin1().data()));
++    return XKeysymToKeycode(display, keysym);
+ }
+ 
+ bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods)
diff --git a/3rdparty/qxt/meta-modifier.patch b/3rdparty/qxt/meta-modifier.patch
new file mode 100644
index 0000000..f77b97a
--- /dev/null
+++ b/3rdparty/qxt/meta-modifier.patch
@@ -0,0 +1,15 @@
+Index: qxtglobalshortcut_x11.cpp
+===================================================================
+--- qxtglobalshortcut_x11.cpp	(revision 1208)
++++ qxtglobalshortcut_x11.cpp	(working copy)
+@@ -74,8 +74,9 @@
+         native |= ControlMask;
+     if (modifiers & Qt::AltModifier)
+         native |= Mod1Mask;
++    if (modifiers & Qt::MetaModifier)
++        native |= Mod4Mask;
+     // TODO: resolve these?
+-    //if (modifiers & Qt::MetaModifier)
+     //if (modifiers & Qt::KeypadModifier)
+     //if (modifiers & Qt::GroupSwitchModifier)
+     return native;
diff --git a/3rdparty/qxt/qxtglobal.cpp b/3rdparty/qxt/qxtglobal.cpp
new file mode 100644
index 0000000..fe7b9e7
--- /dev/null
+++ b/3rdparty/qxt/qxtglobal.cpp
@@ -0,0 +1,241 @@
+/****************************************************************************
+ **
+ ** Copyright (C) Qxt Foundation. Some rights reserved.
+ **
+ ** This file is part of the QxtCore module of the Qxt library.
+ **
+ ** This library is free software; you can redistribute it and/or modify it
+ ** under the terms of the Common Public License, version 1.0, as published
+ ** by IBM, and/or under the terms of the GNU Lesser General Public License,
+ ** version 2.1, as published by the Free Software Foundation.
+ **
+ ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+ ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+ ** FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** You should have received a copy of the CPL and the LGPL along with this
+ ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
+ ** included with the source distribution for more information.
+ ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
+ **
+ ** <http://libqxt.org>  <foundation at libqxt.org>
+ **
+ ****************************************************************************/
+
+#include "qxtglobal.h"
+
+/*!
+    \headerfile <QxtGlobal>
+    \title Global Qxt Declarations
+    \inmodule QxtCore
+
+    \brief The <QxtGlobal> header provides basic declarations and
+    is included by all other Qxt headers.
+ */
+
+/*!
+    \macro QXT_VERSION
+    \relates <QxtGlobal>
+
+    This macro expands a numeric value of the form 0xMMNNPP (MM =
+    major, NN = minor, PP = patch) that specifies Qxt's version
+    number. For example, if you compile your application against Qxt
+    0.4.0, the QXT_VERSION macro will expand to 0x000400.
+
+    You can use QXT_VERSION to use the latest Qt features where
+    available. For example:
+    \code
+    #if QXT_VERSION >= 0x000400
+        qxtTabWidget->setTabMovementMode(QxtTabWidget::InPlaceMovement);
+    #endif
+    \endcode
+
+    \sa QXT_VERSION_STR, qxtVersion()
+ */
+
+/*!
+    \macro QXT_VERSION_STR
+    \relates <QxtGlobal>
+
+    This macro expands to a string that specifies Qxt's version number
+    (for example, "0.4.0"). This is the version against which the
+    application is compiled.
+
+    \sa qxtVersion(), QXT_VERSION
+ */
+
+/*!
+    \relates <QxtGlobal>
+
+    Returns the version number of Qxt at run-time as a string (for
+    example, "0.4.0"). This may be a different version than the
+    version the application was compiled against.
+
+    \sa QXT_VERSION_STR
+ */
+const char* qxtVersion()
+{
+    return QXT_VERSION_STR;
+}
+
+/*!
+\headerfile <QxtPimpl>
+\title The Qxt private implementation
+\inmodule QxtCore
+
+\brief The <QxtPimpl> header provides tools for hiding
+details of a class.
+
+Application code generally doesn't have to be concerned about hiding its
+implementation details, but when writing library code it is important to
+maintain a constant interface, both source and binary. Maintaining a constant
+source interface is easy enough, but keeping the binary interface constant
+means moving implementation details into a private class. The PIMPL, or
+d-pointer, idiom is a common method of implementing this separation. QxtPimpl
+offers a convenient way to connect the public and private sides of your class.
+
+\section1 Getting Started
+Before you declare the public class, you need to make a forward declaration
+of the private class. The private class must have the same name as the public
+class, followed by the word Private. For example, a class named MyTest would
+declare the private class with:
+\code
+class MyTestPrivate;
+\endcode
+
+\section1 The Public Class
+Generally, you shouldn't keep any data members in the public class without a
+good reason. Functions that are part of the public interface should be declared
+in the public class, and functions that need to be available to subclasses (for
+calling or overriding) should be in the protected section of the public class.
+To connect the private class to the public class, include the
+QXT_DECLARE_PRIVATE macro in the private section of the public class. In the
+example above, the private class is connected as follows:
+\code
+private:
+    QXT_DECLARE_PRIVATE(MyTest)
+\endcode
+
+Additionally, you must include the QXT_INIT_PRIVATE macro in the public class's
+constructor. Continuing with the MyTest example, your constructor might look
+like this:
+\code
+MyTest::MyTest() {
+    // initialization
+    QXT_INIT_PRIVATE(MyTest);
+}
+\endcode
+
+\section1 The Private Class
+As mentioned above, data members should usually be kept in the private class.
+This allows the memory layout of the private class to change without breaking
+binary compatibility for the public class. Functions that exist only as
+implementation details, or functions that need access to private data members,
+should be implemented here.
+
+To define the private class, inherit from the template QxtPrivate class, and
+include the QXT_DECLARE_PUBLIC macro in its public section. The template
+parameter should be the name of the public class. For example:
+\code
+class MyTestPrivate : public QxtPrivate<MyTest> {
+public:
+    MyTestPrivate();
+    QXT_DECLARE_PUBLIC(MyTest)
+};
+\endcode
+
+\section1 Accessing Private Members
+Use the qxt_d() function (actually a function-like object) from functions in
+the public class to access the private class. Similarly, functions in the
+private class can invoke functions in the public class by using the qxt_p()
+function (this one's actually a function).
+
+For example, assume that MyTest has methods named getFoobar and doBaz(),
+and MyTestPrivate has a member named foobar and a method named doQuux().
+The code might resemble this example:
+\code
+int MyTest::getFoobar() {
+    return qxt_d().foobar;
+}
+
+void MyTestPrivate::doQuux() {
+    qxt_p().doBaz(foobar);
+}
+\endcode
+*/
+
+/*! 
+ * \macro QXT_DECLARE_PRIVATE(PUB)
+ * \relates <QxtPimpl>
+ * Declares that a public class has a related private class.
+ *
+ * This shuold be put in the private section of the public class. The parameter is the name of the public class.
+ */
+
+/*!
+ * \macro QXT_DECLARE_PUBLIC(PUB)
+ * \relates <QxtPimpl>
+ * Declares that a private class has a related public class.
+ *
+ * This may be put anywhere in the declaration of the private class. The parameter is the name of the public class.
+ */
+
+/*!
+ * \macro QXT_INIT_PRIVATE(PUB)
+ * \relates <QxtPimpl>
+ * Initializes resources owned by the private class.
+ *
+ * This should be called from the public class's constructor,
+ * before qxt_d() is used for the first time. The parameter is the name of the public class.
+ */
+
+/*!
+ * \macro QXT_D(PUB)
+ * \relates <QxtPimpl>
+ * Returns a reference in the current scope named "d" to the private class.
+ *
+ * This function is only available in a class using \a QXT_DECLARE_PRIVATE.
+ */
+
+/*!
+ * \macro QXT_P(PUB)
+ * \relates <QxtPimpl>
+ * Creates a reference in the current scope named "q" to the public class.
+ *
+ * This macro only works in a class using \a QXT_DECLARE_PUBLIC.
+ */
+
+/*!
+ * \fn QxtPrivate<PUB>& PUB::qxt_d()
+ * \relates <QxtPimpl>
+ * Returns a reference to the private class.
+ *
+ * This function is only available in a class using \a QXT_DECLARE_PRIVATE.
+ */
+
+/*!
+ * \fn const QxtPrivate<PUB>& PUB::qxt_d() const
+ * \relates <QxtPimpl>
+ * Returns a const reference to the private class.
+ *
+ * This function is only available in a class using \a QXT_DECLARE_PRIVATE.
+ * This overload will be automatically used in const functions.
+ */
+
+/*!
+ * \fn PUB& QxtPrivate::qxt_p()
+ * \relates <QxtPimpl>
+ * Returns a reference to the public class.
+ *
+ * This function is only available in a class using \a QXT_DECLARE_PUBLIC.
+ */
+
+/*!
+ * \fn const PUB& QxtPrivate::qxt_p() const
+ * \relates <QxtPimpl>
+ * Returns a const reference to the public class.
+ *
+ * This function is only available in a class using \a QXT_DECLARE_PUBLIC.
+ * This overload will be automatically used in const functions.
+ */
diff --git a/3rdparty/qxt/qxtglobal.h b/3rdparty/qxt/qxtglobal.h
new file mode 100644
index 0000000..038ceaf
--- /dev/null
+++ b/3rdparty/qxt/qxtglobal.h
@@ -0,0 +1,207 @@
+/****************************************************************************
+ **
+ ** Copyright (C) Qxt Foundation. Some rights reserved.
+ **
+ ** This file is part of the QxtCore module of the Qxt library.
+ **
+ ** This library is free software; you can redistribute it and/or modify it
+ ** under the terms of the Common Public License, version 1.0, as published
+ ** by IBM, and/or under the terms of the GNU Lesser General Public License,
+ ** version 2.1, as published by the Free Software Foundation.
+ **
+ ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+ ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+ ** FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** You should have received a copy of the CPL and the LGPL along with this
+ ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
+ ** included with the source distribution for more information.
+ ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
+ **
+ ** <http://libqxt.org>  <foundation at libqxt.org>
+ **
+ ****************************************************************************/
+
+#ifndef QXTGLOBAL_H
+#define QXTGLOBAL_H
+
+#include <qglobal.h>
+
+#define QXT_VERSION 0x000600
+#define QXT_VERSION_STR "0.6.0"
+
+//--------------------------global macros------------------------------
+
+#ifndef QXT_NO_MACROS
+
+#endif // QXT_NO_MACROS
+
+//--------------------------export macros------------------------------
+
+#define QXT_DLLEXPORT DO_NOT_USE_THIS_ANYMORE
+
+#if !defined(QXT_STATIC)
+#    if defined(BUILD_QXT_CORE)
+#        define QXT_CORE_EXPORT Q_DECL_EXPORT
+#    else
+#        define QXT_CORE_EXPORT Q_DECL_IMPORT
+#    endif
+#else
+#    define QXT_CORE_EXPORT
+#endif // BUILD_QXT_CORE
+ 
+#if !defined(QXT_STATIC)
+#    if defined(BUILD_QXT_GUI)
+#        define QXT_GUI_EXPORT Q_DECL_EXPORT
+#    else
+#        define QXT_GUI_EXPORT Q_DECL_IMPORT
+#    endif
+#else
+#    define QXT_GUI_EXPORT
+#endif // BUILD_QXT_GUI
+ 
+#if !defined(QXT_STATIC)
+#    if defined(BUILD_QXT_NETWORK)
+#        define QXT_NETWORK_EXPORT Q_DECL_EXPORT
+#    else
+#        define QXT_NETWORK_EXPORT Q_DECL_IMPORT
+#    endif
+#else
+#    define QXT_NETWORK_EXPORT
+#endif // BUILD_QXT_NETWORK
+ 
+#if !defined(QXT_STATIC)
+#    if defined(BUILD_QXT_SQL)
+#        define QXT_SQL_EXPORT Q_DECL_EXPORT
+#    else
+#        define QXT_SQL_EXPORT Q_DECL_IMPORT
+#    endif
+#else
+#    define QXT_SQL_EXPORT
+#endif // BUILD_QXT_SQL
+ 
+#if !defined(QXT_STATIC)
+#    if defined(BUILD_QXT_WEB)
+#        define QXT_WEB_EXPORT Q_DECL_EXPORT
+#    else
+#        define QXT_WEB_EXPORT Q_DECL_IMPORT
+#    endif
+#else
+#    define QXT_WEB_EXPORT
+#endif // BUILD_QXT_WEB
+ 
+#if !defined(QXT_STATIC)
+#    if defined(BUILD_QXT_BERKELEY)
+#        define QXT_BERKELEY_EXPORT Q_DECL_EXPORT
+#    else
+#        define QXT_BERKELEY_EXPORT Q_DECL_IMPORT
+#    endif
+#else
+#    define QXT_BERKELEY_EXPORT
+#endif // BUILD_QXT_BERKELEY
+
+#if !defined(QXT_STATIC)
+#    if defined(BUILD_QXT_ZEROCONF)
+#        define QXT_ZEROCONF_EXPORT Q_DECL_EXPORT
+#    else
+#        define QXT_ZEROCONF_EXPORT Q_DECL_IMPORT
+#    endif
+#else
+#    define QXT_ZEROCONF_EXPORT
+#endif // QXT_ZEROCONF_EXPORT
+
+#if defined BUILD_QXT_CORE || defined BUILD_QXT_GUI || defined  BUILD_QXT_SQL || defined BUILD_QXT_NETWORK || defined BUILD_QXT_WEB || defined BUILD_QXT_BERKELEY || defined BUILD_QXT_ZEROCONF
+#   define BUILD_QXT
+#endif
+
+QXT_CORE_EXPORT const char* qxtVersion();
+
+#ifndef QT_BEGIN_NAMESPACE
+#define QT_BEGIN_NAMESPACE
+#endif
+
+#ifndef QT_END_NAMESPACE
+#define QT_END_NAMESPACE
+#endif
+
+#ifndef QT_FORWARD_DECLARE_CLASS
+#define QT_FORWARD_DECLARE_CLASS(Class) class Class;
+#endif
+
+/****************************************************************************
+** This file is derived from code bearing the following notice:
+** The sole author of this file, Adam Higerd, has explicitly disclaimed all
+** copyright interest and protection for the content within. This file has
+** been placed in the public domain according to United States copyright
+** statute and case law. In jurisdictions where this public domain dedication
+** is not legally recognized, anyone who receives a copy of this file is
+** permitted to use, modify, duplicate, and redistribute this file, in whole
+** or in part, with no restrictions or conditions. In these jurisdictions,
+** this file shall be copyright (C) 2006-2008 by Adam Higerd.
+****************************************************************************/
+
+#define QXT_DECLARE_PRIVATE(PUB) friend class PUB##Private; QxtPrivateInterface<PUB, PUB##Private> qxt_d;
+#define QXT_DECLARE_PUBLIC(PUB) friend class PUB;
+#define QXT_INIT_PRIVATE(PUB) qxt_d.setPublic(this);
+#define QXT_D(PUB) PUB##Private& d = qxt_d()
+#define QXT_P(PUB) PUB& p = qxt_p()
+
+template <typename PUB>
+class QxtPrivate
+{
+public:
+    virtual ~QxtPrivate()
+    {}
+    inline void QXT_setPublic(PUB* pub)
+    {
+        qxt_p_ptr = pub;
+    }
+
+protected:
+    inline PUB& qxt_p()
+    {
+        return *qxt_p_ptr;
+    }
+    inline const PUB& qxt_p() const
+    {
+        return *qxt_p_ptr;
+    }
+
+private:
+    PUB* qxt_p_ptr;
+};
+
+template <typename PUB, typename PVT>
+class QxtPrivateInterface
+{
+    friend class QxtPrivate<PUB>;
+public:
+    QxtPrivateInterface()
+    {
+        pvt = new PVT;
+    }
+    ~QxtPrivateInterface()
+    {
+        delete pvt;
+    }
+
+    inline void setPublic(PUB* pub)
+    {
+        pvt->QXT_setPublic(pub);
+    }
+    inline PVT& operator()()
+    {
+        return *static_cast<PVT*>(pvt);
+    }
+    inline const PVT& operator()() const
+    {
+        return *static_cast<PVT*>(pvt);
+    }
+private:
+    QxtPrivateInterface(const QxtPrivateInterface&) { }
+    QxtPrivateInterface& operator=(const QxtPrivateInterface&) { }
+    QxtPrivate<PUB>* pvt;
+};
+
+#endif // QXT_GLOBAL
diff --git a/3rdparty/qxt/qxtglobalshortcut.cpp b/3rdparty/qxt/qxtglobalshortcut.cpp
new file mode 100644
index 0000000..ef378f9
--- /dev/null
+++ b/3rdparty/qxt/qxtglobalshortcut.cpp
@@ -0,0 +1,191 @@
+/****************************************************************************
+ **
+ ** Copyright (C) Qxt Foundation. Some rights reserved.
+ **
+ ** This file is part of the QxtGui module of the Qxt library.
+ **
+ ** This library is free software; you can redistribute it and/or modify it
+ ** under the terms of the Common Public License, version 1.0, as published
+ ** by IBM, and/or under the terms of the GNU Lesser General Public License,
+ ** version 2.1, as published by the Free Software Foundation.
+ **
+ ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+ ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+ ** FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** You should have received a copy of the CPL and the LGPL along with this
+ ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
+ ** included with the source distribution for more information.
+ ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
+ **
+ ** <http://libqxt.org>  <foundation at libqxt.org>
+ **
+ ****************************************************************************/
+#include "qxtglobalshortcut.h"
+#include "qxtglobalshortcut_p.h"
+#include <QAbstractEventDispatcher>
+#include <QtDebug>
+
+bool QxtGlobalShortcutPrivate::error = false;
+int QxtGlobalShortcutPrivate::ref = 0;
+QAbstractEventDispatcher::EventFilter QxtGlobalShortcutPrivate::prevEventFilter = 0;
+QHash<QPair<quint32, quint32>, QxtGlobalShortcut*> QxtGlobalShortcutPrivate::shortcuts;
+
+QxtGlobalShortcutPrivate::QxtGlobalShortcutPrivate() : enabled(true), key(Qt::Key(0)), mods(Qt::NoModifier)
+{
+    if (!ref++)
+        prevEventFilter = QAbstractEventDispatcher::instance()->setEventFilter(eventFilter);
+}
+
+QxtGlobalShortcutPrivate::~QxtGlobalShortcutPrivate()
+{
+    if (!--ref)
+        QAbstractEventDispatcher::instance()->setEventFilter(prevEventFilter);
+}
+
+bool QxtGlobalShortcutPrivate::setShortcut(const QKeySequence& shortcut)
+{
+    Qt::KeyboardModifiers allMods = Qt::ShiftModifier | Qt::ControlModifier | Qt::AltModifier | Qt::MetaModifier;
+    key = shortcut.isEmpty() ? Qt::Key(0) : Qt::Key((shortcut[0] ^ allMods) & shortcut[0]);
+    mods = shortcut.isEmpty() ? Qt::KeyboardModifiers(0) : Qt::KeyboardModifiers(shortcut[0] & allMods);
+    const quint32 nativeKey = nativeKeycode(key);
+    const quint32 nativeMods = nativeModifiers(mods);
+    const bool res = registerShortcut(nativeKey, nativeMods);
+    shortcuts.insert(qMakePair(nativeKey, nativeMods), &qxt_p());
+    if (!res)
+        qWarning() << "QxtGlobalShortcut failed to register:" << QKeySequence(key + mods).toString();
+    return res;
+}
+
+bool QxtGlobalShortcutPrivate::unsetShortcut()
+{
+    const quint32 nativeKey = nativeKeycode(key);
+    const quint32 nativeMods = nativeModifiers(mods);
+    const bool res = unregisterShortcut(nativeKey, nativeMods);
+    shortcuts.remove(qMakePair(nativeKey, nativeMods));
+    if (!res)
+        qWarning() << "QxtGlobalShortcut failed to unregister:" << QKeySequence(key + mods).toString();
+    key = Qt::Key(0);
+    mods = Qt::KeyboardModifiers(0);
+    return res;
+}
+
+void QxtGlobalShortcutPrivate::activateShortcut(quint32 nativeKey, quint32 nativeMods)
+{
+    QxtGlobalShortcut* shortcut = shortcuts.value(qMakePair(nativeKey, nativeMods));
+    if (shortcut && shortcut->isEnabled())
+        emit shortcut->activated();
+}
+
+/*!
+    \class QxtGlobalShortcut
+    \inmodule QxtGui
+    \brief The QxtGlobalShortcut class provides a global shortcut aka "hotkey".
+
+    A global shortcut triggers even if the application is not active. This
+    makes it easy to implement applications that react to certain shortcuts
+    still if some other application is active or if the application is for
+    example minimized to the system tray.
+
+    Example usage:
+    \code
+    QxtGlobalShortcut* shortcut = new QxtGlobalShortcut(window);
+    connect(shortcut, SIGNAL(activated()), window, SLOT(toggleVisibility()));
+    shortcut->setShortcut(QKeySequence("Ctrl+Shift+F12"));
+    \endcode
+
+    \bold {Note:} Since Qxt 0.6 QxtGlobalShortcut no more requires QxtApplication.
+ */
+
+/*!
+    \fn QxtGlobalShortcut::activated()
+
+    This signal is emitted when the user types the shortcut's key sequence.
+
+    \sa shortcut
+ */
+
+/*!
+    Constructs a new QxtGlobalShortcut with \a parent.
+ */
+QxtGlobalShortcut::QxtGlobalShortcut(QObject* parent)
+        : QObject(parent)
+{
+    QXT_INIT_PRIVATE(QxtGlobalShortcut);
+}
+
+/*!
+    Constructs a new QxtGlobalShortcut with \a shortcut and \a parent.
+ */
+QxtGlobalShortcut::QxtGlobalShortcut(const QKeySequence& shortcut, QObject* parent)
+        : QObject(parent)
+{
+    QXT_INIT_PRIVATE(QxtGlobalShortcut);
+    setShortcut(shortcut);
+}
+
+/*!
+    Destructs the QxtGlobalShortcut.
+ */
+QxtGlobalShortcut::~QxtGlobalShortcut()
+{
+    if (qxt_d().key != 0)
+        qxt_d().unsetShortcut();
+}
+
+/*!
+    \property QxtGlobalShortcut::shortcut
+    \brief the shortcut key sequence
+
+    \bold {Note:} Notice that corresponding key press and release events are not
+    delivered for registered global shortcuts even if they are disabled.
+    Also, comma separated key sequences are not supported.
+    Only the first part is used:
+
+    \code
+    qxtShortcut->setShortcut(QKeySequence("Ctrl+Alt+A,Ctrl+Alt+B"));
+    Q_ASSERT(qxtShortcut->shortcut() == QKeySequence("Ctrl+Alt+A"));
+    \endcode
+ */
+QKeySequence QxtGlobalShortcut::shortcut() const
+{
+    return QKeySequence(qxt_d().key | qxt_d().mods);
+}
+
+bool QxtGlobalShortcut::setShortcut(const QKeySequence& shortcut)
+{
+    if (qxt_d().key != 0)
+        qxt_d().unsetShortcut();
+    return qxt_d().setShortcut(shortcut);
+}
+
+/*!
+    \property QxtGlobalShortcut::enabled
+    \brief whether the shortcut is enabled
+
+    A disabled shortcut does not get activated.
+
+    The default value is \c true.
+
+    \sa setDisabled()
+ */
+bool QxtGlobalShortcut::isEnabled() const
+{
+    return qxt_d().enabled;
+}
+
+void QxtGlobalShortcut::setEnabled(bool enabled)
+{
+    qxt_d().enabled = enabled;
+}
+
+/*!
+    Sets the shortcut \a disabled.
+
+    \sa enabled
+ */
+void QxtGlobalShortcut::setDisabled(bool disabled)
+{
+    qxt_d().enabled = !disabled;
+}
diff --git a/3rdparty/qxt/qxtglobalshortcut.h b/3rdparty/qxt/qxtglobalshortcut.h
new file mode 100644
index 0000000..a97ba2d
--- /dev/null
+++ b/3rdparty/qxt/qxtglobalshortcut.h
@@ -0,0 +1,58 @@
+/****************************************************************************
+ **
+ ** Copyright (C) Qxt Foundation. Some rights reserved.
+ **
+ ** This file is part of the QxtGui module of the Qxt library.
+ **
+ ** This library is free software; you can redistribute it and/or modify it
+ ** under the terms of the Common Public License, version 1.0, as published
+ ** by IBM, and/or under the terms of the GNU Lesser General Public License,
+ ** version 2.1, as published by the Free Software Foundation.
+ **
+ ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+ ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+ ** FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** You should have received a copy of the CPL and the LGPL along with this
+ ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
+ ** included with the source distribution for more information.
+ ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
+ **
+ ** <http://libqxt.org>  <foundation at libqxt.org>
+ **
+ ****************************************************************************/
+#ifndef QXTGLOBALSHORTCUT_H
+#define QXTGLOBALSHORTCUT_H
+
+#include "qxtglobal.h"
+#include <QObject>
+#include <QKeySequence>
+class QxtGlobalShortcutPrivate;
+
+class QXT_GUI_EXPORT QxtGlobalShortcut : public QObject
+{
+    Q_OBJECT
+    QXT_DECLARE_PRIVATE(QxtGlobalShortcut)
+    Q_PROPERTY(bool enabled READ isEnabled WRITE setEnabled)
+    Q_PROPERTY(QKeySequence shortcut READ shortcut WRITE setShortcut)
+
+public:
+    explicit QxtGlobalShortcut(QObject* parent = 0);
+    explicit QxtGlobalShortcut(const QKeySequence& shortcut, QObject* parent = 0);
+    virtual ~QxtGlobalShortcut();
+
+    QKeySequence shortcut() const;
+    bool setShortcut(const QKeySequence& shortcut);
+
+    bool isEnabled() const;
+
+public Q_SLOTS:
+    void setEnabled(bool enabled = true);
+    void setDisabled(bool disabled = true);
+
+Q_SIGNALS:
+    void activated();
+};
+
+#endif // QXTGLOBALSHORTCUT_H
diff --git a/3rdparty/qxt/qxtglobalshortcut_mac.cpp b/3rdparty/qxt/qxtglobalshortcut_mac.cpp
new file mode 100644
index 0000000..0bcea7f
--- /dev/null
+++ b/3rdparty/qxt/qxtglobalshortcut_mac.cpp
@@ -0,0 +1,207 @@
+/****************************************************************************
+ **
+ ** Copyright (C) Qxt Foundation. Some rights reserved.
+ **
+ ** This file is part of the QxtGui module of the Qxt library.
+ **
+ ** This library is free software; you can redistribute it and/or modify it
+ ** under the terms of the Common Public License, version 1.0, as published
+ ** by IBM, and/or under the terms of the GNU Lesser General Public License,
+ ** version 2.1, as published by the Free Software Foundation.
+ **
+ ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+ ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+ ** FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** You should have received a copy of the CPL and the LGPL along with this
+ ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
+ ** included with the source distribution for more information.
+ ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
+ **
+ ** <http://libqxt.org>  <foundation at libqxt.org>
+ **
+ ****************************************************************************/
+#include <Carbon/Carbon.h>
+#include "qxtglobalshortcut_p.h"
+#include <QMap>
+#include <QHash>
+#include <QtDebug>
+#include <QApplication>
+
+typedef QPair<uint, uint> Identifier;
+static QMap<quint32, EventHotKeyRef> keyRefs;
+static QHash<Identifier, quint32> keyIDs;
+static quint32 hotKeySerial = 0;
+static bool qxt_mac_handler_installed = false;
+
+OSStatus qxt_mac_handle_hot_key(EventHandlerCallRef nextHandler, EventRef event, void* data)
+{
+    // pass event to the app event filter
+    Q_UNUSED(data);
+    qApp->macEventFilter(nextHandler, event);
+    return noErr;
+}
+
+bool QxtGlobalShortcutPrivate::eventFilter(void* message)
+//bool QxtGlobalShortcutPrivate::macEventFilter(EventHandlerCallRef caller, EventRef event)
+{
+    EventRef event = (EventRef) message;
+    if (GetEventClass(event) == kEventClassKeyboard && GetEventKind(event) == kEventHotKeyPressed)
+    {
+        EventHotKeyID keyID;
+        GetEventParameter(event, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(keyID), NULL, &keyID);
+        Identifier id = keyIDs.key(keyID.id);
+        activateShortcut(id.second, id.first);
+    }
+    return false;
+}
+
+quint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers)
+{
+    quint32 native = 0;
+    if (modifiers & Qt::ShiftModifier)
+        native |= shiftKeyBit;
+    if (modifiers & Qt::ControlModifier)
+        native |= cmdKey;
+    if (modifiers & Qt::AltModifier)
+        native |= optionKey;
+    if (modifiers & Qt::MetaModifier)
+        native |= controlKey;
+    if (modifiers & Qt::KeypadModifier)
+        native |= kEventKeyModifierNumLockMask;
+    return native;
+}
+
+quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key)
+{
+    UTF16Char ch;
+    // Constants found in NSEvent.h from AppKit.framework
+    if (key == Qt::Key_Up)				ch = 0xF700;
+    else if (key == Qt::Key_Down)		ch = 0xF701;
+    else if (key == Qt::Key_Left)		ch = 0xF702;
+    else if (key == Qt::Key_Right)		ch = 0xF703;
+    else if (key >= Qt::Key_F1 && key <= Qt::Key_F35)
+        ch = key - Qt::Key_F1 + 0xF704;
+    else if (key == Qt::Key_Insert)		ch = 0xF727;
+    else if (key == Qt::Key_Delete)		ch = 0xF728;
+    else if (key == Qt::Key_Home)		ch = 0xF729;
+    else if (key == Qt::Key_End)			ch = 0xF72B;
+    else if (key == Qt::Key_PageUp)		ch = 0xF72C;
+    else if (key == Qt::Key_PageDown)	ch = 0xF72D;
+    else if (key == Qt::Key_Print)		ch = 0xF72E;
+    else if (key == Qt::Key_ScrollLock)	ch = 0xF72F;
+    else if (key == Qt::Key_Pause)		ch = 0xF730;
+    else if (key == Qt::Key_SysReq)		ch = 0xF731;
+    else if (key == Qt::Key_Stop)		ch = 0xF734;
+    else if (key == Qt::Key_Menu)		ch = 0xF735;
+    else if (key == Qt::Key_Select)		ch = 0xF741;
+    else if (key == Qt::Key_Execute)		ch = 0xF742;
+    else if (key == Qt::Key_Help)		ch = 0xF746;
+    else if (key == Qt::Key_Mode_switch)	ch = 0xF747;
+    else if (key == Qt::Key_Escape)		ch = 27;
+    else if (key == Qt::Key_Return)		ch = 13;
+    else if (key == Qt::Key_Enter)		ch = 3;
+    else if (key == Qt::Key_Tab)			ch = 9;
+    else								ch = key;
+
+    KeyboardLayoutRef layout;
+    KeyboardLayoutKind layoutKind;
+    KLGetCurrentKeyboardLayout(&layout);
+    KLGetKeyboardLayoutProperty(layout, kKLKind, const_cast<const void**>(reinterpret_cast<void**>(&layoutKind)));
+
+    if (layoutKind == kKLKCHRKind)
+    { // no Unicode available
+        if (ch > 255) return 0;
+
+        char* data;
+        KLGetKeyboardLayoutProperty(layout, kKLKCHRData, const_cast<const void**>(reinterpret_cast<void**>(&data)));
+        int ct = *reinterpret_cast<short*>(data + 258);
+        for (int i = 0; i < ct; i++)
+        {
+            char* keyTable = data + 260 + 128 * i;
+            for (int j = 0; j < 128; j++)
+            {
+                if (keyTable[j] == ch) return j;
+            }
+        }
+
+        return 0;
+    }
+
+    char* data;
+    KLGetKeyboardLayoutProperty(layout, kKLuchrData, const_cast<const void**>(reinterpret_cast<void**>(&data)));
+    UCKeyboardLayout* header = reinterpret_cast<UCKeyboardLayout*>(data);
+    UCKeyboardTypeHeader* table = header->keyboardTypeList;
+
+    for (quint32 i=0; i < header->keyboardTypeCount; i++)
+    {
+        UCKeyStateRecordsIndex* stateRec = 0;
+        if (table[i].keyStateRecordsIndexOffset != 0)
+        {
+            stateRec = reinterpret_cast<UCKeyStateRecordsIndex*>(data + table[i].keyStateRecordsIndexOffset);
+            if (stateRec->keyStateRecordsIndexFormat != kUCKeyStateRecordsIndexFormat) stateRec = 0;
+        }
+
+        UCKeyToCharTableIndex* charTable = reinterpret_cast<UCKeyToCharTableIndex*>(data + table[i].keyToCharTableIndexOffset);
+        if (charTable->keyToCharTableIndexFormat != kUCKeyToCharTableIndexFormat) continue;
+
+        for (quint32 j=0; j < charTable->keyToCharTableCount; j++)
+        {
+            UCKeyOutput* keyToChar = reinterpret_cast<UCKeyOutput*>(data + charTable->keyToCharTableOffsets[j]);
+            for (quint32 k=0; k < charTable->keyToCharTableSize; k++)
+            {
+                if (keyToChar[k] & kUCKeyOutputTestForIndexMask)
+                {
+                    long idx = keyToChar[k] & kUCKeyOutputGetIndexMask;
+                    if (stateRec && idx < stateRec->keyStateRecordCount)
+                    {
+                        UCKeyStateRecord* rec = reinterpret_cast<UCKeyStateRecord*>(data + stateRec->keyStateRecordOffsets[idx]);
+                        if (rec->stateZeroCharData == ch) return k;
+                    }
+                }
+                else if (!(keyToChar[k] & kUCKeyOutputSequenceIndexMask) && keyToChar[k] < 0xFFFE)
+                {
+                    if (keyToChar[k] == ch) return k;
+                }
+            } // for k
+        } // for j
+    } // for i
+
+    return 0;
+}
+
+bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods)
+{
+    if (!qxt_mac_handler_installed)
+    {
+        EventTypeSpec t;
+        t.eventClass = kEventClassKeyboard;
+        t.eventKind = kEventHotKeyPressed;
+        InstallApplicationEventHandler(&qxt_mac_handle_hot_key, 1, &t, NULL, NULL);
+    }
+
+    EventHotKeyID keyID;
+    keyID.signature = 'cute';
+    keyID.id = ++hotKeySerial;
+
+    EventHotKeyRef ref = 0;
+    bool rv = !RegisterEventHotKey(nativeKey, nativeMods, keyID, GetApplicationEventTarget(), 0, &ref);
+    if (rv)
+    {
+        keyIDs.insert(Identifier(nativeMods, nativeKey), keyID.id);
+        keyRefs.insert(keyID.id, ref);
+    }
+    qDebug() << ref;
+    return rv;
+}
+
+bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods)
+{
+    Identifier id(nativeMods, nativeKey);
+    if (!keyIDs.contains(id)) return false;
+
+    EventHotKeyRef ref = keyRefs.take(keyIDs[id]);
+    keyIDs.remove(id);
+    return !UnregisterEventHotKey(ref);
+}
diff --git a/3rdparty/qxt/qxtglobalshortcut_p.h b/3rdparty/qxt/qxtglobalshortcut_p.h
new file mode 100644
index 0000000..4570396
--- /dev/null
+++ b/3rdparty/qxt/qxtglobalshortcut_p.h
@@ -0,0 +1,63 @@
+/****************************************************************************
+ **
+ ** Copyright (C) Qxt Foundation. Some rights reserved.
+ **
+ ** This file is part of the QxtGui module of the Qxt library.
+ **
+ ** This library is free software; you can redistribute it and/or modify it
+ ** under the terms of the Common Public License, version 1.0, as published
+ ** by IBM, and/or under the terms of the GNU Lesser General Public License,
+ ** version 2.1, as published by the Free Software Foundation.
+ **
+ ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+ ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+ ** FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** You should have received a copy of the CPL and the LGPL along with this
+ ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
+ ** included with the source distribution for more information.
+ ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
+ **
+ ** <http://libqxt.org>  <foundation at libqxt.org>
+ **
+ ****************************************************************************/
+#ifndef QXTGLOBALSHORTCUT_P_H
+#define QXTGLOBALSHORTCUT_P_H
+
+#include "qxtglobalshortcut.h"
+#include <QAbstractEventDispatcher>
+#include <QKeySequence>
+#include <QHash>
+
+class QxtGlobalShortcutPrivate : public QxtPrivate<QxtGlobalShortcut>
+{
+public:
+    QXT_DECLARE_PUBLIC(QxtGlobalShortcut)
+    QxtGlobalShortcutPrivate();
+    ~QxtGlobalShortcutPrivate();
+
+    bool enabled;
+    Qt::Key key;
+    Qt::KeyboardModifiers mods;
+
+    bool setShortcut(const QKeySequence& shortcut);
+    bool unsetShortcut();
+
+    static bool error;
+    static int ref;
+    static QAbstractEventDispatcher::EventFilter prevEventFilter;
+    static bool eventFilter(void* message);
+
+private:
+    static quint32 nativeKeycode(Qt::Key keycode);
+    static quint32 nativeModifiers(Qt::KeyboardModifiers modifiers);
+
+    static bool registerShortcut(quint32 nativeKey, quint32 nativeMods);
+    static bool unregisterShortcut(quint32 nativeKey, quint32 nativeMods);
+    static void activateShortcut(quint32 nativeKey, quint32 nativeMods);
+
+    static QHash<QPair<quint32, quint32>, QxtGlobalShortcut*> shortcuts;
+};
+
+#endif // QXTGLOBALSHORTCUT_P_H
diff --git a/3rdparty/qxt/qxtglobalshortcut_win.cpp b/3rdparty/qxt/qxtglobalshortcut_win.cpp
new file mode 100644
index 0000000..d81f108
--- /dev/null
+++ b/3rdparty/qxt/qxtglobalshortcut_win.cpp
@@ -0,0 +1,229 @@
+/****************************************************************************
+ **
+ ** Copyright (C) Qxt Foundation. Some rights reserved.
+ **
+ ** This file is part of the QxtGui module of the Qxt library.
+ **
+ ** This library is free software; you can redistribute it and/or modify it
+ ** under the terms of the Common Public License, version 1.0, as published
+ ** by IBM, and/or under the terms of the GNU Lesser General Public License,
+ ** version 2.1, as published by the Free Software Foundation.
+ **
+ ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+ ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+ ** FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** You should have received a copy of the CPL and the LGPL along with this
+ ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
+ ** included with the source distribution for more information.
+ ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
+ **
+ ** <http://libqxt.org>  <foundation at libqxt.org>
+ **
+ ****************************************************************************/
+#include "qxtglobalshortcut_p.h"
+#include <qt_windows.h>
+
+bool QxtGlobalShortcutPrivate::eventFilter(void* message)
+{
+    MSG* msg = static_cast<MSG*>(message);
+    if (msg->message == WM_HOTKEY)
+    {
+        const quint32 keycode = HIWORD(msg->lParam);
+        const quint32 modifiers = LOWORD(msg->lParam);
+        activateShortcut(keycode, modifiers);
+    }
+    return false;
+}
+
+quint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers)
+{
+    // MOD_ALT, MOD_CONTROL, (MOD_KEYUP), MOD_SHIFT, MOD_WIN
+    quint32 native = 0;
+    if (modifiers & Qt::ShiftModifier)
+        native |= MOD_SHIFT;
+    if (modifiers & Qt::ControlModifier)
+        native |= MOD_CONTROL;
+    if (modifiers & Qt::AltModifier)
+        native |= MOD_ALT;
+    if (modifiers & Qt::MetaModifier)
+        native |= MOD_WIN;
+    // TODO: resolve these?
+    //if (modifiers & Qt::KeypadModifier)
+    //if (modifiers & Qt::GroupSwitchModifier)
+    return native;
+}
+
+quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key)
+{
+    switch (key)
+    {
+    case Qt::Key_Escape:
+        return VK_ESCAPE;
+    case Qt::Key_Tab:
+    case Qt::Key_Backtab:
+        return VK_TAB;
+    case Qt::Key_Backspace:
+        return VK_BACK;
+    case Qt::Key_Return:
+    case Qt::Key_Enter:
+        return VK_RETURN;
+    case Qt::Key_Insert:
+        return VK_INSERT;
+    case Qt::Key_Delete:
+        return VK_DELETE;
+    case Qt::Key_Pause:
+        return VK_PAUSE;
+    case Qt::Key_Print:
+        return VK_PRINT;
+    case Qt::Key_Clear:
+        return VK_CLEAR;
+    case Qt::Key_Home:
+        return VK_HOME;
+    case Qt::Key_End:
+        return VK_END;
+    case Qt::Key_Left:
+        return VK_LEFT;
+    case Qt::Key_Up:
+        return VK_UP;
+    case Qt::Key_Right:
+        return VK_RIGHT;
+    case Qt::Key_Down:
+        return VK_DOWN;
+    case Qt::Key_PageUp:
+        return VK_PRIOR;
+    case Qt::Key_PageDown:
+        return VK_NEXT;
+    case Qt::Key_F1:
+        return VK_F1;
+    case Qt::Key_F2:
+        return VK_F2;
+    case Qt::Key_F3:
+        return VK_F3;
+    case Qt::Key_F4:
+        return VK_F4;
+    case Qt::Key_F5:
+        return VK_F5;
+    case Qt::Key_F6:
+        return VK_F6;
+    case Qt::Key_F7:
+        return VK_F7;
+    case Qt::Key_F8:
+        return VK_F8;
+    case Qt::Key_F9:
+        return VK_F9;
+    case Qt::Key_F10:
+        return VK_F10;
+    case Qt::Key_F11:
+        return VK_F11;
+    case Qt::Key_F12:
+        return VK_F12;
+    case Qt::Key_F13:
+        return VK_F13;
+    case Qt::Key_F14:
+        return VK_F14;
+    case Qt::Key_F15:
+        return VK_F15;
+    case Qt::Key_F16:
+        return VK_F16;
+    case Qt::Key_F17:
+        return VK_F17;
+    case Qt::Key_F18:
+        return VK_F18;
+    case Qt::Key_F19:
+        return VK_F19;
+    case Qt::Key_F20:
+        return VK_F20;
+    case Qt::Key_F21:
+        return VK_F21;
+    case Qt::Key_F22:
+        return VK_F22;
+    case Qt::Key_F23:
+        return VK_F23;
+    case Qt::Key_F24:
+        return VK_F24;
+    case Qt::Key_Space:
+        return VK_SPACE;
+    case Qt::Key_Asterisk:
+        return VK_MULTIPLY;
+    case Qt::Key_Plus:
+        return VK_ADD;
+    case Qt::Key_Comma:
+        return VK_SEPARATOR;
+    case Qt::Key_Minus:
+        return VK_SUBTRACT;
+    case Qt::Key_Slash:
+        return VK_DIVIDE;
+
+    case Qt::Key_MediaNext:
+        return VK_MEDIA_NEXT_TRACK;
+    case Qt::Key_MediaPrevious:
+        return VK_MEDIA_PREV_TRACK;
+    case Qt::Key_MediaStop:
+        return VK_MEDIA_STOP;
+    case Qt::Key_MediaPlay:
+        return VK_MEDIA_PLAY_PAUSE;
+    case Qt::Key_VolumeDown:
+        return VK_VOLUME_DOWN;
+    case Qt::Key_VolumeUp:
+        return VK_VOLUME_UP;
+    case Qt::Key_VolumeMute:
+        return VK_VOLUME_MUTE;
+
+        // numbers
+    case Qt::Key_0:
+    case Qt::Key_1:
+    case Qt::Key_2:
+    case Qt::Key_3:
+    case Qt::Key_4:
+    case Qt::Key_5:
+    case Qt::Key_6:
+    case Qt::Key_7:
+    case Qt::Key_8:
+    case Qt::Key_9:
+        return key;
+
+        // letters
+    case Qt::Key_A:
+    case Qt::Key_B:
+    case Qt::Key_C:
+    case Qt::Key_D:
+    case Qt::Key_E:
+    case Qt::Key_F:
+    case Qt::Key_G:
+    case Qt::Key_H:
+    case Qt::Key_I:
+    case Qt::Key_J:
+    case Qt::Key_K:
+    case Qt::Key_L:
+    case Qt::Key_M:
+    case Qt::Key_N:
+    case Qt::Key_O:
+    case Qt::Key_P:
+    case Qt::Key_Q:
+    case Qt::Key_R:
+    case Qt::Key_S:
+    case Qt::Key_T:
+    case Qt::Key_U:
+    case Qt::Key_V:
+    case Qt::Key_W:
+    case Qt::Key_X:
+    case Qt::Key_Y:
+    case Qt::Key_Z:
+        return key;
+
+    default:
+        return 0;
+    }
+}
+
+bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods)
+{
+    return RegisterHotKey(0, nativeMods ^ nativeKey, nativeMods, nativeKey);
+}
+
+bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods)
+{
+    return UnregisterHotKey(0, nativeMods ^ nativeKey);
+}
diff --git a/3rdparty/qxt/qxtglobalshortcut_x11.cpp b/3rdparty/qxt/qxtglobalshortcut_x11.cpp
new file mode 100644
index 0000000..c22894d
--- /dev/null
+++ b/3rdparty/qxt/qxtglobalshortcut_x11.cpp
@@ -0,0 +1,135 @@
+/****************************************************************************
+ **
+ ** Copyright (C) Qxt Foundation. Some rights reserved.
+ **
+ ** This file is part of the QxtGui module of the Qxt library.
+ **
+ ** This library is free software; you can redistribute it and/or modify it
+ ** under the terms of the Common Public License, version 1.0, as published
+ ** by IBM, and/or under the terms of the GNU Lesser General Public License,
+ ** version 2.1, as published by the Free Software Foundation.
+ **
+ ** This file is provided "AS IS", without WARRANTIES OR CONDITIONS OF ANY
+ ** KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ ** WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR
+ ** FITNESS FOR A PARTICULAR PURPOSE.
+ **
+ ** You should have received a copy of the CPL and the LGPL along with this
+ ** file. See the LICENSE file and the cpl1.0.txt/lgpl-2.1.txt files
+ ** included with the source distribution for more information.
+ ** If you did not receive a copy of the licenses, contact the Qxt Foundation.
+ **
+ ** <http://libqxt.org>  <foundation at libqxt.org>
+ **
+ ****************************************************************************/
+#include "qxtglobalshortcut_p.h"
+#include <QX11Info>
+#include <X11/Xlib.h>
+
+#include "keymapper_x11.h"
+
+static int (*original_x_errhandler)(Display* display, XErrorEvent* event);
+
+static int qxt_x_errhandler(Display* display, XErrorEvent *event)
+{
+    Q_UNUSED(display);
+    switch (event->error_code)
+    {
+        case BadAccess:
+        case BadValue:
+        case BadWindow:
+            if (event->request_code == 33 /* X_GrabKey */ ||
+                event->request_code == 34 /* X_UngrabKey */)
+            {
+                QxtGlobalShortcutPrivate::error = true;
+                //TODO:
+                //char errstr[256];
+                //XGetErrorText(dpy, err->error_code, errstr, 256);
+            }
+        default:
+            return 0;
+    }
+}
+
+bool QxtGlobalShortcutPrivate::eventFilter(void* message)
+{
+    XEvent* event = static_cast<XEvent*>(message);
+    if (event->type == KeyPress)
+    {
+        XKeyEvent* key = (XKeyEvent*) event;
+        activateShortcut(key->keycode, 
+            // Mod1Mask == Alt, Mod4Mask == Meta
+            key->state & (ShiftMask | ControlMask | Mod1Mask | Mod4Mask));
+    }
+    return false;
+}
+
+quint32 QxtGlobalShortcutPrivate::nativeModifiers(Qt::KeyboardModifiers modifiers)
+{
+    // ShiftMask, LockMask, ControlMask, Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, and Mod5Mask
+    quint32 native = 0;
+    if (modifiers & Qt::ShiftModifier)
+        native |= ShiftMask;
+    if (modifiers & Qt::ControlModifier)
+        native |= ControlMask;
+    if (modifiers & Qt::AltModifier)
+        native |= Mod1Mask;
+    if (modifiers & Qt::MetaModifier)
+        native |= Mod4Mask;
+    // TODO: resolve these?
+    //if (modifiers & Qt::KeypadModifier)
+    //if (modifiers & Qt::GroupSwitchModifier)
+    return native;
+}
+
+quint32 QxtGlobalShortcutPrivate::nativeKeycode(Qt::Key key)
+{
+    // (davidsansome) Try the table from QKeyMapper first - this seems to be
+    // the only way to get Keysyms for the media keys.
+    unsigned int keysym = 0;
+    int i = 0;
+    while (KeyTbl[i]) {
+      if (KeyTbl[i+1] == static_cast<uint>(key)) {
+        keysym = KeyTbl[i];
+        break;
+      }
+      i += 2;
+    }
+
+    // If that didn't work then fall back on XStringToKeysym
+    if (!keysym) {
+      keysym = XStringToKeysym(QKeySequence(key).toString().toLatin1().data());
+    }
+
+    Display* display = QX11Info::display();
+    return XKeysymToKeycode(display, keysym);
+}
+
+bool QxtGlobalShortcutPrivate::registerShortcut(quint32 nativeKey, quint32 nativeMods)
+{
+    Display* display = QX11Info::display();
+    Window window = QX11Info::appRootWindow();
+    Bool owner = True;
+    int pointer = GrabModeAsync;
+    int keyboard = GrabModeAsync;
+    error = false;
+    original_x_errhandler = XSetErrorHandler(qxt_x_errhandler);
+    XGrabKey(display, nativeKey, nativeMods, window, owner, pointer, keyboard);
+    XGrabKey(display, nativeKey, nativeMods | Mod2Mask, window, owner, pointer, keyboard); // allow numlock
+    XSync(display, False);
+    XSetErrorHandler(original_x_errhandler);
+    return !error;
+}
+
+bool QxtGlobalShortcutPrivate::unregisterShortcut(quint32 nativeKey, quint32 nativeMods)
+{
+    Display* display = QX11Info::display();
+    Window window = QX11Info::appRootWindow();
+    error = false;
+    original_x_errhandler = XSetErrorHandler(qxt_x_errhandler);
+    XUngrabKey(display, nativeKey, nativeMods, window);
+    XUngrabKey(display, nativeKey, nativeMods | Mod2Mask, window); // allow numlock
+    XSync(display, False);
+    XSetErrorHandler(original_x_errhandler);
+    return !error;
+}
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 18466dc..9b16fe2 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -5,13 +5,13 @@ cmake_minimum_required(VERSION 2.6)
 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;TGZ")
+set(CPACK_GENERATOR "DEB;RPM;TBZ2")
 set(DEBIAN_PACKAGE_DESCRIPTION "Qt4/KDE4 Client for MPD")
 set(DEBIAN_PACKAGE_SECTION "kde4")
 set(CPACK_SOURCE_GENERATOR "TBZ2")
 set(CPACK_PACKAGE_VERSION_MAJOR "1")
-set(CPACK_PACKAGE_VERSION_MINOR "1")
-set(CPACK_PACKAGE_VERSION_PATCH "3")
+set(CPACK_PACKAGE_VERSION_MINOR "2")
+set(CPACK_PACKAGE_VERSION_PATCH "2")
 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}")
@@ -21,21 +21,29 @@ set(CPACK_PACKAGE_FILE_NAME "${CMAKE_PROJECT_NAME}-${CANTATA_VERSION_FULL}${CPAC
 set(CPACK_SOURCE_IGNORE_FILES  "/.svn/;CMakeLists.txt.user")
 include(CPack)
 
-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)
-option(ENABLE_HTTP_STREAM_PLAYBACK "Enable playback of MPD HTTP streams(Phonon required for Qt4, QtMultimedia for Qt5)" OFF)
+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)
+option(ENABLE_HTTP_STREAM_PLAYBACK "Enable playback of MPD HTTP streams (Phonon required for Qt4, QtMultimedia for Qt5)" OFF)
+if (WIN32)
+    option(ENABLE_HTTPS_SUPPORT "Enable HTTPS URLs for Last.fm, Wikipedia, SoundCloud, etc. (Requires a Qt built with SSL support)" OFF)
+else (WIN32)
+    option(ENABLE_HTTPS_SUPPORT "Enable HTTPS URLs for Last.fm, Wikipedia, SoundCloud, etc." ON)
+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_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)" 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_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)
 
 if (ENABLE_QT5)
     set(ENABLE_KDE FALSE)
@@ -45,27 +53,177 @@ if (ENABLE_UDISKS2)
     set(WITH_SOLID_UDISKS2 ON)
 endif (ENABLE_UDISKS2)
 
+if (ENABLE_TAGLIB)
+    set(TAGLIB_MIN_VERSION "1.6")
+    find_package(Taglib)
+endif (ENABLE_TAGLIB)
+
+if (TAGLIB_FOUND)
+    if (ENABLE_CDPARANOIA)
+        find_package(Cdparanoia)
+        if (CDPARANOIA_FOUND)
+            if (ENABLE_CDDB)
+                find_package(CDDB)
+            endif (ENABLE_CDDB)
+            if (ENABLE_MUSICBRAINZ)
+                find_package(MusicBrainz5)
+            endif (ENABLE_MUSICBRAINZ)
+        endif (CDPARANOIA_FOUND)
+    endif (ENABLE_CDPARANOIA)
+
+    set(ENABLE_TAGEDITOR_SUPPORT 1)
+    set(ENABLE_TRACKORGANIZER_SUPPORT 1)
+    include(CheckCXXSourceCompiles)
+    set(CMAKE_REQUIRED_INCLUDES "${TAGLIB_INCLUDES}")
+    set(CMAKE_REQUIRED_LIBRARIES "${TAGLIB_LIBRARIES}")
+
+    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)
+
+    set(CMAKE_REQUIRED_INCLUDES)
+    set(CMAKE_REQUIRED_LIBRARIES)
+
+    set(TAGLIB-EXTRAS_MIN_VERSION "1.0")
+    if (ENABLE_TAGLIB_EXTRAS)
+        find_package(Taglib-Extras)
+    endif (ENABLE_TAGLIB_EXTRAS)
+    set(TAGLIB_EXTRAS_FOUND ${TAGLIB-EXTRAS_FOUND}) # we need a c-compatible name for the include file
+
+    include(CheckTagLibFileName)
+    check_taglib_filename(COMPLEX_TAGLIB_FILENAME)
+
+    add_definitions(${TAGLIB_CFLAGS})
+    if (TAGLIB-EXTRAS_FOUND)
+        include_directories(${TAGLIB-EXTRAS_INCLUDES})
+        add_definitions(${TAGLIB-EXTRAS_CFLAGS})
+    endif (TAGLIB-EXTRAS_FOUND)
+
+    if (ENABLE_FFMPEG)
+        find_package(FFMPEG)
+    endif (ENABLE_FFMPEG)
+    if (ENABLE_MPG123)
+        find_package(MPG123)
+    endif (ENABLE_MPG123)
+    if (ENABLE_SPEEXDSP AND (FFMPEG_FOUND OR MPG123_FOUND))
+        find_package(SPEEXDSP)
+    endif (ENABLE_SPEEXDSP AND (FFMPEG_FOUND OR MPG123_FOUND))
+    if (ENABLE_MTP AND NOT WIN32 AND NOT APPLE)
+        find_package(Mtp)
+    endif (ENABLE_MTP AND NOT WIN32 AND NOT APPLE)
+endif (TAGLIB_FOUND)
+
+if (ENABLE_QT5)
+    find_package(Qt5Widgets REQUIRED)
+    find_package(Qt5Xml REQUIRED)
+    find_package(Qt5Network REQUIRED)
+    find_package(Qt5Concurrent REQUIRED)
+    set(QTCORELIBS ${Qt5Core_LIBRARIES})
+    set(QTNETWORKLIBS ${Qt5Network_LIBRARIES})
+    set(QTGUILIBS ${Qt5Gui_LIBRARIES})
+    set(QTLIBS ${QTCORELIBS} ${Qt5Widgets_LIBRARIES} ${QTNETWORKLIBS} ${QTGUILIBS} ${Qt5Xml_LIBRARIES} ${Qt5Concurrent_LIBRARIES})
+    set(QTINCLUDES ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Network_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS} ${Qt5Core_INCLUDE_DIRS} ${Qt5Concurrent_INCLUDE_DIRS})
+    add_definitions(${Qt5Widgets_DEFINITIONS} ${Qt5Network_DEFINITIONS} ${Qt5Xml_DEFINITIONS} ${Qt5Concurrent_DEFINITIONS})
+    set(CMAKE_CXX_FLAGS "${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
+    find_package(Qt5DBus)
+    if (Qt5DBus_FOUND)
+        set(QT_QTDBUS_FOUND 1) # required for config.h !!!
+        set(QTLIBS ${QTLIBS} ${Qt5DBus_LIBRARIES})
+        set(QTINCLUDES ${QTINCLUDES} ${Qt5DBus_INCLUDE_DIRS})
+        add_definitions(${Qt5DBus_DEFINITIONS})
+    endif (Qt5DBus_FOUND)
+else (ENABLE_QT5)
+    find_package(Qt4 REQUIRED QtCore QtGui QtXml QtNetwork)
+    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})
+    if (QT_QTDBUS_FOUND)
+        set(QTLIBS ${QTLIBS} ${QT_QTDBUS_LIBRARY})
+    endif (QT_QTDBUS_FOUND)
+    set(QTINCLUDES ${QT_INCLUDES})
+    add_definitions(-DQT_NO_STL -DQT_NO_CAST_TO_ASCII -Wall -Wextra)
+endif (ENABLE_QT5)
+
+if (ENABLE_HTTP_STREAM_PLAYBACK)
+    if (ENABLE_QT5)
+        find_package(Qt5Multimedia REQUIRED)
+        set(QTLIBS ${QTLIBS} ${Qt5Multimedia_LIBRARIES})
+        set(QTINCLUDES ${QTINCLUDES} ${Qt5Multimedia_INCLUDES})
+        add_definitions(${Qt5Multimedia_DEFINITIONS})
+    else (ENABLE_QT5)
+        find_package(Phonon REQUIRED)
+    endif (ENABLE_QT5)
+endif (ENABLE_HTTP_STREAM_PLAYBACK)
+
+if (ENABLE_KDE)
+    find_package(KDE4 REQUIRED)
+    add_definitions(-DENABLE_KDE_SUPPORT)
+    set(ENABLE_KDE_SUPPORT TRUE)
+endif (ENABLE_KDE)
+
+if (NOT ENABLE_QT5 AND NOT WIN32 AND NOT APPLE)
+    find_package(QJSON)
+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})
+
+# QJSon and MusicBrainz require exceptions to be enabled!
+if (CMAKE_COMPILER_IS_GNUCXX)
+   add_definitions("-fexceptions -UQT_NO_EXCEPTIONS")
+endif (CMAKE_COMPILER_IS_GNUCXX)
+if (CMAKE_C_COMPILER MATCHES "icc")
+   add_definitions(-fexceptions)
+endif (CMAKE_C_COMPILER MATCHES "icc")
+if (MSVC)
+   add_definitions(-EHsc)
+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
     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/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/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
     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
     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/volumecontrol.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/toolbar.cpp widgets/menubutton.cpp
     widgets/toolbutton.cpp widgets/wizardpage.cpp widgets/statuslabel.cpp widgets/searchwidget.cpp widgets/messageoverlay.cpp
-    widgets/basicitemdelegate.cpp
+    widgets/basicitemdelegate.cpp widgets/sizegrip.cpp widgets/sizewidget.cpp widgets/servicestatuslabel.cpp widgets/spacerwidget.cpp
+    widgets/songdialog.cpp
     network/networkaccessmanager.cpp network/networkproxyfactory.cpp
+    http/httpserversettings.cpp http/httpserver.cpp http/httpsocket.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
@@ -75,19 +233,20 @@ 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/streamspage.h streams/streamdialog.h streams/streamfetcher.h streams/digitallyimportedsettings.h streams/streamssettings.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/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
     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/volumecontrol.h
-    widgets/genrecombo.h widgets/toolbar.h widgets/searchwidget.h widgets/messageoverlay.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
     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
@@ -95,94 +254,30 @@ set(CANTATA_MOC_HDRS
 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/streamspage.ui streams/digitallyimportedsettings.ui streams/streamssettings.ui
     dynamic/dynamicpage.ui dynamic/dynamicrule.ui dynamic/dynamicrules.ui
     context/togglelist.ui context/othersettings.ui
     widgets/itemview.ui
-    online/onlineservicespage.ui)
-
-if (ENABLE_TAGLIB)
-    set(TAGLIB_MIN_VERSION "1.6")
-    find_package(Taglib)
-    if (TAGLIB_FOUND AND ENABLE_CDPARANOIA)
-        find_package(Cdparanoia)
-        if (CDPARANOIA_FOUND) 
-            if (ENABLE_CDDB)
-                find_package(CDDB)
-            endif (ENABLE_CDDB)
-            if (ENABLE_MUSICBRAINZ)
-                find_package(MusicBrainz5)
-            endif (ENABLE_MUSICBRAINZ)
-        endif (CDPARANOIA_FOUND)
-    endif (TAGLIB_FOUND AND ENABLE_CDPARANOIA)
-endif (ENABLE_TAGLIB)
-
-if (NOT ENABLE_QT5 AND NOT WIN32)
-    find_package(QJSON)
-endif (NOT ENABLE_QT5 AND NOT WIN32)
-
-if (ENABLE_OVERLAYSCROLLBARS)
-    add_definitions(-DENABLE_OVERLAYSCROLLBARS)
-endif (ENABLE_OVERLAYSCROLLBARS)
-
-if (TAGLIB_FOUND)
-    set(CANTATA_SRCS ${CANTATA_SRCS}
-        tags/tageditor.cpp tags/trackorganiser.cpp tags/tags.cpp
-        devices/filenameschemedialog.cpp
-        http/httpserversettings.cpp http/httpserver.cpp http/httpsocket.cpp)
-    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS}
-        tags/tageditor.h tags/trackorganiser.h
-        http/httpserversettings.h http/httpsocket.h
-        devices/filenameschemedialog.h devices/device.h)
-    set(CANTATA_UIS ${CANTATA_UIS}
-        http/httpserversettings.ui
-        tags/tageditor.ui tags/trackorganiser.ui
-        devices/filenameschemedialog.ui)
-endif (TAGLIB_FOUND)
-
-if (NOT WIN32)
-    set(CANTATA_SRCS ${CANTATA_SRCS} dbus/mpris.cpp dbus/gnomemediakeys.cpp devices/mountpoints.cpp)
-    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} dbus/mpris.h dbus/gnomemediakeys.h devices/mountpoints.h)
+    http/httpserversettings.ui
+    online/onlineservicespage.ui online/onlinesettings.ui)
+
+if (ENABLE_MODEL_TEST AND NOT ENABLE_KDE AND NOT ENABLE_QT5)
+    set(QTLIBS ${QTLIBS} ${QT_QTTEST_LIBRARY})
+    set(CANTATA_SRCS ${CANTATA_SRCS} models/modeltest.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} models/modeltest.h)
+    set(CMAKE_BUILD_TYPE "Debug")
+endif (ENABLE_MODEL_TEST AND NOT ENABLE_KDE AND NOT ENABLE_QT5)
+
+if (QT_QTDBUS_FOUND)
+    if (NOT ENABLE_KDE)
+        set(CANTATA_SRCS ${CANTATA_SRCS} dbus/gnomemediakeys.cpp)
+        set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} dbus/gnomemediakeys.h)
+        set_SOURCE_FILES_PROPERTIES(dbus/org.gnome.SettingsDaemon.xml dbus/org.gnome.SettingsDaemon.MediaKeys.xml PROPERTIES NO_NAMESPACE TRUE)
+    endif (NOT ENABLE_KDE)
+    set(CANTATA_SRCS ${CANTATA_SRCS} dbus/mpris.cpp dbus/powermanagement.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} dbus/mpris.h dbus/powermanagement.h)
     set(CANTATA_SRCS ${CANTATA_SRCS} dbus/notify.cpp)
     set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} dbus/notify.h)
-endif (NOT WIN32)
-
-set(CANTATA_RCS cantata.qrc)
-
-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})
-
-if (ENABLE_QT5)
-    find_package(Qt5Widgets REQUIRED)
-    find_package(Qt5Xml REQUIRED)
-    find_package(Qt5Network REQUIRED)
-    find_package(Qt5Concurrent REQUIRED)
-    set(QTCORELIBS ${Qt5Core_LIBRARIES})
-    set(QTLIBS ${QTCORELIBS} ${Qt5Widgets_LIBRARIES} ${Qt5Network_LIBRARIES} ${Qt5Xml_LIBRARIES} ${Qt5Concurrent_LIBRARIES})
-    set(QTINCLUDES ${Qt5Widgets_INCLUDE_DIRS} ${Qt5Network_INCLUDE_DIRS} ${Qt5Xml_INCLUDE_DIRS} ${Qt5Core_INCLUDE_DIRS} ${Qt5Concurrent_INCLUDE_DIRS})
-    add_definitions(${Qt5Widgets_DEFINITIONS} ${Qt5Network_DEFINITIONS} ${Qt5Xml_DEFINITIONS} ${Qt5Concurrent_DEFINITIONS})
-    set(CMAKE_CXX_FLAGS "${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
-    if (NOT WIN32)
-        find_package(Qt5DBus REQUIRED)
-        set(QTLIBS ${QTLIBS} ${Qt5DBus_LIBRARIES})
-        set(QTINCLUDES ${QTINCLUDES} ${Qt5DBus_INCLUDE_DIRS})
-        add_definitions(${Qt5DBus_DEFINITIONS})
-    endif (NOT WIN32)
-else (ENABLE_QT5)
-    find_package(Qt4 REQUIRED QtCore QtGui QtXml QtNetwork)
-    set(QTCORELIBS ${QT_QTCORE_LIBRARY})
-    set(QTLIBS ${QT_QTSVG_LIBRARY} ${QT_QTXML_LIBRARY} ${QTCORELIBS} ${QT_QTGUI_LIBRARY} ${QT_QTNETWORK_LIBRARY} ${QT_QTDBUS_LIBRARY})
-    set(QTINCLUDES ${QT_INCLUDES})
-    add_definitions(-DQT_NO_STL -DQT_NO_CAST_TO_ASCII -Wall -Wextra)
-endif (ENABLE_QT5)
-
-find_package(ZLIB REQUIRED)
-
-if (NOT WIN32)
-    set_SOURCE_FILES_PROPERTIES(dbus/org.gnome.SettingsDaemon.xml dbus/org.gnome.SettingsDaemon.MediaKeys.xml PROPERTIES NO_NAMESPACE TRUE)
 
     if (ENABLE_QT5)
         qt5_add_dbus_adaptor(CANTATA_SRCS dbus/org.mpris.MediaPlayer2.Player.xml dbus/mpris.h Mpris)
@@ -192,93 +287,50 @@ if (NOT WIN32)
         qt5_add_dbus_interfaces(CANTATA_SRCS dbus/org.freedesktop.UPower.xml)
         qt5_add_dbus_interfaces(CANTATA_SRCS dbus/org.gnome.SettingsDaemon.xml)
         qt5_add_dbus_interfaces(CANTATA_SRCS dbus/org.gnome.SettingsDaemon.MediaKeys.xml)
+        qt5_add_dbus_interfaces(CANTATA_SRCS dbus/org.kde.Solid.PowerManagement.PolicyAgent.xml)
+        qt5_add_dbus_interfaces(CANTATA_SRCS dbus/org.freedesktop.PowerManagement.Inhibit.xml)
     else (ENABLE_QT5)
-        if ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 4) )
+        if ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 2) )
             qt4_add_dbus_adaptor(CANTATA_SRCS dbus/org.mpris.MediaPlayer2.Player.OLD.xml dbus/mpris.h Mpris)
-        else ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 4) )
+        else ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 2) )
             qt4_add_dbus_adaptor(CANTATA_SRCS dbus/org.mpris.MediaPlayer2.Player.xml dbus/mpris.h Mpris)
-        endif ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 4) )
+        endif ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 2) )
         qt4_add_dbus_adaptor(CANTATA_SRCS dbus/org.mpris.MediaPlayer2.root.xml dbus/mpris.h Mpris)
         qt4_add_dbus_adaptor(CANTATA_SRCS dbus/com.googlecode.cantata.xml gui/mainwindow.h MainWindow)
-        if (NOT ENABLE_KDE_SUPPORT)
-            if ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 4) )
-                qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.freedesktop.Notifications.OLD.xml)
-            else ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 4) )
-                qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.freedesktop.Notifications.xml)
-            endif ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 4) )
+        if ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 2) )
+            qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.freedesktop.Notifications.OLD.xml)
+        else ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 2) )
+            qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.freedesktop.Notifications.xml)
+        endif ( (QT_VERSION_MINOR LESS 8) OR (QT_VERSION_MINOR EQUAL 8 AND QT_VERSION_PATCH LESS 2) )
+        if (NOT ENABLE_KDE)
             qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.freedesktop.UPower.xml)
-        endif (NOT ENABLE_KDE_SUPPORT)
-        qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.gnome.SettingsDaemon.xml)
-        qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.gnome.SettingsDaemon.MediaKeys.xml)
+            qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.gnome.SettingsDaemon.xml)
+            qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.gnome.SettingsDaemon.MediaKeys.xml)
+        endif (NOT ENABLE_KDE)
+        qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.kde.Solid.PowerManagement.PolicyAgent.xml)
+        qt4_add_dbus_interfaces(CANTATA_SRCS dbus/org.freedesktop.PowerManagement.Inhibit.xml)
     endif (ENABLE_QT5)
-endif (NOT WIN32)
+endif (QT_QTDBUS_FOUND)
 
-if (ENABLE_KDE)
-    find_package(KDE4 REQUIRED)
-    add_definitions(-DENABLE_KDE_SUPPORT)
-    set(ENABLE_KDE_SUPPORT TRUE)
-endif (ENABLE_KDE)
+if (NOT WIN32 AND NOT APPLE)
+    set(CANTATA_SRCS ${CANTATA_SRCS} devices/mountpoints.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} devices/mountpoints.h)
+endif (NOT WIN32 AND NOT APPLE)
 
-if (ENABLE_HTTP_STREAM_PLAYBACK)
-    if (ENABLE_QT5)
-        find_package(Qt5Multimedia REQUIRED)
-        set(QTLIBS ${QTLIBS} ${Qt5Multimedia_LIBRARIES})
-        set(QTINCLUDES ${QTINCLUDES} ${Qt5Multimedia_INCLUDES})
-        add_definitions(${Qt5Multimedia_DEFINITIONS})
-    else (ENABLE_QT5)
-        find_package(Phonon REQUIRED)
-    endif (ENABLE_QT5)
-endif (ENABLE_HTTP_STREAM_PLAYBACK)
+set(CANTATA_RCS cantata.qrc)
 
 if (TAGLIB_FOUND)
-    set(ENABLE_TAGEDITOR_SUPPORT 1)
-    set(ENABLE_TRACKORGANIZER_SUPPORT 1)
-    include(CheckCXXSourceCompiles)
-    set(CMAKE_REQUIRED_INCLUDES "${TAGLIB_INCLUDES}")
-    set(CMAKE_REQUIRED_LIBRARIES "${TAGLIB_LIBRARIES}")
-
-    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)
-
-    set(CMAKE_REQUIRED_INCLUDES)
-    set(CMAKE_REQUIRED_LIBRARIES)
-
-    set(TAGLIB-EXTRAS_MIN_VERSION "1.0")
-    if (ENABLE_TAGLIB_EXTRAS)
-        find_package(Taglib-Extras)
-    endif (ENABLE_TAGLIB_EXTRAS)
-    set(TAGLIB_EXTRAS_FOUND ${TAGLIB-EXTRAS_FOUND}) # we need a c-compatible name for the include file
-
-    include(CheckTagLibFileName)
-    check_taglib_filename(COMPLEX_TAGLIB_FILENAME)
-
-    add_definitions(${TAGLIB_CFLAGS})
-    if (TAGLIB-EXTRAS_FOUND)
-        include_directories(${TAGLIB-EXTRAS_INCLUDES})
-        add_definitions(${TAGLIB-EXTRAS_CFLAGS})
-    endif (TAGLIB-EXTRAS_FOUND)
+    set(CANTATA_SRCS ${CANTATA_SRCS}
+        tags/tageditor.cpp tags/trackorganiser.cpp
+        devices/filenameschemedialog.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS}
+        tags/tageditor.h tags/trackorganiser.h
+        devices/filenameschemedialog.h devices/device.h)
+    set(CANTATA_UIS ${CANTATA_UIS}
+        tags/tageditor.ui tags/trackorganiser.ui
+        devices/filenameschemedialog.ui)
 
-    if (ENABLE_FFMPEG)
-        find_package(FFMPEG)
-    endif (ENABLE_FFMPEG)
-    if (ENABLE_MPG123)
-        find_package(MPG123)
-    endif (ENABLE_MPG123)
     if (FFMPEG_FOUND OR MPG123_FOUND)
-        if (ENABLE_SPEEXDSP)
-            find_package(SPEEXDSP)
-        endif (ENABLE_SPEEXDSP)
         include_directories(${CMAKE_SOURCE_DIR}/replaygain)
         set(CANTATA_SRCS ${CANTATA_SRCS} replaygain/albumscanner.cpp replaygain/rgdialog.cpp replaygain/tagreader.cpp replaygain/jobcontroller.cpp)
         set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} replaygain/albumscanner.h replaygain/rgdialog.h replaygain/tagreader.h replaygain/jobcontroller.h)
@@ -286,17 +338,20 @@ if (TAGLIB_FOUND)
         set(ENABLE_REPLAYGAIN_SUPPORT 1)
         add_subdirectory(replaygain)
     endif (FFMPEG_FOUND OR MPG123_FOUND)
-
-    if (WIN32)
-        set(CANTATA_SRCS ${CANTATA_SRCS} devices/device.cpp tags/filetyperesolver.cpp)
-    else (WIN32)
+    if (ENABLE_EXTERNAL_TAGS)
+        set(CANTATA_SRCS ${CANTATA_SRCS} tags/tagclient.cpp)
+        add_subdirectory(tags)
+    else (ENABLE_EXTERNAL_TAGS)
+        set(CANTATA_SRCS ${CANTATA_SRCS} tags/tags.cpp tags/filetyperesolver.cpp)
+    endif (ENABLE_EXTERNAL_TAGS)
+
+    if (WIN32 OR APPLE)
+        set(CANTATA_SRCS ${CANTATA_SRCS} devices/device.cpp)
+    else (WIN32 OR APPLE)
         set(ENABLE_DEVICES_SUPPORT 1)
-        if (NOT ENABLE_KDE_SUPPORT)
+        if (NOT ENABLE_KDE)
             add_subdirectory(3rdparty/solid-lite)
-        endif (NOT ENABLE_KDE_SUPPORT)
-        if (ENABLE_MTP)
-            find_package(Mtp)
-        endif (ENABLE_MTP)
+        endif (NOT ENABLE_KDE)
         if (MTP_FOUND)
             set(CANTATA_SRCS ${CANTATA_SRCS} devices/mtpdevice.cpp)
             set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} devices/mtpdevice.h)
@@ -319,7 +374,7 @@ if (TAGLIB_FOUND)
 
         set(CANTATA_SRCS ${CANTATA_SRCS} devices/devicespage.cpp devices/filejob.cpp
                 devices/device.cpp devices/fsdevice.cpp devices/umsdevice.cpp
-                models/devicesmodel.cpp tags/filetyperesolver.cpp devices/actiondialog.cpp devices/devicepropertieswidget.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
                 online/onlinedevice.cpp)
@@ -345,43 +400,35 @@ if (TAGLIB_FOUND)
             add_subdirectory(devices/mounter)
             add_subdirectory(devices/avahi)
         endif (ENABLE_REMOTE_DEVICES)
-    endif (WIN32)
+    endif (WIN32 OR APPLE)
 endif (TAGLIB_FOUND)
 
-# QJSon and MusicBrainz require exceptions to be enabled!
-if (CMAKE_COMPILER_IS_GNUCXX)
-   add_definitions("-fexceptions -UQT_NO_EXCEPTIONS")
-endif (CMAKE_COMPILER_IS_GNUCXX)
-if (CMAKE_C_COMPILER MATCHES "icc")
-   add_definitions(-fexceptions)
-endif (CMAKE_C_COMPILER MATCHES "icc")
-if (MSVC)
-   add_definitions(-EHsc)
-endif (MSVC)
-
-add_subdirectory(po)
-add_subdirectory(support)
-add_subdirectory(streams/icons)
-
 if (ENABLE_PROXY_CONFIG)
     set(CANTATA_SRCS ${CANTATA_SRCS} network/proxysettings.cpp)
     set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} network/proxysettings.h)
     set(CANTATA_UIS ${CANTATA_UIS} network/proxysettings.ui)
 endif (ENABLE_PROXY_CONFIG)
 
-if (ENABLE_KDE_SUPPORT)
+add_subdirectory(po)
+add_subdirectory(support)
+add_subdirectory(streams/icons)
+add_subdirectory(streams/providers)
+add_subdirectory(online/icons)
+
+if (ENABLE_KDE)
     include_directories(${KDE4_INCLUDES})
     add_definitions(${KDE4_DEFINITIONS})
     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)
-    if (NOT WIN32 AND TAGLIB_FOUND AND ENABLE_REMOTE_DEVICES)
+    if (NOT WIN32 AND NOT APPLE AND TAGLIB_FOUND AND ENABLE_REMOTE_DEVICES)
         target_link_libraries(cantata ${KDE4_KFILE_LIBS})
-    endif (NOT WIN32 AND TAGLIB_FOUND AND ENABLE_REMOTE_DEVICES)
+    endif (NOT WIN32 AND NOT APPLE AND TAGLIB_FOUND AND ENABLE_REMOTE_DEVICES)
     install(TARGETS cantata ${INSTALL_TARGETS_DEFAULT_ARGS})
-else (ENABLE_KDE_SUPPORT)
+else (ENABLE_KDE)
     if (WIN32)
+        add_definitions(-DWIN32)
         add_subdirectory(windows)
         set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} gui/application.h)
         if (NOT CANTATA_WINDOWS_INSTALLER_DEST)
@@ -399,6 +446,9 @@ else (ENABLE_KDE_SUPPORT)
     endif (WIN32)
 
     set(CANTATA_RCS ${CANTATA_RCS} cantata_qt.qrc)
+    set(CANTATA_SRCS ${CANTATA_SRCS} gui/shortcutssettingspage.cpp gui/mediakeys.cpp)
+    set(CANTATA_MOC_HDRS ${CANTATA_MOC_HDRS} gui/shortcutssettingspage.h gui/multimediakeysinterface.h)
+
     if (ENABLE_QT5)
         QT5_ADD_RESOURCES(CANTATA_RC_SRCS ${CANTATA_RCS})
         QT5_WRAP_UI(CANTATA_UI_HDRS ${CANTATA_UIS})
@@ -410,15 +460,31 @@ else (ENABLE_KDE_SUPPORT)
         QT4_WRAP_CPP(CANTATA_MOC_SRCS ${CANTATA_MOC_HDRS})
     endif (ENABLE_QT5)
 
+    if (WIN32 OR APPLE OR NOT ENABLE_QT5)
+        add_definitions(-DQXT_STATIC)
+        add_subdirectory(3rdparty/qxt)
+        include_directories(${CMAKE_SOURCE_DIR}/3rdparty/qxt)
+        set(CANTATA_SRCS ${CANTATA_SRCS} gui/qxtmediakeys.cpp)
+    endif (WIN32 OR APPLE OR NOT ENABLE_QT5)
+
     if (WIN32)
         set(CMAKE_BUILD_TYPE "Release")
         ADD_EXECUTABLE(cantata WIN32 ${CANTATA_SRCS} ${CANTATA_MOC_SRCS} ${CANTATA_RC_SRCS} ${CANTATA_UI_HDRS} ${CANTATA_PO})
         install(TARGETS cantata DESTINATION ${CMAKE_INSTALL_PREFIX})
+    elseif (APPLE)
+        ADD_EXECUTABLE(cantata MACOSX_BUNDLE ${CANTATA_SRCS} ${CANTATA_MOC_SRCS} ${CANTATA_RC_SRCS} ${CANTATA_UI_HDRS} ${CANTATA_PO})
+        #ADD_EXECUTABLE(cantata ${CANTATA_SRCS} ${CANTATA_MOC_SRCS} ${CANTATA_RC_SRCS} ${CANTATA_UI_HDRS} ${CANTATA_PO})
+        set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR})
+        set(MACOSX_BUNDLE_BUNDLE_NAME Cantata)
+        SET(MACOSX_BUNDLE_SHORT_VERSION_STRING ${CANATA_VERSION})
+        SET(MACOSX_BUNDLE_VERSION ${CANATA_VERSION})
+        SET(MACOSX_BUNDLE_LONG_VERSION_STRING ${CANTATA_VERSION_FULL})
+        set(MACOSX_BUNDLE_ICON_FILE "cantata.icns")
+        add_subdirectory(mac)
+        include(DeployQt4)
+        INSTALL_QT4_EXECUTABLE("cantata.app" "qjpeg;qsvg;qsvgicon")
     else (WIN32)
         ADD_EXECUTABLE(cantata ${CANTATA_SRCS} ${CANTATA_MOC_SRCS} ${CANTATA_RC_SRCS} ${CANTATA_UI_HDRS})
-        if (NOT ENABLE_QT5)
-            target_link_libraries(cantata X11)
-        endif (NOT ENABLE_QT5)
         install(TARGETS cantata RUNTIME DESTINATION bin LIBRARY DESTINATION lib ARCHIVE DESTINATION lib)
     endif (WIN32)
 
@@ -428,16 +494,22 @@ else (ENABLE_KDE_SUPPORT)
         add_subdirectory(3rdparty/qtsingleapplication)
         target_link_libraries(cantata qtsingleapplication)
     endif (WIN32)
-endif (ENABLE_KDE_SUPPORT)
+    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 (ENABLE_HTTP_STREAM_PLAYBACK AND NOT ENABLE_QT5)
     target_link_libraries(cantata ${PHONON_LIBS})
     include_directories(${PHONON_INCLUDES})
 endif (ENABLE_HTTP_STREAM_PLAYBACK AND NOT ENABLE_QT5)
 
-if (WIN32)
+if (WIN32 OR APPLE)
     # install(FILES mpd/mpd.conf.template DESTINATION ${CMAKE_INSTALL_PREFIX}/mpd)
-else (WIN32)
+else (WIN32 OR APPLE)
     install(PROGRAMS dynamic/cantata-dynamic DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/scripts)
     install(FILES mpd/mpd.conf.template DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/mpd)
 
@@ -457,11 +529,11 @@ else (WIN32)
             target_link_libraries(cantata ${MUSICBRAINZ5_LIBRARIES})
             include_directories(${MUSICBRAINZ5_INCLUDE_DIR})
         endif (MUSICBRAINZ5_FOUND)
-        if (ENABLE_KDE_SUPPORT)
+        if (ENABLE_KDE)
             install(FILES cantata-play-audiocd.desktop DESTINATION ${DATA_INSTALL_DIR}/solid/actions)
-        endif (ENABLE_KDE_SUPPORT)
+        endif (ENABLE_KDE)
     endif (CDDB_FOUND OR MUSICBRAINZ5_FOUND)
-endif (WIN32)
+endif (WIN32 OR APPLE)
 
 if (QJSON_FOUND)
     include_directories(${QJSON_INCLUDE_DIR})
@@ -478,18 +550,22 @@ target_link_libraries(cantata support qtiocompressor ${QTLIBS} ${ZLIB_LIBRARIES}
 include_directories(${QTINCLUDES} ${ZLIB_INCLUDE_DIRS})
 
 if (TAGLIB_FOUND)
+    # Cantata still links to taglib, even if external tag reader/writer is used,
+    # because JamendoService uses taglib for ID3 genres.
     target_link_libraries(cantata ${TAGLIB_LIBRARIES})
     include_directories(${TAGLIB_INCLUDES})
-    if (TAGLIB-EXTRAS_FOUND)
-        target_link_libraries(cantata ${TAGLIB-EXTRAS_LIBRARIES})
-        include_directories(${TAGLIB-EXTRAS_INCLUDES})
-    endif (TAGLIB-EXTRAS_FOUND)
-    if (NOT ENABLE_KDE_SUPPORT AND NOT WIN32)
+    if (NOT ENABLE_EXTERNAL_TAGS)     
+        if (TAGLIB-EXTRAS_FOUND)
+            target_link_libraries(cantata ${TAGLIB-EXTRAS_LIBRARIES})
+            include_directories(${TAGLIB-EXTRAS_INCLUDES})
+        endif (TAGLIB-EXTRAS_FOUND)
+    endif (NOT ENABLE_EXTERNAL_TAGS)
+    if (NOT ENABLE_KDE AND NOT WIN32 AND NOT APPLE)
         target_link_libraries(cantata solidlite)
-    endif (NOT ENABLE_KDE_SUPPORT AND NOT WIN32)
-    if (ENABLE_REMOTE_DEVICES AND NOT WIN32)
+    endif (NOT ENABLE_KDE 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)
+    endif (ENABLE_REMOTE_DEVICES AND NOT WIN32 AND NOT APPLE)
 endif (TAGLIB_FOUND)
 
 # enable warnings
@@ -502,9 +578,9 @@ endif (UNIX AND NOT APPLE)
 configure_file(config.h.cmake ${CMAKE_BINARY_DIR}/config.h)
 
 message("")
-if (ENABLE_KDE_SUPPORT)
+if (ENABLE_KDE)
     message("INFO: Building KDE version")
-else (ENABLE_KDE_SUPPORT)
+else (ENABLE_KDE)
     if (NOT WIN32)
         if (ENABLE_QT5)
             message("INFO: Building Qt5 version")
@@ -512,7 +588,7 @@ else (ENABLE_KDE_SUPPORT)
             message("INFO: Building Qt4 version")
         endif (ENABLE_QT5)
     endif (NOT WIN32)
-endif (ENABLE_KDE_SUPPORT)
+endif (ENABLE_KDE)
 
 if (TAGLIB_FOUND)
 
@@ -542,28 +618,33 @@ if (TAGLIB_FOUND)
         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_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)
+        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)
-        if (NOT AUDIOCD_SUPPORT AND NOT WIN32)
+        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)
+        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_SUPPORT)
+        if (NOT ENABLE_PROXY_CONFIG AND NOT ENABLE_KDE)
             message("        - Proxy configuration")
-        endif (NOT ENABLE_PROXY_CONFIG AND NOT ENABLE_KDE_SUPPORT)
-    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_SUPPORT))
-
+        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))
+
+    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!!!")
+    endif (ENABLE_EXTERNAL_TAGS)
 else (TAGLIB_FOUND)
 
     message("      Disabled features:")
@@ -572,15 +653,13 @@ else (TAGLIB_FOUND)
     endif (NOT PHONON_FOUND)
     message("        - Tag Editor (taglib required)")
     message("        - Track Organizer (taglib required)")
-    message("        - Commandline support (taglib required)")
-    message("        - HTTP server support (taglib required)")
-    if (NOT WIN32)
+    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 and libmtp required)")
-    endif (NOT WIN32)
+        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)
@@ -598,3 +677,13 @@ if (NOT CMAKE_SYSTEM_NAME MATCHES Linux)
     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("")
+endif (ENABLE_MODEL_TEST AND NOT ENABLE_KDE AND NOT ENABLE_QT5)
diff --git a/ChangeLog b/ChangeLog
index 0a2b44b..ea0876e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,188 @@
-1.1.3
+1.2.2
+-----
+ 1. Fix British English translation.
+ 2. Improve internal HTTP security - only serve files to MPD host, and only
+    files in playqueue.
+ 3. Also remove CDDA files when Cantata exits.
+ 4. Improve error message if 'playlist_directory' does not exist.
+ 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
+    be added.
+ 8. If Ctrl-F is activated again whilst search widget is visible, then select
+    all current text.
+ 9. When MPD seeks a Cantata HTTP stream, set the Content-Range header field.
+    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
+    start-up.
+13. Fix broken spinboxes in some dialogs with Gtk style.
+14. Correctly style treeview in CD details dialog.
+15. Only show artist name of CD track if it does not start with main CD artist.
+16. Show track numbers in CD listing.
+
+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.
+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.
+6. Fix potential memory leak with cover images.
+7. Fix crash when changing online view from list to tree, after a soundcloud
+   search.
+8. Use MPD status.playlistLength to determine number of playqueue items when
+   controlling state of prev, next, and stop buttons.
+
+1.2.0
+-----
+ 1. Add support for opus audio format - AudioCD encoding, transcoding, HTTP
+    server, etc.
+ 2. Add support for user-installable stream providers. See README for file
+    format.
+ 3. Add config page to control which stream categories are enabled, to import
+    new categories, and to remove imported categories.
+ 4. Request IceCast stream list in compressed format.
+ 5. Add ShoutCast search.
+ 6. For some stream categories (digitally imported, jazzradio, rockradio, sky,
+    somaFm, and some user categories) add category name to stream name when it
+    is saved in favourites, or added to playqueue.
+ 7. Support composer tag - group albums via composer, edit tag, rename files
+    using tag, and use field for dynamic playlists.
+ 8. Place HTTP stream URL into connections page, as URL could be different per
+    connection.
+ 9. Use QListWidget in Qt preferences dialog, so that keyboard navigation can be
+    used.
+10. Add ability to 'filter search' stream categories.
+11. Add option to prevent system from suspending whilst playing (Linux only).
+12. If playqueue is cleared when dynamizer is running, then also stop dynamizer.
+13. Create a new SizeGrip class, so that we can force the size-grip on the main
+    window to have the same height as toolbuttons - this makes it align to the
+    bottom.
+14. Place a 0-pixel wide 'size widget' at the bottom of each view, to attempt to
+    ensure consistent sizes between views.
+15. Make playqueue search consistent with view search - ie. only show search on
+    activating 'Search Play Queue', do not toggle.
+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
+    '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
+    you downgrade Cantata, you will have issues (e.g. missing favourite
+    streams)
+21. Add two items to config file to modify cover-loading responsiveness. Please
+    see README for further details.
+22. Use "play" command if play button is pressed and there is no current song.
+23. Use HTTPS URLs for Last.fm, Wikipedia, SoundCloud, etc, for non-windows
+    builds.
+24. Only show genre combo if we have some genres.
+25. When parsing CUE files - attempt to load as UTF-8, and then "System"
+    encoding. Support a new config item, 'cueFileCodecs', which allows extra
+    Qt text-codecs to be tried (see README for details). If all of these fail,
+    then revert back to the previous behaviour.
+26. Don't build GNOME media-keys support into KDE builds, as these use KDE's
+    global keyboard shortcuts.
+27. With KDE builds, default to using media-keys as global shortcuts.
+28. Optionally support Qxt global shortcuts for Qt-only (Qt4) Linux and Windows
+    builds.
+29. Move media-keys setting into shortcuts page.
+30. Add a config item to disable all network access. Needs to be set manually,
+    see README for details.
+31. Add a config item to configure album-view to load all covers immediately,
+    rather than waiting for then to be displayed. Again, no UI for this, and
+    see README for details.
+32. Slimmer toolbar - song times are now at the ends of the time slider.
+33. Custom time slider and volume control.
+34. Optionally, prompt before clearing playqueue.
+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
+    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
+    this, always use Cantata's copy of KMessageWidget for all KDE builds.
+40. Cantata requires libMTP 1.1.0 or newer.
+41. When displaying paths, convert to native separators, and remove trailing
+    separator. When reading back entry, revert this process.
+42. Fix tag editing, track re-organisation, and playback of non-MPD files via
+    HTTP server on windows.
+43. Don't treat albums that have artists such as 'Abc' and 'Abc with xyz' as
+    multiple artist albums.
+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
+    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
+    details.
+48. Provide a CMake option to control whether KWallet is used to store MPD
+    passwords for KDE builds.
+49. Display total cache usage in Cache settings.
+50. Fix updating of current collecion in Cantata's menu when current collection
+    is set in settings dialog.
+51. Only load ListenLive categories when requested.
+52. In artists and albums views, add 'Add Albums In Random Order' entry to
+    context menu. When selected, all highlighted albums (or albums by
+    highlighted artists) will be added to playqueue in a random order.
+53. Add 'Shuffle Albums' entry to playqueue context menu.
+54. When showing a new page, place focus on view.
+55. If MPD's database time is invalid, and the cache's database time is
+    invalid, then accept a database listing. This works-around an issue with
+    using MPD's proxy DB in versions prior to 0.18.5  - where no database time
+    is sent. In this case, Cantata will store the current date and time in its
+    cache file. Users with a proxy DB (and using MPD version before 0;18.5)
+    will need to force Cantata to update to notice changes.
+56. Look for backdrop.jpg/png in music folder before attempting to download.
+57. Add option to store downloaded backdrops into music folder. Stored as
+    backdrop.jpg
+58. Fix crash when an album link is clicked on in context-view when current
+    song is from a Various Artists album and the album link is to another album
+    by the artist.
+59. Show device copy/delete status in Unity launcher - show current progress,
+    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.
+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
+    constructed.
+65. Using mouse wheel over position slider changes position by 5 seconds.
+66. Fix fetching lyrics for songs, or artists, containing ampersand or question
+    mark characters.
+67. Use correct output argument for oggenc and faac.
+68. Only load info of stored playlists when required.
+69. If looking for lyrics on lyrics.wikia.com, then use its search API to
+    locate lyrics page.
+70. Radio GFM streams.
+71. Fix lyrics scraping code for most providers.
+72. Add leoslyrics.com to list of lyrics providers.
+73. Align main popup menu to side of window.
+74. Use AlbumArt.jpg as default cover name for MTP devices. Android's gallery
+    application will ignore album covers if they are named this way.
+75. Don't allow configuring of filename for MTP devices. MTP device support
+    uses folder structure to determine 'Various Artists' album-artist (as LibMTP
+    does not support album artist tag).
+76. If song has a disc number set, then display song track as
+    "disc.track title" - e.g. "2.01 Blah blah"
+77. Better handling of Cantata stream URLs with special characters (e.g.
+    question marks)
+78. Remove Cantata streams when exiting.
+79. Update album's year if song year is changed in tag editor.
+80. If we can access a CUE file, but fail to parse it, then do not add CUE to
+    album's track list.
+81. Show MTP track list progress in percentages.
+82. Fix memleak with MTP devices.
+83. Open MTP devices in un-cached mode (faster)
+84. Add clear button to Qt input dialogs.
+
+1.1.3
 -----
  1. (Hopefully) fix selection order of items - and order added to playqueue.
  2. Updated translations: German, Spanish.
@@ -38,12 +222,12 @@
     of genres associated with artists.
  3. Fix decoding of details for Online service URLs sent to MPD, and
     subsequently read back.
- 4. Dont allow dragging of stream categories onto playqueue.
+ 4. Don't allow dragging of stream categories onto playqueue.
  5. Replace # in stream names with ${hash} when passing to MPD, and revert when
     URL is displayed.
  6. Fix covers when using album artist for multiple artist albums, and album
     artist name is "Various Artists" - but this has been translated in Cantata.
- 7. Dont draw item divider in icon views.
+ 7. Don't draw item divider in icon views.
  8. For Qt4 less than 4.8.4, then use old dbus Qt type annotations.
  9. Default to exporting favourites streams XML into home folder.
 10. Reset the covers-requested-per-iteration counter after each event loop
@@ -60,7 +244,7 @@
     passwords will be saved here.
  4. Fix reading of genres from cache file.
  5. Fix updating of genres after DB is refreshed.
- 6. Dont use https for context view searches.
+ 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
@@ -82,14 +266,14 @@
  7. Only show actions on mouse-over.
  8. Use larger action icons in icon view when we have larger previews.
  9. Better non-monochrome radio-stream icons. Thanks to Grely
-10. Dont use alternating rows in views (does not look too great with grouped
+10. Don't use alternating rows in views (does not look too great with grouped
     view). Use a fading divider instead.
 11. Combine info and lyrics pages into a new context view. By default this is
     not placed in the sidebar, but has a toggle to show in the main view.
 12. Remove EchoNest usage, as this only seems to return English results. Use
     wikipedia instead. Only the introduction is displayed by default. If no
     entry is found on wikipedia, then last.fm is consulted.
-13. Dont display stream URL as sub-text, it makes the view look messy for no
+13. Don't display stream URL as sub-text, it makes the view look messy for no
     real gain. (URL is still shown in tooltip)
 14. Detailed tree view for folders and playlists by default.
 15. Remove config compatibility with Cantata versions older than 0.7
@@ -98,7 +282,7 @@
 17. Make 'stop after current track' assignable to KDE global shortcut.
 18. Add 'stop after current' to tray item menu, and to Cantata MPRIS interface.
 19. Try to use better text for buttons in dialogs, and not just yes/no.
-20. Dont use icons in buttons when using QGtkStyle - Gtk does not use button
+20. Don't use icons in buttons when using QGtkStyle - Gtk does not use button
     icons.
 21. Use checkboxes in sync dialog to mark songs to be copied.
 22. Show number of selected artists, albums, and songs in sync dialog.
@@ -195,7 +379,7 @@
 
 1.0.3
 -----
- 1. Dont display codec settings in copy dialog unless we are copying to a
+ 1. Don't display codec settings in copy dialog unless we are copying to a
     device, or from an AudioCD.
  2. Save size of Track Organiser, Tag Editor, and ReplayGain dialogs.
  3. Fix consistency of default button in messageboxes between Qt and KDE builds.
@@ -233,7 +417,7 @@
 
 1.0.1
 -----
-1. Dont display Jamendo and Magnatune cache settings in config dialog if these
+1. Don't display Jamendo and Magnatune cache settings in config dialog if these
    have been disabled at build time.
 2. Correctly calculate size of cache folders when folder does not exist.
 3. Fix deletion of cache when single item selected.
@@ -254,7 +438,7 @@
      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)
+     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.
@@ -416,7 +600,7 @@
 
 0.9.2
 -----
- 1. (Qt-Only) Dont show clear button for read-only line-edits.
+ 1. (Qt-Only) Don't show clear button for read-only line-edits.
  2. Fix 'Locate In Library' when library is not set to tree mode.
  3. Use grid layout for transcoder slider, removes Qt layout warning.
  4. Simplified Chinese translation - thanks to 薛景
@@ -445,7 +629,7 @@
 1. Fix saving of 'Store covers in MPD dir' setting.
 2. Show/hide main window when KDE tray item clicked.
 3. Add 'Show Window' to tray item menu.
-4. Dont allow to set focus onto clear button in line-edits.
+4. Don't allow to set focus onto clear button in line-edits.
 5. Remove animation when showing messagewidget, seems to workaround a crash
    when compiled with KDE and using Oxygen.
 6. Fix activation of devices tab via keyboard shortcut.
@@ -651,7 +835,7 @@
     translations. Plural forms not supported correctly, hence instead of
     "1 Track" / "2 Tracks" Qt will have "Tracks: 1" / "Tracks: 2" The existing
     translations will need to be updated to handle the Qt specific cases.
-41. Dont clear genre list when clearing music library model.
+41. Don't clear genre list when clearing music library model.
 42. If we are grouping multiple-artists albums under 'Various Artists', then
     we also need to place 'Various Artists' albums there as well. This oddity
     can occur when i18n('Various Artists') != 'Various Artists'
diff --git a/INSTALL b/INSTALL
index 01f951d..3a3d6c7 100644
--- a/INSTALL
+++ b/INSTALL
@@ -1,5 +1,9 @@
-KDE
-===
+Build & Installation
+====================
+
+KDE4
+----
+
 1. mkdir build
 2. cd build
 3. cmake .. -DCMAKE_INSTALL_PREFIX=`kde4-config --prefix` -DCMAKE_BUILD_TYPE=Release
@@ -8,7 +12,8 @@ KDE
 
 
 Qt4
-===
+---
+
 1. mkdir build
 2. cd build
 3. cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DENABLE_KDE=OFF
@@ -17,7 +22,8 @@ Qt4
 
 
 Qt5
-===
+---
+
 1. mkdir build
 2. cd build
 3. cmake .. -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Release -DENABLE_KDE=OFF -DENABLE_QT5=ON
@@ -39,7 +45,7 @@ The following options may be passed to CMake:
 
     -DCANTATA_TRANSLATIONS=<list of translations to install>
         Builds and installs the selected translations. Supported values are
-        cs, de, en_GB, es, pl, ru, ko, zh_CN, and all. Entries should be
+        cs, de, en_GB, es, hu, pl, ru, ko, zh_CN, and all. Entries should be
         separated with a semicolon (";") e.g. -DCANTATA_TRANSLATIONS="es;pl"
         Default: all
 
@@ -66,11 +72,30 @@ The following options may be passed to CMake:
         Default: OFF
 
     -DENABLE_PROXY_CONFIG=ON
-        Enable support fpor proxy settings in config dialog. If disabled,i
+        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
+        
+    -DENABLE_KWALLET=ON
+        Use KWallet with KDE builds.
+        Default: ON
+
+    -DENABLE_UNCACHED_MTP=ON
+        Open MTP devices in un-cached mode (faster)
+        Default: ON
+
 
     Windows specific:
 
@@ -79,10 +104,20 @@ The following options may be passed to CMake:
         Default: z:\
         
     -DCANTATA_MINGW_LIBS=<path>\mingwm10.dll;<path>libgcc_s_dw2-1.dll
-        Extra MinGW libraries required for install stage
+        Extra MinGW libraries required for install stage.
         Default: <empty>
         
     -DCANTATA_OXYGEN_DIR=<path>
-        Path to Oxygen icons, required for install stage
+        Path to Oxygen icons, required for install stage.
         Default: <empty>
 
+
+    Testing ONLY options:
+
+    -DENABLE_MODEL_TEST=ON
+        Enable testing of Cantata's QAbstractItemModels. Builds with this set
+        are ONLY intended to be run under a debugger! If enabled, then 
+        CMAKE_BUILD_TYPE will automatically be set to Debug. 
+        Currently this option ONLY affects pure Qt4 builds.
+        Default: OFF
+
diff --git a/README b/README
index 73e0280..1e02f8a 100644
--- a/README
+++ b/README
@@ -1,5 +1,26 @@
-Introduction
-============
+Table of Contents
+-----------------
+
+ 1. Introduction
+ 2. Dependencies
+ 3. Bugs
+ 4. Translations
+ 5. Covers
+ 6. Advanced Config Items
+ 7. CUE Files
+ 8. Streams
+ 9. MultiMedia Keys
+10. Dynamic Helper Script - Local Mode
+11. Dynamic Helper Script - Server Mode
+12. Source Code
+13. Debug Logging
+14. Credits
+15. Windows
+
+
+
+1. Introduction
+===============
 
 Cantata is a graphical client for MPD. It contains the following features:
 
@@ -13,7 +34,7 @@ Cantata is a graphical client for MPD. It contains the following features:
  8. Ability to calculate ReplyGain tags. (Linux only, and if relevant libraries
     installed)
  9. Dynamic playlists.
-10. Online services; Jamendo, Magnatune, and SoundCloud.
+10. Online services; Jamendo, Magnatune, SoundCloud, and Podcasts.
 11. Radio stream support - wth the ability to search for streams via TuneIn.
 12. USB-Mass-Storage and MTP device support. (Linux only, and if relevant
     libraries installed)
@@ -32,8 +53,8 @@ code (and user interface) is now *very* different to that of QtMPC, and both
 KDE and Qt (Linux) builds have the same feature set.
 
 
-Dependencies
-============
+2. Dependencies
+===============
 
 Cantata requires the following Qt libraries:
 
@@ -58,8 +79,26 @@ Cantata may also use the following optional libraries:
 9. MusicBrainz5 - either this or CDDB required for Audio CDs
 
 
-Translations
-============
+3. Bugs
+=======
+
+Before reporting bugs, please check that this is not an MPD related issue with
+your system - e.g. please try recreating the issue with another MPD client,
+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
+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.
+
+
+4. Translations
+===============
 
 Becasue Cantata started out as a KDE4 application, the translation files are
 based upon KDE's i18n framework - these are located within the 'po' folder.
@@ -112,8 +151,8 @@ In the po folder there is a script named generate.sh, this is used to extract
 translatable strings and update current translations.
 
 
-Covers
-======
+5. Covers
+=========
 
 When displaying covers, Cantata will load album covers in the following order:
 
@@ -174,8 +213,7 @@ For artist images:
 3. artist.jpg
 4. artist.png
 
-... the above will be repeated for each parent folder (until we reach the MPD
-    root folder)
+...the above will be repeated for the parent folder
 
 ...then Cantata will check its cache folder (~/.cache/cantata/covers), for :
 
@@ -186,9 +224,8 @@ For artist images:
 
 7. ${url}/${dirFromFile}/artist.jpg
 8. ${url}/${dirFromFile}/artist.png
-
-... the above will be repeated for each parent folder (until we reach the MPD
-    root folder)
+ 
+...the above will be repeated for the parent folder
 
 ...lastly
 
@@ -199,24 +236,237 @@ 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
 permissions. If not, then they will be saved in Cantata's cache folder.
 
+For context view backdrops:
 
-MultiMedia Keys
-===============
+...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. ${currentArtist}-backdrop.jpg
+2. ${currentArtist}-backdrop.png
+3. backdrop.jpg
+4. backdrop.png
+
+...the above will be repeated for the parent folder
+
+...then Cantata will check its cache folder (~/.cache/cantata/backdrops), for :
+
+5. ${currentArtist}.jpg
+6. ${currentArtist}.png
+
+...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
+
+...lastly:
+
+9. 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.
+
+
+6. Advanced Config Items
+========================
+
+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:
+    Qt builds:  ~/.config/cantata/cantata.conf  ( Current User )
+                /etc/xdg/cantata.conf           ( All Users    )
+    KDE builds: ~/.kde/share/config/cantatarc   ( Current User )
+                /etc/kde4/cantatarc             ( All Users    )
+
+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
+    configured icon theme. This config is empty by default, and Cantata uses
+    the system configured icon theme.
+    
+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
+    lag when scrolling the Albums view. (Values 0..20 are acceptable)
+
+maxCoverUpdatePerIteration=<Integer>
+    Covers the are not located and loaded in the UI thread, will be loaded in a
+    background thread. These then need to be sent to the UI thread to be
+    displayed. This config controls the number of covers that are sent in one
+    batch. The default is again 5. (Values 1..20 are acceptable)
+
+cueFileCodecs=<Comma separated list of codecs>
+    List of extra text codecs to try when loading CUE files. UTF-8 and System
+    default are tried first, and then the entries from this config are tried.
+    My Qt4.8 has the following codecs available:
+
+    GBK, CP936, MS936, windows-936, System, UTF-8, ISO-8859-1, latin1, CP819,
+    IBM819, iso-ir-100, csISOLatin1, ISO-8859-15, latin9, UTF-32LE, UTF-32BE,
+    UTF-32, UTF-16LE, UTF-16BE, UTF-16, mulelao-1, roman8, hp-roman8,
+    csHPRoman8, TIS-620, ISO, WINSAMI2, WS2, Apple, macintosh, MacRoman,
+    windows-1258, CP1258, windows-1257, CP1257, windows-1256, CP1256,
+    windows-1255, CP1255, windows-1254, CP1254, windows-1253, CP1253,
+    windows-1252, CP1252, windows-1251, CP1251, windows-1250, CP1250, IBM866,
+    CP866, csIBM866, IBM874, CP874, IBM850, CP850, csPC850Multilingual,
+    ISO-8859-16, iso-ir-226, latin10, ISO-8859-14, iso-ir-199, latin8,
+    iso-celtic, ISO-8859-13, ISO-8859-10, iso-ir-157, latin6, ISO-8859-10:1992,
+    csISOLatin6, ISO-8859-9, iso-ir-148, latin5, csISOLatin5, ISO-8859-8, ISO,
+    iso-ir-138, hebrew, csISOLatinHebrew, ISO-8859-7, ECMA-118, greek,
+    iso-ir-126, csISOLatinGreek, ISO-8859-6, ISO-8859-6-I, ECMA-114, ASMO-708,
+    arabic, iso-ir-127, csISOLatinArabic, ISO-8859-5, cyrillic, iso-ir-144,
+    csISOLatinCyrillic, ISO-8859-4, latin4, iso-ir-110, csISOLatin4, ISO-8859-3,
+    latin3, iso-ir-109, csISOLatin3, ISO-8859-2, latin2, iso-ir-101,
+    csISOLatin2, KOI8-U, KOI8-RU, KOI8-R, csKOI8R, Iscii-Mlm, Iscii-Knd,
+    Iscii-Tlg, Iscii-Tml, Iscii-Ori, Iscii-Gjr, Iscii-Pnj, Iscii-Bng, Iscii-Dev,
+    TSCII, GB18030, GB2312, gb2312.1980-0, gbk-0, EUC-JP, ISO-2022-JP,
+    Shift_JIS, jisx0201*-0, jisx0208*-0, JIS7, SJIS, MS_Kanji, EUC-KR,
+    ksc5601.1987-0, cp949, Big5, Big5-HKSCS, big5-0, big5hkscs-0, Big5-ETen,
+    CP950
+
+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)
+
+e.g.
+[General]
+iconTheme=oxygen
+maxCoverFindPerIteration=5
+maxCoverUpdatePerIteration=5
+cueFileCodecs=GBK, big5-0
+networkAccessEnabled=false
+albumViewLoadAll=true
+volumeStep=2
+
+
+7. CUE Files
+============
+
+If Cantata is running with MPD>=0.17, then it will attempt to parse the contents
+of CUE files. The CUE file will be parsed to ascertain the album and track
+details. The track durations for all bar the last should be accurate, and
+Cantata will attempt to determine the duration of the last track - but this
+might not be 100% accurate.
+
+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
+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.))
+
+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.
+
+
+8. Streams
+==========
+
+Cantata contains a list of in-built stream categories, or providers. To import
+new stream categories into Cantata, files need to be GZip compressed tarballs
+of the following format.
+
+  Filename: CATEGORY_NAME.streams  (e.g. German Radio.streams)
+
+  Contents: Either streams.xml or streams.xml.gz, & either icon.png or icon.svg
+            streams.xml.gz should be gzipped.
+            icon.svg should be a non-compressed SVG file.
+
+            Icons for sub-categories (first level only) - these should be named
+            the same as the category (with / replaced by _) -
+            e.g. 'Hard_Soft Rock.svg' for 'Hard/Soft Rock')
+
+streams.xml.gz is the same format as Cantata's "Favourites" streams file, and
+the same as stream cache files. The format is as follows:
+
+  <?xml version="1.0" encoding="UTF-8"?>
+  <streams version="1.0" addCategoryName="true">
+    <stream name="Station Name" url="http://station.stream.url"/>
+  </streams>
+
+if "addCategoryName" is set to true, then when Cantata adds a station from this
+category to either favourites or the playqueue, it will prepend the Category
+name to the station name.
+
+e.g. To create a stream category named "Wicked Radio" that has 2
+sub-categeries, and 3 stream URLs you would need:
+
+streams.xml.gz with:
+  <?xml version="1.0" encoding="UTF-8"?>
+  <streams version="1.0" addCategoryName="true">
+    <category name="Rock">
+      <stream name="Hard Rock" url="http://127.0.0.1/hard.ogg"/>
+      <stream name="Soft Rock" url="http://127.0.0.1/soft.ogg"/>
+    </category>
+    <stream name="Blues" url="http://127.0.0.1/blues.ogg"/>
+  </streams>
+
+streams.xml.gz & icon.svg need to be placed into a gzip'ed tarball named
+Wicked Radio.streams
+
+With the above example, Cantata would list the following in the streams view:
+
+> Wicked Radio
+   > Rock
+       Hard Rock
+       Soft Rock
+   Blues
+
+When "Hard Rock" is added to the playqueue, it will be listed as
+"Wicked Radio - Hard Rock"
+
+If Rock.png (or Rock.svg) and/or Blues.png (or Blues.svg) also exist in the
+tarball, then they will be copied to the install location and used as icons for
+the respective category.
+
+To create .streams file:
+    1. Place all files in a temp folder
+    2. cd into temp folder
+    3. tar cfz NAME.tar.gz *
+    4. mv NAME.tar.gz NAME.streams
+
+
+9. MultiMedia Keys
+==================
 
 Cantata may be controlled via the media keys on some keyboards. To enable this,
-the KDE version can be configured to use KDE's global shortcuts. The Qt only
-builds (under Linux) can use the GNOME settings daemon's MediaKeys interface.
-This interface is normally started automatically under GNOME/Unity - and you
-will also need to enable the setting in Cantata's configuration dialog (as of
-v1.1 this option is enabled by default)
+the KDE version can be configured to use KDE's global shortcuts. 
 
-If your system does not have this daemon, you could possibly use
-https://code.google.com/p/mediakeys-daemon/ which is a python re-implementation
-of the interface.
+Linux Qt4 and Windows builds, as of 1.2, now also support basic media-keys
+shortcuts.
 
+Linux Qt4 and Qt5 builds can also use the GNOME settings daemon's MediaKeys
+interface. This interface is normally started automatically under GNOME/Unity
+- and you will also need to enable the setting in the shortcuts page of
+Cantata's configuration dialog (as of v1.1 this option is enabled by default)
 
-Dynamic Helper Script - Local Mode
-==================================
+
+10. Dynamic Helper Script - Local Mode
+======================================
 
 When a dynamic playlist is loaded in Cantata, the cantata-dynamic helper script
 is executed in the background to do the actual song selection. In this way the
@@ -225,13 +475,13 @@ possible for this script to be controlled on the command line (although it was
 never written with this in mind).
 
 The list of dynamic playlists may be obtained by looking in
-~/.config/cantata/dynamic
+~/.local/share/cantata/dynamic
 
 To 'load' a dynamic playlist, all you need to do is symlink the desired one in
-~/.config/cantata/dynamic to ~/.cache/cantata/dynamic/rules. Then you can start
-the helper by calling '/usr/share/cantata/scripts/cantata-dynamic start'  (or
-first call '/usr/share/cantata/scripts/cantata-dynamic stop' to stop any current
-playlist).
+~/.local/share/cantata/dynamic to ~/.cache/cantata/dynamic/rules. Then you can
+start the helper by calling '/usr/share/cantata/scripts/cantata-dynamic start'
+(or first call '/usr/share/cantata/scripts/cantata-dynamic stop' to stop any
+current playlist).
 
 To pass connection details, cantata-dynamic reads the same environment variables
 as mpc - namely MPD_HOST and MPD_PORT
@@ -248,13 +498,13 @@ playlist, load the 'MyPlaylist' playlist, and start this on the mpd at
     if [ -f "$HOME/.cache/cantata/dynamic/rules" ] ; then
         rm "$HOME/.cache/cantata/dynamic/rules"
     fi
-    ln -s "$HOME/.config/cantata/dynamic/MyPlaylist.rules" "$HOME/.cache/cantata/dynamic/rules"
+    ln -s "$HOME/.local/share/cantata/dynamic/MyPlaylist.rules" "$HOME/.cache/cantata/dynamic/rules"
     # Restart dynamic script
     MPD_HOST=pass at hostname MPD_PORT=1234 /usr/share/cantata/scripts/cantata-dynamic start
 
 
-Dynamic Helper - Server Mode
-============================
+11. Dynamic Helper Script - Server Mode
+=======================================
 
 In addition to the above, the helper script may be installed on the system
 containing MPD, and run in 'server' mode. When run in this mode, it is intended
@@ -302,7 +552,7 @@ following parameters (shown here with the default values):
 'pidFile' When started, the script will store its PID within the file
 configured here. This is then used to detect if the script is running, etc.
 
-'filesDir' This controls where the dyamic rules are stored. The user the script
+'filesDir' This controls where the dynamic rules are stored. The user the script
 is run as should have read/write permissions to this folder.
 
 'activeFile' When a set of rules is made 'active', all cantata does is create a
@@ -429,6 +679,8 @@ ControlDynamizer:
     Mode:   HTTP POST
     URL:    http://host:port/control
     Params: state={start/stop} [Required]
+            clear={1/0}        If set to '1', and state=stop, then the MPD
+                               playqueue is also cleared.
 
 
 In order to detect whether the set of stored rules has changed, a client should
@@ -450,10 +702,11 @@ addition of a header - e.g.
 {CANTATA/<id>}STATUS:STATE:<current status>\nRULES:<name of currently active rule>\nTIME:<epoch time since started, or last rule modification>
 
 
-Source Code
-===========
+12. Source Code
+===============
 
 The Cantata source folder contains the following structure:
+
     3rdparty   - Third party libraries
     cmake      - CMake scripts
     context    - Context view classes
@@ -476,9 +729,12 @@ The Cantata source folder contains the following structure:
     widgets    - Widgets that are probably Cantata specific.
     windows    - Files relevant to creating the windows installer.
 
+Cantata's SVG icons have been 'cleaned' using:
+  scour --strip-xml-prolog --indent=none -i in.svg -o out.svg
 
-Debug Logging
-=============
+
+13. Debug Logging
+=================
 
 Cantata contains some debug logging that might help to diagnose certain issues.
 To enable this, you must set an environment variable before starting Cantata.
@@ -486,40 +742,61 @@ Therefore, its probably better to start Cantata from the commandline.
 
 The following debug values may be used:
 
-    MPD communications        1
-    MPD Parsing               2
-    Covers                    4
-    Wikipedia context info    8
-    Last.fm context info     16
-    Combined context info    32
-    Context widget           64
-    Context backdrop        128
-    Dynamic                 256
-    Stream Fetching         512
-
-These values may be combined to enable multipe output. e.g. to enable MPD and
+    MPD communications           1
+    MPD Parsing                  2
+    Covers                       4
+    Wikipedia context info       8
+    Last.fm context info        16
+    Combined context info       32
+    Context widget              64
+    Context backdrop           128
+    Dynamic                    256
+    Stream Fetching            512
+    Http Server               1024
+    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)
+
+These values may be combined to enable multiple output. e.g. to enable MPD and
 covers logging:
 
     CANTATA_DEBUG=5 cantata
-
+    
 for just covers logging:
 
     CANTATA_DEBUG=4 cantata
 
-NOTE: The above will function regardless of whether you have created a Debug or
-Release build.
+As of Cantata 1.2.0, all logging output is saved to a file. On Linux systems
+this will be ~/.cache/cantata/cantata.log For Windows this will be
+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
+command prompt box. e.g.:
+
+    1. Run cmd.exe from start menu.
+    2. cd c:\Program Files\Cantata
+    3. set CANTATA_DEBUG=4
+    4. cantata.exe
+
+NOTE: Debug logging will function regardless of whether you have created a
+Debug or Release build.
 
-Credits
-=======
+
+14. Credits
+===========
 
 Cantata contains code/icons from:
+
     Amarok         - amarok.kde.org (Transcoding, Cover fetching code in cover
                      dialog)
-    Clementine     - www.clementine-player.org (Lyrics searches, CueFile
+    Clementine     - www.clementine-player.org (Lyrics searches, CUE file
                      parsing, and digitally imported support)
     Be::MPC        - Wikipedia parsing code
-    Quassel        - quassel-irc.org (Qt-only keyboard shortcut config support)
+    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
@@ -529,18 +806,19 @@ Cantata contains code/icons from:
     libebur128     - https://github.com/jiixyj/libebur128 (Replay gain
                      calculation)
     QJson          - JSON parser, taken from https://github.com/flavio/qjson
-    Sidebar icons  - Taken from IcoMoon - http://icomoon.io/#icons
+    IcoMoon        - http://icomoon.io/#icons (Monochrome sidebar icons)
 
 
-Windows
-=======
+15. Windows
+===========
 
 The following steps are used to compile Cantata, and create the windows
 installer.
 
 This assumes the following folder structure:
+
     z:\cantata\src          [ Checkout of Cantata's source code ]
-    z:\cantata\build
+    z:\cantata\build        
     z:\cantata\install      [ make install will place target files here ]
     z:\cantata\oxygen       [ Oxygen icons folder ]
     z:\dev\MingGW
@@ -548,11 +826,12 @@ This assumes the following folder structure:
     z:\dev\taglib
     z:\dev\zlib
 
+
 1. Install Qt, MinGW, cmake, TagLib and zlib. TagLib and zlib will probably
    need compiling.
 
 2. Call cmake (e.g. from build folder):
-     cmake ../src -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DENABLE_TAGLIB=OFF -DTAGLIB_FOUND=1 -DTAGLIB_INCLUDES=z:/dev/taglib/include -DTAGLIB_LIBRARIES=z:/dev/taglib/lib/libtag.dll.a -DTAGLIB_MP4_FOUND=1 -DTAGLIB_ASF_FOUND=1 -DZLIB_INCLUDE_DIR=z:/dev/zlib/include -DZLIB_LIBRARY=z:/dev/zlib/libz.dll.a -DCMAKE_INSTALL_PREFIX=z:/cantata/install -DCANTATA_WINDOWS_INSTALLER_DEST=z:/cantata -DCANTATA_MINGW_LIBS=z:/dev/MinGW/bin/mingwm10.dll;z:/dev/MinGW/bin/libgcc_s_dw2-1.dll -DCANTATA_OXYGEN_DIR=z:/cantata/oxygen -DCMAKE_BUILD_TYPE=Release -DENABLE_KDE=OFF
+     cmake ../src -G "MinGW Makefiles" -DCMAKE_BUILD_TYPE=Release -DENABLE_TAGLIB=OFF -DTAGLIB_FOUND=1 -DTAGLIB_INCLUDES=z:/dev/taglib/include -DTAGLIB_LIBRARIES=z:/dev/taglib/lib/libtag.dll.a -DTAGLIB_MP4_FOUND=1 -DTAGLIB_ASF_FOUND=1 -DTAGLIB_CAN_SAVE_ID3VER=1 -DZLIB_INCLUDE_DIR=z:/dev/zlib/include -DZLIB_LIBRARY=z:/dev/zlib/libz.dll.a -DCMAKE_INSTALL_PREFIX=z:/cantata/install -DCANTATA_WINDOWS_INSTALLER_DEST=z:/cantata -DCANTATA_MINGW_LIBS=z:/dev/MinGW/bin/mingwm10.dll;z:/dev/MinGW/bin/libgcc_s_dw2-1.dll -DCANTATA_OXYGEN_DIR=z:/cantata/oxygen -DCMAKE_BUILD_TYPE=Release -DENABLE_KDE=OFF
 
    (Note: -DENABLE_TAGLIB=OFF stops cmake from trying to find TagLib, as the TagLib settings have been manually set)
 
diff --git a/TODO b/TODO
index 77af284..c5699f1 100644
--- a/TODO
+++ b/TODO
@@ -29,12 +29,9 @@
 - 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?
-  - Make list of providers configurable?
 
 - Online
-  - Podcast support.
   - DAAP servers? (Online or devices? Online as its read-only?)
-  - Make list configurable?
 
 - Devices
   - libMTP does not support album artist tag.
@@ -48,6 +45,7 @@
   - Seek support for AudioCDs
   - Possible issues UDisks2, might not be able to get block device
     (e.g. /dev/sr0)?
+  - Playback from MTP devices.
 
 - Lyrics
   - Add support for reading via tags in mp4, flac, and ogg files.
@@ -62,8 +60,6 @@
   - How to (reliably) determine duration of last track?
 
 - MPD Stream playback
-  - URL setting should be in collections page, as each instance will
-    have a separate URL!
   - Playback functionality needs to handle URL change when connection changes.
 
 - General
diff --git a/cantata-play-audiocd.desktop b/cantata-play-audiocd.desktop
index d69fcfe..b3ceff5 100644
--- a/cantata-play-audiocd.desktop
+++ b/cantata-play-audiocd.desktop
@@ -6,6 +6,5 @@ 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 02bf7dc..a4c3176 100644
--- a/cantata.desktop
+++ b/cantata.desktop
@@ -23,4 +23,5 @@ Icon=cantata
 Exec=cantata %U
 Categories=Qt;KDE;AudioVideo;Player;
 X-DBUS-StartupType=Unique
+X-DBUS-ServiceName=com.googlecode.cantata
 Keywords=Music;MPD;
diff --git a/cantata.qrc b/cantata.qrc
index d4a9b6c..6ae2012 100644
--- a/cantata.qrc
+++ b/cantata.qrc
@@ -37,6 +37,13 @@
 <file alias="soundcloud">online/icons/soundcloud.svg</file>
 <file alias="jamendo">online/icons/jamendo.svg</file>
 <file alias="magnatune">online/icons/magnatune.svg</file>
+<file alias="podcasts">online/icons/podcasts.svg</file>
+<file alias="bbc">online/icons/bbc.svg</file>
+<file alias="cbc">online/icons/cbc.svg</file>
+<file alias="npr">online/icons/npr.svg</file>
+<file alias="itunes">online/icons/itunes.svg</file>
+<file alias="gpodder">online/icons/gpodder.svg</file>
+<file alias="podcast_directories.xml">online/podcast_directories.xml</file>
 
 <file alias="digitallyimported">streams/icons/digitallyimported.png</file>
 <file alias="favourites">streams/icons/favourites.svg</file>
@@ -47,6 +54,7 @@
 <file alias="shoutcast">streams/icons/shoutcast.svg</file>
 <file alias="skyfm">streams/icons/skyfm.png</file>
 <file alias="somafm">streams/icons/somafm.png</file>
+<file alias="radiogfm">streams/icons/radiogfm.png</file>
 <file alias="tunein">streams/icons/tunein.svg</file>
 
 <file alias="va16.png">icons/hi16-action-cantata-view-media-artist-various.png</file>
diff --git a/cmake/FindMtp.cmake b/cmake/FindMtp.cmake
index a6b7a0e..3a7c78a 100644
--- a/cmake/FindMtp.cmake
+++ b/cmake/FindMtp.cmake
@@ -31,7 +31,7 @@ else (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND MTP_VERSION_OKAY)
     ${_MTP_LIBRARY_DIRS}
   )
 
-  exec_program(${PKG_CONFIG_EXECUTABLE} ARGS --atleast-version=1.0.0 libmtp OUTPUT_VARIABLE _pkgconfigDevNull RETURN_VALUE MTP_VERSION_OKAY)
+  exec_program(${PKG_CONFIG_EXECUTABLE} ARGS --atleast-version=1.1.0 libmtp OUTPUT_VARIABLE _pkgconfigDevNull RETURN_VALUE MTP_VERSION_OKAY)
   
   if (MTP_INCLUDE_DIR AND MTP_LIBRARIES AND MTP_VERSION_OKAY STREQUAL "0")
      set(MTP_FOUND TRUE)
diff --git a/config.h.cmake b/config.h.cmake
index 3dcfe6e..e3aef70 100644
--- a/config.h.cmake
+++ b/config.h.cmake
@@ -3,7 +3,8 @@
 
 #define CANTATA_MAKE_VERSION(a, b, c) (((a) << 16) | ((b) << 8) | (c))
 /*
-  NOTE: If CANTATA_REV_URL is changed, then cantata-dynamac, CMakeLists.txt, and README will need updating.
+  NOTE: If CANTATA_REV_URL, or CANTATA_URL, are changed, then cantata-dynamac,
+        CMakeLists.txt, README, and cantata.desktop  will need updating.
         dbus/com.googlecode.cantata.xml will also need renaming/updating.
 */
 #define CANTATA_REV_URL "com.googlecode.cantata"
@@ -23,6 +24,8 @@
 #cmakedefine TAGLIB_MP4_FOUND 1
 #cmakedefine MTP_FOUND 1
 #cmakedefine ENABLE_HTTP_STREAM_PLAYBACK 1
+#cmakedefine ENABLE_HTTPS_SUPPORT 1
+#cmakedefine ENABLE_KWALLET 1
 #cmakedefine FFMPEG_FOUND 1
 #cmakedefine MPG123_FOUND 1
 #cmakedefine CDDB_FOUND 1
@@ -32,7 +35,10 @@
 #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
 
 /*
  This is done via CMake add_defintions - as it controls SLOT generation in GtkProxyStyle
diff --git a/context/albumview.cpp b/context/albumview.cpp
index fcd5029..31be462 100644
--- a/context/albumview.cpp
+++ b/context/albumview.cpp
@@ -35,7 +35,6 @@
 #include <QScrollBar>
 #include <QFile>
 #include <QUrl>
-#include <QNetworkReply>
 #include <QProcess>
 #include <QMenu>
 #include <QTimer>
@@ -83,11 +82,15 @@ AlbumView::AlbumView(QWidget *p)
 
 void AlbumView::showContextMenu(const QPoint &pos)
 {
-   QMenu *menu = text->createStandardContextMenu();
-   menu->addSeparator();
-   menu->addAction(refreshAction);
-   menu->exec(text->mapToGlobal(pos));
-   delete menu;
+    QMenu *menu = text->createStandardContextMenu();
+    menu->addSeparator();
+    if (cancelJobAction->isEnabled()) {
+        menu->addAction(cancelJobAction);
+    } else {
+        menu->addAction(refreshAction);
+    }
+    menu->exec(text->mapToGlobal(pos));
+    delete menu;
 }
 
 void AlbumView::refresh()
@@ -129,7 +132,7 @@ void AlbumView::update(const Song &song, bool force)
         }
         clearDetails();
         setHeader(song.album.isEmpty() ? stdHeader : song.album);
-        Covers::Image cImg=Covers::self()->requestImage(song);
+        Covers::Image cImg=Covers::self()->requestImage(song, true);
         if (!cImg.img.isNull()) {
             detailsReceived|=Cover;
             pic=createPicTag(cImg.img, cImg.fileName);
@@ -253,6 +256,12 @@ void AlbumView::updateDetails(bool preservePos)
     }
 }
 
+void AlbumView::abort()
+{
+    engine->cancel();
+    hideSpinner();
+}
+
 void AlbumView::clearCache()
 {
     Utils::clearOldCache(constCacheDir, ArtistView::constCacheAge);
diff --git a/context/albumview.h b/context/albumview.h
index 4751706..4253628 100644
--- a/context/albumview.h
+++ b/context/albumview.h
@@ -28,7 +28,7 @@
 #include <QList>
 
 class QImage;
-class QNetworkReply;
+class NetworkJob;
 class QByteArray;
 class QUrl;
 class ContextEngine;
diff --git a/context/artistview.cpp b/context/artistview.cpp
index d7c41a2..3de8600 100644
--- a/context/artistview.cpp
+++ b/context/artistview.cpp
@@ -32,7 +32,6 @@
 #include "contextengine.h"
 #include "actioncollection.h"
 #include "musiclibrarymodel.h"
-#include <QNetworkReply>
 #include <QApplication>
 #include <QTextStream>
 #include <QLayout>
@@ -106,11 +105,15 @@ ArtistView::ArtistView(QWidget *parent)
 
 void ArtistView::showContextMenu(const QPoint &pos)
 {
-   QMenu *menu = text->createStandardContextMenu();
-   menu->addSeparator();
-   menu->addAction(refreshAction);
-   menu->exec(text->mapToGlobal(pos));
-   delete menu;
+    QMenu *menu = text->createStandardContextMenu();
+    menu->addSeparator();
+    if (cancelJobAction->isEnabled()) {
+        menu->addAction(cancelJobAction);
+    } else {
+        menu->addAction(refreshAction);
+    }
+    menu->exec(text->mapToGlobal(pos));
+    delete menu;
 }
 
 void ArtistView::refresh()
@@ -164,7 +167,7 @@ void ArtistView::update(const Song &s, bool force)
             if (!currentSong.isVariousArtists()) {
                 s.file=currentSong.file;
             }
-            Covers::Image img=Covers::self()->requestImage(s);
+            Covers::Image img=Covers::self()->requestImage(s, true);
             if (!img.img.isNull()) {
                 pic=createPicTag(img.img, img.fileName);
             }
@@ -242,12 +245,12 @@ void ArtistView::loadSimilar()
 
 void ArtistView::handleSimilarReply()
 {
-    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
+    NetworkJob *reply = qobject_cast<NetworkJob*>(sender());
     if (!reply) {
         return;
     }
     if (reply==currentSimilarJob) {
-        if (QNetworkReply::NoError==reply->error()) {
+        if (reply->ok()) {
             QByteArray data=reply->readAll();
             QStringList artists=parseSimilarResponse(data);
             if (!artists.isEmpty()) {
@@ -292,7 +295,7 @@ void ArtistView::setBio()
             QStringList artistAlbums=c.value();
             qSort(artistAlbums);
             foreach (const QString &album, artistAlbums) {
-                albums+=QLatin1String("<li><a href=\"")+buildUrl(currentSong.albumArtist(), album)+"\">"+album+"</a></li>";
+                albums+=QLatin1String("<li><a href=\"")+buildUrl(currentSong.artist, album)+"\">"+album+"</a></li>";
             }
         }
         for (; it!=end; ++it) {
@@ -368,6 +371,7 @@ void ArtistView::abort()
         currentSimilarJob->abort();
         currentSimilarJob=0;
     }
+    hideSpinner();
 }
 
 void ArtistView::searchResponse(const QString &resp, const QString &lang)
diff --git a/context/artistview.h b/context/artistview.h
index 3ad6da5..174b529 100644
--- a/context/artistview.h
+++ b/context/artistview.h
@@ -30,7 +30,7 @@
 
 class ComboBox;
 class QLabel;
-class QNetworkReply;
+class NetworkJob;
 class QIODevice;
 class QImage;
 class QUrl;
@@ -83,7 +83,7 @@ private:
     QString pic;
     QString biography;
     QString similarArtists;
-    QNetworkReply *currentSimilarJob;
+    NetworkJob *currentSimilarJob;
     QString provider;
     QString webLinks;
     QString albums;
diff --git a/context/backdropcreator.cpp b/context/backdropcreator.cpp
index 46fb5b8..0bbde74 100644
--- a/context/backdropcreator.cpp
+++ b/context/backdropcreator.cpp
@@ -24,13 +24,9 @@
 #include "backdropcreator.h"
 #include "covers.h"
 #include "thread.h"
+#include "utils.h"
 #include <QApplication>
 #include <QPainter>
-#include <QDebug>
-#include <stdlib.h>
-#ifdef Q_OS_WIN32
-#include <time.h>
-#endif
 
 #include <QDebug>
 static bool debugEnabled=false;
@@ -65,7 +61,7 @@ void BackdropCreator::create(const QString &artist, const QList<Song> &songs)
     images.clear();
     requested.clear();
     foreach (const Song &s, songs) {
-        Covers::Image img=Covers::self()->requestImage(s);
+        Covers::Image img=Covers::self()->requestImage(s, true);
         if (!img.img.isNull()) {
             images.append(img.img.scaled(imageSize, imageSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
         } else {
@@ -124,11 +120,7 @@ void BackdropCreator::createImage()
 
         for (int y=0; y<constVCount; ++y) {
             for (int x=0; x<constHCount; ++x) {
-                #ifdef Q_OS_WIN32
-                int index=rand()%toUse.count();
-                #else
-                int index=random()%toUse.count();
-                #endif
+                int index=Utils::random(toUse.count());
                 p.drawImage(x*imageSize, y*imageSize, toUse.takeAt(index));
                 if (toUse.isEmpty()) {
                     toUse=images;
diff --git a/context/contextengine.cpp b/context/contextengine.cpp
index 895b90c..40f987c 100644
--- a/context/contextengine.cpp
+++ b/context/contextengine.cpp
@@ -24,7 +24,7 @@
 #include "contextengine.h"
 #include "metaengine.h"
 #include "wikipediaengine.h"
-#include <QNetworkReply>
+#include "networkaccessmanager.h"
 
 ContextEngine * ContextEngine::create(QObject *parent)
 {
@@ -66,9 +66,9 @@ void ContextEngine::cancel()
     }
 }
 
-QNetworkReply * ContextEngine::getReply(QObject *obj)
+NetworkJob * ContextEngine::getReply(QObject *obj)
 {
-    QNetworkReply *reply = qobject_cast<QNetworkReply*>(obj);
+    NetworkJob *reply = qobject_cast<NetworkJob*>(obj);
     if (!reply) {
         return 0;
     }
diff --git a/context/contextengine.h b/context/contextengine.h
index ef375d5..23b4d0c 100644
--- a/context/contextengine.h
+++ b/context/contextengine.h
@@ -27,7 +27,7 @@
 #include <QObject>
 #include <QStringList>
 
-class QNetworkReply;
+class NetworkJob;
 
 class ContextEngine : public QObject
 {
@@ -58,10 +58,10 @@ Q_SIGNALS:
     void searchResult(const QString &html, const QString &lang);
 
 protected:
-    QNetworkReply * getReply(QObject *obj);
+    NetworkJob * getReply(QObject *obj);
 
 protected:
-    QNetworkReply *job;
+    NetworkJob *job;
 };
 
 #endif
diff --git a/context/contextwidget.cpp b/context/contextwidget.cpp
index b5ef103..13beb07 100644
--- a/context/contextwidget.cpp
+++ b/context/contextwidget.cpp
@@ -38,7 +38,6 @@
 #include <QGridLayout>
 #include <QSpacerItem>
 #include <QPainter>
-#include <QNetworkReply>
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
 #endif
@@ -62,6 +61,7 @@ void ContextWidget::enableDebug()
     debugEnabled=true;
 }
 
+static const QString constBackdropName=QLatin1String("backdrop");
 //const QLatin1String ContextWidget::constHtbApiKey(0); // API key required
 const QLatin1String ContextWidget::constFanArtApiKey("ee86404cb429fa27ac32a1a3c117b006");
 const QLatin1String ContextWidget::constCacheDir("backdrops/");
@@ -99,14 +99,15 @@ public:
         addAction(act);
         connect(act, SIGNAL(triggered(bool)), parent, SLOT(reset()));
         setContextMenuPolicy(Qt::ActionsContextMenu);
+        size=Utils::isHighDpi() ? 4 : 2;
     }
 
     void resizeEvent(QResizeEvent *event)
     {
         if (Qt::Horizontal==orientation()) {
-            setContentsMargins(2, 0, 2, 0);
+            setContentsMargins(size, 0, size, 0);
         } else {
-            setContentsMargins(0, 2, 0, 2);
+            setContentsMargins(0, size, 0, size);
         }
         setMask(QRegion(contentsRect()));
         QSplitterHandle::resizeEvent(event);
@@ -146,9 +147,9 @@ public:
     }
 
     bool underMouse;
+    int size;
 };
 
-
 ThinSplitter::ThinSplitter(QWidget *parent)
     : QSplitter(parent)
 {
@@ -213,11 +214,17 @@ ContextWidget::ContextWidget(QWidget *parent)
     splitterColor=palette().text().color();
     QDesktopWidget *dw=QApplication::desktop();
     if (dw) {
-        minBackdropSize=dw->availableGeometry(this).size()-QSize(32, 64);
+        QSize geo=dw->availableGeometry(this).size()-QSize(32, 64);
+        minBackdropSize=geo;
         minBackdropSize.setWidth(((int)(minBackdropSize.width()/32))*32);
         minBackdropSize.setHeight(((int)(minBackdropSize.height()/32))*32);
+        maxBackdropSize=QSize(geo.width()*1.25, geo.height()*1.25);
+    } else if (Utils::isHighDpi()) {
+        minBackdropSize=QSize(1024*3, 768*3);
+        maxBackdropSize=QSize(minBackdropSize.width()*2, minBackdropSize.height()*2);
     } else {
         minBackdropSize=QSize(1024, 768);
+        maxBackdropSize=QSize(minBackdropSize.width()*2, minBackdropSize.height()*2);
     }
 }
 
@@ -419,7 +426,7 @@ void ContextWidget::paintEvent(QPaintEvent *e)
     QRect r(rect());
 
     if (!isWide && viewCombo) {
-        int space=fontMetrics().height()/4;
+        int space=2; // fontMetrics().height()/4;
         r.adjust(0, 0, 0, -(viewCombo->rect().height()+space));
     }
     if (darkBackground) {
@@ -480,12 +487,17 @@ void ContextWidget::updateImage(const QImage &img, bool created)
         currentBackdrop=QPixmap::fromImage(setOpacity(img));
     }
 
-    if (!currentBackdrop.isNull() && !created && 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);
+    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);
         }
-        currentBackdrop=currentBackdrop.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
     }
 
     fadeValue=0.0;
@@ -519,6 +531,7 @@ void ContextWidget::update(const Song &s)
     artist->update(sng);
     album->update(sng);
     song->update(sng);
+    currentSong=s;
 
     updateArtist=Covers::fixArtist(sng.basicArtist());
     if (isVisible() && drawBackdrop) {
@@ -552,7 +565,7 @@ void ContextWidget::cancel()
 
 void ContextWidget::updateBackdrop()
 {
-    DBUG << updateArtist << currentArtist;
+    DBUG << updateArtist << currentArtist << currentSong.file;
     if (updateArtist==currentArtist) {
         return;
     }
@@ -564,10 +577,40 @@ void ContextWidget::updateBackdrop()
         return;
     }
 
-    QImage img(cacheFileName(currentArtist, false));
+    if (!currentSong.isStream() && MPDConnection::self()->getDetails().dirReadable) {
+        QString dirName=MPDConnection::self()->getDetails().dir;
+        if (!dirName.isEmpty() && !dirName.startsWith(QLatin1String("http:/"))) {
+            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);
+                    if (QFile::exists(dirName+fileName)) {
+                        QImage img(dirName+fileName);
+
+                        if (!img.isNull()) {
+                            DBUG << "Got backdrop from" << QString(dirName+fileName);
+                            updateImage(img);
+                            QWidget::update();
+                            return;
+                        }
+                    }
+                }
+                QDir d(dirName);
+                d.cdUp();
+                dirName=Utils::fixPath(d.absolutePath());
+            }
+        }
+    }
+
+    QString cacheName=cacheFileName(currentArtist, false);
+    QImage img(cacheName);
     if (img.isNull()) {
         getBackdrop();
     } else {
+        DBUG << "Use cache file:" << cacheName;
         updateImage(img);
         QWidget::update();
     }
@@ -617,6 +660,12 @@ void ContextWidget::getBackdrop()
 void ContextWidget::getFanArtBackdrop()
 {
     // First we need to query musicbrainz to get id
+    getMusicbrainzId(fixArtist(currentArtist));
+}
+
+static const char * constArtistProp="artist-name";
+void ContextWidget::getMusicbrainzId(const QString &artist)
+{
     QUrl url("http://www.musicbrainz.org/ws/2/artist/");
     #if QT_VERSION < 0x050000
     QUrl &query=url;
@@ -624,13 +673,14 @@ void ContextWidget::getFanArtBackdrop()
     QUrlQuery query;
     #endif
 
-    query.addQueryItem("query", "artist:"+fixArtist(currentArtist));
+    query.addQueryItem("query", "artist:"+artist);
     #if QT_VERSION >= 0x050000
     url.setQuery(query);
     #endif
 
     job = NetworkAccessManager::self()->get(url);
     DBUG << url.toString();
+    job->setProperty(constArtistProp, artist);
     connect(job, SIGNAL(finished()), this, SLOT(musicbrainzResponse()));
 }
 
@@ -660,7 +710,7 @@ void ContextWidget::getDiscoGsImage()
 
 //void ContextWidget::htBackdropsResponse()
 //{
-//    QNetworkReply *reply = getReply(sender());
+//    NetworkJob *reply = getReply(sender());
 //    if (!reply) {
 //        return;
 //    }
@@ -668,7 +718,7 @@ void ContextWidget::getDiscoGsImage()
 //    DBUG << "status" << reply->error() << reply->errorString();
 
 //    QString id;
-//    if (QNetworkReply::NoError==reply->error()) {
+//    if (reply->ok()) {
 //        QXmlStreamReader xml(reply);
 //        while (!xml.atEnd() && !xml.hasError() && id.isEmpty()) {
 //            xml.readNext();
@@ -694,7 +744,7 @@ void ContextWidget::getDiscoGsImage()
 //                }
 //            }
 //        }
-//    } else if (QNetworkReply::OperationCanceledError==reply->error()) {
+//    } else if (NetworkJob::OperationCanceledError==reply->error()) {
 //        // We timed out, someting wrong with htbackdrops? Jsut use auto-generated backdrops for now...
 //        useHtBackdrops=false;
 //    }
@@ -711,34 +761,45 @@ void ContextWidget::getDiscoGsImage()
 
 void ContextWidget::musicbrainzResponse()
 {
-    QNetworkReply *reply = getReply(sender());
+    NetworkJob *reply = getReply(sender());
     if (!reply) {
         return;
     }
 
     DBUG << "status" << reply->error() << reply->errorString();
 
-    bool inSection=false;
-    QXmlStreamReader doc(reply);
     QString id;
 
-    while (!doc.atEnd()) {
-        doc.readNext();
+    if (reply->ok()) {
+        bool inSection=false;
+        QXmlStreamReader doc(reply->actualJob());
 
-        if (doc.isStartElement()) {
-            if (!inSection && QLatin1String("artist-list")==doc.name()) {
-                inSection=true;
-            } if (inSection && QLatin1String("artist")==doc.name()) {
-                id=doc.attributes().value("id").toString();
+        while (!doc.atEnd()) {
+            doc.readNext();
+
+            if (doc.isStartElement()) {
+                if (!inSection && QLatin1String("artist-list")==doc.name()) {
+                    inSection=true;
+                } if (inSection && QLatin1String("artist")==doc.name()) {
+                    id=doc.attributes().value("id").toString();
+                    break;
+                }
+            } else if (doc.isEndElement() && inSection && QLatin1String("artist")==doc.name()) {
                 break;
             }
-        } else if (doc.isEndElement() && inSection && QLatin1String("artist")==doc.name()) {
-            break;
         }
     }
 
     if (id.isEmpty()) {
-        getDiscoGsImage();
+        QString artist=reply->property(constArtistProp).toString();
+        // MusicBrainz does not seem to like AC/DC, but AC DC works - so if we fail with an artist
+        // containing /, then try with space...
+        if (!artist.isEmpty() && artist.contains("/")) {
+            artist=artist.replace("/", " ");
+            getMusicbrainzId(artist);
+        } else {
+            getDiscoGsImage();
+        }
     } else {
         QUrl url("http://api.fanart.tv/webservice/artist/"+constFanArtApiKey+"/"+id+"/json/artistbackground/1");
         job=NetworkAccessManager::self()->get(url);
@@ -749,7 +810,7 @@ void ContextWidget::musicbrainzResponse()
 
 void ContextWidget::fanArtResponse()
 {
-    QNetworkReply *reply = getReply(sender());
+    NetworkJob *reply = getReply(sender());
     if (!reply) {
         return;
     }
@@ -757,13 +818,13 @@ void ContextWidget::fanArtResponse()
     DBUG << "status" << reply->error() << reply->errorString();
     QString url;
 
-    if (QNetworkReply::NoError==reply->error()) {
+    if (reply->ok()) {
         QJson::Parser parser;
         bool ok=false;
-            #ifdef Q_OS_WIN
-            QVariantMap parsed=parser.parse(reply->readAll(), &ok).toMap();
-            #else
-        QVariantMap parsed=parser.parse(reply, &ok).toMap();
+        #ifdef Q_OS_WIN
+        QVariantMap parsed=parser.parse(reply->readAll(), &ok).toMap();
+        #else
+        QVariantMap parsed=parser.parse(reply->actualJob(), &ok).toMap();
         #endif
         if (ok && !parsed.isEmpty()) {
             QVariantMap artist=parsed[parsed.keys().first()].toMap();
@@ -829,7 +890,7 @@ static bool matchesArtist(const QString &titleOrig, const QString &artistOrig)
 
 void ContextWidget::discoGsResponse()
 {
-    QNetworkReply *reply = getReply(sender());
+    NetworkJob *reply = getReply(sender());
     if (!reply) {
         return;
     }
@@ -837,13 +898,13 @@ void ContextWidget::discoGsResponse()
     DBUG << "status" << reply->error() << reply->errorString();
     QString url;
 
-    if (QNetworkReply::NoError==reply->error()) {
+    if (reply->ok()) {
         QJson::Parser parser;
         bool ok=false;
         #ifdef Q_OS_WIN
         QVariantMap parsed=parser.parse(reply->readAll(), &ok).toMap();
         #else
-        QVariantMap parsed=parser.parse(reply, &ok).toMap();
+        QVariantMap parsed=parser.parse(reply->actualJob(), &ok).toMap();
         #endif
         if (ok && parsed.contains("resp")) {
             QVariantMap response=parsed["resp"].toMap();
@@ -878,28 +939,60 @@ void ContextWidget::discoGsResponse()
 
 void ContextWidget::downloadResponse()
 {
-    QNetworkReply *reply = getReply(sender());
+    NetworkJob *reply = getReply(sender());
     if (!reply) {
         return;
     }
 
     DBUG << "status" << reply->error() << reply->errorString();
 
-    if (QNetworkReply::NoError!=reply->error()) {
-        return;
-    }
+    QImage img;
+    QByteArray data;
 
-    QByteArray data=reply->readAll();
-    QImage img=QImage::fromData(data);
+    if (reply->ok()) {
+        data=reply->readAll();
+        img=QImage::fromData(data);
+    }
 
     if (img.isNull()) {
         createBackdrop();
     } else {
         updateImage(img);
-        QFile f(cacheFileName(currentArtist, true));
-        if (f.open(QIODevice::WriteOnly)) {
-            f.write(data);
-            f.close();
+        bool saved=false;
+
+        if (Settings::self()->storeBackdropsInMpdDir() && !currentSong.isVariousArtists() && !currentSong.isStream() &&
+            !currentSong.isCdda() && 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";
+                QFile f(fileName);
+                if (f.open(QIODevice::WriteOnly)) {
+                    f.write(data);
+                    f.close();
+                    DBUG << "Saved backdrop to" << fileName << "for artist" << currentArtist << ", current song" << currentSong.file;
+                    saved=true;
+                }
+            } else {
+                DBUG << "Not saving to mpd folder, mpd dir:" << mpdDir
+                     << "num parts:" << songDir.split(Utils::constDirSep, QString::SkipEmptyParts).count();
+            }
+        } 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;
+        }
+
+        if (!saved) {
+            QString cacheName=cacheFileName(currentArtist, true);
+            QFile f(cacheName);
+            if (f.open(QIODevice::WriteOnly)) {
+                DBUG << "Saved backdrop to (cache)" << cacheName << "for artist" << currentArtist << ", current song" << currentSong.file;
+                f.write(data);
+                f.close();
+            }
         }
         QWidget::update();
     }
@@ -940,9 +1033,9 @@ void ContextWidget::backdropCreated(const QString &artist, const QImage &img)
     }
 }
 
-QNetworkReply * ContextWidget::getReply(QObject *obj)
+NetworkJob * ContextWidget::getReply(QObject *obj)
 {
-    QNetworkReply *reply = qobject_cast<QNetworkReply*>(obj);
+    NetworkJob *reply = qobject_cast<NetworkJob*>(obj);
     if (!reply) {
         return 0;
     }
diff --git a/context/contextwidget.h b/context/contextwidget.h
index 94e40f9..ce39e34 100644
--- a/context/contextwidget.h
+++ b/context/contextwidget.h
@@ -35,7 +35,7 @@ class ArtistView;
 class AlbumView;
 class SongView;
 class BackdropCreator;
-class QNetworkReply;
+class NetworkJob;
 class QStackedWidget;
 class QComboBox;
 class QImage;
@@ -101,16 +101,18 @@ private:
     void getBackdrop();
 //    void getHtBackdrop();
     void getFanArtBackdrop();
+    void getMusicbrainzId(const QString &artist);
     void getDiscoGsImage();
     void createBackdrop();
-    QNetworkReply * getReply(QObject *obj);
+    NetworkJob * getReply(QObject *obj);
 
 private:
-    QNetworkReply *job;
+    NetworkJob *job;
     bool drawBackdrop;
     bool darkBackground;
 //    bool useHtBackdrops;
     bool useFanArt;
+    Song currentSong;
     QPixmap oldBackdrop;
     QPixmap currentBackdrop;
     QString currentArtist;
@@ -130,6 +132,7 @@ private:
 //    QString backdropText;
     QSet<QString> backdropAlbums;
     QSize minBackdropSize;
+    QSize maxBackdropSize;
     QList<QString> artistsCreatedBackdropsFor;
 };
 
diff --git a/context/lastfmengine.cpp b/context/lastfmengine.cpp
index 46c824b..d1e5a80 100644
--- a/context/lastfmengine.cpp
+++ b/context/lastfmengine.cpp
@@ -25,7 +25,7 @@
 #include "networkaccessmanager.h"
 #include "localize.h"
 #include "covers.h"
-#include <QNetworkReply>
+#include "config.h"
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
 #endif
@@ -45,8 +45,6 @@ const QLatin1String LastFmEngine::constLinkPlaceholder("XXX_CONTEXT_READ_MORE_ON
 
 static const char * constModeProperty="mode";
 static const char * constQuery="query";
-static const char * constRedirectsProperty="redirects";
-static const int constMaxRedirects=3;
 
 LastFmEngine::LastFmEngine(QObject *p)
     : ContextEngine(p)
@@ -69,7 +67,7 @@ QString LastFmEngine::translateLinks(QString text) const
 void LastFmEngine::search(const QStringList &query, Mode mode)
 {
     QStringList fixedQuery=fixQuery(query);
-    QUrl url("http://ws.audioscrobbler.com/2.0/");
+    QUrl url("https://ws.audioscrobbler.com/2.0/");
     #if QT_VERSION < 0x050000
     QUrl &urlQuery=url;
     #else
@@ -89,7 +87,6 @@ void LastFmEngine::search(const QStringList &query, Mode mode)
 
     job=NetworkAccessManager::self()->get(url);
     job->setProperty(constModeProperty, (int)mode);
-    job->setProperty(constRedirectsProperty, 0);
     
     QStringList queryString;
     foreach (QString q, fixedQuery) {
@@ -105,24 +102,13 @@ void LastFmEngine::search(const QStringList &query, Mode mode)
 void LastFmEngine::parseResponse()
 {
     DBUG << __FUNCTION__;
-    QNetworkReply *reply = getReply(sender());
+    NetworkJob *reply = getReply(sender());
     if (!reply) {
         return;
     }
 
-    QVariant redirect = reply->header(QNetworkRequest::LocationHeader);
-    int numRirects=reply->property(constRedirectsProperty).toInt();
-    if (redirect.isValid() && ++numRirects<constMaxRedirects) {
-        job=NetworkAccessManager::self()->get(redirect.toString());
-        job->setProperty(constRedirectsProperty, numRirects);
-        job->setProperty(constModeProperty, reply->property(constModeProperty));
-        DBUG <<  "Redirect" << redirect.toString();
-        connect(job, SIGNAL(finished()), this, SLOT(parseResponse()));
-        return;
-    }
-
     QByteArray data=reply->readAll();
-    if (QNetworkReply::NoError!=reply->error() || data.isEmpty()) {
+    if (!reply->ok() || data.isEmpty()) {
         DBUG <<  "Empty/error";
         emit searchResult(QString(), QString());
         return;
diff --git a/context/lyricsettings.cpp b/context/lyricsettings.cpp
index da6a7b3..1707e5d 100644
--- a/context/lyricsettings.cpp
+++ b/context/lyricsettings.cpp
@@ -62,10 +62,7 @@ void LyricSettings::showEvent(QShowEvent *e)
         selected->clear();
         foreach (const UltimateLyricsProvider *provider, lprov) {
             QListWidgetItem *item = new QListWidgetItem(provider->isEnabled() ? selected : available);
-            QString name(provider->getName());
-            name.replace("(POLISH)", i18n("(Polish Translations)"));
-            name.replace("(PORTUGUESE)", i18n("(Portuguese Translations)"));
-            item->setText(name);
+            item->setText(provider->displayName());
             item->setData(Qt::UserRole, provider->getName());
         }
         loadedXml=true;
diff --git a/context/songview.cpp b/context/songview.cpp
index 14730d5..9165bee 100644
--- a/context/songview.cpp
+++ b/context/songview.cpp
@@ -56,7 +56,22 @@ static QString cacheFile(QString artist, QString title, bool createDir=false)
 {
     title.replace("/", "_");
     artist.replace("/", "_");
-    return QDir::toNativeSeparators(Utils::cacheDir(SongView::constLyricsDir+artist+'/', createDir))+title+SongView::constExtension;
+    QString dir=Utils::cacheDir(SongView::constLyricsDir+artist+Utils::constDirSep, createDir);
+
+    if (dir.isEmpty()) {
+        return QString();
+    }
+    return dir+title+SongView::constExtension;
+}
+
+static inline QString mpdFilePath(const QString &songFile)
+{
+    return Utils::changeExtension(MPDConnection::self()->getDetails().dir+songFile, SongView::constExtension);
+}
+
+static inline QString mpdFilePath(const Song &song)
+{
+    return mpdFilePath(song.file);
 }
 
 static inline QString fixNewLines(const QString &o)
@@ -70,6 +85,7 @@ SongView::SongView(QWidget *p)
     , currentRequest(0)
     , mode(Mode_Display)
     , job(0)
+    , currentProv(0)
 {
     refreshAction = ActionCollection::get()->createAction("refreshlyrics", i18n("Refresh Lyrics"), "view-refresh");
     editAction = ActionCollection::get()->createAction("editlyrics", i18n("Edit Lyrics"), Icons::self()->editIcon);
@@ -225,10 +241,38 @@ void SongView::showContextMenu(const QPoint &pos)
        break;
    }
 
+   if (Mode_Edit!=mode && cancelJobAction->isEnabled()) {
+       menu->addSeparator();
+       menu->addAction(cancelJobAction);
+   }
+
    menu->exec(text->mapToGlobal(pos));
    delete menu;
 }
 
+void SongView::abort()
+{
+    if (job) {
+        connect(job, SIGNAL(finished()), this, SLOT(downloadFinished()));
+        job->abort();
+        job->deleteLater();
+        job=0;
+    }
+    currentProvider=-1;
+    if (currentProv) {
+        currentProv->abort();
+        currentProv=0;
+
+        text->setText(QString());
+        // Set lyrics file anyway - so that editing is enabled!
+        lyricsFile=Settings::self()->storeLyricsInMpdDir()
+                ? mpdFilePath(currentSong)
+                : cacheFile(currentSong.artist, currentSong.title);
+        setMode(Mode_Display);
+    }
+    hideSpinner();
+}
+
 void SongView::update(const Song &s, bool force)
 {
     if (Mode_Edit==mode && !force) {
@@ -284,13 +328,13 @@ void SongView::update(const Song &s, bool force)
                 songFile=u.hasQueryItem("file") ? u.queryItemValue("file") : QString();
             }
 
-            QString mpdLyrics=Utils::changeExtension(MPDConnection::self()->getDetails().dir+songFile, constExtension);
+            QString mpdLyrics=mpdFilePath(songFile);
 
             if (MPDConnection::self()->getDetails().dir.startsWith(QLatin1String("http:/"))) {
                 QUrl url(mpdLyrics);
                 job=NetworkAccessManager::self()->get(url);
                 job->setProperty("file", songFile);
-                connect(job, SIGNAL(finished()), SLOT(downloadFinished()));
+                connect(job, SIGNAL(finished()), this, SLOT(downloadFinished()));
                 return;
             } else {
                 #ifdef TAGLIB_FOUND
@@ -298,7 +342,6 @@ void SongView::update(const Song &s, bool force)
 
                 if (!tagLyrics.isEmpty()) {
                     text->setText(fixNewLines(tagLyrics));
-                    hideSpinner();
                     setMode(Mode_Display);
 //                    controls->setVisible(false);
                     return;
@@ -334,20 +377,23 @@ void SongView::update(const Song &s, bool force)
 
 void SongView::downloadFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (reply) {
         reply->deleteLater();
-        if (QNetworkReply::NoError==reply->error()) {
-            QString file=reply->property("file").toString();
-            if (!file.isEmpty() && file==currentSong.file) {
-                QTextStream str(reply);
-                QString lyrics=str.readAll();
-                if (!lyrics.isEmpty()) {
-                    text->setText(fixNewLines(lyrics));
-                    hideSpinner();
-                    return;
+        if (job==reply) {
+            if (reply->ok()) {
+                QString file=reply->property("file").toString();
+                if (!file.isEmpty() && file==currentSong.file) {
+                    QTextStream str(reply->actualJob());
+                    QString lyrics=str.readAll();
+                    if (!lyrics.isEmpty()) {
+                        text->setText(fixNewLines(lyrics));
+                        hideSpinner();
+                        return;
+                    }
                 }
             }
+            job=0;
         }
     }
     getLyrics();
@@ -376,7 +422,7 @@ void SongView::lyricsReady(int id, QString lyrics)
             text->setText(fixNewLines(plain));
             lyricsFile=QString();
             if (! ( Settings::self()->storeLyricsInMpdDir() &&
-                    saveFile(Utils::changeExtension(MPDConnection::self()->getDetails().dir+currentSong.file, constExtension))) ) {
+                    saveFile(mpdFilePath(currentSong))) ) {
                 saveFile(cacheFile(currentSong.artist, currentSong.title, true));
             }
             setMode(Mode_Display);
@@ -401,7 +447,7 @@ bool SongView::saveFile(const QString &fileName)
 QString SongView::mpdFileName() const
 {
     return currentSong.file.isEmpty() || MPDConnection::self()->getDetails().dir.isEmpty() || currentSong.isStream()
-            ? QString() : Utils::changeExtension(MPDConnection::self()->getDetails().dir+currentSong.file, constExtension);
+            ? QString() : mpdFilePath(currentSong);
 }
 
 QString SongView::cacheFileName() const
@@ -411,18 +457,17 @@ QString SongView::cacheFileName() const
 
 void SongView::getLyrics()
 {
-    UltimateLyricsProvider *prov=UltimateLyrics::self()->getNext(currentProvider);
-    if (prov) {
-        text->setText(i18n("Fetching lyrics via %1", prov->getName()));
-        prov->fetchInfo(currentRequest, currentSong);
+    currentProv=UltimateLyrics::self()->getNext(currentProvider);
+    if (currentProv) {
+        text->setText(i18n("Fetching lyrics via %1", currentProv->displayName()));
+        currentProv->fetchInfo(currentRequest, currentSong);
         showSpinner();
     } else {
         text->setText(QString());
         currentProvider=-1;
-        hideSpinner();
         // Set lyrics file anyway - so that editing is enabled!
         lyricsFile=Settings::self()->storeLyricsInMpdDir()
-                ? Utils::changeExtension(MPDConnection::self()->getDetails().dir+currentSong.file, constExtension)
+                ? mpdFilePath(currentSong)
                 : cacheFile(currentSong.artist, currentSong.title);
         setMode(Mode_Display);
     }
@@ -430,6 +475,9 @@ void SongView::getLyrics()
 
 void SongView::setMode(Mode m)
 {
+    if (Mode_Display==m) {
+        hideSpinner();
+    }
     if (mode==m) {
         return;
     }
@@ -438,7 +486,7 @@ void SongView::setMode(Mode m)
     saveAction->setEnabled(Mode_Edit==m);
     cancelAction->setEnabled(Mode_Edit==m);
     editAction->setEnabled(editable);
-    delAction->setEnabled(editable && !MPDConnection::self()->getDetails().dir.isEmpty() && QFile::exists(Utils::changeExtension(MPDConnection::self()->getDetails().dir+currentSong.file, constExtension)));
+    delAction->setEnabled(editable && !MPDConnection::self()->getDetails().dir.isEmpty() && QFile::exists(mpdFilePath(currentSong)));
     setEditable(Mode_Edit==m);
 }
 
diff --git a/context/songview.h b/context/songview.h
index 079928f..c044d06 100644
--- a/context/songview.h
+++ b/context/songview.h
@@ -30,7 +30,7 @@
 class UltimateLyricsProvider;
 class QImage;
 class Action;
-class QNetworkReply;
+class NetworkJob;
 
 class SongView : public View
 {
@@ -66,6 +66,7 @@ public Q_SLOTS:
     void showContextMenu(const QPoint &pos);
 
 private:
+    void abort();
     QString mpdFileName() const;
     QString cacheFileName() const;
     void getLyrics();
@@ -94,7 +95,8 @@ private:
     Mode mode;
     QString lyricsFile;
     QString preEdit;
-    QNetworkReply *job;
+    NetworkJob *job;
+    UltimateLyricsProvider *currentProv;
 };
 
 #endif
diff --git a/context/ultimate_providers.xml b/context/ultimate_providers.xml
index 673d9c1..8cc96a7 100644
--- a/context/ultimate_providers.xml
+++ b/context/ultimate_providers.xml
@@ -1,39 +1,54 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <lyricproviders>
-  <provider name="azlyrics.com" title="{artist} LYRICS - {title}" charset="utf-8" url="http://www.azlyrics.com/lyrics/{artist}/{title}.html">
+  <provider name="azlyrics.com" charset="utf-8" url="http://www.azlyrics.com/lyrics/{artist}/{title}.html">
     <urlFormat replace=" ._@,;&\/'"-" with=""/>
     <extract>
       <item begin="<!-- END OF RINGTONE 1 -->" end="<!-- RINGTONE 2 -->"/>
     </extract>
+    <extract> <!-- new -->
+      <item begin="<!-- start of lyrics -->" end="<!-- end of lyrics -->"/>
+    </extract>
     <exclude>
       <item tag="<B>"/>
       <item begin="<i>[" end="]</i>"/>
       <item begin="[" end="]"/>
     </exclude>
   </provider>
-  <provider name="darklyrics.com" title ="{ARTIST} LYRICS - "{title}" ({year}) album"  charset="utf-8" url="http://www.darklyrics.com/lyrics/{artist2}/{album2}.html">
-    <extract>
-      <item begin="<h3><a name="{track}">{track}. {Title2}</a></h3><br />" end="<h3>"/>
+  <provider name="darklyrics.com" charset="utf-8" url="http://www.darklyrics.com/lyrics/{artist2}/{album2}.html">
+    <extract> <!-- modified -->
+      <item begin="<h3><a name="{track}">{track}. {Title}</a></h3><br/>" end="<h3>"/>
+    </extract>
+    <extract> <!-- modified -->
+      <item begin="<h3><a name="{track}">{track}. {Title}</a></h3><br/>" end="<div class="thanks">"/>
+    </extract>
+    <extract> <!-- new -->
+      <item begin="<h3><a name="{track}">{track}. {Title}</a></h3><br/>" end="<br/><br/>"/>
     </extract>
-    <extract>
-      <item begin="<h3><a name="{track}">{track}. {Title2}</a></h3><br />" end="<div class="thanks">"/>
-      </extract>
     <invalidIndicator value="The page you requested was not found on DarkLyrics.com."/>
   </provider>
-  <provider name="directlyrics.com" title="{artist} - {title} lyrics" charset="iso-8859-1" url="http://www.directlyrics.com/{artist}-{title}-lyrics.html">
+  <provider name="directlyrics.com" charset="utf-8" url="http://www.directlyrics.com/{artist}-{title}-lyrics.html"> <!-- was iso-8859-1 -->
     <urlFormat replace=" _@,;&\/'"" with="-"/>
     <urlFormat replace="." with=""/>
     <extract>
       <item tag="<div id="lyricsContent">"/>
       <item tag="<p>"/>
     </extract>
+    <extract> <!-- new -->
+      <item begin="<div class="lyrics">" end="</div>"/>
+    </extract>
     <exclude>
       <item begin="<b>" end="</b>"/>
     </exclude>
+    <exclude> <!-- new -->
+      <item begin="<script async src="" end="</script><br>"/>
+    </exclude>
   </provider>
-  <provider name="elyrics.net" title="{title} Lyrics - {artist}" charset="iso-8859-1" url="http://www.elyrics.net/read/{a}/{artist}-lyrics/{title}-lyrics.html">
+  <provider name="elyrics.net" charset="iso-8859-1" url="http://www.elyrics.net/read/{a}/{artist}-lyrics/{title}-lyrics.html">
     <urlFormat replace=" _@;&\/"" with="-"/>
     <urlFormat replace="'" with="_"/>
+    <extract> <!-- new -->
+      <item begin="<div id='loading'></div>" end="<p>"/>
+    </extract>
     <extract>
       <item tag="<div class='ly' style='font-size:12px;'>"/>
     </extract>
@@ -41,43 +56,57 @@
       <item tag="<strong>"/>
       <item tag="<em>"/>
     </exclude>
+    <exclude> <!-- new -->
+      <item begin="<em><br>[From: http://www.elyrics.net" end=" ]</em><br>"/>
+    </exclude>
     <invalidIndicator value="Page not Found"/>
   </provider>
-  <provider name="letras.mus.br" title="" charset="iso-8859-1" url="http://letras.terra.com.br/winamp.php?musica={title}&artista={artist}">
+  <provider name="letras.mus.br" charset="iso-8859-1" url="http://letras.terra.com.br/winamp.php?musica={title}&artista={artist}">
     <urlFormat replace="_@,;&\/"" with="_"/>
     <urlFormat replace=" " with="+"/>
+    <extract> <!-- new -->
+      <item begin="</div>" end="<div id="banner">"/>
+    </extract>
     <extract>
       <item begin="</div>" end="</div>"/>
     </extract>
     <invalidIndicator value="Verifique se o nome do seu arquivo e sua"/>
   </provider>
-  <provider name="loudson.gs" title="" charset="utf-8" url="http://www.loudson.gs/{a}/{artist}/{album}/{title}">
+  <provider name="loudson.gs" charset="utf-8" url="http://www.loudson.gs/{a}/{artist}/{album}/{title}">
     <urlFormat replace=" _@,;&\/"" with="-"/>
     <urlFormat replace="." with=""/>
     <extract>
       <item tag="<div class="middle_col_TracksLyrics ">"/>
     </extract>
+    <extract> <!-- new -->
+      <item tag="<div class="middle_col_TracksLyrics">"/>
+    </extract>
   </provider>
-  <provider name="lyrics.com" title="{artist} - {title} Lyrics" charset="utf-8" url="http://www.lyrics.com/lyrics/{artist}/{title}.html">
+  <provider name="lyrics.com" charset="utf-8" url="http://www.lyrics.com/lyrics/{artist}/{title}.html">
     <urlFormat replace=" _@,;&\/"" with="-"/>
     <urlFormat replace="'." with=""/>
+    <extract> <!-- new -->
+      <item tag="<div id="lyric_space">"/>
+    </extract>
     <extract>
       <item tag="<div id="lyrics" class="SCREENONLY">"/>
     </extract>
     <invalidIndicator value="we do not have the lyric for this song"/>
   </provider>
-  <provider name="lyrics.wikia.com" title="{artist}:{title} Lyrics - " charset="utf-8" url="http://lyrics.wikia.com/{Artist}:{Title}">
+  <provider name="lyrics.wikia.com" charset="utf-8" url="http://lyrics.wikia.com/api.php">
+    <!-- These are not used, as mediawiki API is used instead...
     <urlFormat replace=" _@;\"" with="_"/>
     <urlFormat replace="?" with="%3F"/>
     <extract>
-      <item begin="<div class='lyricbox'>" end="<!--"/>
+      <item begin="<div class='lyricbox'>" end="<!- -"/>  TODO: This was a comment ( ! - - ) but brakes commentinging out!
     </extract>
     <exclude>
       <item tag="<div class='rtMatcher'>"/>
       <item tag="<span style="padding:1em">"/>
     </exclude>
+    -->
   </provider>
-  <provider name="lyricsbay.com" title="{title} lyrics {artist}" charset="iso-8859-1" url="http://www.lyricsbay.com/{title}_lyrics-{artist}.html">
+  <provider name="lyricsbay.com" charset="iso-8859-1" url="http://www.lyricsbay.com/{title}_lyrics-{artist}.html">
     <urlFormat replace=" _@,;&\/'"" with="_"/>
     <urlFormat replace="." with=""/>
     <extract>
@@ -87,7 +116,7 @@
       <item tag="<textarea name="songscpy" id="songscpyid" onclick="callselect('songscpyid','selectswf')" rows="3" cols="45" READONLY>"/>
     </exclude>
   </provider>
-  <provider name="lyricsdownload.com" title="{artist} - {title} LYRICS" charset="utf-8" url="http://www.lyricsdownload.com/{artist}-{title}-lyrics.html">
+  <provider name="lyricsdownload.com" charset="utf-8" url="http://www.lyricsdownload.com/{artist}-{title}-lyrics.html">
     <urlFormat replace=" _@,;&\/"" with="-"/>
     <urlFormat replace="." with=""/>
     <extract>
@@ -95,22 +124,28 @@
     </extract>
     <invalidIndicator value="We haven't lyrics of this song"/>
   </provider>
-  <provider name="lyricsmania.com" title="{artist} - {title} Lyrics" charset="iso-8859-1" url="http://www.lyricsmania.com/{title}_lyrics_{artist}.html">
+  <provider name="lyricsmania.com" charset="iso-8859-1" url="http://www.lyricsmania.com/{title}_lyrics_{artist}.html">
     <urlFormat replace=" _@;&\/"'." with="_"/>
+    <extract> <!-- new -->
+      <item tag="<div id='songlyrics_h' class='dn'>"/>
+    </extract>
     <extract>
       <item begin="<span style="font-size:14px;">" end="<span style="font-size:14px;">"/>
       <item begin="</center>" end="<a"/>
     </extract>
     <invalidIndicator value="The lyrics you requested is not in our archive yet,"/>
   </provider>
-  <provider name="lyricsmode.com" title="{artist} - {title} lyrics" charset="iso-8859-1" url="http://www.lyricsmode.com/lyrics/{a}/{artist}/{title}.html">
+  <provider name="lyricsmode.com" charset="iso-8859-1" url="http://www.lyricsmode.com/lyrics/{a}/{artist}/{title}.html">
     <urlFormat replace=" ._@,;&\/"" with="_"/>
     <extract>
       <item tag="<div id='songlyrics_h' class='dn'>"/>
     </extract>
+    <extract> <!-- new -->
+      <item begin="<p id="lyrics_text">" end="</p>"/>
+    </extract>
     <invalidIndicator value="Sorry, we have no"/>
   </provider>
-  <provider name="lyricsplugin.com" title="{artist} - {title} Lyrics" charset="utf-8" url="http://www.lyricsplugin.com/winamp03/plugin/?title={title}&artist={artist}">
+  <provider name="lyricsplugin.com" charset="utf-8" url="http://www.lyricsplugin.com/winamp03/plugin/?title={title}&artist={artist}">
     <urlFormat replace="_@;&\/"" with="-"/>
     <urlFormat replace="'" with=""/>
     <urlFormat replace=" " with="%20"/>
@@ -118,16 +153,20 @@
       <item tag="<div id="lyrics">"/>
     </extract>
   </provider>
-  <provider name="lyricsreg.com" title="{title} lyrics {artist}" charset="iso-8859-1" url="http://www.lyricsreg.com/lyrics/{artist}/{title}/">
+  <provider name="lyricsreg.com" charset="iso-8859-1" url="http://www.lyricsreg.com/lyrics/{artist}/{title}/">
     <urlFormat replace=" _@,;&\/"" with="+"/>
     <urlFormat replace="'." with=""/>
     <extract>
       <item begin="Ringtone to your Cell" end="Ringtone to your Cell"/>
       <item begin="<div style="text-align:center;">" end="<a"/>
     </extract>
+    <extract> <!-- new -->
+      <item begin="Ringtone to your Cell" end="Ringtone to your Cell"/>
+      <item begin="</a><br/><br/>" end="<a"/>
+    </extract>
     <invalidIndicator value="Page not Found"/>
   </provider>
-  <provider name="lyricstime.com" title="{artist} - {title} Lyrics" charset="iso-8859-1" url="http://www.lyricstime.com/{artist}-{title}-lyrics.html">
+  <provider name="lyricstime.com" charset="iso-8859-1" url="http://www.lyricstime.com/{artist}-{title}-lyrics.html">
     <urlFormat replace=" _@,;&\/"'" with="-"/>
     <urlFormat replace="." with=""/>
     <extract>
@@ -135,7 +174,7 @@
       <item tag="<p>"/>
     </extract>
   </provider>
-  <provider name="lyriki.com" title="" charset="utf-8" url="http://www.lyriki.com/{artist}:{title}">
+  <provider name="lyriki.com" charset="utf-8" url="http://www.lyriki.com/{artist}:{title}">
     <urlFormat replace=" _@,;&\/"" with="_"/>
     <urlFormat replace="." with=""/>
     <extract>
@@ -143,7 +182,7 @@
       <item tag="<p>"/>
     </extract>
   </provider>
-  <provider name="metrolyrics.com" title="{artist} - {title} LYRICS" charset="utf-8" url="http://www.metrolyrics.com/{title}-lyrics-{artist}.html">
+  <provider name="metrolyrics.com" charset="utf-8" url="http://www.metrolyrics.com/{title}-lyrics-{artist}.html">
     <urlFormat replace=" _@,;&\/"" with="-"/>
     <urlFormat replace="'." with=""/>
     <extract>
@@ -152,12 +191,15 @@
     <extract>
       <item tag="<div id="lyrics">"/>
     </extract>
+    <extract> <!-- new -->
+      <item tag="<div id="lyrics-body-text">"/>
+    </extract>
     <exclude>
       <item tag="<h5>"/>
     </exclude>
     <invalidIndicator value="These lyrics are missing"/>
   </provider>
-  <provider name="mp3lyrics.org" title="{artist} &quot;{title}&quot; Lyrics" charset="utf-8" url="http://www.mp3lyrics.org/{a}/{artist}/{title}/">
+  <provider name="mp3lyrics.org" charset="utf-8" url="http://www.mp3lyrics.org/{a}/{artist}/{title}/">
     <urlFormat replace=" _@,;&\/"" with="-"/>
     <urlFormat replace="'." with=""/>
     <extract>
@@ -166,6 +208,9 @@
     <extract>
       <item tag="<div class="KonaBody" id="EchoTopic">"/>
     </extract>
+    <extract> <!-- new -->
+      <item tag="<div id="lyrics_text">"/>
+    </extract>
     <exclude>
       <item tag="<font size=2>"/>
       <item begin="<b><i>" end="</u></b>:"/>
@@ -173,26 +218,29 @@
     </exclude>
     <invalidIndicator value="Something went wrong"/>
   </provider>
-  <provider name="seeklyrics.com" title="{artist} - {title} Lyrics" charset="iso-8859-1" url="http://www.seeklyrics.com/lyrics/{Artist}/{Title}.html">
+  <provider name="seeklyrics.com" charset="iso-8859-1" url="http://www.seeklyrics.com/lyrics/{Artist}/{Title}.html">
     <urlFormat replace=" _@,;&\/'"" with="-"/>
     <urlFormat replace="." with=""/>
     <extract>
       <item tag="<div id="songlyrics">"/>
     </extract>
   </provider>
-  <provider name="songlyrics.com" title="{title} LYRICS - {artist}" charset="utf-8" url="http://www.songlyrics.com/{artist}/{title}-lyrics/">
+  <provider name="songlyrics.com" charset="utf-8" url="http://www.songlyrics.com/{artist}/{title}-lyrics/">
     <urlFormat replace=" ._@,;&\/"" with="-"/>
     <urlFormat replace="'" with="_"/>
     <extract>
       <item tag="<p id="songLyricsDiv" ondragstart="return false;" onselectstart="return false;" oncontextmenu="return false;" class="songLyricsV14" style="font-size: 14px;z-index: 9999;position: absolute;left: -6000px;">"/>
     </extract>
+    <extract> <!-- new -->
+      <item tag="<p id="songLyricsDiv" ondragstart="return false;" onselectstart="return false;" oncontextmenu="return false;" class="songLyricsV14">"/>
+    </extract>
     <exclude>
       <item begin="
[" end="] "/>
     </exclude>
     <invalidIndicator value="Sorry, we have no"/>
     <invalidIndicator value="This is an upcoming album and we do not have the"/>
   </provider>
-  <provider name="tekstowo.pl (POLISH)" title="                                   {artist} - {title} - " charset="iso-8859-2" url="http://www.tekstowo.pl/piosenka,{artist},{title}.html">
+  <provider name="tekstowo.pl (POLISH)" charset="iso-8859-2" url="http://www.tekstowo.pl/piosenka,{artist},{title}.html">
     <urlFormat replace=" _@,;&\/'"." with="_"/>
     <extract>
       <item tag="<div id="tran" style="display:none">"/>
@@ -200,30 +248,52 @@
     <extract>
       <item tag="<div id="tex" style="display:block">"/>
     </extract>
+    <extract> <!-- new -->
+      <item begin="<h2>Tekst piosenki:</h2><br/>" end="<p>"/>
+    </extract>
     <exclude>
       <item begin="<div style="float:left"" end=">"/>
     </exclude>
   </provider>
-  <provider name="teksty.org" title="{Artist} - {Title2} - tekst" charset="UTF-8" url="http://www.teksty.org/{artist},{title},tekst-piosenki">
+  <provider name="teksty.org" charset="utf-8" url="http://www.teksty.org/{artist},{title},tekst-piosenki">
     <urlFormat replace=" _@,;&\/"." with="_"/>
     <urlFormat replace="'" with=""/>
     <extract>
       <item tag="<span class="text" id='text25534-dta'>"/>
     </extract>
+    <extract> <!-- new -->
+      <item begin="<div class="songText" id="songContent">" end="</div>"/>
+    </extract>
     <exclude>
       <item begin="<div style="float:left"" end=">"/>
     </exclude>
   </provider>
-  <provider name="vagalume.com.br" title="{title} de {artist} no VAGALUME" charset="iso-8859-1" url="http://vagalume.com.br/{artist}/{title}.html">
+  <provider name="vagalume.com.br" charset="iso-8859-1" url="http://vagalume.com.br/{artist}/{title}.html">
     <urlFormat replace=" _@,;&\/'"." with="-"/>
     <extract>
       <item tag="<span class="editable_area">"/>
     </extract>
+    <extract> <!-- new -->
+      <item tag="<div itemprop=description>"/>
+    </extract>
   </provider>
-  <provider name="vagalume.com.br (PORTUGUESE)" title="{title} de {artist} no VAGALUME" charset="iso-8859-1" url="http://vagalume.com.br/{artist}/{title}-traducao.html">
+  <provider name="vagalume.com.br (PORTUGUESE)" charset="iso-8859-1" url="http://vagalume.com.br/{artist}/{title}-traducao.html">
     <urlFormat replace=" _@,;&\/'"." with="-"/>
     <extract>
       <item tag="<div class="tab_traducao sideBySide lyricArea tab_tra_pt">"/>
     </extract>
+    <extract> <!-- new -->
+      <item tag="<div id=lyr_translation>"/>
+      <item begin="<div>" end="null"/>
+    </extract>
+  </provider>
+  <!-- new -->
+  <provider name="leoslyrics.com" charset="iso-8859-1" url="http://www.leoslyrics.com/{artist}/{title}-lyrics/">
+    <urlFormat replace=" ._@,;&\/"" with="-"/>
+    <urlFormat replace="'" with="_"/>
+    <extract>
+      <item tag="<div ondragstart="return false;" onselectstart="return false;" oncontextmenu="return false;">"/>
+    </extract>
+    <invalidIndicator value="Sorry, you either followed an invalid link or that page no longer exists."/>
   </provider>
 </lyricproviders>
diff --git a/context/ultimatelyrics.cpp b/context/ultimatelyrics.cpp
index 452f0bd..e55353c 100644
--- a/context/ultimatelyrics.cpp
+++ b/context/ultimatelyrics.cpp
@@ -76,7 +76,6 @@ static UltimateLyricsProvider * parseProvider(QXmlStreamReader *reader)
 
     UltimateLyricsProvider* scraper = new UltimateLyricsProvider;
     scraper->setName(attributes.value("name").toString());
-    scraper->setTitle(attributes.value("title").toString());
     scraper->setCharset(attributes.value("charset").toString());
     scraper->setUrl(attributes.value("url").toString());
 
diff --git a/context/ultimatelyricsprovider.cpp b/context/ultimatelyricsprovider.cpp
index 1e8dd32..f8e9294 100644
--- a/context/ultimatelyricsprovider.cpp
+++ b/context/ultimatelyricsprovider.cpp
@@ -23,46 +23,127 @@
 
 #include "ultimatelyricsprovider.h"
 #include "networkaccessmanager.h"
-#include "song.h"
-#include <QNetworkReply>
+#include "localize.h"
 #include <QTextCodec>
+#include <QXmlStreamReader>
+#include <QUrl>
+#if QT_VERSION >= 0x050000
+#include <QUrlQuery>
+#endif
+#include <QDebug>
+static bool debugEnabled=false;
+#define DBUG if (debugEnabled) qWarning() << "Lyrics" << __FUNCTION__
+void UltimateLyricsProvider::enableDebug()
+{
+    debugEnabled=true;
+}
+
+static const QString constArtistArg=QLatin1String("{Artist}");
+static const QString constArtistLowerArg=QLatin1String("{artist}");
+static const QString constArtistLowerNoSpaceArg=QLatin1String("{artist2}");
+static const QString constArtistFirstCharArg=QLatin1String("{a}");
+static const QString constAlbumArg=QLatin1String("{Album}");
+static const QString constAlbumLowerArg=QLatin1String("{album}");
+static const QString constAlbumLowerNoSpaceArg=QLatin1String("{album2}");
+static const QString constTitleLowerArg=QLatin1String("{title}");
+static const QString constTitleArg=QLatin1String("{Title}");
+static const QString constTitleCaseArg=QLatin1String("{Title2}");
+static const QString constYearArg=QLatin1String("{year}");
+static const QString constTrackNoArg=QLatin1String("{track}");
+
+static QString noSpace(const QString &text)
+{
+    QString ret(text);
+    ret.remove(' ');
+    return ret;
+}
+
+static QString firstChar(const QString &text)
+{
+    return text.isEmpty() ? text : text[0].toLower();
+}
 
-static const int constRedirectLimit=5;
+static QString titleCase(const QString &text)
+{
+    if (0==text.length()) {
+        return QString();
+    }
+    if (1==text.length()) {
+        return text[0].toUpper();
+    }
+    return text[0].toUpper() + text.right(text.length() - 1).toLower();
+}
 
-static QString extract(const QString &source, const QString &begin, const QString &end)
+static QString doTagReplace(QString str, const Song &song)
 {
-    int beginIdx = source.indexOf(begin);
+    if (str.contains(QLatin1Char('{'))) {
+        QString artistFixed=song.basicArtist();
+        str.replace(constArtistArg, artistFixed);
+        str.replace(constArtistFirstCharArg, firstChar(artistFixed));
+        str.replace(constAlbumArg, song.album);
+        str.replace(constTitleArg, song.title);
+        str.replace(constYearArg, QString::number(song.year));
+        str.replace(constTrackNoArg, QString::number(song.track));
+    }
+    return str;
+}
+
+static QString extract(const QString &source, const QString &begin, const QString &end, bool isTag=false)
+{
+    DBUG << "Looking for" << begin << end;
+    int beginIdx = source.indexOf(begin, 0, Qt::CaseInsensitive);
+    bool skipTagClose=false;
+
+    if (-1==beginIdx && isTag) {
+        beginIdx = source.indexOf(QString(begin).remove(">"), 0, Qt::CaseInsensitive);
+        skipTagClose=true;
+    }
     if (-1==beginIdx) {
+        DBUG << "Failed to find begin";
         return QString();
     }
-    beginIdx += begin.length();
+    if (skipTagClose) {
+        int closeIdx=source.indexOf(">", beginIdx);
+        if (-1!=closeIdx) {
+            beginIdx=closeIdx+1;
+        } else {
+            beginIdx += begin.length();
+        }
+    } else {
+        beginIdx += begin.length();
+    }
 
-    int endIdx = source.indexOf(end, beginIdx);
-    if (-1==endIdx) {
+    int endIdx = source.indexOf(end, beginIdx, Qt::CaseInsensitive);
+    if (-1==endIdx && QLatin1String("null")!=end) {
+        DBUG << "Failed to find end";
         return QString();
     }
 
+    DBUG << "Found match";
     return source.mid(beginIdx, endIdx - beginIdx - 1);
 }
 
 static QString extractXmlTag(const QString &source, const QString &tag)
 {
+    DBUG << "Looking for" << tag;
     QRegExp re("<(\\w+).*>"); // ಠ_ಠ
     if (-1==re.indexIn(tag)) {
+        DBUG << "Failed to find tag";
         return QString();
     }
 
-    return extract(source, tag, "</" + re.cap(1) + ">");
+    DBUG << "Found match";
+    return extract(source, tag, "</" + re.cap(1) + ">", true);
 }
 
 static QString exclude(const QString &source, const QString &begin, const QString &end)
 {
-    int beginIdx = source.indexOf(begin);
+    int beginIdx = source.indexOf(begin, 0, Qt::CaseInsensitive);
     if (-1==beginIdx) {
         return source;
     }
 
-    int endIdx = source.indexOf(end, beginIdx + begin.length());
+    int endIdx = source.indexOf(end, beginIdx + begin.length(), Qt::CaseInsensitive);
     if (-1==endIdx) {
         return source;
     }
@@ -80,56 +161,45 @@ static QString excludeXmlTag(const QString &source, const QString &tag)
     return exclude(source, tag, "</" + re.cap(1) + ">");
 }
 
-static void applyExtractRule(const UltimateLyricsProvider::Rule &rule, QString *content)
+static void applyExtractRule(const UltimateLyricsProvider::Rule &rule, QString &content, const Song &song)
 {
-    foreach (const UltimateLyricsProvider::RuleItem& item, rule) {
+    foreach (const UltimateLyricsProvider::RuleItem &item, rule) {
         if (item.second.isNull()) {
-            *content = extractXmlTag(*content, item.first);
+            content = extractXmlTag(content, doTagReplace(item.first, song));
         } else {
-            *content = extract(*content, item.first, item.second);
+            content = extract(content, doTagReplace(item.first, song), doTagReplace(item.second, song));
         }
     }
 }
 
-static void applyExcludeRule(const UltimateLyricsProvider::Rule &rule, QString *content)
+static void applyExcludeRule(const UltimateLyricsProvider::Rule &rule, QString &content, const Song &song)
 {
-    foreach (const UltimateLyricsProvider::RuleItem& item, rule) {
+    foreach (const UltimateLyricsProvider::RuleItem &item, rule) {
         if (item.second.isNull()) {
-            *content = excludeXmlTag(*content, item.first);
+            content = excludeXmlTag(content, doTagReplace(item.first, song));
         } else {
-            *content = exclude(*content, item.first, item.second);
+            content = exclude(content, doTagReplace(item.first, song), doTagReplace(item.second, song));
         }
     }
 }
 
-static QString noSpace(const QString &text)
-{
-    QString ret(text);
-    ret.remove(' ');
-    return ret;
-}
-
-static QString firstChar(const QString &text)
+UltimateLyricsProvider::UltimateLyricsProvider()
+    : enabled(true)
+    , relevance(0)
 {
-    return text.isEmpty() ? text : text[0].toLower();
 }
 
-static QString titleCase(const QString &text)
+UltimateLyricsProvider::~UltimateLyricsProvider()
 {
-    if (0==text.length()) {
-        return QString();
-    }
-    if (1==text.length()) {
-        return text[0].toUpper();
-    }
-    return text[0].toUpper() + text.right(text.length() - 1).toLower();
+    abort();
 }
 
-UltimateLyricsProvider::UltimateLyricsProvider()
-    : enabled(true)
-    , relevance(0)
-    , redirectCount(0)
+QString UltimateLyricsProvider::displayName() const
 {
+    QString n(name);
+    n.replace("(POLISH)", i18n("(Polish Translations)"));
+    n.replace("(PORTUGUESE)", i18n("(Portuguese Translations)"));
+    return n;
 }
 
 void UltimateLyricsProvider::fetchInfo(int id, const Song &metadata)
@@ -145,32 +215,87 @@ void UltimateLyricsProvider::fetchInfo(int id, const Song &metadata)
     }
 
     QString artistFixed=metadata.basicArtist();
-    // Fill in fields in the URL
     QString urlText(url);
-    doUrlReplace("{artist}",  artistFixed.toLower(),             urlText);
-    doUrlReplace("{artist2}", noSpace(artistFixed.toLower()),    urlText);
-    doUrlReplace("{album}",   metadata.album.toLower(),          urlText);
-    doUrlReplace("{album2}",  noSpace(metadata.album.toLower()), urlText);
-    doUrlReplace("{title}",   metadata.title.toLower(),          urlText);
-    doUrlReplace("{Artist}",  artistFixed,                       urlText);
-    doUrlReplace("{Album}",   metadata.album,                    urlText);
-    doUrlReplace("{ARTIST}",  artistFixed.toUpper(),             urlText);
-    doUrlReplace("{year}",    QString::number(metadata.year),    urlText);
-    doUrlReplace("{Title}",   metadata.title,                    urlText);
-    doUrlReplace("{Title2}",  titleCase(metadata.title),         urlText);
-    doUrlReplace("{a}",       firstChar(artistFixed),            urlText);
-    doUrlReplace("{track}",   QString::number(metadata.track),   urlText);
-
-    // Fetch the URL, follow redirects
-    redirectCount = 0;
-    QNetworkReply *reply = NetworkAccessManager::self()->get(QNetworkRequest(QUrl(urlText)));
+
+    if (QLatin1String("lyrics.wikia.com")==name) {
+        QUrl url(urlText);
+        #if QT_VERSION < 0x050000
+        QUrl &query=url;
+        #else
+        QUrlQuery query;
+        #endif
+
+        query.addQueryItem(QLatin1String("artist"), artistFixed);
+        query.addQueryItem(QLatin1String("song"), metadata.title);
+        query.addQueryItem(QLatin1String("func"), QLatin1String("getSong"));
+        query.addQueryItem(QLatin1String("fmt"), QLatin1String("xml"));
+        #if QT_VERSION >= 0x050000
+        url.setQuery(query);
+        #endif
+
+        NetworkJob *reply = NetworkAccessManager::self()->get(url);
+        requests[reply] = id;
+        connect(reply, SIGNAL(finished()), this, SLOT(wikiMediaSearchResponse()));
+        return;
+    }
+
+    songs.insert(id, metadata);
+
+    // Fill in fields in the URL
+    bool urlContainsDetails=urlText.contains(QLatin1Char('{'));
+    if (urlContainsDetails) {
+        doUrlReplace(constArtistArg, artistFixed, urlText);
+        doUrlReplace(constArtistLowerArg, artistFixed.toLower(), urlText);
+        doUrlReplace(constArtistLowerNoSpaceArg, noSpace(artistFixed.toLower()), urlText);
+        doUrlReplace(constArtistFirstCharArg, firstChar(artistFixed), urlText);
+        doUrlReplace(constAlbumArg, metadata.album, urlText);
+        doUrlReplace(constAlbumLowerArg, metadata.album.toLower(), urlText);
+        doUrlReplace(constAlbumLowerNoSpaceArg, noSpace(metadata.album.toLower()), urlText);
+        doUrlReplace(constTitleArg, metadata.title, urlText);
+        doUrlReplace(constTitleLowerArg, metadata.title.toLower(), urlText);
+        doUrlReplace(constTitleCaseArg, titleCase(metadata.title), urlText);
+        doUrlReplace(constYearArg, QString::number(metadata.year), urlText);
+        doUrlReplace(constTrackNoArg, QString::number(metadata.track), urlText);
+    }
+
+    // For some reason Qt messes up the ? -> %3F and & -> %26 conversions - by placing 25 after the %
+    // So, try and revert this...
+    QUrl url(urlText);
+
+    if (urlContainsDetails) {
+        QByteArray data=url.toEncoded();
+        data.replace("%253F", "%3F");
+        data.replace("%253f", "%3f");
+        data.replace("%2526", "%26");
+        url=QUrl::fromEncoded(data, QUrl::StrictMode);
+    }
+
+    QNetworkRequest req(url);
+    req.setRawHeader("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:6.0) Gecko/20100101 Firefox/6.0");
+    NetworkJob *reply = NetworkAccessManager::self()->get(req);
     requests[reply] = id;
-    connect(reply, SIGNAL(finished()), SLOT(lyricsFetched()));
+    connect(reply, SIGNAL(finished()), this, SLOT(lyricsFetched()));
 }
 
-void UltimateLyricsProvider::lyricsFetched()
+void UltimateLyricsProvider::abort()
+{
+    QHash<NetworkJob *, int>::ConstIterator it(requests.constBegin());
+    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();
+    }
+    requests.clear();
+    songs.clear();
+}
+
+void UltimateLyricsProvider::wikiMediaSearchResponse()
 {
-    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
+    NetworkJob *reply = qobject_cast<NetworkJob*>(sender());
     if (!reply) {
         return;
     }
@@ -178,32 +303,62 @@ void UltimateLyricsProvider::lyricsFetched()
     int id = requests.take(reply);
     reply->deleteLater();
 
-    if (QNetworkReply::NoError!=reply->error()) {
-        //emit Finished(id);
+    if (!reply->ok()) {
         emit lyricsReady(id, QString());
         return;
     }
 
-    // Handle redirects
-    QVariant redirect_target = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
-    if (redirect_target.isValid()) {
-        if (redirectCount >= constRedirectLimit) {
-            //emit Finished(id);
-            emit lyricsReady(id, QString());
-            return;
-        }
-
-        QUrl target = redirect_target.toUrl();
-        if (target.scheme().isEmpty() || target.host().isEmpty()) {
-            QString path = target.path();
-            target = reply->url();
-            target.setPath(path);
+    QUrl url;
+    QXmlStreamReader doc(reply->actualJob());
+    while (!doc.atEnd()) {
+        doc.readNext();
+        if (doc.isStartElement() && QLatin1String("url")==doc.name()) {
+            QString lyricsUrl=doc.readElementText();
+            if (!lyricsUrl.contains(QLatin1String("action=edit"))) {
+                url=QUrl::fromEncoded(lyricsUrl.toUtf8()).toString();
+            }
+            break;
         }
+    }
 
-        redirectCount ++;
-        QNetworkReply* reply = NetworkAccessManager::self()->get(QNetworkRequest(target));
+    if (url.isValid()) {
+        QString path=url.path();
+        #if QT_VERSION < 0x050000
+        QUrl &query=url;
+        #else
+        QUrlQuery query;
+        #endif
+        // ?action=query&prop=revisions&rvprop=content&format=xml&titles="
+        url.setPath(QLatin1String("/api.php"));
+        query.addQueryItem(QLatin1String("action"), QLatin1String("query"));
+        query.addQueryItem(QLatin1String("prop"), QLatin1String("revisions"));
+        query.addQueryItem(QLatin1String("rvprop"), QLatin1String("content"));
+        query.addQueryItem(QLatin1String("format"), QLatin1String("xml"));
+        query.addQueryItem(QLatin1String("titles"), path.startsWith(QLatin1Char('/')) ? path.mid(1) : path);
+        #if QT_VERSION >= 0x050000
+        url.setQuery(query);
+        #endif
+
+        NetworkJob *reply = NetworkAccessManager::self()->get(url);
         requests[reply] = id;
-        connect(reply, SIGNAL(finished()), SLOT(lyricsFetched()));
+        connect(reply, SIGNAL(finished()), this, SLOT(wikiMediaLyricsFetched()));
+    } else {
+        emit lyricsReady(id, QString());
+    }
+}
+
+void UltimateLyricsProvider::wikiMediaLyricsFetched()
+{
+    NetworkJob *reply = qobject_cast<NetworkJob*>(sender());
+    if (!reply) {
+        return;
+    }
+
+    int id = requests.take(reply);
+    reply->deleteLater();
+
+    if (!reply->ok()) {
+        emit lyricsReady(id, QString());
         return;
     }
 
@@ -212,12 +367,41 @@ void UltimateLyricsProvider::lyricsFetched()
     #else
     const QTextCodec *codec = QTextCodec::codecForName(charset.toLatin1().constData());
     #endif
-    const QString original_content = codec->toUnicode(reply->readAll());
+    QString contents = codec->toUnicode(reply->readAll()).replace("<br />", "<br/>");
+    DBUG << name << "response" << contents;
+    emit lyricsReady(id, extract(contents, QLatin1String("<lyrics>"), QLatin1String("</lyrics>")));
+}
 
+void UltimateLyricsProvider::lyricsFetched()
+{
+    NetworkJob *reply = qobject_cast<NetworkJob*>(sender());
+    if (!reply) {
+        return;
+    }
+
+    int id = requests.take(reply);
+    reply->deleteLater();
+    Song song=songs.take(id);
+
+    if (!reply->ok()) {
+        //emit Finished(id);
+        emit lyricsReady(id, QString());
+        return;
+    }
+
+    #if QT_VERSION < 0x050000
+    const QTextCodec *codec = QTextCodec::codecForName(charset.toAscii().constData());
+    #else
+    const QTextCodec *codec = QTextCodec::codecForName(charset.toLatin1().constData());
+    #endif
+    const QString originalContent = codec->toUnicode(reply->readAll()).replace("<br />", "<br/>");
+
+    DBUG << name << "response" << originalContent;
     // Check for invalid indicators
     foreach (const QString &indicator, invalidIndicators) {
-        if (original_content.contains(indicator)) {
+        if (originalContent.contains(indicator)) {
             //emit Finished(id);
+            DBUG << name << "invalid";
             emit lyricsReady(id, QString());
             return;
         }
@@ -227,20 +411,28 @@ void UltimateLyricsProvider::lyricsFetched()
 
     // Apply extract rules
     foreach (const Rule& rule, extractRules) {
-        QString content = original_content;
-        applyExtractRule(rule, &content);
+        QString content = originalContent;
+        applyExtractRule(rule, content, song);
+        #ifndef Q_OS_WIN
+        content.replace(QLatin1String("\r"), QLatin1String(""));
+        #endif
+        content=content.trimmed();
 
         if (!content.isEmpty()) {
             lyrics = content;
+            break;
         }
     }
 
     // Apply exclude rules
     foreach (const Rule& rule, excludeRules) {
-        applyExcludeRule(rule, &lyrics);
+        applyExcludeRule(rule, lyrics, song);
     }
 
     lyrics=lyrics.trimmed();
+    lyrics.replace("<br/>\n", "<br/>");
+    lyrics.replace("<br>\n", "<br/>");
+    DBUG << name << (lyrics.isEmpty() ? "empty" : "succeeded");
     emit lyricsReady(id, lyrics);
 }
 
@@ -256,6 +448,8 @@ void UltimateLyricsProvider::doUrlReplace(const QString &tag, const QString &val
         QRegExp re("[" + QRegExp::escape(format.first) + "]");
         valueCopy.replace(re, format.second);
     }
-
+    // ? and & should ony be used in URL queries...
+    valueCopy.replace(QLatin1Char('&'), QLatin1String("%26"));
+    valueCopy.replace(QLatin1Char('?'), QLatin1String("%3f"));
     u.replace(tag, valueCopy, Qt::CaseInsensitive);
 }
diff --git a/context/ultimatelyricsprovider.h b/context/ultimatelyricsprovider.h
index 38113b2..a35db59 100644
--- a/context/ultimatelyricsprovider.h
+++ b/context/ultimatelyricsprovider.h
@@ -24,26 +24,29 @@
 #ifndef ULTIMATELYRICSPROVIDER_H
 #define ULTIMATELYRICSPROVIDER_H
 
+#include "song.h"
 #include <QObject>
 #include <QPair>
 #include <QStringList>
 #include <QHash>
+#include <QMap>
 
-struct Song;
-class QNetworkReply;
+class NetworkJob;
 
 class UltimateLyricsProvider : public QObject {
     Q_OBJECT
 
 public:
+    static void enableDebug();
+
     UltimateLyricsProvider();
+    virtual ~UltimateLyricsProvider();
 
     typedef QPair<QString, QString> RuleItem;
     typedef QList<RuleItem> Rule;
     typedef QPair<QString, QString> UrlFormat;
 
     void setName(const QString &n) { name = n; }
-    void setTitle(const QString &t) { title = t; }
     void setUrl(const QString &u) { url = u; }
     void setCharset(const QString &c) { charset = c; }
     void setRelevance(int r) { relevance = r; }
@@ -52,25 +55,30 @@ public:
     void addExcludeRule(const Rule &rule) { excludeRules << rule; }
     void addInvalidIndicator(const QString &indicator) { invalidIndicators << indicator; }
     QString getName() const { return name; }
+    QString displayName() const;
     int getRelevance() const { return relevance; }
     void fetchInfo(int id, const Song &metadata);
     bool isEnabled() const { return enabled; }
     void setEnabled(bool e) { enabled = e; }
+    void abort();
 
 Q_SIGNALS:
     void lyricsReady(int id, const QString &data);
 
 private Q_SLOTS:
+    void wikiMediaSearchResponse();
+    void wikiMediaLyricsFetched();
     void lyricsFetched();
 
 private:
+    QString doTagReplace(QString str, const Song &song, bool doAll=true);
     void doUrlReplace(const QString &tag, const QString &value, QString &u) const;
 
 private:
     bool enabled;
-    QHash<QNetworkReply*, int> requests;
+    QHash<NetworkJob *, int> requests;
+    QMap<int, Song> songs;
     QString name;
-    QString title;
     QString url;
     QString charset;
     int relevance;
@@ -78,7 +86,6 @@ private:
     QList<Rule> extractRules;
     QList<Rule> excludeRules;
     QStringList invalidIndicators;
-    int redirectCount;
 };
 
 #endif // ULTIMATELYRICSPROVIDER_H
diff --git a/context/view.cpp b/context/view.cpp
index b3700f6..b3ae631 100644
--- a/context/view.cpp
+++ b/context/view.cpp
@@ -27,6 +27,10 @@
 #include "settings.h"
 #include "textbrowser.h"
 #include "gtkstyle.h"
+#include "actioncollection.h"
+#include "action.h"
+#include "icons.h"
+#include "localize.h"
 #include <QLabel>
 #include <QScrollBar>
 #include <QImage>
@@ -83,6 +87,14 @@ View::View(QWidget *parent)
     if (headerTag.isEmpty()) {
         initHeaderTags();
     }
+
+    cancelJobAction=new Action(Icons::self()->cancelIcon, i18n("Cancel"), this);
+    connect(cancelJobAction, SIGNAL(triggered()), SLOT(abort()));
+}
+
+View::~View()
+{
+    abort();
 }
 
 void View::clear()
@@ -135,6 +147,7 @@ void View::showSpinner()
     }
     if (!spinner->isActive()) {
         spinner->start();
+        cancelJobAction->setEnabled(true);
     }
 }
 
@@ -142,6 +155,7 @@ void View::hideSpinner()
 {
     if (spinner) {
         spinner->stop();
+        cancelJobAction->setEnabled(false);
     }
 }
 
@@ -199,3 +213,7 @@ void View::searchResponse(const QString &r, const QString &l)
     Q_UNUSED(l)
     text->setText(r);
 }
+
+void View::abort()
+{
+}
diff --git a/context/view.h b/context/view.h
index fed845d..82e808e 100644
--- a/context/view.h
+++ b/context/view.h
@@ -34,12 +34,14 @@ class Spinner;
 class QNetworkReply;
 class QLayoutItem;
 class TextBrowser;
+class Action;
 
 class View : public QWidget
 {
     Q_OBJECT
 public:
     View(QWidget *p);
+    virtual ~View();
 
     static QString subHeader(const QString &str) { return "<"+subTag+">"+str+"</"+subTag+">"; }
     static void initHeaderTags();
@@ -63,6 +65,7 @@ public:
 
 protected Q_SLOTS:
     virtual void searchResponse(const QString &r, const QString &l);
+    virtual void abort();
 
 protected:
     static QString subTag;
@@ -72,6 +75,7 @@ protected:
     TextBrowser *text;
     bool needToUpdate;
     Spinner *spinner;
+    Action *cancelJobAction;
 };
 
 #endif
diff --git a/context/wikipediaengine.cpp b/context/wikipediaengine.cpp
index 13c6f89..88d1214 100644
--- a/context/wikipediaengine.cpp
+++ b/context/wikipediaengine.cpp
@@ -25,7 +25,7 @@
 #include "networkaccessmanager.h"
 #include "localize.h"
 #include "settings.h"
-#include <QNetworkReply>
+#include "config.h"
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
 #endif
@@ -41,9 +41,7 @@ void WikipediaEngine::enableDebug()
 }
 
 static const char * constModeProperty="mode";
-static const char * constRedirectsProperty="redirects";
 static const char * constQueryProperty="query";
-static const int constMaxRedirects=3;
 
 static QString strip(const QString &string, QString open, QString close, QString inner=QString())
 {
@@ -314,7 +312,7 @@ void WikipediaEngine::search(const QStringList &query, Mode mode)
 void WikipediaEngine::requestTitles(const QStringList &query, Mode mode, const QString &lang)
 {
     cancel();
-    QUrl url("http://"+lang+".wikipedia.org/w/api.php");
+    QUrl url("https://"+lang+".wikipedia.org/w/api.php");
     #if QT_VERSION < 0x050000
     QUrl &q=url;
     #else
@@ -334,7 +332,6 @@ void WikipediaEngine::requestTitles(const QStringList &query, Mode mode, const Q
 
     job=NetworkAccessManager::self()->get(url);
     job->setProperty(constModeProperty, (int)mode);
-    job->setProperty(constRedirectsProperty, 0);
     job->setProperty(constQueryProperty, query);
     DBUG <<  url.toString();
     connect(job, SIGNAL(finished()), this, SLOT(parseTitles()));
@@ -343,7 +340,7 @@ void WikipediaEngine::requestTitles(const QStringList &query, Mode mode, const Q
 void WikipediaEngine::parseTitles()
 {
     DBUG << __FUNCTION__;
-    QNetworkReply *reply = getReply(sender());
+    NetworkJob *reply = getReply(sender());
     if (!reply) {
         return;
     }
@@ -351,7 +348,7 @@ void WikipediaEngine::parseTitles()
     QUrl url=reply->url();
     QString hostLang=getLang(url);
     QByteArray data=reply->readAll();
-    if (QNetworkReply::NoError!=reply->error() || data.isEmpty()) {
+    if (!reply->ok() || data.isEmpty()) {
         DBUG <<  reply->errorString();
         emit searchResult(QString(), QString());
         return;
@@ -512,13 +509,12 @@ void WikipediaEngine::getPage(const QStringList &query, Mode mode, const QString
     }
 
     QUrl url;
-    url.setScheme(QLatin1String("http"));
+    url.setScheme(QLatin1String("https"));
     url.setHost(lang+".wikipedia.org");
     url.setPath("/wiki/Special:Export/"+title);
     job=NetworkAccessManager::self()->get(url);
     job->setProperty(constModeProperty, (int)mode);
     job->setProperty(constQueryProperty, query);
-    job->setProperty(constRedirectsProperty, 0);
     DBUG <<  url.toString();
     connect(job, SIGNAL(finished()), this, SLOT(parsePage()));
 }
@@ -526,26 +522,14 @@ void WikipediaEngine::getPage(const QStringList &query, Mode mode, const QString
 void WikipediaEngine::parsePage()
 {
     DBUG << __FUNCTION__;
-    QNetworkReply *reply = getReply(sender());
+    NetworkJob *reply = getReply(sender());
     if (!reply) {
         return;
     }
 
-    QVariant redirect = reply->header(QNetworkRequest::LocationHeader);
-    int numRirects=reply->property(constRedirectsProperty).toInt();
-    if (redirect.isValid() && ++numRirects<constMaxRedirects) {
-        job=NetworkAccessManager::self()->get(redirect.toString());
-        job->setProperty(constRedirectsProperty, numRirects);
-        job->setProperty(constModeProperty, reply->property(constModeProperty));
-        job->setProperty(constQueryProperty, reply->property(constQueryProperty));
-        DBUG <<  "Redirect" << redirect.toString();
-        connect(job, SIGNAL(finished()), this, SLOT(parsePage()));
-        return;
-    }
-
     QByteArray data=reply->readAll();
-    if (QNetworkReply::NoError!=reply->error() || data.isEmpty()) {
-    DBUG <<  "Empty/error";
+    if (!reply->ok() || data.isEmpty()) {
+        DBUG <<  "Empty/error";
         emit searchResult(QString(), QString());
         return;
     }
diff --git a/context/wikipediasettings.cpp b/context/wikipediasettings.cpp
index 1bd32ca..ce7a049 100644
--- a/context/wikipediasettings.cpp
+++ b/context/wikipediasettings.cpp
@@ -32,16 +32,26 @@
 #include "utils.h"
 #include "action.h"
 #include "thread.h"
-#include <QNetworkReply>
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
 #endif
 #include <QXmlStreamReader>
 #include <QFile>
 
+static const QString constFileName=QLatin1String("wikipedia-available.xml.gz");
+
 static QString localeFile()
 {
-    return Utils::configDir(QString(), true)+"wikipedia-available.xml.gz";
+    return Utils::dataDir(QString(), true)+constFileName;
+}
+
+// Move files from previous ~/.config/cantata to ~/.local/share/cantata
+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);
+    #endif
 }
 
 WikipediaLoader::WikipediaLoader()
@@ -105,6 +115,7 @@ void WikipediaSettings::showEvent(QShowEvent *e)
     if (Initial==state) {
         state=Loading;
         QByteArray data;
+        moveToNewLocation();
         QString fileName=localeFile();
         if (QFile::exists(fileName)) {
             QFile f(fileName);
@@ -185,7 +196,7 @@ void WikipediaSettings::getLangs()
 
 void WikipediaSettings::parseLangs()
 {
-    QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender());
+    NetworkJob *reply = qobject_cast<NetworkJob*>(sender());
     if (!reply) {
         return;
     }
diff --git a/context/wikipediasettings.h b/context/wikipediasettings.h
index f25542a..9cb6d24 100644
--- a/context/wikipediasettings.h
+++ b/context/wikipediasettings.h
@@ -27,7 +27,7 @@
 #include "togglelist.h"
 #include <QMap>
 
-class QNetworkReply;
+class NetworkJob;
 class QShowEvent;
 class QListWidgetItem;
 class Spinner;
@@ -87,7 +87,7 @@ private:
 
 private:
     State state;
-    QNetworkReply *job;
+    NetworkJob *job;
     Spinner *spinner;
     Action *reload;
     QMap<int, QListWidgetItem *> prefMap;
diff --git a/dbus/gnomemediakeys.cpp b/dbus/gnomemediakeys.cpp
index 45b128c..d4be1bb 100644
--- a/dbus/gnomemediakeys.cpp
+++ b/dbus/gnomemediakeys.cpp
@@ -22,7 +22,6 @@
  */
 
 #include "gnomemediakeys.h"
-#include "mainwindow.h"
 #include "settingsdaemoninterface.h"
 #include "mediakeysinterface.h"
 #include <QDBusConnection>
@@ -36,31 +35,21 @@ static const char * constService = "org.gnome.SettingsDaemon";
 static const char * constDaemonPath = "/org/gnome/SettingsDaemon";
 static const char * constMediaKeysPath = "/org/gnome/SettingsDaemon/MediaKeys";
 
-GnomeMediaKeys::GnomeMediaKeys(MainWindow *parent)
-    : QObject(parent)
-    , mw(parent)
+GnomeMediaKeys::GnomeMediaKeys(QObject *p)
+    : MultiMediaKeysInterface(p)
     , daemon(0)
     , mk(0)
     , watcher(0)
 {
 }
 
-static bool runningUnderKde()
+void GnomeMediaKeys::activate(bool a)
 {
-    const char *env=qgetenv("KDE_FULL_SESSION");
-    if (env && 0==strcmp(env, "true")) {
-        return true;
-    }
-    return QLatin1String("KDE")==QString(qgetenv("XDG_CURRENT_DESKTOP"));
-}
-
-void GnomeMediaKeys::setEnabled(bool en)
-{
-    if (en && !mk) {
+    if (a && !mk) {
         if (daemonIsRunning()) {
             grabKeys();
         }
-    } else if (!en && mk) {
+    } else if (!a && mk) {
         releaseKeys();
         disconnectDaemon();
         if (watcher) {
@@ -73,7 +62,7 @@ void GnomeMediaKeys::setEnabled(bool en)
 bool GnomeMediaKeys::daemonIsRunning()
 {
     // Check if the service is available
-    if (!QDBusConnection::sessionBus().interface()->isServiceRegistered(constService) && !runningUnderKde()) {
+    if (!QDBusConnection::sessionBus().interface()->isServiceRegistered(constService)) {
         //...not already started, so attempt to start!
         QDBusConnection::sessionBus().interface()->startService(constService);
         if (!daemon) {
@@ -153,13 +142,13 @@ void GnomeMediaKeys::keyPressed(const QString &app, const QString &key)
         return;
     }
     if (QLatin1String("Play")==key) {
-        mw->playPauseTrack();
+        emit playPause();
     } else if (QLatin1String("Stop")==key) {
-        mw->stopPlayback();
+        emit stop();
     } else if (QLatin1String("Next")==key) {
-        mw->nextTrack();
+        emit next();
     } else if (QLatin1String("Previous")==key) {
-        mw->prevTrack();
+        emit previous();
     }
 }
 
diff --git a/dbus/gnomemediakeys.h b/dbus/gnomemediakeys.h
index cb635c4..b631466 100644
--- a/dbus/gnomemediakeys.h
+++ b/dbus/gnomemediakeys.h
@@ -24,22 +24,21 @@
 #ifndef GNOME_MEDIA_KEYS_H
 #define GNOME_MEDIA_KEYS_H
 
-#include <QObject>
+#include "multimediakeysinterface.h"
 
 class OrgGnomeSettingsDaemonInterface;
 class OrgGnomeSettingsDaemonMediaKeysInterface;
 class QDBusPendingCallWatcher;
-class MainWindow;
 class QDBusServiceWatcher;
 
-class GnomeMediaKeys : public QObject
+class GnomeMediaKeys : public MultiMediaKeysInterface
 {
     Q_OBJECT
 
 public:
-    GnomeMediaKeys(MainWindow *parent);
+    GnomeMediaKeys(QObject *p);
 
-    void setEnabled(bool en);
+    void activate(bool a);
 
 private:
     bool daemonIsRunning();
@@ -54,7 +53,6 @@ private Q_SLOTS:
     void pluginActivated(const QString &name);
 
 private:
-    MainWindow *mw;
     OrgGnomeSettingsDaemonInterface *daemon;
     OrgGnomeSettingsDaemonMediaKeysInterface *mk;
     QDBusServiceWatcher *watcher;
diff --git a/dbus/mpris.cpp b/dbus/mpris.cpp
index 87ad699..3da6e78 100644
--- a/dbus/mpris.cpp
+++ b/dbus/mpris.cpp
@@ -26,6 +26,7 @@
 #include "playeradaptor.h"
 #include "rootadaptor.h"
 #include "config.h"
+#include "mainwindow.h"
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KWindowSystem>
 #endif
diff --git a/dbus/mpris.h b/dbus/mpris.h
index ac24a2e..ddbd6b7 100644
--- a/dbus/mpris.h
+++ b/dbus/mpris.h
@@ -30,9 +30,10 @@
 #include <QApplication>
 #include "song.h"
 #include "mpdstatus.h"
-#include "mainwindow.h"
+#include "stdactions.h"
 
 class QDBusObjectPath;
+class MainWindow;
 
 class Mpris : public QObject
 {
@@ -69,23 +70,23 @@ public:
     virtual ~Mpris() { }
 
     // org.mpris.MediaPlayer2.Player
-    void Next() { mw->nextTrack(); }
-    void Previous() { mw->prevTrack(); }
+    void Next() { StdActions::self()->nextTrackAction->trigger(); }
+    void Previous() { StdActions::self()->prevTrackAction->trigger(); }
     void Pause() {
         if (MPDState_Playing==MPDStatus::self()->state()) {
-            mw->playPauseTrack();
+            StdActions::self()->playPauseTrackAction->trigger();
         }
     }
 
-    void PlayPause() { mw->playPauseTrack(); }
-    void Stop() { mw->stopPlayback(); }
-    void StopAfterCurrent() { mw->stopAfterCurrentTrack(); }
+    void PlayPause() { StdActions::self()->playPauseTrackAction->trigger(); }
+    void Stop() { StdActions::self()->stopPlaybackAction->trigger(); }
+    void StopAfterCurrent() { StdActions::self()->stopAfterTrackAction->trigger(); }
 
     void Play() {
         MPDStatus * const status = MPDStatus::self();
 
         if (status->playlistLength() && MPDState_Playing!=status->state()) {
-           mw->playPauseTrack();
+           StdActions::self()->playPauseTrackAction->trigger();
         }
     }
 
diff --git a/dbus/org.freedesktop.PowerManagement.Inhibit.xml b/dbus/org.freedesktop.PowerManagement.Inhibit.xml
new file mode 100644
index 0000000..d5be190
--- /dev/null
+++ b/dbus/org.freedesktop.PowerManagement.Inhibit.xml
@@ -0,0 +1,20 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+  <interface name="org.freedesktop.PowerManagement.Inhibit">
+    <method name="Inhibit">
+      <arg type="s" name="application" direction="in"/>
+      <arg type="s" name="reason" direction="in"/>
+      <arg type="u" name="cookie" direction="out"/>
+    </method>
+    <method name="UnInhibit">
+      <arg type="u" name="cookie" direction="in"/>
+    </method>
+
+    <signal name="HasInhibitChanged">
+      <arg type="b" name="has_inhibit" direction="out"/>
+    </signal>
+    <method name="HasInhibit">
+      <arg type="b" name="has_inhibit" direction="out"/>
+    </method>
+  </interface>
+</node>
diff --git a/dbus/org.kde.Solid.PowerManagement.PolicyAgent.xml b/dbus/org.kde.Solid.PowerManagement.PolicyAgent.xml
new file mode 100644
index 0000000..a07dd73
--- /dev/null
+++ b/dbus/org.kde.Solid.PowerManagement.PolicyAgent.xml
@@ -0,0 +1,16 @@
+<!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">
+<node>
+  <interface name="org.kde.Solid.PowerManagement.PolicyAgent">
+    <method name="AddInhibition">
+      <arg type="u" direction="in" />
+      <arg type="s" direction="in" />
+      <arg type="s" direction="in" />
+
+      <arg type="u" direction="out" />
+    </method>
+
+    <method name="ReleaseInhibition">
+      <arg type="u" direction="in" />
+    </method>
+  </interface>
+</node>
diff --git a/dbus/powermanagement.cpp b/dbus/powermanagement.cpp
new file mode 100644
index 0000000..41905f9
--- /dev/null
+++ b/dbus/powermanagement.cpp
@@ -0,0 +1,139 @@
+/*
+ * 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 "powermanagement.h"
+
+#ifdef ENABLE_KDE_SUPPORT
+#include <KDE/Solid/PowerManagement>
+#include <KDE/KGlobal>
+#include <kdeversion.h>
+K_GLOBAL_STATIC(PowerManagement, instance)
+#else
+#include "inhibitinterface.h"
+#include "policyagentinterface.h"
+#include "upowerinterface.h"
+#endif
+#include "localize.h"
+#include "mpdstatus.h"
+
+PowerManagement * PowerManagement::self()
+{
+    #ifdef ENABLE_KDE_SUPPORT
+    return instance;
+    #else
+    static PowerManagement *instance=0;
+    if(!instance) {
+        instance=new PowerManagement;
+    }
+    return instance;
+    #endif
+}
+
+PowerManagement::PowerManagement()
+    : inhibitSuspendWhilstPlaying(false)
+    , cookie(-1)
+{
+    #ifdef ENABLE_KDE_SUPPORT
+    #if KDE_IS_VERSION(4, 7, 0)
+    connect(Solid::PowerManagement::notifier(), SIGNAL(resumingFromSuspend()), this, SIGNAL(resuming()));
+    #endif
+    #else
+    policy = new OrgKdeSolidPowerManagementPolicyAgentInterface(OrgKdeSolidPowerManagementPolicyAgentInterface::staticInterfaceName(),
+                                                                QLatin1String("/org/kde/Solid/PowerManagement/PolicyAgent"),
+                                                                QDBusConnection::sessionBus(), this);
+    inhibit = new OrgFreedesktopPowerManagementInhibitInterface(OrgFreedesktopPowerManagementInhibitInterface::staticInterfaceName(),
+                                                                QLatin1String("/org/freedesktop/PowerManagement/Inhibit"),
+                                                                QDBusConnection::sessionBus(), this);
+    upower = new OrgFreedesktopUPowerInterface(OrgFreedesktopUPowerInterface::staticInterfaceName(),
+                                               QLatin1String("/org/freedesktop/UPower"), QDBusConnection::systemBus(), this);
+    connect(upower, SIGNAL(Resuming()), this, SIGNAL(resuming()));
+    #endif
+}
+
+void PowerManagement::setInhibitSuspend(bool i)
+{
+    if (i==inhibitSuspendWhilstPlaying) {
+        return;
+    }
+    i=inhibitSuspendWhilstPlaying;
+
+    if (inhibitSuspendWhilstPlaying) {
+        connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(mpdStatusUpdated()));
+        if (MPDState_Playing==MPDStatus::self()->state()) {
+            beginSuppressingSleep();
+        }
+    } else {
+        disconnect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(mpdStatusUpdated()));
+        stopSuppressingSleep();
+    }
+}
+
+void PowerManagement::beginSuppressingSleep()
+{
+    if (-1!=cookie) {
+        return;
+    }
+    QString reason=i18n("Cantata is playing a track");
+    #ifdef ENABLE_KDE_SUPPORT
+    cookie=Solid::PowerManagement::beginSuppressingSleep(reason);
+    #else
+    QDBusReply<uint> reply;
+    if (policy->isValid()) {
+        reply = policy->AddInhibition((uint)1, QCoreApplication::applicationName(), reason);
+    } else {
+        // Fallback to the fd.o Inhibit interface
+        reply = inhibit->Inhibit(QCoreApplication::applicationName(), reason);
+    }
+    cookie=reply.isValid() ? reply : -1;
+    #endif
+}
+
+void PowerManagement::stopSuppressingSleep()
+{
+    if (-1==cookie) {
+        return;
+    }
+
+    #ifdef ENABLE_KDE_SUPPORT
+    Solid::PowerManagement::stopSuppressingSleep(cookie);
+    #else
+    if (policy->isValid()) {
+        policy->ReleaseInhibition(cookie);
+    } else {
+        // Fallback to the fd.o Inhibit interface
+        inhibit->UnInhibit(cookie);
+    }
+    #endif
+    cookie=-1;
+}
+
+void PowerManagement::mpdStatusUpdated()
+{
+    if (inhibitSuspendWhilstPlaying) {
+        if (MPDState_Playing==MPDStatus::self()->state()) {
+            beginSuppressingSleep();
+        } else {
+            stopSuppressingSleep();
+        }
+    }
+}
diff --git a/devices/mountpoints.h b/dbus/powermanagement.h
similarity index 56%
copy from devices/mountpoints.h
copy to dbus/powermanagement.h
index d4ba7be..3f1a009 100644
--- a/devices/mountpoints.h
+++ b/dbus/powermanagement.h
@@ -21,36 +21,44 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef MOUNTPOINTS_H
-#define MOUNTPOINTS_H
+#ifndef POWERMANAGEMENT_H
+#define POWERMANAGEMENT_H
 
 #include <QObject>
-#include <QSet>
 #include <QString>
 
-class QFile;
-
-class MountPoints : public QObject
+#ifndef ENABLE_KDE_SUPPORT
+class OrgKdeSolidPowerManagementPolicyAgentInterface;
+class OrgFreedesktopPowerManagementInhibitInterface;
+class OrgFreedesktopUPowerInterface;
+#endif
+    
+class PowerManagement : public QObject
 {
     Q_OBJECT
 
 public:
-    static MountPoints * self();
+    static PowerManagement * self();
+    PowerManagement();
 
-    MountPoints();
-    int currentToken() const { return token; }
-    bool isMounted(const QString &mp) const;
+    void setInhibitSuspend(bool i);
+    void beginSuppressingSleep();
+    void stopSuppressingSleep();
 
 Q_SIGNALS:
-    void updated();
+    void resuming();
 
 private Q_SLOTS:
-    void updateMountPoints();
+    void mpdStatusUpdated();
 
 private:
-    int token;
-    QSet<QString> current;
-    QFile *mounts;
+    bool inhibitSuspendWhilstPlaying;
+    int cookie;
+    #ifndef ENABLE_KDE_SUPPORT
+    OrgKdeSolidPowerManagementPolicyAgentInterface *policy;
+    OrgFreedesktopPowerManagementInhibitInterface *inhibit;
+    OrgFreedesktopUPowerInterface *upower;
+    #endif
 };
 
-#endif // MOUNTPOINTS_H
+#endif
diff --git a/devices/actiondialog.cpp b/devices/actiondialog.cpp
index 8d4e7da..4df3a99 100644
--- a/devices/actiondialog.cpp
+++ b/devices/actiondialog.cpp
@@ -49,6 +49,9 @@
 #endif
 #include <QFile>
 #include <QDebug>
+#ifdef QT_QTDBUS_FOUND
+#include <QDBusConnection>
+#endif
 
 static int iCount=0;
 
@@ -65,10 +68,10 @@ enum Pages
     PAGE_PROGRESS
 };
 
-class SongDialog : public Dialog
+class SongListDialog : public Dialog
 {
 public:
-    SongDialog(ActionDialog *p)
+    SongListDialog(ActionDialog *p)
         : Dialog(p) {
         setCaption(i18n("Songs To Be Copied"));
         setButtons(Close);
@@ -112,11 +115,15 @@ ActionDialog::ActionDialog(QWidget *parent)
     connect(configureDestButton, SIGNAL(clicked()), SLOT(configureDest()));
     connect(this, SIGNAL(update()), MPDConnection::self(), SLOT(update()));
     connect(songCount, SIGNAL(leftClickedUrl()), SLOT(showSongs()));
+    #ifdef QT_QTDBUS_FOUND
+    unityMessage=QDBusMessage::createSignal("/Cantata", "com.canonical.Unity.LauncherEntry", "Update");
+    #endif
 }
 
 ActionDialog::~ActionDialog()
 {
     iCount--;
+    updateUnity(true);
 }
 
 void ActionDialog::controlInfoLabel(Device *dev)
@@ -161,7 +168,7 @@ void ActionDialog::controlInfoLabel(Device *dev)
 void ActionDialog::showSongs()
 {
     if (!songDialog) {
-        songDialog=new SongDialog(this);
+        songDialog=new SongListDialog(this);
     }
     songDialog->show();
 }
@@ -213,6 +220,14 @@ void ActionDialog::copy(const QString &srcUdi, const QString &dstUdi, const QLis
     totalTime=0;
     #endif
     foreach (const Song &s, songsToAction) {
+        quint32 size=s.size;
+        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();
+            }
+        }
         if (s.size>0) {
             spaceRequired+=s.size;
         }
@@ -351,6 +366,7 @@ void ActionDialog::init(const QString &srcUdi, const QString &dstUdi, const QLis
     #ifdef ENABLE_REPLAYGAIN_SUPPORT
     albumsWithoutRgTags.clear();
     #endif
+    updateUnity(false);
 }
 
 void ActionDialog::slotButtonClicked(int button)
@@ -657,9 +673,6 @@ void ActionDialog::actionStatus(int status, bool copiedCover)
     case Device::FailedToUpdateTags:
         setPage(PAGE_SKIP, i18n("Failed to update metadata.<br/><br/<hr/>%1", formatSong(currentSong)));
         break;
-    case Device::TooManyRedirects:
-        setPage(PAGE_SKIP, i18n("Failed to download track - too many redirects encountered.<br/><br/<hr/>%1", formatSong(currentSong)));
-        break;
     case Device::DownloadFailed:
         setPage(PAGE_SKIP, i18n("Failed to download track.<br/><br/<hr/>%1", formatSong(currentSong)));
         break;
@@ -861,6 +874,7 @@ void ActionDialog::jobPercent(int percent)
 {
     if (percent!=currentPercent) {
         progressBar->setValue((100*count)+percent);
+        updateUnity(false);
         currentPercent=percent;
         if (PAGE_PROGRESS==stack->currentIndex()) {
             progressLabel->setText(formatSong(currentSong, false, true));
@@ -872,6 +886,27 @@ void ActionDialog::incProgress()
 {
     count++;
     progressBar->setValue(100*count);
+    updateUnity(false);
+}
+
+void ActionDialog::updateUnity(bool finished)
+{
+    #ifdef QT_QTDBUS_FOUND
+    QList<QVariant> args;
+    double progress = finished || progressBar->maximum()<1 ? 0.0 : (progressBar->value()/(progressBar->maximum()*1.0));
+    bool showProgress = progress>-0.1 && progress < 100.0 && !finished;
+    QMap<QString, QVariant> props;
+    props["count-visible"]=!finished && songsToAction.count()>0;
+    props["count"]=(long long)songsToAction.count();
+    props["progress-visible"]=showProgress;
+    props["progress"]=showProgress ? progress : 0.0;
+    args.append("application://cantata.desktop");
+    args.append(props);
+    unityMessage.setArguments(args);
+    QDBusConnection::sessionBus().send(unityMessage);
+    #else
+    Q_UNUSED(finished)
+    #endif
 }
 
 void ActionDialog::cacheSaved()
diff --git a/devices/actiondialog.h b/devices/actiondialog.h
index 67e9eb7..ee5f613 100644
--- a/devices/actiondialog.h
+++ b/devices/actiondialog.h
@@ -27,10 +27,13 @@
 #include "dialog.h"
 #include "song.h"
 #include "device.h"
+#include "config.h"
 #include "ui_actiondialog.h"
 #include <QElapsedTimer>
-
-class SongDialog;
+#ifdef QT_QTDBUS_FOUND
+#include <QDBusMessage>
+#endif
+class SongListDialog;
 
 class ActionDialog : public Dialog, Ui::ActionDialog
 {
@@ -85,6 +88,7 @@ private:
     void removeSong(const Song &s);
     void cleanDirs();
     void incProgress();
+    void updateUnity(bool finished);
 
 private:
     Mode mode;
@@ -117,9 +121,12 @@ private:
     #ifdef ENABLE_REPLAYGAIN_SUPPORT
     QSet<QString> albumsWithoutRgTags;
     #endif
+    #ifdef QT_QTDBUS_FOUND
+    QDBusMessage unityMessage;
+    #endif
 
-    SongDialog *songDialog;
-    friend class SongDialog;
+    SongListDialog *songDialog;
+    friend class SongListDialog;
 };
 
 #endif
diff --git a/devices/actiondialog.ui b/devices/actiondialog.ui
index df84bca..544e52e 100644
--- a/devices/actiondialog.ui
+++ b/devices/actiondialog.ui
@@ -42,6 +42,9 @@
          </item>
          <item>
           <widget class="QToolButton" name="configureSourceButton">
+           <property name="toolTip">
+            <string>Configure</string>
+           </property>
            <property name="autoRaise">
             <bool>true</bool>
            </property>
@@ -85,6 +88,9 @@
          </item>
          <item>
           <widget class="QToolButton" name="configureDestButton">
+           <property name="toolTip">
+            <string>Configure</string>
+           </property>
            <property name="autoRaise">
             <bool>true</bool>
            </property>
diff --git a/devices/albumdetails.ui b/devices/albumdetails.ui
index 0520b59..7eb3051 100644
--- a/devices/albumdetails.ui
+++ b/devices/albumdetails.ui
@@ -42,6 +42,19 @@
          <widget class="CompletionCombo" name="artist"/>
         </item>
         <item row="1" column="0">
+         <widget class="BuddyLabel" name="composerLabel">
+          <property name="text">
+           <string>Composer:</string>
+          </property>
+          <property name="buddy">
+           <cstring>composer</cstring>
+          </property>
+         </widget>
+        </item>
+        <item row="1" column="1">
+         <widget class="CompletionCombo" name="composer"/>
+        </item>
+        <item row="2" column="0">
          <widget class="BuddyLabel" name="label_2">
           <property name="text">
            <string>Title:</string>
@@ -51,10 +64,10 @@
           </property>
          </widget>
         </item>
-        <item row="1" column="1">
+        <item row="2" column="1">
          <widget class="CompletionCombo" name="title"/>
         </item>
-        <item row="2" column="0">
+        <item row="3" column="0">
          <widget class="BuddyLabel" name="label_3">
           <property name="text">
            <string>Genre:</string>
@@ -64,10 +77,10 @@
           </property>
          </widget>
         </item>
-        <item row="2" column="1">
+        <item row="3" column="1">
          <widget class="CompletionCombo" name="genre"/>
         </item>
-        <item row="3" column="0">
+        <item row="4" column="0">
          <widget class="BuddyLabel" name="label_4">
           <property name="text">
            <string>Year:</string>
@@ -77,38 +90,38 @@
           </property>
          </widget>
         </item>
+        <item row="4" column="1">
+         <widget class="SpinBox" name="year"/>
+        </item>
         <item row="5" column="0">
-         <widget class="BuddyLabel" name="label_5">
+         <widget class="BuddyLabel" name="label_6">
           <property name="text">
-           <string>Single artist:</string>
+           <string>Disc:</string>
           </property>
           <property name="buddy">
-           <cstring>singleArtist</cstring>
+           <cstring>disc</cstring>
           </property>
          </widget>
         </item>
-        <item row="3" column="1">
-         <widget class="SpinBox" name="year"/>
-        </item>
         <item row="5" column="1">
-         <widget class="OnOffButton" name="singleArtist">
-          <property name="text">
-           <string/>
-          </property>
-         </widget>
+         <widget class="SpinBox" name="disc"/>
         </item>
-        <item row="4" column="0">
-         <widget class="BuddyLabel" name="label_6">
+        <item row="6" column="0">
+         <widget class="BuddyLabel" name="label_5">
           <property name="text">
-           <string>Disc:</string>
+           <string>Single artist:</string>
           </property>
           <property name="buddy">
-           <cstring>disc</cstring>
+           <cstring>singleArtist</cstring>
           </property>
          </widget>
         </item>
-        <item row="4" column="1">
-         <widget class="SpinBox" name="disc"/>
+        <item row="6" column="1">
+         <widget class="OnOffButton" name="singleArtist">
+          <property name="text">
+           <string/>
+          </property>
+         </widget>
         </item>
        </layout>
       </item>
@@ -133,7 +146,7 @@
       <item>
        <widget class="QTreeWidget" name="tracks">
         <property name="alternatingRowColors">
-         <bool>true</bool>
+         <bool>false</bool>
         </property>
         <property name="rootIsDecorated">
          <bool>false</bool>
@@ -193,6 +206,7 @@
  </customwidgets>
  <tabstops>
   <tabstop>artist</tabstop>
+  <tabstop>composer</tabstop>
   <tabstop>title</tabstop>
   <tabstop>genre</tabstop>
   <tabstop>year</tabstop>
diff --git a/devices/albumdetailsdialog.cpp b/devices/albumdetailsdialog.cpp
index 7c16be5..095cfd7 100644
--- a/devices/albumdetailsdialog.cpp
+++ b/devices/albumdetailsdialog.cpp
@@ -32,6 +32,7 @@
 #include "cdalbum.h"
 #include "icons.h"
 #include "coverdialog.h"
+#include "basicitemdelegate.h"
 #include <QMenu>
 #include <QItemDelegate>
 #include <QMouseEvent>
@@ -106,15 +107,21 @@ AlbumDetailsDialog::AlbumDetailsDialog(QWidget *parent)
 
     QSet<QString> artists;
     QSet<QString> albumArtists;
+    QSet<QString> composers;
     QSet<QString> albums;
     QSet<QString> genres;
-    MusicLibraryModel::self()->getDetails(artists, albumArtists, albums, genres);
+    MusicLibraryModel::self()->getDetails(artists, albumArtists, composers, albums, genres);
 
     QStringList strings=albumArtists.toList();
     strings.sort();
     artist->clear();
     artist->insertItems(0, strings);
 
+    strings=composers.toList();
+    strings.sort();
+    composer->clear();
+    composer->insertItems(0, strings);
+
     strings=albums.toList();
     strings.sort();
     title->clear();
@@ -143,6 +150,7 @@ AlbumDetailsDialog::AlbumDetailsDialog(QWidget *parent)
     cover->setMaximumSize(size, size);
     setCover();
     cover->installEventFilter(this);
+    tracks->setItemDelegate(new BasicItemDelegate(tracks));
 }
 
 AlbumDetailsDialog::~AlbumDetailsDialog()
@@ -154,6 +162,7 @@ void AlbumDetailsDialog::show(AudioCdDevice *dev)
 {
     udi=dev->id();
     artist->setText(dev->albumArtist());
+    composer->setText(dev->albumComposer());
     title->setText(dev->albumName());
     genre->setText(dev->albumGenre());
     disc->setValue(dev->albumDisc());
@@ -313,6 +322,7 @@ Song AlbumDetailsDialog::toSong(QTreeWidgetItem *i, const CdAlbum &album)
     s.year=album.year;
     s.disc=album.disc;
     s.artist=singleArtist->isChecked() ? s.albumartist : i->text(COL_ARTIST);
+    s.composer=album.composer;
     s.title=i->text(COL_TITLE);
     s.track=i->text(COL_TRACK).toInt();
     s.id=i->data(0, Role_Id).toInt();
@@ -328,6 +338,7 @@ CdAlbum AlbumDetailsDialog::getAlbum() const
 
     CdAlbum cdAlbum;
     cdAlbum.artist=artist->text().trimmed();
+    cdAlbum.composer=composer->text().trimmed();
     cdAlbum.name=title->text().trimmed();
     cdAlbum.disc=disc->value();
     cdAlbum.year=year->value();
diff --git a/devices/audiocddevice.cpp b/devices/audiocddevice.cpp
index 9be3b4f..4243c4a 100644
--- a/devices/audiocddevice.cpp
+++ b/devices/audiocddevice.cpp
@@ -165,7 +165,7 @@ AudioCdDevice::~AudioCdDevice()
     #endif
 }
 
-bool AudioCdDevice::isDevice(const QString &dev)
+bool AudioCdDevice::isAudioDevice(const QString &dev) const
 {
     return constAnyDev==dev || device==dev;
 }
@@ -271,7 +271,7 @@ void AudioCdDevice::copySongTo(const Song &s, const QString &baseDir, const QStr
     currentDestFile=encoder.changeExtension(baseDir+musicPath);
 
     QDir dir(Utils::getDir(currentDestFile));
-    if (!dir.exists() && !Utils::createDir(dir.absolutePath(), baseDir)) {
+    if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) {
         emit actionStatus(DirCreationFaild);
         return;
     }
@@ -338,6 +338,7 @@ void AudioCdDevice::setDetails(const CdAlbum &a)
     setData(a.artist);
     album=a.name;
     artist=a.artist;
+    composer=a.composer;
     genre=a.genre;
     year=a.year;
     disc=a.disc;
@@ -359,7 +360,7 @@ void AudioCdDevice::setDetails(const CdAlbum &a)
         s.artist=artist;
         s.album=album;
         s.file=AudioCdDevice::coverUrl(id());
-        Covers::Image img=Covers::self()->requestImage(s);
+        Covers::Image img=Covers::self()->requestImage(s, true);
         if (!img.img.isNull()) {
             setCover(s, img.img, img.fileName);
         }
diff --git a/devices/audiocddevice.h b/devices/audiocddevice.h
index 7964dde..d1a8cc0 100644
--- a/devices/audiocddevice.h
+++ b/devices/audiocddevice.h
@@ -57,7 +57,7 @@ public:
     virtual ~AudioCdDevice();
 
     QImage image() const { return cover().img; }
-    bool isDevice(const QString &dev);
+    bool isAudioDevice(const QString &dev) const;
     bool supportsDisconnect() const { return 0!=drive; }
     bool isConnected() const { return !device.isEmpty(); }
     void rescan(bool useCddb);
@@ -79,6 +79,7 @@ public:
     bool canPlaySongs() const { return true; }
     QString albumName() const { return album; }
     QString albumArtist() const { return artist; }
+    QString albumComposer() const { return composer; }
     QString albumGenre() const { return genre; }
     int albumDisc() const { return disc; }
     int albumYear() const { return year; }
@@ -114,6 +115,7 @@ private:
     QString detailsString;
     QString album;
     QString artist;
+    QString composer;
     QString genre;
     QString device;
     QString devPath;
diff --git a/devices/cdalbum.h b/devices/cdalbum.h
index 2c99f09..eaf7205 100644
--- a/devices/cdalbum.h
+++ b/devices/cdalbum.h
@@ -30,10 +30,11 @@
 
 struct CdAlbum {
     CdAlbum() : isDefault(false), year(0), disc(0)  { }
-    bool isNull() const { return 0==year && 0==disc && tracks.isEmpty() && name.isEmpty() && artist.isEmpty() && genre.isEmpty(); }
+    bool isNull() const { return 0==year && 0==disc && tracks.isEmpty() && name.isEmpty() && artist.isEmpty() && composer.isEmpty() && genre.isEmpty(); }
     bool isDefault;
     QString name;
     QString artist;
+    QString composer;
     QString genre;
     int year;
     int disc;
diff --git a/devices/cddbinterface.cpp b/devices/cddbinterface.cpp
index 808a927..5c4a8ab 100644
--- a/devices/cddbinterface.cpp
+++ b/devices/cddbinterface.cpp
@@ -73,6 +73,9 @@ CddbInterface::~CddbInterface()
 static CdAlbum toAlbum(cddb_disc_t *disc, const CdAlbum &initial=CdAlbum())
 {
     CdAlbum album;
+    if (!disc) {
+        return album;
+    }
     album.name=QString::fromUtf8(cddb_disc_get_title(disc));
     album.artist=QString::fromUtf8(cddb_disc_get_artist(disc));
     album.genre=QString::fromUtf8(cddb_disc_get_genre(disc));
@@ -144,7 +147,7 @@ void CddbInterface::readDisc()
     struct ioc_read_toc_single_entry te;
     struct ioc_read_subchannel cdsc;
     struct cd_sub_channel_info data;
-    bzero(&cdsc,sizeof(cdsc));
+    bzero(&cdsc, sizeof(cdsc));
     cdsc.data = &data;
     cdsc.data_len = sizeof(data);
     cdsc.data_format = CD_CURRENT_POSITION;
@@ -200,10 +203,12 @@ void CddbInterface::readDisc()
     }
     #endif
 
-    cddb_disc_set_artist(disc, unknown.constData());
-    cddb_disc_set_title(disc, unknown.constData());
-    cddb_disc_set_genre(disc, unknown.constData());
-    cddb_disc_calc_discid(disc);
+    if (disc) {
+        cddb_disc_set_artist(disc, unknown.constData());
+        cddb_disc_set_title(disc, unknown.constData());
+        cddb_disc_set_genre(disc, unknown.constData());
+        cddb_disc_calc_discid(disc);
+    }
     close(fd);
 
     initial=toAlbum(disc);
diff --git a/devices/device.cpp b/devices/device.cpp
index 8c54530..5a4eae9 100644
--- a/devices/device.cpp
+++ b/devices/device.cpp
@@ -149,6 +149,12 @@ Song Device::fixPath(const Song &orig, bool fullPath) const
 
 #include <unistd.h>
 
+void Device::toggleGrouping()
+{
+    MusicLibraryItemRoot::toggleGrouping();
+    saveCache();
+}
+
 const QLatin1String Device::constNoCover("-");
 const QLatin1String Device::constEmbedCover("+");
 
@@ -340,4 +346,9 @@ void Device::songCount(int c)
     setStatusMessage(i18n("Updating (%1)...", c));
 }
 
+void Device::updatePercentage(int pc)
+{
+    setStatusMessage(i18n("Updating (%1%)...", pc));
+}
+
 #endif // Q_OS_WIN
diff --git a/devices/device.h b/devices/device.h
index 1dc1882..843da11 100644
--- a/devices/device.h
+++ b/devices/device.h
@@ -82,7 +82,6 @@ public:
         FailedToLockDevice,
 
         // These are for online services...
-        TooManyRedirects,
         DownloadFailed
     };
 
@@ -158,8 +157,10 @@ public:
     virtual qint64 freeSpace()=0;
     virtual DevType devType() const=0;
     virtual void removeCache() { }
+    virtual bool isDevice() const { return true; }
 
     #ifndef Q_OS_WIN
+    void toggleGrouping();
     virtual void saveCache();
     const QString & id() const { return deviceId; }
     void applyUpdate();
@@ -179,13 +180,14 @@ public:
     QModelIndex index() const;
     #endif
 
-#ifndef Q_OS_WIN
+    #if !defined Q_OS_WIN && !defined WIN32
     void updateStatus();
 
 public Q_SLOTS:
     void setStatusMessage(const QString &message);
     void songCount(int c);
-#endif
+    void updatePercentage(int pc);
+    #endif
 
 Q_SIGNALS:
     void connected(const QString &id);
diff --git a/devices/deviceoptions.cpp b/devices/deviceoptions.cpp
index f666488..652bc3b 100644
--- a/devices/deviceoptions.cpp
+++ b/devices/deviceoptions.cpp
@@ -170,6 +170,7 @@ static void manipulateThe(QString &str, bool reverse)
 }
 
 const QLatin1String DeviceOptions::constAlbumArtist("%albumartist%");
+const QLatin1String DeviceOptions::constComposer("%composer%");
 const QLatin1String DeviceOptions::constAlbumTitle("%album%");
 const QLatin1String DeviceOptions::constTrackArtist("%artist%");
 const QLatin1String DeviceOptions::constTrackTitle("%title%");
@@ -246,7 +247,7 @@ void DeviceOptions::load(const QString &group, bool isMpd)
     #endif
 }
 
-void DeviceOptions::save(const QString &group, bool isMpd, bool saveTrans) const
+void DeviceOptions::save(const QString &group, bool isMpd, bool saveTrans, bool saveFileName) const
 {
     #ifdef ENABLE_KDE_SUPPORT
     KConfigGroup cfg(KGlobal::config(), !isMpd || group.isEmpty() || KGlobal::config()->hasGroup(group) ? group : constMpdGroup);
@@ -255,11 +256,13 @@ void DeviceOptions::save(const QString &group, bool isMpd, bool saveTrans) const
     cfg.beginGroup(!isMpd || group.isEmpty() || HAS_GROUP(group) ? group : constMpdGroup);
     #endif
 
-    SET_VALUE("scheme", scheme);
-    SET_VALUE("vfatSafe", vfatSafe);
-    SET_VALUE("asciiOnly", asciiOnly);
-    SET_VALUE("ignoreThe", ignoreThe);
-    SET_VALUE("replaceSpaces", replaceSpaces);
+    if (saveFileName) {
+        SET_VALUE("scheme", scheme);
+        SET_VALUE("vfatSafe", vfatSafe);
+        SET_VALUE("asciiOnly", asciiOnly);
+        SET_VALUE("ignoreThe", ignoreThe);
+        SET_VALUE("replaceSpaces", replaceSpaces);
+    }
     #ifdef ENABLE_DEVICES_SUPPORT
     if (!isMpd) {
         SET_VALUE("useCache", useCache);
@@ -329,8 +332,7 @@ QString DeviceOptions::createFilename(const Song &s) const
     static QStringList ignore;
 
     if (ignore.isEmpty()) {
-        ignore << QLatin1String("%composer%")
-               << QLatin1String("%comment%")
+        ignore << QLatin1String("%comment%")
                << QLatin1String("%filetype%")
                << QLatin1String("%ignore%")
                << QLatin1String("%folder%")
@@ -344,6 +346,7 @@ QString DeviceOptions::createFilename(const Song &s) const
     Song copy=clean(s);
 
     path.replace(constAlbumArtist, copy.albumArtist());
+    path.replace(constComposer, copy.composer);
     path.replace(constAlbumTitle, copy.album);
     path.replace(constTrackArtist, copy.artist);
     path.replace(constTrackTitle, copy.title);
diff --git a/devices/deviceoptions.h b/devices/deviceoptions.h
index 692a02c..7c412bb 100644
--- a/devices/deviceoptions.h
+++ b/devices/deviceoptions.h
@@ -43,6 +43,7 @@ struct DeviceStorage {
 
 struct DeviceOptions {
     static const QLatin1String constAlbumArtist;
+    static const QLatin1String constComposer;
     static const QLatin1String constAlbumTitle;
     static const QLatin1String constTrackArtist;
     static const QLatin1String constTrackTitle;
@@ -61,7 +62,7 @@ struct DeviceOptions {
     #endif
 
     void load(const QString &group, bool isMpd=false);
-    void save(const QString &group, bool isMpd=false, bool saveTrans=true) const;
+    void save(const QString &group, bool isMpd=false, bool saveTrans=true, bool saveFileNameScheme=true) const;
 
     bool operator==(const DeviceOptions &o) const {
         return vfatSafe==o.vfatSafe && asciiOnly==o.asciiOnly && ignoreThe==o.ignoreThe &&
diff --git a/devices/devicepropertieswidget.cpp b/devices/devicepropertieswidget.cpp
index 71e1f6b..3e6a17d 100644
--- a/devices/devicepropertieswidget.cpp
+++ b/devices/devicepropertieswidget.cpp
@@ -125,15 +125,25 @@ void DevicePropertiesWidget::update(const QString &path, const DeviceOptions &op
             albumCovers->insertItems(0, QStringList() << noCoverText << embedCoverText);
         }
     }
-    filenameScheme->setText(opts.scheme);
-    vfatSafe->setChecked(opts.vfatSafe);
-    asciiOnly->setChecked(opts.asciiOnly);
-    ignoreThe->setChecked(opts.ignoreThe);
-    replaceSpaces->setChecked(opts.replaceSpaces);
+    if (props&Prop_FileName) {
+        filenameScheme->setText(opts.scheme);
+        vfatSafe->setChecked(opts.vfatSafe);
+        asciiOnly->setChecked(opts.asciiOnly);
+        ignoreThe->setChecked(opts.ignoreThe);
+        replaceSpaces->setChecked(opts.replaceSpaces);
+    } else {
+        REMOVE(filenamesGroupBox)
+        filenameScheme=0;
+        vfatSafe=0;
+        asciiOnly=0;
+        ignoreThe=0;
+        replaceSpaces=0;
+        configFilename=0;
+    }
     origOpts=opts;
 
     if (props&Prop_Folder) {
-        musicFolder->setText(path);
+        musicFolder->setText(Utils::convertDirForDisplay(path));
         connect(musicFolder, SIGNAL(textChanged(const QString &)), this, SLOT(checkSaveable()));
     } else {
         REMOVE(musicFolder);
@@ -269,13 +279,15 @@ void DevicePropertiesWidget::update(const QString &path, const DeviceOptions &op
         connect(defaultVolume,SIGNAL(currentIndexChanged(int)), this, SLOT(checkSaveable()));
     }
 
-    origMusicFolder=path;
-    connect(configFilename, SIGNAL(clicked()), SLOT(configureFilenameScheme()));
-    connect(filenameScheme, SIGNAL(textChanged(const QString &)), this, SLOT(checkSaveable()));
-    connect(vfatSafe, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
-    connect(asciiOnly, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
-    connect(ignoreThe, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
-    connect(replaceSpaces, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+    origMusicFolder=Utils::fixPath(path);
+    if (props&Prop_FileName) {
+        connect(configFilename, SIGNAL(clicked()), SLOT(configureFilenameScheme()));
+        connect(filenameScheme, SIGNAL(textChanged(const QString &)), this, SLOT(checkSaveable()));
+        connect(vfatSafe, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+        connect(asciiOnly, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+        connect(ignoreThe, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+        connect(replaceSpaces, SIGNAL(stateChanged(int)), this, SLOT(checkSaveable()));
+    }
 
     if (albumCovers) {
         albumCoversChanged();
@@ -326,9 +338,9 @@ void DevicePropertiesWidget::checkSaveable()
 
     modified=opts!=origOpts;
     if (!modified && checkFolder) {
-        modified=musicFolder->text().trimmed()!=origMusicFolder;
+        modified=music()!=origMusicFolder;
     }
-    saveable=!opts.scheme.isEmpty() && (!checkFolder || !musicFolder->text().trimmed().isEmpty()) && !opts.coverName.isEmpty();
+    saveable=!opts.scheme.isEmpty() && (!checkFolder || !music().isEmpty()) && !opts.coverName.isEmpty();
     if (saveable &&
         ( (-1!=opts.coverName.indexOf(noCoverText) && opts.coverName!=noCoverText) ||
           (-1!=opts.coverName.indexOf(embedCoverText) && opts.coverName!=embedCoverText) ) ) {
@@ -349,11 +361,21 @@ void DevicePropertiesWidget::configureFilenameScheme()
 DeviceOptions DevicePropertiesWidget::settings()
 {
     DeviceOptions opts;
-    opts.scheme=filenameScheme->text().trimmed();
-    opts.vfatSafe=vfatSafe->isChecked();
-    opts.asciiOnly=asciiOnly->isChecked();
-    opts.ignoreThe=ignoreThe->isChecked();
-    opts.replaceSpaces=replaceSpaces->isChecked();
+    if (filenameScheme) {
+        opts.scheme=filenameScheme->text().trimmed();
+    }
+    if (vfatSafe) {
+        opts.vfatSafe=vfatSafe->isChecked();
+    }
+    if (asciiOnly) {
+        opts.asciiOnly=asciiOnly->isChecked();
+    }
+    if (ignoreThe) {
+        opts.ignoreThe=ignoreThe->isChecked();
+    }
+    if (replaceSpaces) {
+        opts.replaceSpaces=replaceSpaces->isChecked();
+    }
     opts.fixVariousArtists=fixVariousArtists ? fixVariousArtists->isChecked() : false;
     opts.useCache=useCache ? useCache->isChecked() : false;
     opts.autoScan=autoScan ? autoScan->isChecked() : false;
diff --git a/devices/devicepropertieswidget.h b/devices/devicepropertieswidget.h
index ee5dde2..4cf7d5e 100644
--- a/devices/devicepropertieswidget.h
+++ b/devices/devicepropertieswidget.h
@@ -26,6 +26,7 @@
 
 #include "ui_devicepropertieswidget.h"
 #include "device.h"
+#include "utils.h"
 
 class FilenameSchemeDialog;
 class DevicePropertiesWidget : public QWidget, Ui::DevicePropertiesWidget
@@ -34,19 +35,20 @@ class DevicePropertiesWidget : public QWidget, Ui::DevicePropertiesWidget
 
 public:
     enum Properties {
-        Prop_Basic       = 0x00,
+        Prop_Basic       = 0x0000,
 
-        Prop_Folder      = 0x01,
-        Prop_CoversAll   = 0x02,
-        Prop_CoversBasic = 0x04,
-        Prop_Va          = 0x08,
-        Prop_Transcoder  = 0x10,
-        Prop_Cache       = 0x20,
-        Prop_AutoScan    = 0x40,
+        Prop_Folder      = 0x0001,
+        Prop_FileName    = 0x0002,
+        Prop_CoversAll   = 0x0004,
+        Prop_CoversBasic = 0x0008,
+        Prop_Va          = 0x0010,
+        Prop_Transcoder  = 0x0020,
+        Prop_Cache       = 0x0040,
+        Prop_AutoScan    = 0x0080,
 
-        Prop_Encoder     = 0x80,
+        Prop_Encoder     = 0x0100,
 
-        Prop_All         = 0xFF
+        Prop_All         = 0x01FF
     };
     DevicePropertiesWidget(QWidget *parent);
     virtual ~DevicePropertiesWidget() { }
@@ -54,7 +56,7 @@ public:
     DeviceOptions settings();
     bool isModified() const { return modified; }
     bool isSaveable() const { return saveable; }
-    QString music() const { return musicFolder ? musicFolder->text().trimmed() : origMusicFolder; }
+    QString music() const { return musicFolder ? Utils::convertDirFromDisplay(musicFolder->text()) : origMusicFolder; }
     QString cover() const;
     void showRemoteConnectionNote(bool v) { remoteDeviceNote->setVisible(v); }
 
diff --git a/devices/devicepropertieswidget.ui b/devices/devicepropertieswidget.ui
index 4efb8a4..d6bda7f 100644
--- a/devices/devicepropertieswidget.ui
+++ b/devices/devicepropertieswidget.ui
@@ -128,7 +128,7 @@
     </layout>
    </item>
    <item>
-    <widget class="QGroupBox" name="groupBox">
+    <widget class="QGroupBox" name="filenamesGroupBox">
      <property name="title">
       <string>Filenames</string>
      </property>
diff --git a/devices/devicespage.cpp b/devices/devicespage.cpp
index afe2ff6..1920d7b 100644
--- a/devices/devicespage.cpp
+++ b/devices/devicespage.cpp
@@ -135,6 +135,12 @@ DevicesPage::~DevicesPage()
 {
 }
 
+void DevicesPage::showEvent(QShowEvent *e)
+{
+    view->focusView();
+    QWidget::showEvent(e);
+}
+
 void DevicesPage::clear()
 {
     DevicesModel::self()->clear();
@@ -270,7 +276,7 @@ void DevicesPage::searchItems()
 {
     QString text=view->searchText().trimmed();
     proxy.update(text, genreCombo->currentIndex()<=0 ? QString() : genreCombo->currentText());
-    if (proxy.enabled() && !text.isEmpty()) {
+    if (proxy.enabled() && !proxy.filterText().isEmpty()) {
         view->expandAll();
     }
 }
diff --git a/devices/devicespage.h b/devices/devicespage.h
index c1eefa8..4e9247b 100644
--- a/devices/devicespage.h
+++ b/devices/devicespage.h
@@ -52,6 +52,7 @@ public:
     void focusSearch() { view->focusSearch(); }
     void goBack() { view->backActivated(); }
     void refresh();
+    void showEvent(QShowEvent *e);
 
 public Q_SLOTS:
     void itemDoubleClicked(const QModelIndex &);
diff --git a/devices/devicespage.ui b/devices/devicespage.ui
index 25afe30..c16f1f5 100644
--- a/devices/devicespage.ui
+++ b/devices/devicespage.ui
@@ -11,6 +11,9 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="vlayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <property name="leftMargin">
     <number>0</number>
    </property>
@@ -29,7 +32,7 @@
    <item>
     <layout class="QHBoxLayout" name="hlayout">
      <property name="spacing">
-      <number>0</number>
+      <number>1</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
@@ -47,14 +50,10 @@
       <widget class="ToolButton" name="searchButton"/>
      </item>
      <item>
-      <widget class="GenreCombo" name="genreCombo">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-      </widget>
+      <widget class="GenreCombo" name="genreCombo"/>
+     </item>
+     <item>
+      <widget class="SizeWidget" name="sizeWidget"/>
      </item>
      <item>
       <widget class="MenuButton" name="menuButton"/>
@@ -87,6 +86,11 @@
    <extends>QToolButton</extends>
    <header>menubutton.h</header>
   </customwidget>
+  <customwidget>
+   <class>SizeWidget</class>
+   <extends>QWidget</extends>
+   <header>sizewidget.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/devices/encoders.cpp b/devices/encoders.cpp
index 39c24d3..9b5dbb7 100644
--- a/devices/encoders.cpp
+++ b/devices/encoders.cpp
@@ -34,7 +34,7 @@ namespace Encoders
 static QList<Encoder> installedEncoders;
 static bool usingAvconv=false;
 
-static void insertCodec(const QString &cmd, const QString &param, Encoder &enc)
+static void insertCodec(const QString &cmd, const QString &param,const QString &outputParam, Encoder &enc)
 {
     QString command=Utils::findExe(cmd);
     if (!command.isEmpty()) {
@@ -43,6 +43,7 @@ static void insertCodec(const QString &cmd, const QString &param, Encoder &enc)
         enc.param=param;
         enc.transcoder=false;
         enc.app=command;
+        enc.outputParam=outputParam;
         if (-1!=index) {
             Encoder orig=installedEncoders.takeAt(index);
             orig.name+=QLatin1String(" (ffmpeg)");
@@ -99,16 +100,16 @@ static void init()
                     QLatin1String("-aq"),
                     i18n("Expected average bitrate for variable bitrate encoding"),
                     QList<Setting>() << Setting(i18n(vbr, 25), 30)
-                    << Setting(i18n(vbr, 50), 55)
-                    << Setting(i18n(vbr, 70), 80)
-                    << Setting(i18n(vbr, 90), 105)
-                    << Setting(i18n(vbr, 120), 125)
-                    << Setting(i18n(vbr, 150), 155)
-                    << Setting(i18n(vbr, 170), 180)
-                    << Setting(i18n(vbr, 180), 205)
-                    << Setting(i18n(vbr, 190), 230)
-                    << Setting(i18n(vbr, 200), 255)
-                    << Setting(i18n(vbr, 210), 280),
+                                     << Setting(i18n(vbr, 50), 55)
+                                     << Setting(i18n(vbr, 70), 80)
+                                     << Setting(i18n(vbr, 90), 105)
+                                     << Setting(i18n(vbr, 120), 125)
+                                     << Setting(i18n(vbr, 150), 155)
+                                     << Setting(i18n(vbr, 170), 180)
+                                     << Setting(i18n(vbr, 180), 205)
+                                     << Setting(i18n(vbr, 190), 230)
+                                     << Setting(i18n(vbr, 200), 255)
+                                     << Setting(i18n(vbr, 210), 280),
                     i18n("Smaller file"),
                     i18n("Better sound quality"),
                     5);
@@ -182,21 +183,58 @@ static void init()
                    QLatin1String("-aq"),
                    i18n("Quality rating"),
                    QList<Setting>() << Setting(i18n(quality, -1, 45), -1)
-                   << Setting(i18n(quality, 0, 64), 0)
-                   << Setting(i18n(quality, 1, 80), 1)
-                   << Setting(i18n(quality, 2, 96), 2)
-                   << Setting(i18n(quality, 3, 112), 3)
-                   << Setting(i18n(quality, 4, 128), 4)
-                   << Setting(i18n(quality, 5, 160), 5)
-                   << Setting(i18n(quality, 6, 192), 6)
-                   << Setting(i18n(quality, 7, 224), 7)
-                   << Setting(i18n(quality, 8, 256), 8)
-                   << Setting(i18n(quality, 9, 320), 9)
-                   << Setting(i18n(quality, 10, 500), 10),
+                                    << Setting(i18n(quality, 0, 64), 0)
+                                    << Setting(i18n(quality, 1, 80), 1)
+                                    << Setting(i18n(quality, 2, 96), 2)
+                                    << Setting(i18n(quality, 3, 112), 3)
+                                    << Setting(i18n(quality, 4, 128), 4)
+                                    << Setting(i18n(quality, 5, 160), 5)
+                                    << Setting(i18n(quality, 6, 192), 6)
+                                    << Setting(i18n(quality, 7, 224), 7)
+                                    << Setting(i18n(quality, 8, 256), 8)
+                                    << Setting(i18n(quality, 9, 320), 9)
+                                    << Setting(i18n(quality, 10, 500), 10),
                    i18n("Smaller file"),
                    i18n("Better sound quality"),
                    6);
 
+    Encoder opus(i18n("Opus"),
+                   i18nc("Feel free to redirect the english Wikipedia link to a local version, if "
+                         "it exists.",
+                         "<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."),
+                   i18n("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."),
+                   QLatin1String("opus"),
+                   command,
+                   QLatin1String("libopus"),
+                   QLatin1String("-ab"),
+                   i18n("Bitrate"),
+                   QList<Setting>() << Setting(i18n(vbr, 32), 32)
+                                    << Setting(i18n(vbr, 64), 64)
+                                    << Setting(i18n(vbr, 96), 96)
+                                    << Setting(i18n(vbr, 128), 128)
+                                    << Setting(i18n(vbr, 160), 160)
+                                    << Setting(i18n(vbr, 192), 192)
+                                    << Setting(i18n(vbr, 256), 256)
+                                    << Setting(i18n(vbr, 320), 320)
+                                    << Setting(i18n(vbr, 360), 360),
+                   i18n("Smaller file"),
+                   i18n("Better sound quality"),
+                   4,
+                   1000);
+
         if (!command.isEmpty()) {
             QList<Encoder> initial;
             initial.append(aac);
@@ -243,19 +281,20 @@ static void init()
                                 QLatin1String("-compression_level"),
                                 i18n("Compression level"),
                                 QList<Setting>() << Setting(QString::number(0), 0)
-                                << Setting(QString::number(1), 1)
-                                << Setting(QString::number(2), 2)
-                                << Setting(QString::number(3), 3)
-                                << Setting(QString::number(4), 4)
-                                << Setting(QString::number(5), 5)
-                                << Setting(QString::number(6), 6)
-                                << Setting(QString::number(7), 7)
-                                << Setting(QString::number(8), 8),
+                                                 << Setting(QString::number(1), 1)
+                                                 << Setting(QString::number(2), 2)
+                                                 << Setting(QString::number(3), 3)
+                                                 << Setting(QString::number(4), 4)
+                                                 << Setting(QString::number(5), 5)
+                                                 << Setting(QString::number(6), 6)
+                                                 << Setting(QString::number(7), 7)
+                                                 << Setting(QString::number(8), 8),
                                 i18n("Faster compression"),
                                 i18n("Smaller file"),
                                 5));
             initial.append(lame);
             initial.append(ogg);
+            initial.append(opus);
             initial.append(
                         Encoder(i18n("Windows Media Audio"),
                                 i18nc("Feel free to redirect the english Wikipedia link to a local version, if "
@@ -279,17 +318,18 @@ static void init()
                                 QLatin1String("wmav2"),
                                 QLatin1String("-ab"),
                                 i18n("Bitrate"),
-                                QList<Setting>() << Setting(i18n(cbr, 64), 65*1000)
-                                << Setting(i18n(cbr, 80), 75*1000)
-                                << Setting(i18n(cbr, 96), 88*1000)
-                                << Setting(i18n(cbr, 112), 106*1000)
-                                << Setting(i18n(cbr, 136), 133*1000)
-                                << Setting(i18n(cbr, 182), 180*1000)
-                                << Setting(i18n(cbr, 275), 271*1000)
-                                << Setting(i18n(cbr, 550), 545*1000),
+                                QList<Setting>() << Setting(i18n(cbr, 64), 65)
+                                                 << Setting(i18n(cbr, 80), 75)
+                                                 << Setting(i18n(cbr, 96), 88)
+                                                 << Setting(i18n(cbr, 112), 106)
+                                                 << Setting(i18n(cbr, 136), 133)
+                                                 << Setting(i18n(cbr, 182), 180)
+                                                 << Setting(i18n(cbr, 275), 271)
+                                                 << Setting(i18n(cbr, 550), 545),
                                 i18n("Smaller file"),
                                 i18n("Better sound quality"),
-                                4));
+                                4,
+                                1000));
 
             QProcess proc;
             proc.start(command, QStringList() << "-codecs");
@@ -326,9 +366,10 @@ static void init()
             }
         }
 
-        insertCodec(QLatin1String("faac"), QLatin1String("-q"), aac);
-        insertCodec(QLatin1String("lame"), QLatin1String("-V"), lame);
-        insertCodec(QLatin1String("oggenc"), QLatin1String("-q"), ogg);
+        insertCodec(QLatin1String("faac"), QLatin1String("-q"), QLatin1String("-o"), aac);
+        insertCodec(QLatin1String("lame"), QLatin1String("-V"), QString(), lame);
+        insertCodec(QLatin1String("oggenc"), QLatin1String("-q"), QLatin1String("-o"), ogg);
+        insertCodec(QLatin1String("opusenc"), QLatin1String("--bitrate"), QString(), opus);
         qSort(installedEncoders);
     }
 }
@@ -366,7 +407,7 @@ QStringList Encoder::params(int value, const QString &in, const QString &out) co
                 v=s.value;
             }
         }
-        p << param << QString::number(v);
+        p << param << QString::number(v*ffmpegValueMultiplier);
     }
 
     if (transcoder) {
@@ -375,6 +416,9 @@ QStringList Encoder::params(int value, const QString &in, const QString &out) co
     } else {
         p << in;
     }
+    if (!outputParam.isEmpty()) {
+        p << outputParam;
+    }
     p << out;
     return p;
 }
diff --git a/devices/encoders.h b/devices/encoders.h
index 9441eda..61efe84 100644
--- a/devices/encoders.h
+++ b/devices/encoders.h
@@ -43,7 +43,8 @@ namespace Encoders
         Encoder()
             : defaultValueIndex(0) {
         }
-        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)
+        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)
             : name(n)
             , description(d)
             , tooltip(t)
@@ -56,6 +57,7 @@ namespace Encoders
             , low(l)
             , high(h)
             , defaultValueIndex(def)
+            , ffmpegValueMultiplier(mult)
             , transcoder(true) {
         }
         bool isNull() { return name.isEmpty(); }
@@ -75,7 +77,9 @@ namespace Encoders
         QList<Setting> values;
         QString low;
         QString high;
+        QString outputParam;
         int defaultValueIndex;
+        int ffmpegValueMultiplier;
         bool transcoder;
     };
 
diff --git a/devices/extractjob.cpp b/devices/extractjob.cpp
index e99cfd2..c162539 100644
--- a/devices/extractjob.cpp
+++ b/devices/extractjob.cpp
@@ -63,7 +63,7 @@ void ExtractJob::writeWavHeader(QIODevice &dev, qint32 size)
         insertSize(&riffHeader[40], size);
     }
 
-    dev.write((char*)riffHeader, 44);
+    dev.write((char*)riffHeader, constWavHeaderSize);
 }
 
 ExtractJob::ExtractJob(const Encoders::Encoder &enc, int val, const QString &src, const QString &dest, const Song &s, const QString &cover)
diff --git a/devices/filenameschemedialog.cpp b/devices/filenameschemedialog.cpp
index a2bff6b..d32595f 100644
--- a/devices/filenameschemedialog.cpp
+++ b/devices/filenameschemedialog.cpp
@@ -39,6 +39,7 @@ FilenameSchemeDialog::FilenameSchemeDialog(QWidget *parent)
     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()));
@@ -50,6 +51,7 @@ FilenameSchemeDialog::FilenameSchemeDialog(QWidget *parent)
 
     exampleSong.albumartist=i18nc("Example album artist", "Various Artists");
     exampleSong.artist=i18nc("Example artist", "Wibble");
+    exampleSong.composer=i18nc("Example composer", "Vivaldi");
     exampleSong.album=i18nc("Example album", "Now 5001");
     exampleSong.title=i18nc("Example song name", "Wobble");
     exampleSong.genre=i18nc("Example genre", "Dance");
@@ -96,23 +98,21 @@ static QString stripAccelerator(QString str)
 void FilenameSchemeDialog::showHelp()
 {
     MessageBox::information(this,
-                          i18n("<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>", stripAccelerator(albumArtist->text()), stripAccelerator(albumTitle->text()),
-                               stripAccelerator(trackArtist->text()), stripAccelerator(trackTitle->text()),
-                               stripAccelerator(trackArtistAndTitle->text()), stripAccelerator(trackNo->text()),
-                               stripAccelerator(cdNo->text()), stripAccelerator(year->text()), stripAccelerator(genre->text())));
+                           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()))+
+                           QLatin1String("</table></p>"));
 }
 
 void FilenameSchemeDialog::enableOkButton()
@@ -126,6 +126,11 @@ void FilenameSchemeDialog::insertAlbumArtist()
     insert(DeviceOptions::constAlbumArtist);
 }
 
+void FilenameSchemeDialog::insertComposer()
+{
+    insert(DeviceOptions::constComposer);
+}
+
 void FilenameSchemeDialog::insertAlbumTitle()
 {
     insert(DeviceOptions::constAlbumTitle);
diff --git a/devices/filenameschemedialog.h b/devices/filenameschemedialog.h
index d8f6f1d..044c0ff 100644
--- a/devices/filenameschemedialog.h
+++ b/devices/filenameschemedialog.h
@@ -44,6 +44,7 @@ private Q_SLOTS:
     void showHelp();
     void enableOkButton();
     void insertAlbumArtist();
+    void insertComposer();
     void insertAlbumTitle();
     void insertTrackArtist();
     void insertTrackTitle();
diff --git a/devices/filenameschemedialog.ui b/devices/filenameschemedialog.ui
index 98788e7..7ae2d7b 100644
--- a/devices/filenameschemedialog.ui
+++ b/devices/filenameschemedialog.ui
@@ -66,18 +66,6 @@
    </item>
    <item row="4" column="0">
     <widget class="QPushButton" name="albumArtist">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>16777215</height>
-      </size>
-     </property>
      <property name="text">
       <string>Album Artist</string>
      </property>
@@ -85,62 +73,33 @@
    </item>
    <item row="4" column="1">
     <widget class="QPushButton" name="albumTitle">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>16777215</height>
-      </size>
-     </property>
      <property name="text">
       <string>Album Title</string>
      </property>
     </widget>
    </item>
    <item row="4" column="2">
-    <widget class="QPushButton" name="trackArtist">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>16777215</height>
-      </size>
+    <widget class="QPushButton" name="composer">
+     <property name="text">
+      <string>Composer</string>
      </property>
+    </widget>
+   </item>
+   <item row="4" column="3">
+    <widget class="QPushButton" name="trackArtist">
      <property name="text">
       <string>Track Artist</string>
      </property>
     </widget>
    </item>
-   <item row="4" column="3">
+   <item row="4" column="4">
     <widget class="QPushButton" name="trackTitle">
-     <property name="minimumSize">
-      <size>
-       <width>0</width>
-       <height>0</height>
-      </size>
-     </property>
-     <property name="maximumSize">
-      <size>
-       <width>16777215</width>
-       <height>16777215</height>
-      </size>
-     </property>
      <property name="text">
       <string>Track Title</string>
      </property>
     </widget>
    </item>
-   <item row="4" column="4">
+   <item row="5" column="0">
     <widget class="QPushButton" name="trackArtistAndTitle">
      <property name="minimumSize">
       <size>
@@ -159,14 +118,14 @@
      </property>
     </widget>
    </item>
-   <item row="5" column="0">
+   <item row="5" column="1">
     <widget class="QPushButton" name="trackNo">
      <property name="text">
       <string>Track #</string>
      </property>
     </widget>
    </item>
-   <item row="5" column="1">
+   <item row="5" column="2">
     <widget class="QPushButton" name="cdNo">
      <property name="text">
       <string>CD #</string>
@@ -174,6 +133,13 @@
     </widget>
    </item>
    <item row="5" column="3">
+    <widget class="QPushButton" name="year">
+     <property name="text">
+      <string>Year</string>
+     </property>
+    </widget>
+   </item>
+   <item row="5" column="4">
     <widget class="QPushButton" name="genre">
      <property name="text">
       <string>Genre</string>
@@ -193,13 +159,6 @@
      </property>
     </spacer>
    </item>
-   <item row="5" column="2">
-    <widget class="QPushButton" name="year">
-     <property name="text">
-      <string>Year</string>
-     </property>
-    </widget>
-   </item>
   </layout>
  </widget>
  <customwidgets>
diff --git a/devices/fsdevice.cpp b/devices/fsdevice.cpp
index e421c45..b3ab184 100644
--- a/devices/fsdevice.cpp
+++ b/devices/fsdevice.cpp
@@ -180,10 +180,10 @@ void MusicScanner::scanFolder(MusicLibraryItemRoot *library, const QString &topL
 
                 song.fillEmptyFields();
                 song.size=info.size();
-                if (!artistItem || song.albumArtist()!=artistItem->data()) {
+                if (!artistItem || song.artistOrComposer()!=artistItem->data()) {
                     artistItem = library->artist(song);
                 }
-                if (!albumItem || albumItem->parentItem()!=artistItem || song.album!=albumItem->data()) {
+                if (!albumItem || albumItem->parentItem()!=artistItem || song.albumName()!=albumItem->data()) {
                     albumItem = artistItem->album(song);
                 }
                 MusicLibraryItemSong *songItem = new MusicLibraryItemSong(song, albumItem);
@@ -418,7 +418,7 @@ void FsDevice::addSong(const Song &s, bool overwrite, bool copyCover)
     }
 
     QDir dir(Utils::getDir(currentDestFile));
-    if(!dir.exists() && !Utils::createDir(dir.absolutePath(), QString())) {
+    if(!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), QString())) {
         emit actionStatus(DirCreationFaild);
         return;
     }
@@ -480,7 +480,7 @@ void FsDevice::copySongTo(const Song &s, const QString &baseDir, const QString &
     currentDestFile=baseDir+musicPath;
 
     QDir dir(Utils::getDir(currentDestFile));
-    if (!dir.exists() && !Utils::createDir(dir.absolutePath(), baseDir)) {
+    if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) {
         emit actionStatus(DirCreationFaild);
         return;
     }
diff --git a/devices/mtpdevice.cpp b/devices/mtpdevice.cpp
index 5c157f7..a087cee 100644
--- a/devices/mtpdevice.cpp
+++ b/devices/mtpdevice.cpp
@@ -52,10 +52,19 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
+//#define TIME_MTP_OPERATIONS
+#ifdef TIME_MTP_OPERATIONS
+#include <QDebug>
+#include <QElapsedTimer>
+#endif
 
 #define MTP_FAKE_ALBUMARTIST_SUPPORT
 #define MTP_TRACKNUMBER_FROM_FILENAME
 
+static const QLatin1String constMtpDefaultCover("AlbumArt.jpg");
+static const uint32_t constRootFolder=0xffffffffU;
+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));
@@ -65,7 +74,7 @@ static int progressMonitor(uint64_t const processed, uint64_t const total, void
 static int trackListMonitor(uint64_t const processed, uint64_t const total, void const * const data)
 {
     Q_UNUSED(total)
-    ((MtpConnection *)data)->trackListProgress(processed);
+    ((MtpConnection *)data)->trackListProgress(((processed*100.0)/(total*1.0))+0.5);
     return ((MtpConnection *)data)->abortRequested() ? -1 : 0;
 }
 
@@ -85,7 +94,7 @@ MtpConnection::MtpConnection(MtpDevice *p)
     #endif
     , library(0)
     , dev(p)
-    , lastUpdate(0)
+    , lastListPercent(-1)
 {
     size=0;
     used=0;
@@ -118,17 +127,23 @@ void MtpConnection::emitProgress(int percent)
     emit progress(percent);
 }
 
-void MtpConnection::trackListProgress(uint64_t count)
+void MtpConnection::trackListProgress(int percent)
 {
-    int t=time(NULL);
-    if ((t-lastUpdate)>=2 || 0==(count%10)) {
-        lastUpdate=t;
-        emit songCount((int)count);
+    if (percent!=lastListPercent) {
+        lastListPercent=percent;
+        emit updatePercentage(percent);
     }
 }
 
 void MtpConnection::connectToDevice()
 {
+    #ifdef TIME_MTP_OPERATIONS
+    QElapsedTimer timer;
+    QElapsedTimer totalTimer;
+    timer.start();
+    totalTimer.start();
+    #endif
+
     device=0;
     storage.clear();
     defaultMusicFolder=0;
@@ -139,26 +154,54 @@ void MtpConnection::connectToDevice()
         emit statusMessage(i18n("No devices found"));
         return;
     }
+    #ifdef TIME_MTP_OPERATIONS
+    qWarning() << "Connect to device:" << timer.elapsed();
+    timer.restart();
+    #endif
 
     LIBMTP_mtpdevice_t *mptDev=0;
     for (int i = 0; i < numDev; i++) {
         if (0!=dev->busNum && 0!=dev->devNum) {
             if (rawDevices[i].bus_location==dev->busNum && rawDevices[i].devnum==dev->devNum) {
+                #ifdef ENABLE_UNCACHED_MTP
+                mptDev = LIBMTP_Open_Raw_Device_Uncached(&rawDevices[i]);
+                #else
                 mptDev = LIBMTP_Open_Raw_Device(&rawDevices[i]);
+                #endif
+                break;
+            }
+        } else {
+            #ifdef ENABLE_UNCACHED_MTP
+            if ((mptDev = LIBMTP_Open_Raw_Device_Uncached(&rawDevices[i]))) {
+                break;
+            }
+            #else
+            if ((mptDev = LIBMTP_Open_Raw_Device(&rawDevices[i]))) {
                 break;
             }
-        } else if ((mptDev = LIBMTP_Open_Raw_Device(&rawDevices[i]))) {
-            break;
+            #endif
         }
     }
 
+    #ifdef TIME_MTP_OPERATIONS
+    qWarning() << "Open raw device:" << timer.elapsed();
+    timer.restart();
+    #endif
+
     size=0;
     used=0;
     device=mptDev;
     updateStorage();
+    #ifdef TIME_MTP_OPERATIONS
+    qWarning() << "Update storage:" << timer.elapsed();
+    #endif
+
     free(rawDevices);
     if (!device) {
         emit statusMessage(i18n("No devices found"));
+        #ifdef TIME_MTP_OPERATIONS
+        qWarning() << "TOTAL connect:" <<totalTimer.elapsed();
+        #endif
         return;
     }
     char *ser=LIBMTP_Get_Serialnumber(device);
@@ -171,6 +214,9 @@ void MtpConnection::connectToDevice()
 
     defaultMusicFolder=device->default_music_folder;
     emit statusMessage(i18n("Connected to device"));
+    #ifdef TIME_MTP_OPERATIONS
+    qWarning() << "TOTAL connect:" <<totalTimer.elapsed();
+    #endif
 }
 
 void MtpConnection::disconnectFromDevice(bool showStatus)
@@ -246,30 +292,54 @@ void MtpConnection::updateLibrary()
         return;
     }
 
+    #ifdef TIME_MTP_OPERATIONS
+    QElapsedTimer timer;
+    QElapsedTimer totalTimer;
+    timer.start();
+    totalTimer.start();
+    #endif
+
     library = new MusicLibraryItemRoot;
     emit statusMessage(i18n("Updating folders..."));
+    #ifdef ENABLE_UNCACHED_MTP
+    updateFilesAndFolders();
+    #else
     updateFolders();
+    #endif
+    #ifdef TIME_MTP_OPERATIONS
+    qWarning() << "Folder update:" << timer.elapsed();
+    timer.restart();
+    #endif
     if (folderMap.isEmpty()) {
         destroyData();
         emit libraryUpdated();
         return;
     }
+    #ifndef ENABLE_UNCACHED_MTP
     emit statusMessage(i18n("Updating files..."));
     updateFiles();
+    #ifdef TIME_MTP_OPERATIONS
+    qWarning() << "Files update:" << timer.elapsed();
+    timer.restart();
+    #endif
+    #endif
     #ifdef MTP_CLEAN_ALBUMS
     updateAlbums();
+    #ifdef TIME_MTP_OPERATIONS
+    qWarning() << "Clean albums:" << timer.elapsed();
+    timer.restart();
+    #endif
     #endif
     emit statusMessage(i18n("Updating tracks..."));
-    lastUpdate=0;
+    lastListPercent=-1;
     LIBMTP_track_t *tracks=LIBMTP_Get_Tracklisting_With_Callback(device, &trackListMonitor, this);
-    LIBMTP_track_t *track=tracks;
     QMap<uint32_t, Folder>::ConstIterator folderEnd=folderMap.constEnd();
-    QList<Storage>::Iterator it=storage.begin();
-    QList<Storage>::Iterator end=storage.end();
+    QList<Storage>::Iterator store=storage.begin();
+    QList<Storage>::Iterator storeEnd=storage.end();
     QMap<int, QString> storageNames;
-    for (; it!=end; ++it) {
-        setMusicFolder(*it);
-        storageNames[(*it).id]=(*it).description;
+    for (; store!=storeEnd; ++store) {
+        setMusicFolder(*store);
+        storageNames[(*store).id]=(*store).description;
     }
 
     MusicLibraryItemArtist *artistItem = 0;
@@ -280,30 +350,38 @@ void MtpConnection::updateLibrary()
     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();
+    timer.restart();
+    #endif
+    while (tracks && !abortRequested()) {
+        LIBMTP_track_t *track=tracks;
+        tracks=tracks->next;
 
-    while (track && !abortRequested()) {
-        QMap<uint32_t, Folder>::ConstIterator it=folderMap.find(track->parent_id);
-        if (it==folderEnd) {
+        QMap<uint32_t, Folder>::ConstIterator folder=folderMap.find(track->parent_id);
+        if (folder==folderEnd) {
             // We only care about tracks in the music folder...
-            track=track->next;
+            LIBMTP_destroy_track_t(track);
             continue;
         }
         Song s;
         QString trackFilename=QString::fromUtf8(track->filename);
         s.id=track->item_id;
-        s.file=encodePath(track, it.value().path+trackFilename, storageNames.count()>1 ? storageNames[track->storage_id] : QString());
+        s.file=encodePath(track, folder.value().path+trackFilename, storageNames.count()>1 ? storageNames[track->storage_id] : QString());
         s.album=QString::fromUtf8(track->album);
         s.artist=QString::fromUtf8(track->artist);
         s.albumartist=s.artist; // TODO: ALBUMARTIST: Read from 'track' when libMTP supports album artist!
+        s.composer=QString::fromUtf8(track->composer);
         s.year=QString::fromUtf8(track->date).mid(0, 4).toUInt();
         s.title=QString::fromUtf8(track->title);
         s.genre=QString::fromUtf8(track->genre);
         s.track=track->tracknumber;
         s.time=(track->duration/1000.0)+0.5;
+        s.size=track->filesize;
         s.fillEmptyFields();
         #ifdef MTP_FAKE_ALBUMARTIST_SUPPORT
         if (getAlbumArtistFromPath) {
-            QStringList folderParts=(*it).path.split('/', QString::SkipEmptyParts);
+            QStringList folderParts=(*folder).path.split('/', QString::SkipEmptyParts);
             if (folderParts.length()>=3) {
                 MtpFolder folder(folderParts.at(1), folderParts.at(2));
                 folders.insert(track->parent_id, folder);
@@ -321,10 +399,10 @@ void MtpConnection::updateLibrary()
             }
         }
         #endif
-        if (!artistItem || (dev->supportsAlbumArtistTag() ? s.albumArtist()!=artistItem->data() : s.album!=artistItem->data())) {
+        if (!artistItem || (dev->supportsAlbumArtistTag() ? s.artistOrComposer()!=artistItem->data() : s.artist!=artistItem->data())) {
             artistItem = library->artist(s);
         }
-        if (!albumItem || albumItem->parentItem()!=artistItem || s.album!=albumItem->data()) {
+        if (!albumItem || albumItem->parentItem()!=artistItem || s.albumName()!=albumItem->data()) {
             albumItem = artistItem->album(s);
         }
         MusicLibraryItemSong *songItem = new MusicLibraryItemSong(s, albumItem);
@@ -340,11 +418,19 @@ void MtpConnection::updateLibrary()
         al.songs.append(songItem);
         al.folder=track->parent_id;
         #endif
-        track=track->next;
+        LIBMTP_destroy_track_t(track);
     }
-    if (tracks) {
-        LIBMTP_destroy_track_t(tracks);
+
+    while (tracks) {
+        LIBMTP_track_t *track=tracks;
+        tracks=tracks->next;
+        LIBMTP_destroy_track_t(track);
     }
+
+    #ifdef TIME_MTP_OPERATIONS
+    qWarning() << "Tracks parse:" << timer.elapsed();
+    timer.restart();
+    #endif
     if (!abortRequested()) {
         #ifdef MTP_FAKE_ALBUMARTIST_SUPPORT
         // Use Album map to determine 'AlbumArtist' tag for various artist albums, and
@@ -411,8 +497,16 @@ void MtpConnection::updateLibrary()
                 }
             }
         }
+        #ifdef TIME_MTP_OPERATIONS
+        qWarning() << "AlbumArtist detection:" << timer.elapsed();
+        timer.restart();
+        #endif
         #endif
         library->applyGrouping();
+        #ifdef TIME_MTP_OPERATIONS
+        qWarning() << "Grouping:" << timer.elapsed();
+        qWarning() << "TOTAL update:" <<totalTimer.elapsed();
+        #endif
         emit libraryUpdated();
     }
 }
@@ -420,9 +514,9 @@ void MtpConnection::updateLibrary()
 void MtpConnection::setMusicFolder(Storage &store)
 {
     if (0==store.musicFolderId) {
-        store.musicFolderId=getFolder("Music/", store.id);
+        store.musicFolderId=getFolder(constMusicFolder+QLatin1Char('/'), store.id);
         if (0==store.musicFolderId) {
-            store.musicFolderId=createFolder("Music", "Music/", 0, store.id);
+            store.musicFolderId=createFolder(constMusicFolder, constMusicFolder+QLatin1Char('/'), 0, store.id);
         }
         if (0!=store.musicFolderId) {
             store.musicPath=getPath(store.musicFolderId);
@@ -430,12 +524,59 @@ void MtpConnection::setMusicFolder(Storage &store)
     }
 }
 
+#ifdef ENABLE_UNCACHED_MTP
+void MtpConnection::updateFilesAndFolders()
+{
+    folderMap.clear();
+    foreach (const Storage st, storage) {
+        listFolder(st.id, constRootFolder, 0);
+    }
+}
+
+void MtpConnection::listFolder(uint32_t storage, uint32_t parentDir, Folder *f)
+{
+    LIBMTP_file_t *files=LIBMTP_Get_Files_And_Folders(device, storage, parentDir);
+
+    while (files) {
+        LIBMTP_file_t *file=files;
+        files = files->next;
+
+        QString name=QString::fromUtf8(file->filename);
+        if (LIBMTP_FILETYPE_FOLDER==file->filetype) {
+            bool isMusic=constRootFolder!=parentDir || 0==name.compare(constMusicFolder, Qt::CaseInsensitive);
+            if (isMusic) {
+                QMap<uint32_t, Folder>::ConstIterator it=folderMap.find(file->parent_id);
+                QString path;
+                if (it!=folderMap.constEnd()) {
+                    path=it.value().path+name+QLatin1Char('/');
+                } else {
+                    path=name+QLatin1Char('/');
+                }
+
+                QMap<uint32_t, Folder>::iterator entry=folderMap.insert(file->item_id, Folder(path, file->item_id, file->parent_id, file->storage_id));
+                if (folderMap.contains(file->parent_id)) {
+                    folderMap[file->parent_id].folders.insert(file->item_id);
+                }
+                listFolder(storage, file->item_id, &(entry.value()));
+            }
+        } else if (f && constRootFolder!=parentDir) {
+            if (name.endsWith(".jpg", Qt::CaseInsensitive) || name.endsWith(".png", Qt::CaseInsensitive) || QLatin1String("albumart.pamp")==name) {
+                f->covers.insert(file->item_id, File(name, file->filesize, file->item_id));
+            } else {
+                f->files.insert(file->item_id, File(name, file->filesize, file->item_id));
+            }
+        }
+        LIBMTP_destroy_file_t(file);
+    }
+}
+#else
 void MtpConnection::updateFolders()
 {
     folderMap.clear();
     LIBMTP_folder_t *folders=LIBMTP_Get_Folder_List(device);
     parseFolder(folders);
     if (folders) {
+        // LIBMTP_destroy_folder_t is recursive
         LIBMTP_destroy_folder_t(folders);
     }
 }
@@ -443,9 +584,11 @@ void MtpConnection::updateFolders()
 void MtpConnection::updateFiles()
 {
     LIBMTP_file_t *files=LIBMTP_Get_Filelisting_With_Callback(device, 0, 0);
-    LIBMTP_file_t *file=files;
     QSet<uint32_t> folders=folderMap.keys().toSet();
-    while (file) {
+    while (files) {
+        LIBMTP_file_t *file=files;
+        files=files->next;
+
         if (folders.contains(file->parent_id)) {
             Folder &folder=folderMap[file->parent_id];
             if (LIBMTP_FILETYPE_FOLDER==file->filetype) {
@@ -459,12 +602,10 @@ void MtpConnection::updateFiles()
                 }
             }
         }
-        file=file->next;
-    }
-    if (files) {
-        LIBMTP_destroy_file_t(files);
+        LIBMTP_destroy_file_t(file);
     }
 }
+#endif
 
 void MtpConnection::updateStorage()
 {
@@ -605,6 +746,7 @@ uint32_t MtpConnection::checkFolderStructure(const QStringList &dirs, Storage &s
     return parentId;
 }
 
+#ifndef ENABLE_UNCACHED_MTP
 void MtpConnection::parseFolder(LIBMTP_folder_t *folder)
 {
     if (!folder) {
@@ -618,7 +760,7 @@ void MtpConnection::parseFolder(LIBMTP_folder_t *folder)
     } else {
         path=QString::fromUtf8(folder->name)+QChar('/');
     }
-    bool isMusic=path.startsWith(QLatin1String("Music/"), Qt::CaseInsensitive);
+    bool isMusic=path.startsWith(constMusicFolder+QLatin1Char('/'), Qt::CaseInsensitive);
     if (isMusic) {
         folderMap.insert(folder->folder_id, Folder(path, folder->folder_id, folder->parent_id, folder->storage_id));
         if (folderMap.contains(folder->parent_id)) {
@@ -633,6 +775,7 @@ void MtpConnection::parseFolder(LIBMTP_folder_t *folder)
         parseFolder(folder->sibling);
     }
 }
+#endif
 
 static char * createString(const QString &str)
 {
@@ -790,7 +933,7 @@ void MtpConnection::putSong(const Song &s, bool fixVa, const DeviceOptions &opts
         if (status!=Device::SongExists) {
             meta->title=createString(song.title);
             meta->artist=createString(song.artist);
-            meta->composer=createString(QString());
+            meta->composer=createString(song.composer);
             meta->genre=createString(song.genre);
             meta->album=createString(song.album);
             meta->date=createString(QString().sprintf("%4d0101T0000.0", song.year));
@@ -1047,8 +1190,10 @@ void MtpConnection::getCover(const Song &song)
 #ifdef MTP_CLEAN_ALBUMS
 void MtpConnection::updateAlbums()
 {
-    if (albums) {
-        LIBMTP_destroy_album_t(albums);
+    while (albums) {
+        LIBMTP_album_t *album=albums;
+        albums=albums->next;
+        LIBMTP_destroy_album_t(album);
     }
     albums=LIBMTP_Get_Album_List(device);
 }
@@ -1091,9 +1236,10 @@ void MtpConnection::destroyData()
     }
     
     #ifdef MTP_CLEAN_ALBUMS
-    if (albums) {
-        LIBMTP_destroy_album_t(albums);
-        albums=0;
+    while (albums) {
+        LIBMTP_album_t *album=albums;
+        albums=albums->next;
+        LIBMTP_destroy_album_t(album);
     }
     #endif
 }
@@ -1148,10 +1294,10 @@ MtpDevice::MtpDevice(MusicModel *m, Solid::Device &dev)
     connect(connection, SIGNAL(cleanDirsStatus(bool)), this, SLOT(cleanDirsStatus(bool)));
     connect(connection, SIGNAL(statusMessage(const QString &)), this, SLOT(setStatusMessage(const QString &)));
     connect(connection, SIGNAL(deviceDetails(const QString &)), this, SLOT(deviceDetails(const QString &)));
-    connect(connection, SIGNAL(songCount(int)), this, SLOT(songCount(int)));
+    connect(connection, SIGNAL(updatePercentage(int)), this, SLOT(updatePercentage(int)));
     connect(connection, SIGNAL(cover(const Song &, const QImage &)), this, SIGNAL(cover(const Song &, const QImage &)));
     opts.fixVariousArtists=false;
-    opts.coverName=Device::constEmbedCover;
+    opts.coverName=constMtpDefaultCover;
     QTimer::singleShot(0, this, SLOT(rescan(bool)));
 }
 
@@ -1310,7 +1456,7 @@ void MtpDevice::copySongTo(const Song &s, const QString &baseDir, const QString
     currentMpdDir=baseDir;
     currentDestFile=baseDir+musicPath;
     QDir dir(Utils::getDir(currentDestFile));
-    if (!dir.exists() && !Utils::createDir(dir.absolutePath(), baseDir)) {
+    if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) {
         emit actionStatus(DirCreationFaild);
         return;
     }
@@ -1503,7 +1649,7 @@ void MtpDevice::saveProperties()
 {
     if (solidDev.isValid()) {
         configured=true;
-        opts.save(cfgKey(solidDev, serial));
+        opts.save(cfgKey(solidDev, serial), false, true, false); // Dont save fileame scheme - cant be changed!
         emit configurationChanged();
     }
 }
@@ -1511,7 +1657,7 @@ void MtpDevice::saveProperties()
 void MtpDevice::saveOptions()
 {
     if (solidDev.isValid()) {
-        opts.save(cfgKey(solidDev, serial));
+        opts.save(cfgKey(solidDev, serial), false, true, false); // Dont save fileame scheme - cant be changed!
     }
 }
 
diff --git a/devices/mtpdevice.h b/devices/mtpdevice.h
index 30ee026..e96c50d 100644
--- a/devices/mtpdevice.h
+++ b/devices/mtpdevice.h
@@ -26,6 +26,7 @@
 
 #include "fsdevice.h"
 #include "song.h"
+#include "config.h"
 #ifdef ENABLE_KDE_SUPPORT
 #include <solid/portablemediaplayer.h>
 #else
@@ -33,6 +34,7 @@
 #endif
 #include <libmtp.h>
 
+
 class MusicLibraryItemRoot;
 class Thread;
 class MtpDevice;
@@ -81,7 +83,7 @@ public:
     uint64_t usedSpace() const { return used; }
     QList<DeviceStorage> getStorageList() const;
     void emitProgress(int percent);
-    void trackListProgress(uint64_t count);
+    void trackListProgress(int percent);
     bool abortRequested() const;
 
 public Q_SLOTS:
@@ -103,14 +105,19 @@ Q_SIGNALS:
     void libraryUpdated();
     void progress(int);
     void deviceDetails(const QString &serialNumber);
-    void songCount(int);
+    void updatePercentage(int);
     void cover(const Song &s, const QImage &img);
 
 private:
     File getCoverDetils(const Song &s);
     bool removeFolder(uint32_t folderId);
+    #ifdef ENABLE_UNCACHED_MTP
+    void updateFilesAndFolders();
+    void listFolder(uint32_t storage, uint32_t parentDir, Folder *f=0);
+    #else
     void updateFolders();
     void updateFiles();
+    #endif
     void updateStorage();
     Storage & getStorage(const QString &volumeIdentifier);
     Storage & getStorage(uint32_t id);
@@ -118,7 +125,9 @@ private:
     uint32_t getFolder(const QString &path, uint32_t storageId);
     QString getPath(uint32_t folderId);
     uint32_t checkFolderStructure(const QStringList &dirs, Storage &store);
+    #ifndef ENABLE_UNCACHED_MTP
     void parseFolder(LIBMTP_folder_t *folder);
+    #endif
     void setMusicFolder(Storage &store);
     #ifdef MTP_CLEAN_ALBUMS
     void updateAlbums();
@@ -139,7 +148,7 @@ private:
     uint64_t size;
     uint64_t used;
     MtpDevice *dev;
-    int lastUpdate;
+    int lastListPercent;
 };
 
 class MtpDevice : public Device
diff --git a/devices/remotefsdevice.cpp b/devices/remotefsdevice.cpp
index f816ac9..09b707b 100644
--- a/devices/remotefsdevice.cpp
+++ b/devices/remotefsdevice.cpp
@@ -359,9 +359,7 @@ void RemoteFsDevice::mount()
                 return;
             }
             QStringList askPassList;
-            const char *env=qgetenv("KDE_FULL_SESSION");
-            QString dm=env && 0==strcmp(env, "true") ? QLatin1String("KDE") : QString(qgetenv("XDG_CURRENT_DESKTOP"));
-            if (dm.isEmpty() || QLatin1String("KDE")==dm) {
+            if (Utils::KDE==Utils::currentDe()) {
                 askPassList << QLatin1String("ksshaskpass") << QLatin1String("ssh-askpass") << QLatin1String("ssh-askpass-gnome");
             } else {
                 askPassList << QLatin1String("ssh-askpass-gnome") << QLatin1String("ssh-askpass") << QLatin1String("ksshaskpass");
diff --git a/dynamic/cantata-dynamic b/dynamic/cantata-dynamic
index 641b635..e5338fa 100755
--- a/dynamic/cantata-dynamic
+++ b/dynamic/cantata-dynamic
@@ -38,7 +38,6 @@ use Sys::Hostname;
 use Socket qw(:all);
 
 # UDP multicast message sender - used to communicate with Cantata when cantata-dynamic is run in server mode!
-my $serverSender : shared = dirname(__FILE__) . '/message-sender';
 my $mcastGroup : shared = '239.123.123.123';
 my $mcastPort : shared = 6602;
 my $mcastTtl : shared = 1;
@@ -402,7 +401,7 @@ sub readRules() {
                                     $pos++;
                                 }
                             }
-                        } elsif ($key eq "Artist" || $key eq "Album" || $key eq "AlbumArtist" || $key eq "Title" || $key eq "Genre") {
+                        } elsif ($key eq "Artist" || $key eq "Album" || $key eq "AlbumArtist" || $key eq "Composer" || $key eq "Title" || $key eq "Genre") {
                             $currentRule="${currentRule} ${key} \"${val}\"";
                         } elsif ($key eq "SimilarArtists") {
                             &querySimilarArtists($val); # Perform a last.fm query to find similar artists
@@ -1029,8 +1028,12 @@ sub control() {
         &sendServerMessage();
         return "OK";
     } elsif ($command eq "stop") {
+        my $doClear=shift;
         $dynamicIsActive=0;
         $currentStatus="IDLE";
+        if ($doClear eq "true" || $doClear eq "1") {
+            &sendCommand("clear");
+        }
         &sendServerMessage();
         return "OK";
     }
@@ -1191,7 +1194,7 @@ sub httpServer() {
             } elsif ($request{URL} eq '/save') {
                 $response=&saveRulesToFile($queryItems{name}, $request{CONTENT});
             } elsif ($request{URL} eq '/control') {
-                $response=&control($queryItems{state});
+                $response=&control($queryItems{state}, $queryItems{clear});
             }
         } elsif ($request{METHOD} eq 'DELETE') {
             $response=&deleteRules($request{URL});
diff --git a/dynamic/dynamic.cpp b/dynamic/dynamic.cpp
index a5da023..d098bd6 100644
--- a/dynamic/dynamic.cpp
+++ b/dynamic/dynamic.cpp
@@ -49,6 +49,11 @@ K_GLOBAL_STATIC(Dynamic, instance)
 #include <QUrlQuery>
 #endif
 #include <signal.h>
+#include <stdio.h>
+
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
 
 #include <QDebug>
 static bool debugEnabled=false;
@@ -125,6 +130,9 @@ Dynamic * Dynamic::self()
     static Dynamic *instance=0;
     if(!instance) {
         instance=new Dynamic;
+        #if defined ENABLE_MODEL_TEST
+        new ModelTest(instance, instance);
+        #endif
     }
     return instance;
     #endif
@@ -134,6 +142,7 @@ const QString Dynamic::constRuleKey=QLatin1String("Rule");
 const QString Dynamic::constArtistKey=QLatin1String("Artist");
 const QString Dynamic::constSimilarArtistsKey=QLatin1String("SimilarArtists");
 const QString Dynamic::constAlbumArtistKey=QLatin1String("AlbumArtist");
+const QString Dynamic::constComposerKey=QLatin1String("Composer");
 const QString Dynamic::constAlbumKey=QLatin1String("Album");
 const QString Dynamic::constTitleKey=QLatin1String("Title");
 const QString Dynamic::constGenreKey=QLatin1String("Genre");
@@ -144,6 +153,16 @@ const QString Dynamic::constExcludeKey=QLatin1String("Exclude");
 static const char * constMulticastMsgHeader="{CANTATA/";
 const QString constStatusMsg(QLatin1String("STATUS:"));
 
+// Move files from previous ~/.config/cantata to ~/.local/share/cantata
+static void moveToNewLocation()
+{
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC // Not required for windows - as already stored in data location!
+    if (Settings::self()->version()<CANTATA_MAKE_VERSION(1, 51, 0)) {
+        Utils::moveDir(Utils::configDir(constDir), Utils::dataDir(constDir, true));
+    }
+    #endif
+}
+
 MulticastReceiver::MulticastReceiver(QObject *parent, const QString &i, const QString &group, quint16 port)
     : QObject(parent)
     , id(i)
@@ -187,6 +206,7 @@ Dynamic::Dynamic()
     , currentCommand(Unknown)
     , receiver(0)
 {
+    moveToNewLocation();
     loadLocal();
     connect(this, SIGNAL(clear()), MPDConnection::self(), SLOT(clear()));
     connect(MPDConnection::self(), SIGNAL(dynamicUrl(const QString &)), this, SLOT(dynamicUrlChanged(const QString &)));
@@ -258,10 +278,10 @@ QVariant Dynamic::data(const QModelIndex &index, int role) const
 
 Qt::ItemFlags Dynamic::flags(const QModelIndex &index) const
 {
-    if (index.isValid())
+    if (index.isValid()) {
         return Qt::ItemIsSelectable | Qt::ItemIsEnabled;
-    else
-        return Qt::NoItemFlags;
+    }
+    return Qt::NoItemFlags;
 }
 
 Dynamic::Entry Dynamic::entry(const QString &e)
@@ -314,7 +334,7 @@ bool Dynamic::save(const Entry &e)
 
         QNetworkRequest req(url);
         req.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
-        currentJob=NetworkAccessManager::self()->post(req, string.toUtf8());
+        currentJob=new NetworkJob(NetworkAccessManager::self()->post(req, string.toUtf8()));
         connect(currentJob, SIGNAL(finished()), this, SLOT(remoteJobFinished()));
         currentCommand=Save;
         currentArgs.clear();
@@ -322,7 +342,7 @@ bool Dynamic::save(const Entry &e)
         return true;
     }
 
-    QFile f(Utils::configDir(constDir, true)+e.name+constExtension);
+    QFile f(Utils::dataDir(constDir, true)+e.name+constExtension);
     if (f.open(QIODevice::WriteOnly|QIODevice::Text)) {
         QTextStream out(&f);
         out.setCodec("UTF-8");
@@ -358,7 +378,7 @@ void Dynamic::del(const QString &name)
     if (it==entryList.end()) {
         return;
     }
-    QString fName(Utils::configDir(constDir, false)+name+constExtension);
+    QString fName(Utils::dataDir(constDir, false)+name+constExtension);
     bool isCurrent=currentEntry==name;
 
     if (!QFile::exists(fName) || QFile::remove(fName)) {
@@ -384,7 +404,7 @@ void Dynamic::start(const QString &name)
         return;
     }
 
-    QString fName(Utils::configDir(constDir, false)+name+constExtension);
+    QString fName(Utils::dataDir(constDir, false)+name+constExtension);
 
     if (!QFile::exists(fName)) {
         emit error(i18n("Failed to locate rules file - %1", fName));
@@ -430,10 +450,14 @@ void Dynamic::start(const QString &name)
     }
 }
 
-void Dynamic::stop()
+void Dynamic::stop(bool sendClear)
 {
     if (isRemote()) {
-        sendCommand(Control, QStringList() << "state" << "stop");
+        if (sendClear) {
+            sendCommand(Control, QStringList() << "state" << "stop" << "clear" << "1");
+        } else {
+            sendCommand(Control, QStringList() << "state" << "stop");
+        }
         return;
     }
 
@@ -443,6 +467,9 @@ void Dynamic::stop()
     int pid=getPid();
 
     if (!pid) {
+        if (sendClear) {
+            emit clear();
+        }
         currentEntry=QString();
         emit running(false);
         if (idx.isValid()) {
@@ -452,6 +479,9 @@ void Dynamic::stop()
     }
 
     if (0!=::kill(pid, 0)) {
+        if (sendClear) {
+            emit clear();
+        }
         currentEntry=QString();
         emit running(false);
         if (idx.isValid()) {
@@ -461,6 +491,9 @@ void Dynamic::stop()
     }
 
     if (controlApp(false)) {
+        if (sendClear) {
+            emit clear();
+        }
         currentEntry=QString();
         emit running(isRunning());
         if (idx.isValid()) {
@@ -558,7 +591,7 @@ void Dynamic::loadLocal()
     currentEntry=QString();
 
     // Load all current enttries...
-    QString dirName=Utils::configDir(constDir);
+    QString dirName=Utils::dataDir(constDir);
     QDir d(dirName);
     if (d.exists()) {
         QStringList rulesFiles=d.entryList(QStringList() << QChar('*')+constExtension);
@@ -818,7 +851,7 @@ void Dynamic::sendCommand(Command cmd, const QStringList &args)
             url.setQuery(query);
             #endif
         
-            currentJob=NetworkAccessManager::self()->deleteResource(QNetworkRequest(url));
+            currentJob=new NetworkJob(NetworkAccessManager::self()->deleteResource(QNetworkRequest(url)));
         } else {
             currentCommand=Unknown;
             currentArgs.clear();
@@ -842,9 +875,9 @@ void Dynamic::sendCommand(Command cmd, const QStringList &args)
         if (SetActive==cmd || Control==cmd) {
             QNetworkRequest req(url);
             req.setHeader(QNetworkRequest::ContentTypeHeader, "text/plain");
-            currentJob=NetworkAccessManager::self()->post(req, QByteArray());
+            currentJob=new NetworkJob(NetworkAccessManager::self()->post(req, QByteArray()));
         } else {
-            currentJob=NetworkAccessManager::self()->get(QNetworkRequest(url));
+            currentJob=NetworkAccessManager::self()->get(url);
         }
     }
     if (List==cmd) {
@@ -935,7 +968,7 @@ void Dynamic::updateRemoteStatus()
 
 void Dynamic::remoteJobFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (!reply || reply!=currentJob) {
         return;
     }
@@ -944,7 +977,7 @@ void Dynamic::remoteJobFinished()
     reply->deleteLater();
 
     int httpResponse=reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt();
-    bool cmdOk=QNetworkReply::NoError==reply->error() && (200==httpResponse || 201==httpResponse);
+    bool cmdOk=reply->ok() && (200==httpResponse || 201==httpResponse);
     DBUG << toString(currentCommand) << currentArgs << cmdOk;
     QString response;
     if (cmdOk) {
diff --git a/dynamic/dynamic.h b/dynamic/dynamic.h
index bc52272..7dd5c9b 100644
--- a/dynamic/dynamic.h
+++ b/dynamic/dynamic.h
@@ -32,7 +32,7 @@
 #include "actionmodel.h"
 
 class QTimer;
-class QNetworkReply;
+class NetworkJob;
 class QUdpSocket;
 
 class MulticastReceiver : public QObject
@@ -86,6 +86,7 @@ public:
     static const QString constArtistKey;
     static const QString constSimilarArtistsKey;
     static const QString constAlbumArtistKey;
+    static const QString constComposerKey;
     static const QString constAlbumKey;
     static const QString constTitleKey;
     static const QString constGenreKey;
@@ -111,7 +112,7 @@ public:
     bool save(const Entry &e);
     void del(const QString &name);
     void start(const QString &name);
-    void stop();
+    void stop(bool sendClear=false);
     void toggle(const QString &name);
     bool isRunning();
     QString current() const { return currentEntry; }
@@ -173,7 +174,7 @@ private:
     int statusTime;
     QString lastState;
     QString dynamicUrl;
-    QNetworkReply *currentJob;
+    NetworkJob *currentJob;
     Command currentCommand;
     QStringList currentArgs;
     Entry currentSave;
diff --git a/dynamic/dynamicpage.cpp b/dynamic/dynamicpage.cpp
index 03f5238..c04260a 100644
--- a/dynamic/dynamicpage.cpp
+++ b/dynamic/dynamicpage.cpp
@@ -96,7 +96,7 @@ void DynamicPage::searchItems()
 {
     QString text=view->searchText().trimmed();
     proxy.update(text);
-    if (proxy.enabled() && !text.isEmpty()) {
+    if (proxy.enabled() && !proxy.filterText().isEmpty()) {
         view->expandAll();
     }
 }
@@ -207,6 +207,7 @@ void DynamicPage::enableWidgets(bool enable)
 
 void DynamicPage::showEvent(QShowEvent *e)
 {
+    view->focusView();
     Dynamic::self()->enableRemotePolling(true);
     QWidget::showEvent(e);
 }
diff --git a/dynamic/dynamicpage.ui b/dynamic/dynamicpage.ui
index ed442e9..0215864 100644
--- a/dynamic/dynamicpage.ui
+++ b/dynamic/dynamicpage.ui
@@ -11,6 +11,9 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="vlayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <property name="margin">
     <number>0</number>
    </property>
@@ -38,7 +41,7 @@
        <number>0</number>
       </property>
       <property name="spacing">
-       <number>0</number>
+       <number>1</number>
       </property>
       <item>
        <widget class="ToolButton" name="refreshBtn"/>
@@ -60,6 +63,9 @@
        </spacer>
       </item>
       <item>
+       <widget class="SizeWidget" name="sizeWidget"/>
+      </item>
+      <item>
        <widget class="ToolButton" name="addBtn"/>
       </item>
       <item>
@@ -95,6 +101,11 @@
    <extends>QToolButton</extends>
    <header>toolbutton.h</header>
   </customwidget>
+  <customwidget>
+   <class>SizeWidget</class>
+   <extends>QWidget</extends>
+   <header>sizewidget.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/dynamic/dynamicrule.ui b/dynamic/dynamicrule.ui
index ab27c4b..39447ea 100644
--- a/dynamic/dynamicrule.ui
+++ b/dynamic/dynamicrule.ui
@@ -46,6 +46,19 @@
       <widget class="CompletionCombo" name="albumArtistText"/>
      </item>
      <item row="4" column="0">
+      <widget class="BuddyLabel" name="composerLabel">
+       <property name="text">
+        <string>Composer:</string>
+       </property>
+       <property name="buddy">
+        <cstring>composerText</cstring>
+       </property>
+      </widget>
+     </item>
+     <item row="4" column="1">
+      <widget class="CompletionCombo" name="composerText"/>
+     </item>
+     <item row="5" column="0">
       <widget class="BuddyLabel" name="label_3">
        <property name="text">
         <string>Album:</string>
@@ -55,10 +68,10 @@
        </property>
       </widget>
      </item>
-     <item row="4" column="1">
+     <item row="5" column="1">
       <widget class="CompletionCombo" name="albumText"/>
      </item>
-     <item row="5" column="0">
+     <item row="6" column="0">
       <widget class="BuddyLabel" name="label_4">
        <property name="text">
         <string>Title:</string>
@@ -68,10 +81,10 @@
        </property>
       </widget>
      </item>
-     <item row="5" column="1">
+     <item row="6" column="1">
       <widget class="LineEdit" name="titleText"/>
      </item>
-     <item row="6" column="0">
+     <item row="7" column="0">
       <widget class="BuddyLabel" name="label_5">
        <property name="text">
         <string>Genre</string>
@@ -81,10 +94,10 @@
        </property>
       </widget>
      </item>
-     <item row="6" column="1">
+     <item row="7" column="1">
       <widget class="CompletionCombo" name="genreText"/>
      </item>
-     <item row="7" column="0">
+     <item row="8" column="0">
       <widget class="BuddyLabel" name="label_6">
        <property name="text">
         <string>From Year:</string>
@@ -94,7 +107,7 @@
        </property>
       </widget>
      </item>
-     <item row="7" column="1">
+     <item row="8" column="1">
       <widget class="SpinBox" name="dateFromSpin">
        <property name="minimumSize">
         <size>
@@ -107,7 +120,7 @@
        </property>
       </widget>
      </item>
-     <item row="8" column="0">
+     <item row="9" column="0">
       <widget class="BuddyLabel" name="label_6x">
        <property name="text">
         <string>To Year:</string>
@@ -117,7 +130,7 @@
        </property>
       </widget>
      </item>
-     <item row="8" column="1">
+     <item row="9" column="1">
       <widget class="SpinBox" name="dateToSpin">
        <property name="minimumSize">
         <size>
@@ -130,7 +143,7 @@
        </property>
       </widget>
      </item>
-     <item row="9" column="0">
+     <item row="10" column="0">
       <widget class="BuddyLabel" name="label_5x">
        <property name="text">
         <string>Exact match:</string>
@@ -140,7 +153,7 @@
        </property>
       </widget>
      </item>
-     <item row="9" column="1">
+     <item row="10" column="1">
       <widget class="OnOffButton" name="exactCheck"/>
      </item>
      <item row="0" column="0">
@@ -302,6 +315,7 @@
   <tabstop>typeCombo</tabstop>
   <tabstop>artistText</tabstop>
   <tabstop>albumArtistText</tabstop>
+  <tabstop>composerText</tabstop>
   <tabstop>albumText</tabstop>
   <tabstop>titleText</tabstop>
   <tabstop>genreText</tabstop>
diff --git a/dynamic/dynamicruledialog.cpp b/dynamic/dynamicruledialog.cpp
index 26936d7..3014a2d 100644
--- a/dynamic/dynamicruledialog.cpp
+++ b/dynamic/dynamicruledialog.cpp
@@ -41,6 +41,7 @@ DynamicRuleDialog::DynamicRuleDialog(QWidget *parent)
     setCaption(i18n("Dynamic Rule"));
 
     connect(artistText, SIGNAL(textChanged(const QString &)), SLOT(enableOkButton()));
+    connect(composerText, SIGNAL(textChanged(const QString &)), SLOT(enableOkButton()));
     connect(similarArtistsText, SIGNAL(textChanged(const QString &)), SLOT(enableOkButton()));
     connect(albumArtistText, SIGNAL(textChanged(const QString &)), SLOT(enableOkButton()));
     connect(albumText, SIGNAL(textChanged(const QString &)), SLOT(enableOkButton()));
@@ -51,9 +52,10 @@ DynamicRuleDialog::DynamicRuleDialog(QWidget *parent)
 
     QSet<QString> artists;
     QSet<QString> albumArtists;
+    QSet<QString> composers;
     QSet<QString> albums;
     QSet<QString> genres;
-    MusicLibraryModel::self()->getDetails(artists, albumArtists, albums, genres);
+    MusicLibraryModel::self()->getDetails(artists, albumArtists, composers, albums, genres);
 
     QStringList strings=artists.toList();
     strings.sort();
@@ -68,6 +70,11 @@ DynamicRuleDialog::DynamicRuleDialog(QWidget *parent)
     albumArtistText->clear();
     albumArtistText->insertItems(0, strings);
 
+    strings=composers.toList();
+    strings.sort();
+    composerText->clear();
+    composerText->insertItems(0, strings);
+
     strings=albums.toList();
     strings.sort();
     albumText->clear();
@@ -96,6 +103,7 @@ bool DynamicRuleDialog::edit(const Dynamic::Rule &rule, bool isAdd)
     artistText->setText(rule[Dynamic::constArtistKey]);
     similarArtistsText->setText(rule[Dynamic::constSimilarArtistsKey]);
     albumArtistText->setText(rule[Dynamic::constAlbumArtistKey]);
+    composerText->setText(rule[Dynamic::constComposerKey]);
     albumText->setText(rule[Dynamic::constAlbumKey]);
     titleText->setText(rule[Dynamic::constTitleKey]);
     genreText->setText(rule[Dynamic::constGenreKey]);
@@ -142,6 +150,9 @@ Dynamic::Rule DynamicRuleDialog::rule() const
     if (!albumArtist().isEmpty()) {
         r.insert(Dynamic::constAlbumArtistKey, albumArtist());
     }
+    if (!composer().isEmpty()) {
+        r.insert(Dynamic::constComposerKey, composer());
+    }
     if (!album().isEmpty()) {
         r.insert(Dynamic::constAlbumKey, album());
     }
@@ -183,7 +194,7 @@ void DynamicRuleDialog::enableOkButton()
     bool haveTo=dateTo>=constMinDate && dateTo<=constMaxDate && dateTo!=dateFrom;
     bool enable=(!haveFrom || !haveTo || (dateTo>=dateFrom && (dateTo-dateFrom)<=constMaxDateRange)) &&
                 (haveFrom || haveTo || !artist().isEmpty() || !similarArtists().isEmpty() || !albumArtist().isEmpty() ||
-                 !album().isEmpty() || !title().isEmpty() || !genre().isEmpty());
+                 !composer().isEmpty() || !album().isEmpty() || !title().isEmpty() || !genre().isEmpty());
 
     errorLabel->setVisible(false);
     if (!enable && haveFrom && haveTo) {
diff --git a/dynamic/dynamicruledialog.h b/dynamic/dynamicruledialog.h
index 260ed56..4c7716e 100644
--- a/dynamic/dynamicruledialog.h
+++ b/dynamic/dynamicruledialog.h
@@ -44,6 +44,7 @@ public:
     QString artist() const { return artistText->text().trimmed(); }
     QString similarArtists() const { return similarArtistsText->text().trimmed(); }
     QString albumArtist() const { return albumArtistText->text().trimmed(); }
+    QString composer() const { return composerText->text().trimmed(); }
     QString album() const { return albumText->text().trimmed(); }
     QString title() const { return titleText->text().trimmed(); }
     QString genre() const { return genreText->text().trimmed(); }
diff --git a/dynamic/dynamicrulesdialog.cpp b/dynamic/dynamicrulesdialog.cpp
index 251c2dc..0dfc09c 100644
--- a/dynamic/dynamicrulesdialog.cpp
+++ b/dynamic/dynamicrulesdialog.cpp
@@ -68,6 +68,8 @@ static QString translateStr(const QString &key)
         return i18n("SimilarArtists");
     } else if (Dynamic::constAlbumArtistKey==key) {
         return i18n("AlbumArtist");
+    } else if (Dynamic::constComposerKey==key) {
+        return i18n("Composer");
     } else if (Dynamic::constAlbumKey==key) {
         return i18n("Album");
     } else if (Dynamic::constTitleKey==key) {
diff --git a/gui/albumspage.cpp b/gui/albumspage.cpp
index 4cde9af..36189a6 100644
--- a/gui/albumspage.cpp
+++ b/gui/albumspage.cpp
@@ -31,9 +31,11 @@
 #include "messagebox.h"
 #include "settings.h"
 #include "stdactions.h"
+#include "utils.h"
 
 AlbumsPage::AlbumsPage(QWidget *p)
     : QWidget(p)
+    , coverLoad(Settings::self()->albumViewLoadAll() ? CL_LoadAll : CL_LoadAsRequired)
 {
     setupUi(this);
     addToPlayQueue->setDefaultAction(StdActions::self()->addToPlayQueueAction);
@@ -42,6 +44,7 @@ AlbumsPage::AlbumsPage(QWidget *p)
     searchButton->setDefaultAction(StdActions::self()->searchAction);
 
     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);
@@ -67,6 +70,7 @@ 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()));
@@ -87,6 +91,16 @@ void AlbumsPage::setView(int v)
     view->setMode((ItemView::Mode)v);
 }
 
+void AlbumsPage::showEvent(QShowEvent *e)
+{
+    view->focusView();
+    if (CL_LoadAll==coverLoad) {
+        AlbumsModel::self()->loadAllCovers();
+        coverLoad=CL_Loaded;
+    }
+    QWidget::showEvent(e);
+}
+
 void AlbumsPage::clear()
 {
     AlbumsModel::self()->clear();
@@ -107,7 +121,21 @@ void AlbumsPage::setItemSize(int v)
     }
 }
 
-QStringList AlbumsPage::selectedFiles(bool allowPlaylists) const
+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();
     if (selected.isEmpty()) {
@@ -119,6 +147,27 @@ QStringList AlbumsPage::selectedFiles(bool allowPlaylists) const
         mapped.append(proxy.mapToSource(idx));
     }
 
+    if (randomAlbums) {
+        QModelIndexList albumIndexes;
+        foreach (const QModelIndex &idx, mapped) {
+            if (static_cast<AlbumsModel::Item *>(idx.internalPointer())->isAlbum()) {
+                albumIndexes.append(idx);
+            }
+        }
+
+        if (albumIndexes.isEmpty()) {
+            return QStringList();
+        }
+
+        if (1==albumIndexes.count()) {
+            mapped=albumIndexes;
+        } else {
+            mapped.clear();
+            while (!albumIndexes.isEmpty()) {
+                mapped.append(albumIndexes.takeAt(Utils::random(albumIndexes.count())));
+            }
+        }
+    }
     return AlbumsModel::self()->filenames(mapped, allowPlaylists);
 }
 
@@ -150,9 +199,9 @@ Song AlbumsPage::coverRequest() const
     return Song();
 }
 
-void AlbumsPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty)
+void AlbumsPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty, bool randomAlbums)
 {
-    QStringList files=selectedFiles(true);
+    QStringList files=selectedFiles(name.isEmpty(), randomAlbums);
 
     if (!files.isEmpty()) {
         if (name.isEmpty()) {
@@ -200,7 +249,7 @@ void AlbumsPage::searchItems()
 {
     QString text=view->searchText().trimmed();
     proxy.update(text, genreCombo->currentIndex()<=0 ? QString() : genreCombo->currentText());
-    if (proxy.enabled() && !text.isEmpty()) {
+    if (proxy.enabled() && !proxy.filterText().isEmpty()) {
         view->expandAll();
     }
 }
@@ -238,4 +287,15 @@ void AlbumsPage::controlActions()
     #endif
     #endif // TAGLIB_FOUND
     StdActions::self()->setCoverAction->setEnabled(1==selected.count() && static_cast<AlbumsModel::Item *>(proxy.mapToSource(selected.at(0)).internalPointer())->isAlbum());
+
+    bool allowRandomAlbum=!selected.isEmpty();
+    if (allowRandomAlbum) {
+        foreach (const QModelIndex &idx, selected) {
+            if (!static_cast<AlbumsModel::Item *>(proxy.mapToSource(idx).internalPointer())->isAlbum()) {
+                allowRandomAlbum=false;
+                break;
+            }
+        }
+    }
+    StdActions::self()->addRandomToPlayQueueAction->setEnabled(allowRandomAlbum);
 }
diff --git a/gui/albumspage.h b/gui/albumspage.h
index 1700087..006e71c 100644
--- a/gui/albumspage.h
+++ b/gui/albumspage.h
@@ -34,15 +34,23 @@ class MusicLibraryItemRoot;
 class AlbumsPage : public QWidget, public Ui::AlbumsPage
 {
     Q_OBJECT
+
+    enum CoverLoad
+    {
+        CL_LoadAsRequired,
+        CL_LoadAll,
+        CL_Loaded
+    };
+
 public:
     AlbumsPage(QWidget *p);
     virtual ~AlbumsPage();
 
     void clear();
-    QStringList selectedFiles(bool allowPlaylists=false) const;
+    QStringList selectedFiles(bool allowPlaylists=false, bool randomAlbums=false) const;
     QList<Song> selectedSongs(bool allowPlaylists=false) const;
     Song coverRequest() const;
-    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0);
+    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();
@@ -52,6 +60,7 @@ public:
     void focusSearch() { view->focusSearch(); }
     void goBack() { view->backActivated(); }
     void goTop() { view->setLevel(0); }
+    void showEvent(QShowEvent *e);
 
 private:
     void setItemSize(int v);
@@ -69,8 +78,10 @@ public Q_SLOTS:
     void controlActions();
     void searchItems();
     void updateGenres(const QModelIndex &);
+    void albumsUpdated();
 
 private:
+    CoverLoad coverLoad;
     AlbumsProxyModel proxy;
 };
 
diff --git a/gui/albumspage.ui b/gui/albumspage.ui
index f87acf8..b8a6351 100644
--- a/gui/albumspage.ui
+++ b/gui/albumspage.ui
@@ -11,6 +11,9 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="vlayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <property name="leftMargin">
     <number>0</number>
    </property>
@@ -29,7 +32,7 @@
    <item>
     <layout class="QHBoxLayout" name="hlayout">
      <property name="spacing">
-      <number>0</number>
+      <number>1</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
@@ -53,6 +56,9 @@
       <widget class="GenreCombo" name="genreCombo"/>
      </item>
      <item>
+      <widget class="SizeWidget" name="sizeWidget"/>
+     </item>
+     <item>
       <widget class="ToolButton" name="addToPlayQueue"/>
      </item>
      <item>
@@ -78,6 +84,11 @@
    <extends>QToolButton</extends>
    <header>toolbutton.h</header>
   </customwidget>
+  <customwidget>
+   <class>SizeWidget</class>
+   <extends>QWidget</extends>
+   <header>sizewidget.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/gui/application.cpp b/gui/application.cpp
index 37cef1e..e87a72d 100644
--- a/gui/application.cpp
+++ b/gui/application.cpp
@@ -26,7 +26,6 @@
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KCmdLineArgs>
 #include <KDE/KStartupInfo>
-#include <KDE/Solid/PowerManagement>
 #include "initialsettingswizard.h"
 #else
 #include <QIcon>
@@ -34,6 +33,9 @@
 #include <QDir>
 #include <windows.h>
 #endif
+#ifdef Q_OS_MAC
+#include <QDir>
+#endif
 #endif
 #include "icon.h"
 #include "icons.h"
@@ -49,9 +51,6 @@ Application::Application(Display *display, Qt::HANDLE visual, Qt::HANDLE colorma
     : KUniqueApplication(display, visual, colormap)
     , w(0)
 {
-    #if KDE_IS_VERSION(4, 7, 0)
-    connect(Solid::PowerManagement::notifier(), SIGNAL(resumingFromSuspend()), MPDConnection::self(), SLOT(reconnect()));
-    #endif
 }
 #endif
 
@@ -59,9 +58,6 @@ Application::Application()
     : KUniqueApplication()
     , w(0)
 {
-    #if KDE_IS_VERSION(4, 7, 0)
-    connect(Solid::PowerManagement::notifier(), SIGNAL(resumingFromSuspend()), MPDConnection::self(), SLOT(reconnect()));
-    #endif
 }
 
 Application::~Application() {
@@ -99,7 +95,6 @@ int Application::newInstance() {
         }
     }
 
-    #ifdef TAGLIB_FOUND
     KCmdLineArgs *args(KCmdLineArgs::parsedArgs());
     QStringList urls;
     for (int i = 0; i < args->count(); ++i) {
@@ -108,7 +103,6 @@ int Application::newInstance() {
     if (!urls.isEmpty()) {
         w->load(urls);
     }
-    #endif
     KStartupInfo::appStarted(startupId());
     in=false;
     return 0;
@@ -125,10 +119,7 @@ void Application::mwDestroyed(QObject *obj)
 Application::Application(int &argc, char **argv)
     : QtSingleApplication(argc, argv)
 {
-    #if defined TAGLIB_FOUND
     connect(this, SIGNAL(messageReceived(const QString &)), SLOT(message(const QString &)));
-    #endif
-
     connect(this, SIGNAL(reconnect()), MPDConnection::self(), SLOT(reconnect()));
 }
 
@@ -163,14 +154,13 @@ bool Application::winEventFilter(MSG *msg, long *result)
 bool Application::start()
 {
     if (isRunning()) {
-        #ifdef TAGLIB_FOUND
         QStringList args(arguments());
         if (args.count()>1) {
             args.takeAt(0);
             sendMessage(args.join("\n"));
-        } else
-        #endif
+        } else {
             sendMessage(QString());
+        }
         return false;
     }
 
@@ -180,20 +170,15 @@ bool Application::start()
 
 void Application::message(const QString &msg)
 {
-    #if defined TAGLIB_FOUND
     if (!msg.isEmpty()) {
         load(msg.split("\n"));
     }
-    #else
-    Q_UNUSED(msg)
-    #endif
     MainWindow *mw=qobject_cast<MainWindow *>(activationWindow());
     if (mw) {
         mw->restoreWindow();
     }
 }
 
-#if defined TAGLIB_FOUND
 void Application::loadFiles()
 {
     QStringList args(arguments());
@@ -220,13 +205,58 @@ void Application::load(const QStringList &files)
         }
     }
 }
-#endif // TAGLIB_FOUND
 
-#else // Q_OS_WIN
+#elif defined Q_OS_MAC
+Application::Application(int &argc, char **argv)
+    : QApplication(argc, argv)
+{
+    connect(this, SIGNAL(messageReceived(const QString &)), SLOT(message(const QString &)));
+    connect(this, SIGNAL(reconnect()), MPDConnection::self(), SLOT(reconnect()));
+}
+
+void Application::setupIconTheme()
+{
+    //QIcon::setThemeSearchPaths(QStringList(QCoreApplication::applicationDirPath() + "/../Resources/icons"));
+    QIcon::setThemeName(QLatin1String("oxygen"));
+}
+
+bool Application::start()
+{
+    setupIconTheme();
+    return true;
+}
+
+void Application::loadFiles()
+{
+    QStringList args(arguments());
+    if (args.count()>1) {
+        args.takeAt(0);
+        load(args);
+    }
+}
+
+void Application::load(const QStringList &files)
+{
+    if (files.isEmpty()) {
+        return;
+    }
+
+    QStringList urls;
+    foreach (const QString &f, files) {
+        urls.append(f);
+    }
+    if (!urls.isEmpty()) {
+        MainWindow *mw=qobject_cast<MainWindow *>(activationWindow());
+        if (mw) {
+            mw->load(urls);
+        }
+    }
+}
+
+#else // Q_OS_WIN || Q_OS_MAC
 #include <QDBusConnection>
 #include <QDBusMessage>
 #include <QDir>
-#include "upowerinterface.h"
 
 Application::Application(int &argc, char **argv)
     : QApplication(argc, argv)
@@ -236,7 +266,6 @@ Application::Application(int &argc, char **argv)
 bool Application::start()
 {
     if (QDBusConnection::sessionBus().registerService(CANTATA_REV_URL)) {
-        connectPowerSignal();
         setupIconTheme();
         return true;
     }
@@ -271,7 +300,6 @@ void Application::setupIconTheme()
 
 void Application::loadFiles()
 {
-    #ifdef TAGLIB_FOUND
     QStringList args(arguments());
     if (args.count()>1) {
         args.takeAt(0);
@@ -281,18 +309,6 @@ void Application::loadFiles()
         m.setArguments(a);
         QDBusConnection::sessionBus().send(m);
     }
-    #endif
-}
-
-void Application::connectPowerSignal()
-{
-    if (!QDBusConnection::systemBus().interface()->isServiceRegistered(OrgFreedesktopUPowerInterface::staticInterfaceName())) {
-        QDBusConnection::systemBus().interface()->startService(OrgFreedesktopUPowerInterface::staticInterfaceName());
-    }
-
-    OrgFreedesktopUPowerInterface *upower=new OrgFreedesktopUPowerInterface(OrgFreedesktopUPowerInterface::staticInterfaceName(),
-                                                                            "/org/freedesktop/UPower", QDBusConnection::systemBus(), this);
-    connect(upower, SIGNAL(Resuming()), MPDConnection::self(), SLOT(reconnect()));
 }
 
 #endif
diff --git a/gui/application.h b/gui/application.h
index 2fbc49e..5e21baa 100644
--- a/gui/application.h
+++ b/gui/application.h
@@ -60,14 +60,10 @@ public:
 
     bool winEventFilter(MSG *msg, long *result);
     bool start();
-    #if defined TAGLIB_FOUND
     void loadFiles();
-    #endif // TAGLIB_FOUND
 
 private:
-    #if defined TAGLIB_FOUND
     void load(const QStringList &files);
-    #endif
 
 private Q_SLOTS:
     void message(const QString &m);
@@ -75,6 +71,21 @@ private Q_SLOTS:
 Q_SIGNALS:
     void reconnect();
 };
+#elif defined Q_OS_MAC || defined __APPLE__   // moc does not seem to see Q_OS_MAC, but will see __APPLE__ :-(
+#include <QApplication>
+class Application : public QApplication
+{
+public:
+    Application(int &argc, char **argv);
+    virtual ~Application() { }
+
+    bool start();
+    void loadFiles();
+    void setupIconTheme();
+
+private:
+    void load(const QStringList &files);
+};
 #else
 #include <QApplication>
 class Application : public QApplication
@@ -87,7 +98,6 @@ public:
     void loadFiles();
     void setActivationWindow(QWidget *) { }
     void setupIconTheme();
-    void connectPowerSignal();
 };
 #endif
 
diff --git a/gui/cachesettings.cpp b/gui/cachesettings.cpp
index 7d17e48..85e92de 100644
--- a/gui/cachesettings.cpp
+++ b/gui/cachesettings.cpp
@@ -36,6 +36,8 @@
 #include "settings.h"
 #include "basicitemdelegate.h"
 #include "streamsmodel.h"
+#include "podcastsearchdialog.h"
+#include "squeezedtextlabel.h"
 #include <QLabel>
 #include <QPushButton>
 #include <QStyle>
@@ -47,7 +49,7 @@
 
 static const int constMaxRecurseLevel=4;
 
-static void calculate(const QString &d, const QStringList &types, int &items, int &space, int level=0)
+static void calculate(const QString &d, const QStringList &types, int &items, quint64 &space, int level=0)
 {
     if (!d.isEmpty() && level<constMaxRecurseLevel) {
         QDir dir(d);
@@ -110,7 +112,7 @@ CacheItemCounter::~CacheItemCounter()
 void CacheItemCounter::getCount()
 {
     int items=0;
-    int space=0;
+    quint64 space=0;
     calculate(dir, types, items, space);
     emit count(items, space);
 }
@@ -125,10 +127,11 @@ CacheItem::CacheItem(const QString &title, const QString &d, const QStringList &
     : QTreeWidgetItem(p, QStringList() << title)
     , counter(new CacheItemCounter(title, d, t))
     , empty(true)
+    , usedSpace(0)
 {
     connect(this, SIGNAL(getCount()), counter, SLOT(getCount()), Qt::QueuedConnection);
     connect(this, SIGNAL(deleteAll()), counter, SLOT(deleteAll()), Qt::QueuedConnection);
-    connect(counter, SIGNAL(count(int, int)), this, SLOT(update(int, int)), Qt::QueuedConnection);
+    connect(counter, SIGNAL(count(int, quint64)), this, SLOT(update(int, quint64)), Qt::QueuedConnection);
     connect(this, SIGNAL(updated()), p, SIGNAL(itemSelectionChanged()));
 }
 
@@ -137,11 +140,12 @@ CacheItem::~CacheItem()
     delete counter;
 }
 
-void CacheItem::update(int itemCount, int space)
+void CacheItem::update(int itemCount, quint64 space)
 {
     setText(1, QString::number(itemCount));
     setText(2, Utils::formatByteSize(space));
     empty=0==itemCount;
+    usedSpace=space;
     setStatus();
     emit updated();
 }
@@ -171,17 +175,14 @@ void CacheItem::calculate()
     emit getCount();
 }
 
-#if QT_VERSION < 0x050000
 static inline void setResizeMode(QHeaderView *hdr, int idx, QHeaderView::ResizeMode mode)
 {
+    #if QT_VERSION < 0x050000
     hdr->setResizeMode(idx, mode);
-}
-#else
-static inline void setResizeMode(QHeaderView *hdr, int idx, QHeaderView::ResizeMode mode)
-{
+    #else
     hdr->setSectionResizeMode(idx, mode);
+    #endif
 }
-#endif
 
 CacheTree::CacheTree(QWidget *parent)
     : QTreeWidget(parent)
@@ -217,6 +218,22 @@ void CacheTree::showEvent(QShowEvent *e)
     QTreeWidget::showEvent(e);
 }
 
+class SpaceLabel : public SqueezedTextLabel
+{
+public:
+    SpaceLabel(QWidget *p)
+        : SqueezedTextLabel(p)
+    {
+        QFont f=font();
+        f.setItalic(true);
+        setFont(f);
+        update(i18n("Calculating..."));
+    }
+
+    void update(int space) { update(Utils::formatByteSize(space)); }
+    void update(const QString &text) { setText(i18n("Total space used: %1", text)); }
+};
+
 CacheSettings::CacheSettings(QWidget *parent)
     : QWidget(parent)
 {
@@ -243,13 +260,19 @@ CacheSettings::CacheSettings(QWidget *parent)
     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::constCacheDir, false), QStringList() << "*"+StreamsModel::constCacheExt, tree);
+    new CacheItem(i18n("Streams"), Utils::cacheDir(StreamsModel::constSubDir, false), QStringList() << "*"+StreamsModel::constCacheExt, tree);
     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("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);
 
+    for (int i=0; i<tree->topLevelItemCount(); ++i) {
+        connect(static_cast<CacheItem *>(tree->topLevelItem(i)), SIGNAL(updated()), this, SLOT(updateSpace()));
+    }
+
+    spaceLabel=new SpaceLabel(this);
     button=new QPushButton(i18n("Delete All"), this);
-    layout->addItem(new QSpacerItem(0, 0, QSizePolicy::MinimumExpanding, QSizePolicy::Fixed), row++, 0);
-    layout->addWidget(button, row, 1, 1, 1);
+    layout->addWidget(spaceLabel, row, 0, 1, 1);
+    layout->addWidget(button, row++, 1, 1, 1);
     button->setEnabled(false);
 
     connect(tree, SIGNAL(itemSelectionChanged()), this, SLOT(controlButton()));
@@ -307,3 +330,12 @@ void CacheSettings::deleteAll()
         }
     }
 }
+
+void CacheSettings::updateSpace()
+{
+    quint64 space=0;
+    for (int i=0; i<tree->topLevelItemCount(); ++i) {
+        space+=static_cast<CacheItem *>(tree->topLevelItem(i))->spaceUsed();
+    }
+    spaceLabel->update(space);
+}
diff --git a/gui/cachesettings.h b/gui/cachesettings.h
index abb7706..023326e 100644
--- a/gui/cachesettings.h
+++ b/gui/cachesettings.h
@@ -30,6 +30,7 @@
 #include <QTreeWidget>
 
 class QPushButton;
+class SpaceLabel;
 class Thread;
 
 class CacheItemCounter : public QObject
@@ -41,7 +42,7 @@ public:
     ~CacheItemCounter();
 
 Q_SIGNALS:
-    void count(int num, int space);
+    void count(int num, quint64 space);
 
 public Q_SLOTS:
     void getCount();
@@ -65,6 +66,7 @@ public:
     void clean();
     bool isEmpty() const { return empty; }
     QString name() const { return text(0); }
+    int spaceUsed() const { return usedSpace; }
 
 Q_SIGNALS:
     void getCount();
@@ -72,7 +74,7 @@ Q_SIGNALS:
     void updated();
 
 private Q_SLOTS:
-    void update(int itemCount, int space);
+    void update(int itemCount, quint64 space);
 
 private:
     void setStatus(const QString &str=QString());
@@ -80,6 +82,7 @@ private:
 private:
     CacheItemCounter *counter;
     bool empty;
+    quint64 usedSpace;
 };
 
 class CacheTree : public QTreeWidget
@@ -105,9 +108,11 @@ public:
 private Q_SLOTS:
     void controlButton();
     void deleteAll();
+    void updateSpace();
 
 private:
     QTreeWidget *tree;
+    SpaceLabel *spaceLabel;
     QPushButton *button;
 };
 
diff --git a/gui/coverdialog.cpp b/gui/coverdialog.cpp
index f96f1f9..1ec433b 100644
--- a/gui/coverdialog.cpp
+++ b/gui/coverdialog.cpp
@@ -32,6 +32,7 @@
 #include "spinner.h"
 #include "icon.h"
 #include "qjson/parser.h"
+#include "config.h"
 #include <QVBoxLayout>
 #include <QLabel>
 #include <QListWidget>
@@ -454,41 +455,30 @@ static const char * constWidthProperty="w";
 static const char * constHeightProperty="h";
 static const char * constSizeProperty="sz";
 static const char * constTypeProperty="type";
-static const char * constRedirectsProperty="redirects";
 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 int constMaxRedirects=5;
-
 void CoverDialog::queryJobFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (!reply || !currentQuery.contains(reply)) {
         return;
     }
 
     currentQuery.remove(reply);
-    if(QNetworkReply::NoError==reply->error()) {
+    if (reply->ok()) {
         QString host=reply->property(constHostProperty).toString();
-        QVariant redirect = reply->header(QNetworkRequest::LocationHeader);
-        if (redirect.isValid()) {
-            int rd=reply->property(constRedirectsProperty).toInt();
-            if (rd<constMaxRedirects) {
-                sendQueryRequest(redirect.toUrl(), rd+1, host);
-            }
-        } else {
-            QByteArray resp=reply->readAll();
-            if (constLastFmHost==host) {
-                parseLstFmQueryResponse(resp);
-            } else if (constGoogleHost==host) {
-                parseGoogleQueryResponse(resp);
-            } else if (constDiscogsHost==host) {
-                parseDiscogsQueryResponse(resp);
-            } else if (constCoverArtArchiveHost==host) {
-                parseCoverArtArchiveQueryResponse(resp);
-            }
+        QByteArray resp=reply->readAll();
+        if (constLastFmHost==host) {
+            parseLstFmQueryResponse(resp);
+        } else if (constGoogleHost==host) {
+            parseGoogleQueryResponse(resp);
+        } else if (constDiscogsHost==host) {
+            parseDiscogsQueryResponse(resp);
+        } else if (constCoverArtArchiveHost==host) {
+            parseCoverArtArchiveQueryResponse(resp);
         }
     }
     reply->deleteLater();
@@ -538,7 +528,7 @@ void CoverDialog::insertItem(CoverItem *item)
 
 void CoverDialog::downloadJobFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (!reply || !currentQuery.contains(reply)) {
         return;
     }
@@ -550,88 +540,63 @@ void CoverDialog::downloadJobFinished()
     }
 
     currentQuery.remove(reply);
-    if(QNetworkReply::NoError==reply->error()) {
+    if (reply->ok()) {
         QString host=reply->property(constHostProperty).toString();
-        QVariant redirect = reply->header(QNetworkRequest::LocationHeader);
-        if (redirect.isValid()) {
-            int rd=reply->property(constRedirectsProperty).toInt();
-            if (rd<constMaxRedirects) {
-                QNetworkReply *j=downloadImage(redirect.toString(), dlType);
-                if (j) {
-                    j->setProperty(constRedirectsProperty, rd+1);
-                    QStringList stringProps=QStringList() << constHostProperty << constLargeProperty << constThumbProperty;
-                    QStringList intProps=QStringList() << constWidthProperty << constHeightProperty << constSizeProperty;
-                    foreach (const QString &prop, stringProps) {
-                        QVariant p=reply->property(prop.toLatin1().constData());
-                        if (p.isValid()) {
-                            j->setProperty(prop.toLatin1().constData(), p.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));
+        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"));
+
+                if (temp->open()) {
+                    if (FT_Other==fileType) {
+                        img.save(temp, "PNG");
+                    } else {
+                        temp->write(data);
                     }
-                    foreach (const QString &prop, intProps) {
-                        QVariant p=reply->property(prop.toLatin1().constData());
-                        if (p.isValid()) {
-                            j->setProperty(prop.toLatin1().constData(), p.toInt());
-                        }
+                    if (tempFiles.size()>=constMaxTempFiles) {
+                        QTemporaryFile *last=tempFiles.takeLast();
+                        last->remove();
+                        delete last;
                     }
+                    temp->setProperty(constLargeProperty, reply->property(constLargeProperty));
+                    tempFiles.prepend(temp);
+                } else {
+                    delete temp;
+                    temp=0;
                 }
             }
-        } else {
-            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));
-            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"));
-
-                    if (temp->open()) {
-                        if (FT_Other==fileType) {
-                            img.save(temp, "PNG");
-                        } else {
-                            temp->write(data);
-                        }
-                        if (tempFiles.size()>=constMaxTempFiles) {
-                            QTemporaryFile *last=tempFiles.takeLast();
-                            last->remove();
-                            delete last;
-                        }
-                        temp->setProperty(constLargeProperty, reply->property(constLargeProperty));
-                        tempFiles.prepend(temp);
-                    } else {
-                        delete temp;
-                        temp=0;
+            if (isLarge) {
+                if (DL_LargePreview==dlType) {
+                    previewDialog()->showImage(cropImage(img, isArtist), reply->property(constLargeProperty).toString());
+                } else if (DL_LargeSave==dlType) {
+                    if (!temp) {
+                        MessageBox::error(this, i18n("Failed to set cover!\nCould not download to temporary file!"));
+                    } else if (saveCover(temp->fileName(), img)) {
+                        accept();
                     }
                 }
-                if (isLarge) {
-                    if (DL_LargePreview==dlType) {
-                        previewDialog()->showImage(cropImage(img, isArtist), reply->property(constLargeProperty).toString());
-                    } else if (DL_LargeSave==dlType) {
-                        if (!temp) {
-                            MessageBox::error(this, i18n("Failed to set cover!\nCould not download to temporary file!"));
-                        } else if (saveCover(temp->fileName(), img)) {
-                            accept();
-                        }
-                    }
-                } else {
-                    CoverItem *item=0;
-                    img=cropImage(img, isArtist);
-                    if (constLastFmHost==host) {
-                        item=new LastFmCover(reply->property(constLargeProperty).toString(), url, img, list);
-                    } else if (constGoogleHost==host) {
-                        item=new GoogleCover(reply->property(constLargeProperty).toString(), url, img, reply->property(constWidthProperty).toInt(),
-                                             reply->property(constHeightProperty).toInt(), reply->property(constSizeProperty).toInt(), list);
-                    } else if (constDiscogsHost==host) {
-                        item=new DiscogsCover(reply->property(constLargeProperty).toString(), url, img, reply->property(constWidthProperty).toInt(),
-                                              reply->property(constHeightProperty).toInt(), list);
-                    } else if (constCoverArtArchiveHost==host) {
-                        item=new CoverArtArchiveCover(reply->property(constLargeProperty).toString(), url, img, list);
-                    }
-                    if (item) {
-                        insertItem(item);
-                    }
+            } else {
+                CoverItem *item=0;
+                img=cropImage(img, isArtist);
+                if (constLastFmHost==host) {
+                    item=new LastFmCover(reply->property(constLargeProperty).toString(), url, img, list);
+                } else if (constGoogleHost==host) {
+                    item=new GoogleCover(reply->property(constLargeProperty).toString(), url, img, reply->property(constWidthProperty).toInt(),
+                                         reply->property(constHeightProperty).toInt(), reply->property(constSizeProperty).toInt(), list);
+                } else if (constDiscogsHost==host) {
+                    item=new DiscogsCover(reply->property(constLargeProperty).toString(), url, img, reply->property(constWidthProperty).toInt(),
+                                          reply->property(constHeightProperty).toInt(), list);
+                } else if (constCoverArtArchiveHost==host) {
+                    item=new CoverArtArchiveCover(reply->property(constLargeProperty).toString(), url, img, list);
+                }
+                if (item) {
+                    insertItem(item);
                 }
             }
         }
@@ -664,7 +629,7 @@ void CoverDialog::showImage(QListWidgetItem *item)
         previewDialog()->showImage(((LocalCover *)cover)->image(), cover->url());
     } else {
         previewDialog()->downloading(cover->url());
-        QNetworkReply *j=downloadImage(cover->url(), DL_LargePreview);
+        NetworkJob *j=downloadImage(cover->url(), DL_LargePreview);
         if (j) {
             j->setProperty(constLargeProperty, cover->url());
             connect(j, SIGNAL(downloadProgress(qint64, qint64)), preview, SLOT(progress(qint64, qint64)));
@@ -740,7 +705,7 @@ void CoverDialog::sendLastFmQuery(const QString &fixedQuery, int page)
     #else
     QUrlQuery query;
     #endif
-    url.setScheme("http");
+    url.setScheme("https");
     url.setHost(constLastFmHost);
     url.setPath("/2.0/");
     query.addQueryItem("api_key", Covers::constLastFmApiKey);
@@ -805,7 +770,7 @@ void CoverDialog::checkStatus()
 
 void CoverDialog::cancelQuery()
 {
-    foreach (QNetworkReply *job, currentQuery) {
+    foreach (NetworkJob *job, currentQuery) {
         if (DL_Query==job->property(constTypeProperty).toInt()) {
             disconnect(job, SIGNAL(finished()), this, SLOT(queryJobFinished()));
         } else {
@@ -893,17 +858,16 @@ void CoverDialog::clearTempFiles()
     }
 }
 
-void CoverDialog::sendQueryRequest(const QUrl &url, int redirects, const QString &host)
+void CoverDialog::sendQueryRequest(const QUrl &url, const QString &host)
 {
-    QNetworkReply *j=NetworkAccessManager::self()->get(QNetworkRequest(url));
+    NetworkJob *j=NetworkAccessManager::self()->get(QNetworkRequest(url));
     j->setProperty(constHostProperty, host.isEmpty() ? url.host() : host);
     j->setProperty(constTypeProperty, (int)DL_Query);
-    j->setProperty(constRedirectsProperty, redirects);
     connect(j, SIGNAL(finished()), this, SLOT(queryJobFinished()));
     currentQuery.insert(j);
 }
 
-QNetworkReply * CoverDialog::downloadImage(const QString &url, DownloadType dlType)
+NetworkJob * CoverDialog::downloadImage(const QString &url, DownloadType dlType)
 {
     if (DL_Thumbnail==dlType) {
         if (currentUrls.contains(url)) {
@@ -937,11 +901,10 @@ QNetworkReply * CoverDialog::downloadImage(const QString &url, DownloadType dlTy
         saving=true;
     }
 
-    QNetworkReply *j=NetworkAccessManager::self()->get(QNetworkRequest(QUrl(url)));
+    NetworkJob *j=NetworkAccessManager::self()->get(QNetworkRequest(QUrl(url)));
     connect(j, SIGNAL(finished()), this, SLOT(downloadJobFinished()));
     currentQuery.insert(j);
     j->setProperty(constTypeProperty, (int)dlType);
-    j->setProperty(constRedirectsProperty, 0);
     if (saving) {
         previewDialog()->downloading(url);
         connect(j, SIGNAL(downloadProgress(qint64, qint64)), preview, SLOT(progress(qint64, qint64)));
@@ -1008,7 +971,7 @@ void CoverDialog::parseLstFmQueryResponse(const QByteArray &resp)
         }
 
         if (!largeUrl.isEmpty() && !thumbUrl.isEmpty()) {
-            QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail);
+            NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
             if (j) {
                 j->setProperty(constHostProperty, constLastFmHost);
                 j->setProperty(constLargeProperty, largeUrl);
@@ -1050,7 +1013,7 @@ void CoverDialog::parseGoogleQueryResponse(const QByteArray &resp)
             QString largeUrl=url.queryItemValue("imgurl");
             QString thumbUrl=rx.cap(2);
             if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) {
-                QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail);
+                NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
                 if (j) {
                     j->setProperty(constHostProperty, constGoogleHost);
                     j->setProperty(constLargeProperty, largeUrl);
@@ -1102,7 +1065,7 @@ void CoverDialog::parseDiscogsQueryResponse(const QByteArray &resp)
                             QString thumbUrl=rm["thumb"].toString();
                             if (thumbUrl.contains("/image/A-150-")) {
                                 QString largeUrl=thumbUrl.replace("image/A-150-", "/image/A-");
-                                QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail);
+                                NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
                                 if (j) {
                                     j->setProperty(constHostProperty, constDiscogsHost);
                                     j->setProperty(constLargeProperty, largeUrl);
@@ -1124,7 +1087,7 @@ void CoverDialog::parseDiscogsQueryResponse(const QByteArray &resp)
                         QString thumbUrl=im["uri150"].toString();
                         QString largeUrl=im["uri"].toString();
                         if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) {
-                            QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail);
+                            NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
                             if (j) {
                                 j->setProperty(constHostProperty, constDiscogsHost);
                                 j->setProperty(constLargeProperty, largeUrl);
@@ -1159,7 +1122,7 @@ void CoverDialog::parseCoverArtArchiveQueryResponse(const QByteArray &resp)
                     thumbUrl=thumb["large"].toString();
                 }
                 if (!thumbUrl.isEmpty() && !largeUrl.isEmpty()) {
-                    QNetworkReply *j=downloadImage(thumbUrl, DL_Thumbnail);
+                    NetworkJob *j=downloadImage(thumbUrl, DL_Thumbnail);
                     if (j) {
                         j->setProperty(constHostProperty, constCoverArtArchiveHost);
                         j->setProperty(constLargeProperty, largeUrl);
@@ -1183,7 +1146,7 @@ void CoverDialog::slotButtonClicked(int button)
                     accept();
                 }
             } else if (CoverItem::Type_Existing!=cover->type()) {
-                QNetworkReply *j=downloadImage(cover->url(), DL_LargeSave);
+                NetworkJob *j=downloadImage(cover->url(), DL_LargeSave);
                 if (j) {
                     j->setProperty(constLargeProperty, cover->url());
                 }
diff --git a/gui/coverdialog.h b/gui/coverdialog.h
index 9332e31..bc487d0 100644
--- a/gui/coverdialog.h
+++ b/gui/coverdialog.h
@@ -32,7 +32,7 @@
 #include <QSet>
 #include <QList>
 
-class QNetworkReply;
+class NetworkJob;
 class QUrl;
 class QTemporaryFile;
 class QListWidgetItem;
@@ -122,9 +122,9 @@ private:
     void sendDiscoGsQuery(const QString &fixedQuery, int page);
     CoverPreview *previewDialog();
     void insertItem(CoverItem *item);
-    QNetworkReply * downloadImage(const QString &url, DownloadType dlType);
+    NetworkJob * downloadImage(const QString &url, DownloadType dlType);
     void clearTempFiles();
-    void sendQueryRequest(const QUrl &url, int redirects=0, const QString &host=QString());
+    void sendQueryRequest(const QUrl &url, const QString &host=QString());
     void parseLstFmQueryResponse(const QByteArray &resp);
     void parseGoogleQueryResponse(const QByteArray &resp);
     void parseDiscogsQueryResponse(const QByteArray &resp);
@@ -138,7 +138,7 @@ private:
     Song song;
     ExistingCover *existing;
     QString currentQueryString;
-    QSet<QNetworkReply *> currentQuery;
+    QSet<NetworkJob *> currentQuery;
     QSet<QString> currentUrls;
     QSet<QString> currentLocalCovers;
     QList<QTemporaryFile *> tempFiles;
diff --git a/gui/covers.cpp b/gui/covers.cpp
index 6878b7e..a2c5e9d 100644
--- a/gui/covers.cpp
+++ b/gui/covers.cpp
@@ -30,6 +30,9 @@
 #include "config.h"
 #include "deviceoptions.h"
 #include "thread.h"
+#include "soundcloudservice.h"
+#include "podcastservice.h"
+#include "onlineservicesmodel.h"
 #ifdef TAGLIB_FOUND
 #include "tags.h"
 #endif
@@ -42,7 +45,6 @@
 #endif
 #include <QTextStream>
 #include <qglobal.h>
-#include <QNetworkReply>
 #include <QIcon>
 #include <QImage>
 #include <QPixmap>
@@ -60,12 +62,17 @@ K_GLOBAL_STATIC(Covers, instance)
 #endif
 
 #include <QDebug>
-static bool debugEnabled=false;
-#define DBUG_CLASS(CLASS) if (debugEnabled) qWarning() << CLASS << QThread::currentThread()->objectName() << __FUNCTION__
+static bool debugIsEnabled=false;
+#define DBUG_CLASS(CLASS) if (debugIsEnabled) qWarning() << CLASS << QThread::currentThread()->objectName() << __FUNCTION__
 #define DBUG DBUG_CLASS(metaObject()->className())
 void Covers::enableDebug()
 {
-    debugEnabled=true;
+    debugIsEnabled=true;
+}
+
+bool Covers::debugEnabled()
+{
+    return debugIsEnabled;
 }
 
 const QLatin1String Covers::constLastFmApiKey("11172d35eb8cc2fd33250a9e45a2d486");
@@ -103,9 +110,11 @@ static QString save(const QString &mimeType, const QString &extension, const QSt
 
         QFile f(filePrefix+mimeType);
         if (f.open(QIODevice::WriteOnly) && raw.size()==f.write(raw)) {
+            #ifndef Q_OS_WIN
             if (!MPDConnection::self()->getDetails().dir.isEmpty() && filePrefix.startsWith(MPDConnection::self()->getDetails().dir)) {
                 Utils::setFilePerms(filePrefix+mimeType);
             }
+            #endif
             return filePrefix+mimeType;
         }
     }
@@ -116,9 +125,11 @@ static QString save(const QString &mimeType, const QString &extension, const QSt
         }
 
         if (img.save(filePrefix+extension)) {
+            #ifndef Q_OS_WIN
             if (!MPDConnection::self()->getDetails().dir.isEmpty() && filePrefix.startsWith(MPDConnection::self()->getDetails().dir)) {
                 Utils::setFilePerms(filePrefix+mimeType);
             }
+            #endif
             return filePrefix+extension;
         }
     }
@@ -177,11 +188,7 @@ QString Covers::fixArtist(const QString &artist)
 static QString xdgConfig()
 {
     QString env = QString::fromLocal8Bit(qgetenv("XDG_CONFIG_HOME"));
-    QString dir = (env.isEmpty() ? QDir::homePath() + QLatin1String("/.config/") : env);
-    if (!dir.endsWith("/")) {
-        dir=dir+'/';
-    }
-    return dir;
+    return Utils::fixPath(env.isEmpty() ? QDir::homePath() + QLatin1String("/.config/") : env);
 }
 
 #ifndef ENABLE_KDE_SUPPORT
@@ -390,39 +397,23 @@ void CoverDownloader::download(const Song &song)
         return;
     }
 
-    bool isOnline=song.file.startsWith("http:/") && song.name.startsWith("http:/");
     QString dirName;
+    bool haveAbsPath=song.file.startsWith(Utils::constDirSep);
 
-    if (!isOnline) {
-        bool haveAbsPath=song.file.startsWith('/');
-
-        if (haveAbsPath || !MPDConnection::self()->getDetails().dir.isEmpty()) {
-            dirName=song.file.endsWith('/') ? (haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+song.file
-                                            : Utils::getDir((haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+song.file);
-        }
+    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);
     }
 
     Job job(song, dirName, isArtistImage);
 
-    if (isOnline) {
-        downloadOnlineImage(job);
-    } else if (!MPDConnection::self()->getDetails().dir.isEmpty() && MPDConnection::self()->getDetails().dir.startsWith(QLatin1String("http://"))) {
+    if (!MPDConnection::self()->getDetails().dir.isEmpty() && MPDConnection::self()->getDetails().dir.startsWith(QLatin1String("http://"))) {
         downloadViaHttp(job, JobHttpJpg);
     } else {
         downloadViaLastFm(job);
     }
 }
 
-void CoverDownloader::downloadOnlineImage(Job &job)
-{
-    job.type=JobOnline;
-    // ONLINE: Image URL is encoded in song.name...
-    QNetworkReply *j=manager->get(QNetworkRequest(QUrl(job.song.name)));
-    connect(j, SIGNAL(finished()), this, SLOT(jobFinished()));
-    jobs.insert(j, job);
-    DBUG << job.song.name;
-}
-
 bool CoverDownloader::downloadViaHttp(Job &job, JobType type)
 {
     QUrl u;
@@ -432,25 +423,25 @@ bool CoverDownloader::downloadViaHttp(Job &job, JobType type)
     QString dir=Utils::getDir(job.song.file);
     if (isArtistImage) {
         if (job.level) {
-            QStringList parts=dir.split("/", QString::SkipEmptyParts);
+            QStringList parts=dir.split(Utils::constDirSep, QString::SkipEmptyParts);
             if (parts.size()<job.level) {
                 return false;
             }
             dir=QString();
             for (int i=0; i<(parts.length()-job.level); ++i) {
-                dir+=parts.at(i)+"/";
+                dir+=parts.at(i)+Utils::constDirSep;
             }
         }
         job.level++;
     }
     #if QT_VERSION < 0x050000
-    u.setEncodedUrl(MPDConnection::self()->getDetails().dir.toLatin1()+QUrl::toPercentEncoding(dir, "/")+coverName.toLatin1());
+    u.setEncodedUrl(MPDConnection::self()->getDetails().dir.toLatin1()+QUrl::toPercentEncoding(dir, Utils::constDirSepCharStr)+coverName.toLatin1());
     #else
     u=QUrl(MPDConnection::self()->getDetails().dir+dir+coverName.toLatin1());
     #endif
 
     job.type=type;
-    QNetworkReply *j=manager->get(QNetworkRequest(u));
+    NetworkJob *j=manager->get(u);
     connect(j, SIGNAL(finished()), this, SLOT(jobFinished()));
     jobs.insert(j, job);
     DBUG << u.toString();
@@ -459,7 +450,7 @@ bool CoverDownloader::downloadViaHttp(Job &job, JobType type)
 
 void CoverDownloader::downloadViaLastFm(Job &job)
 {
-    QUrl url("http://ws.audioscrobbler.com/2.0/");
+    QUrl url("https://ws.audioscrobbler.com/2.0/");
     #if QT_VERSION < 0x050000
     QUrl &query=url;
     #else
@@ -477,7 +468,7 @@ void CoverDownloader::downloadViaLastFm(Job &job)
     url.setQuery(query);
     #endif
 
-    QNetworkReply *j = manager->get(url);
+    NetworkJob *j = manager->get(url);
     connect(j, SIGNAL(finished()), this, SLOT(lastFmCallFinished()));
     job.type=JobLastFm;
     jobs.insert(j, job);
@@ -486,22 +477,22 @@ void CoverDownloader::downloadViaLastFm(Job &job)
 
 void CoverDownloader::lastFmCallFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (!reply) {
         return;
     }
 
     DBUG << "status" << reply->error() << reply->errorString();
 
-    QHash<QNetworkReply *, Job>::Iterator it(jobs.find(reply));
-    QHash<QNetworkReply *, Job>::Iterator end(jobs.end());
+    QHash<NetworkJob *, Job>::Iterator it(jobs.find(reply));
+    QHash<NetworkJob *, Job>::Iterator end(jobs.end());
 
     if (it!=end) {
         Job job=it.value();
         jobs.erase(it);
         QString url;
 
-        if(QNetworkReply::NoError==reply->error()) {
+        if(reply->ok()) {
             QXmlStreamReader doc(reply->readAll());
             QString largeUrl;
             bool inSection=false;
@@ -541,7 +532,7 @@ void CoverDownloader::lastFmCallFinished()
             #else
             u=QUrl(url);
             #endif
-            QNetworkReply *j=manager->get(QNetworkRequest(u));
+            NetworkJob *j=manager->get(QNetworkRequest(u));
             connect(j, SIGNAL(finished()), this, SLOT(jobFinished()));
             DBUG << "download" << u.toString();
             jobs.insert(j, job);
@@ -566,21 +557,22 @@ void CoverDownloader::lastFmCallFinished()
 
 void CoverDownloader::jobFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (!reply) {
         return;
     }
 
     DBUG << "status" << reply->error() << reply->errorString();
 
-    QHash<QNetworkReply *, Job>::Iterator it(jobs.find(reply));
-    QHash<QNetworkReply *, Job>::Iterator end(jobs.end());
+    QHash<NetworkJob *, Job>::Iterator it(jobs.find(reply));
+    QHash<NetworkJob *, Job>::Iterator end(jobs.end());
 
     if (it!=end) {
-        QByteArray data=QNetworkReply::NoError==reply->error() ? reply->readAll() : QByteArray();
+        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") ? "JPG" : (url.endsWith(".png") ? "PNG" : 0));
+        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));
         Job job=it.value();
 
         if (!img.img.isNull() && img.img.size().width()<32) {
@@ -588,7 +580,7 @@ void CoverDownloader::jobFinished()
         }
 
         jobs.remove(it.key());
-        if (img.img.isNull() && JobLastFm!=job.type && JobOnline) {
+        if (img.img.isNull() && JobLastFm!=job.type) {
             if (JobHttpJpg==job.type) {
                 if (!job.level || !downloadViaHttp(job, JobHttpJpg)) {
                     job.level=0;
@@ -644,20 +636,13 @@ QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteA
         return QString();
     }
 
-    if (JobOnline==job.type) {
-        // ONLINE: Cache dir is saved in Song.title
-        savedName=save(mimeType, extension, Utils::cacheDir(job.song.title)+Covers::encodeName(job.isArtist ? job.song.albumartist : (job.song.albumartist+" - "+job.song.album)), img, raw);
-        if (!savedName.isEmpty()) {
-            DBUG << job.song.file << savedName;
-            return savedName;
-        }
-    } else if (job.isArtist) {
+    if (job.isArtist) {
         if (saveInMpdDir && canSaveTo(job.dir)) {
             QString mpdDir=MPDConnection::self()->getDetails().dir;
-            if (!mpdDir.isEmpty() && job.dir.startsWith(mpdDir) && 2==job.dir.mid(mpdDir.length()).split('/', QString::SkipEmptyParts).count()) {
+            if (!mpdDir.isEmpty() && job.dir.startsWith(mpdDir) && 2==job.dir.mid(mpdDir.length()).split(Utils::constDirSep, QString::SkipEmptyParts).count()) {
                 QDir d(job.dir);
                 d.cdUp();
-                savedName=save(mimeType, extension, d.absolutePath()+'/'+Covers::artistFileName(job.song), img, raw);
+                savedName=save(mimeType, extension, d.absolutePath()+Utils::constDirSep+Covers::artistFileName(job.song), img, raw);
                 if (!savedName.isEmpty()) {
                     DBUG << job.song.file << savedName;
                     return savedName;
@@ -698,10 +683,10 @@ QString CoverDownloader::saveImg(const Job &job, const QImage &img, const QByteA
     return QString();
 }
 
-QHash<QNetworkReply *, CoverDownloader::Job>::Iterator CoverDownloader::findJob(const Job &job)
+QHash<NetworkJob *, CoverDownloader::Job>::Iterator CoverDownloader::findJob(const Job &job)
 {
-    QHash<QNetworkReply *, Job>::Iterator it(jobs.begin());
-    QHash<QNetworkReply *, Job>::Iterator end(jobs.end());
+    QHash<NetworkJob *, Job>::Iterator it(jobs.begin());
+    QHash<NetworkJob *, Job>::Iterator end(jobs.end());
 
     for (; it!=end; ++it) {
         if ((*it).isArtist==job.isArtist && (*it).song.albumArtist()==job.song.albumArtist() && (*it).song.album==job.song.album) {
@@ -741,15 +726,18 @@ void CoverLocator::locate(const Song &s)
     startTimer(0);
 }
 
-// To improve responsiveness of views, we only process a max of 5 images per even loop iteration.
+// To improve responsiveness of views, we only process a max of X images per even loop iteration.
 // If more images are asked for, we place these into a list, and get them on the next iteration
 // of the loop. This way things appear smoother.
-static const int constMaxPerLoopIteration=5;
+static int maxPerLoopIteration=5;
+
+// Max number of 'findImage' per iteration - these are done in GUI thread, so keep small...
+static int maxFindPerLoopIteration=5;
 
 void CoverLocator::locate()
 {
     QList<Song> toDo;
-    for (int i=0; i<constMaxPerLoopIteration && !queue.isEmpty(); ++i) {
+    for (int i=0; i<maxPerLoopIteration && !queue.isEmpty(); ++i) {
         toDo.append(queue.takeFirst());
     }
     if (toDo.isEmpty()) {
@@ -776,6 +764,9 @@ Covers::Covers()
     , cache(300000)
     , countResetTimer(0)
 {
+    maxPerLoopIteration=Settings::self()->maxCoverUpdatePerIteration();
+    maxFindPerLoopIteration=Settings::self()->maxCoverFindPerIteration();
+
     qRegisterMetaType<LocatedCover>("LocatedCover");
     qRegisterMetaType<QList<LocatedCover> >("QList<LocatedCover>");
     saveInMpdDir=Settings::self()->storeCoversInMpdDir();
@@ -815,15 +806,28 @@ QPixmap * Covers::get(const Song &song, int size)
     QPixmap *pix(cache.object(key));
 
     if (!pix) {
-        Covers::Image img=findImage(song, false);
+        QImage img;
+        if (song.isFromOnlineService()) {
+            if (SoundCloudService::constName==song.onlineService()) {
+                img=QImage(SoundCloudService::iconPath());
+            } else if (PodcastService::constName==song.onlineService()) {
+                img=QImage(PodcastService::iconPath());
+            }
+        }
+
+        if (img.isNull()) {
+            img=findImage(song, false).img;
+        }
 
         cacheSizes.insert(size);
-        if (!img.img.isNull()) {
-            pix=new QPixmap(QPixmap::fromImage(img.img.scaled(size, size, Qt::KeepAspectRatio, Qt::SmoothTransformation)));
+        if (!img.isNull()) {
+            pix=new QPixmap(QPixmap::fromImage(img.scaled(size, size, Qt::KeepAspectRatio, Qt::SmoothTransformation)));
             cache.insert(key, pix, pix->width()*pix->height()*(pix->depth()/8));
         } else {
             // Attempt to download cover...
-            emit download(song);
+            if (Song::OnlineSvrTrack!=song.type) {
+                emit download(song);
+            }
             // Create a dummy pixmap so that we dont keep on stating files that do not exist!
             pix=new QPixmap(1, 1);
             cache.insert(key, pix, 4);
@@ -893,7 +897,10 @@ 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;
+    DBUG_CLASS("Covers") << song.file << song.artist << song.albumartist << song.album << song.type;
+    if (Song::OnlineSvrTrack==song.type) {
+        return OnlineServicesModel::self()->readImage(song);
+    }
     bool isArtistImage=song.isArtistImageRequest();
     QString prevFileName=Covers::self()->getFilename(song, isArtistImage);
     if (!prevFileName.isEmpty()) {
@@ -913,28 +920,9 @@ Covers::Image Covers::locateImage(const Song &song)
         }
     }
 
-    bool isOnline=song.file.startsWith("http:/") && song.name.startsWith("http:/");
-
-    if (isOnline) {
-        // ONLINE: Cache dir is saved in Song.title
-        QString baseName=Utils::cacheDir(song.title, false)+encodeName(isArtistImage ? song.albumartist : (song.albumartist+" - "+song.album));
-        for (int e=0; constExtensions[e]; ++e) {
-            if (QFile::exists(baseName+constExtensions[e])) {
-                QImage img(baseName+constExtensions[e]);
-
-                if (!img.isNull()) {
-                    DBUG_CLASS("Covers") << "Got online from cache" << QString(baseName+constExtensions[e]);
-                    return Image(img, baseName+constExtensions[e]);
-                }
-            }
-        }
-        DBUG_CLASS("Covers") << "Online image not in cache";
-        return Image(QImage(), QString());
-    }
-
     QString songFile=song.file;
     QString dirName;
-    bool haveAbsPath=song.file.startsWith('/');
+    bool haveAbsPath=song.file.startsWith(Utils::constDirSep);
 
     if (song.isCantataStream()) {
         #if QT_VERSION < 0x050000
@@ -945,10 +933,13 @@ Covers::Image Covers::locateImage(const Song &song)
         #endif
         songFile=u.hasQueryItem("file") ? u.queryItemValue("file") : QString();
     }
+
     if (!songFile.isEmpty() && !song.file.startsWith(("http:/")) &&
         (haveAbsPath || (!MPDConnection::self()->getDetails().dir.isEmpty() && !MPDConnection::self()->getDetails().dir.startsWith(QLatin1String("http://")) ) ) ) {
-        dirName=songFile.endsWith('/') ? (haveAbsPath ? QString() : MPDConnection::self()->getDetails().dir)+songFile
+        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";
@@ -1027,7 +1018,7 @@ Covers::Image Covers::locateImage(const Song &song)
             if (QFile::exists(dir+artist+constExtensions[e])) {
                 QImage img(dir+artist+constExtensions[e]);
                 if (!img.isNull()) {
-                    DBUG_CLASS("Covers") << "Got artist image" << QString(dir+artist+constExtensions[e]);
+                    DBUG_CLASS("Covers") << "Got cached artist image" << QString(dir+artist+constExtensions[e]);
                     return Image(img, dir+artist+constExtensions[e]);
                 }
             }
@@ -1040,7 +1031,7 @@ Covers::Image Covers::locateImage(const Song &song)
             if (QFile::exists(dir+album+constExtensions[e])) {
                 QImage img(dir+album+constExtensions[e]);
                 if (!img.isNull()) {
-                    DBUG_CLASS("Covers") << "Got cover image" << QString(dir+album+constExtensions[e]);
+                    DBUG_CLASS("Covers") << "Got cached cover image" << QString(dir+album+constExtensions[e]);
                     return Image(img, dir+album+constExtensions[e]);
                 }
             }
@@ -1068,18 +1059,26 @@ static Covers::Image fix(const Covers::Image &img)
     return Covers::Image(img.img, img.fileName.startsWith(constCoverInTagPrefix) ? QString() : img.fileName);
 }
 
-Covers::Image Covers::requestImage(const Song &song)
+Covers::Image Covers::requestImage(const Song &song, bool urgent)
 {
     DBUG << song.file << song.artist << song.albumartist << song.album;
-    if (retrieved>=constMaxPerLoopIteration) {
+
+    QString key=song.isArtistImageRequest() ? artistKey(song) : albumKey(song);
+    if (currentImageRequests.contains(key)) {
+        return Covers::Image();
+    }
+
+    if (retrieved>=maxFindPerLoopIteration && !urgent) {
+        currentImageRequests.insert(key);
         emit locate(song);
         return Covers::Image();
     }
 
     retrieved++;
     Image img=findImage(song, false);
-    if (img.img.isNull()) {
+    if (img.img.isNull() && Song::OnlineSvrTrack!=song.type) {
         DBUG << song.file << song.artist << song.albumartist << song.album << "Need to download";
+        currentImageRequests.insert(key);
         emit download(song);
     }
 
@@ -1153,9 +1152,11 @@ void Covers::cleanCdda()
 
 void Covers::gotAlbumCover(const Song &song, const QImage &img, const QString &fileName, bool emitResult)
 {
+    QString key=albumKey(song);
+    currentImageRequests.remove(key);
     if (!img.isNull() && !fileName.isEmpty() && !fileName.startsWith("http:/")) {
         mutex.lock();
-        filenames.insert(albumKey(song), fileName);
+        filenames.insert(key, fileName);
         mutex.unlock();
     }
     if (emitResult) {
@@ -1166,9 +1167,11 @@ void Covers::gotAlbumCover(const Song &song, const QImage &img, const QString &f
 
 void Covers::gotArtistImage(const Song &song, const QImage &img, const QString &fileName, bool emitResult)
 {
+    QString key=artistKey(song);
+    currentImageRequests.remove(key);
     if (!img.isNull() && !fileName.isEmpty() && !fileName.startsWith("http:/")) {
         mutex.lock();
-        filenames.insert(artistKey(song), fileName);
+        filenames.insert(key, fileName);
         mutex.unlock();
     }
     if (emitResult) {
diff --git a/gui/covers.h b/gui/covers.h
index 60af5f2..f167ec4 100644
--- a/gui/covers.h
+++ b/gui/covers.h
@@ -37,7 +37,7 @@
 
 class QString;
 class Thread;
-class QNetworkReply;
+class NetworkJob;
 class QMutex;
 class QTimer;
 #ifdef ENABLE_KDE_SUPPORT
@@ -53,9 +53,7 @@ public:
     enum JobType {
         JobHttpJpg,
         JobHttpPng,
-        JobLastFm,
-
-        JobOnline
+        JobLastFm
     };
 
     struct Job
@@ -82,7 +80,6 @@ Q_SIGNALS:
     void artistImage(const Song &song, const QImage &img, const QString &file);
 
 private:
-    void downloadOnlineImage(Job &job);
     bool downloadViaHttp(Job &job, JobType type);
     void downloadViaLastFm(Job &job);
 
@@ -92,10 +89,10 @@ private Q_SLOTS:
 
 private:
     QString saveImg(const Job &job, const QImage &img, const QByteArray &raw);
-    QHash<QNetworkReply *, Job>::Iterator findJob(const Job &job);
+    QHash<NetworkJob *, Job>::Iterator findJob(const Job &job);
 
 private:
-    QHash<QNetworkReply *, Job> jobs;
+    QHash<NetworkJob *, Job> jobs;
 
 private:
     Thread *thread;
@@ -153,6 +150,7 @@ public:
     };
 
     static void enableDebug();
+    static bool debugEnabled();
 
     static const QSize constMaxSize;
     static const QLatin1String constLastFmApiKey;
@@ -184,7 +182,7 @@ public:
     // Get QImage and filename associated with Song request. If this is not found, then the cover
     // 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);
+    Image requestImage(const Song &song, bool urgent=false);
     void setSaveInMpdDir(bool s);
     void emitCoverUpdated(const Song &song, const QImage &img, const QString &file);
 
@@ -217,6 +215,7 @@ private:
 
 private:
     int retrieved;
+    QSet<QString> currentImageRequests;
     QList<Song> queue;
     QSet<int> cacheSizes;
     QCache<quint32, QPixmap> cache;
diff --git a/gui/filesettings.cpp b/gui/filesettings.cpp
index b5fb075..9f073d2 100644
--- a/gui/filesettings.cpp
+++ b/gui/filesettings.cpp
@@ -37,6 +37,7 @@ void FileSettings::load()
     storeCoversInMpdDir->setChecked(Settings::self()->storeCoversInMpdDir());
     storeLyricsInMpdDir->setChecked(Settings::self()->storeLyricsInMpdDir());
     storeStreamsInMpdDir->setChecked(Settings::self()->storeStreamsInMpdDir());
+    storeBackdropsInMpdDir->setChecked(Settings::self()->storeBackdropsInMpdDir());
 }
 
 void FileSettings::save()
@@ -47,6 +48,7 @@ void FileSettings::save()
     Settings::self()->saveStoreCoversInMpdDir(storeCoversInMpdDir->isChecked());
     Settings::self()->saveStoreLyricsInMpdDir(storeLyricsInMpdDir->isChecked());
     Settings::self()->saveStoreStreamsInMpdDir(storeStreamsInMpdDir->isChecked());
+    Settings::self()->saveStoreBackdropsInMpdDir(storeBackdropsInMpdDir->isChecked());
 
     if (streamsChaged) {
         emit reloadStreams();
diff --git a/gui/filesettings.ui b/gui/filesettings.ui
index e579e8a..e1d855d 100644
--- a/gui/filesettings.ui
+++ b/gui/filesettings.ui
@@ -47,6 +47,23 @@
       </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>
@@ -56,7 +73,7 @@
        </property>
       </widget>
      </item>
-     <item row="2" column="1">
+     <item row="3" column="1">
       <widget class="OnOffButton" name="storeStreamsInMpdDir">
        <property name="text">
         <string/>
@@ -90,7 +107,7 @@
       </sizepolicy>
      </property>
      <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>
+      <string><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></string>
      </property>
      <property name="alignment">
       <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
diff --git a/gui/folderpage.cpp b/gui/folderpage.cpp
index b4d2c72..bd2f5f6 100644
--- a/gui/folderpage.cpp
+++ b/gui/folderpage.cpp
@@ -35,6 +35,7 @@
 
 FolderPage::FolderPage(QWidget *p)
     : QWidget(p)
+    , loaded(false)
 {
     setupUi(this);
     addToPlayQueue->setDefaultAction(StdActions::self()->addToPlayQueueAction);
@@ -98,6 +99,7 @@ void FolderPage::setEnabled(bool e)
         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()));
     }
@@ -105,10 +107,11 @@ void FolderPage::setEnabled(bool e)
 
 void FolderPage::refresh()
 {
-    if (DirViewModel::self()->isEnabled()) {
+    if (DirViewModel::self()->isEnabled() && isVisible()) {
         view->setLevel(0);
         view->showSpinner();
         emit loadFolders();
+        loaded=true;
     }
 }
 
@@ -117,11 +120,21 @@ void FolderPage::clear()
     DirViewModel::self()->clear();
 }
 
+void FolderPage::showEvent(QShowEvent *e)
+{
+    view->focusView();
+    QWidget::showEvent(e);
+    if (!loaded) {
+        emit loadFolders();
+        loaded=true;
+    }
+}
+
 void FolderPage::searchItems()
 {
     QString text=view->searchText().trimmed();
     proxy.update(text);
-    if (proxy.enabled() && !text.isEmpty()) {
+    if (proxy.enabled() && !proxy.filterText().isEmpty()) {
         view->expandAll();
     }
 }
@@ -222,7 +235,7 @@ QStringList FolderPage::selectedFiles(bool allowPlaylists) const
 
 void FolderPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty)
 {
-    QStringList files=selectedFiles(true);
+    QStringList files=selectedFiles(name.isEmpty());
 
     if (!files.isEmpty()) {
         if (name.isEmpty()) {
diff --git a/gui/folderpage.h b/gui/folderpage.h
index 63294b0..86c2afd 100644
--- a/gui/folderpage.h
+++ b/gui/folderpage.h
@@ -59,6 +59,7 @@ public:
     void setView(int v) { view->setMode((ItemView::Mode)v); }
     void focusSearch() { view->focusSearch(); }
     void goBack() { view->backActivated(); }
+    void showEvent(QShowEvent *e);
 
 Q_SIGNALS:
     // These are for communicating with MPD object (which is in its own thread, so need to talk via signal/slots)
@@ -79,6 +80,7 @@ private:
     QStringList walk(QModelIndex rootItem);
 
 private:
+    bool loaded;
     #ifndef Q_OS_WIN
     Action *browseAction;
     #endif
diff --git a/gui/folderpage.ui b/gui/folderpage.ui
index dedbe75..a427139 100644
--- a/gui/folderpage.ui
+++ b/gui/folderpage.ui
@@ -11,6 +11,9 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="vlayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <property name="leftMargin">
     <number>0</number>
    </property>
@@ -29,7 +32,7 @@
    <item>
     <layout class="QHBoxLayout" name="hlayout">
      <property name="spacing">
-      <number>0</number>
+      <number>1</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
@@ -63,6 +66,9 @@
       </spacer>
      </item>
      <item>
+      <widget class="SizeWidget" name="sizeWidget"/>
+     </item>
+     <item>
       <widget class="ToolButton" name="addToPlayQueue"/>
      </item>
      <item>
@@ -83,6 +89,11 @@
    <extends>QToolButton</extends>
    <header>toolbutton.h</header>
   </customwidget>
+  <customwidget>
+   <class>SizeWidget</class>
+   <extends>QWidget</extends>
+   <header>sizewidget.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/gui/initialsettingswizard.cpp b/gui/initialsettingswizard.cpp
index faea1a1..d500080 100644
--- a/gui/initialsettingswizard.cpp
+++ b/gui/initialsettingswizard.cpp
@@ -73,6 +73,7 @@ InitialSettingsWizard::InitialSettingsWizard(QWidget *p)
     storeCoversInMpdDir->setChecked(Settings::self()->storeCoversInMpdDir());
     storeLyricsInMpdDir->setChecked(Settings::self()->storeLyricsInMpdDir());
     storeStreamsInMpdDir->setChecked(Settings::self()->storeStreamsInMpdDir());
+    storeBackdropsInMpdDir->setChecked(Settings::self()->storeBackdropsInMpdDir());
     #ifdef ENABLE_KDE_SUPPORT
     introPage->setBackground(Icon("cantata"));
     #else
@@ -124,7 +125,7 @@ MPDConnectionDetails InitialSettingsWizard::getDetails()
     det.port=port->value();
     det.password=password->text();
     det.dir=dir->text().trimmed();
-    det.dirReadable=det.dir.isEmpty() ? false : QDir(det.dir).isReadable();
+    det.setDirReadable();
     det.dynamizerPort=0;
     return det;
 }
@@ -212,6 +213,8 @@ void InitialSettingsWizard::accept()
 
     if (basic->isChecked()) {
         Settings::self()->saveCurrentConnection(MPDUser::constName);
+        Settings::self()->saveStopOnExit(true);
+        Settings::self()->saveStopDynamizerOnExit(true);
         emit setDetails(MPDUser::self()->details());
     } else {
         MPDUser::self()->cleanup();
diff --git a/gui/initialsettingswizard.ui b/gui/initialsettingswizard.ui
index 878dcba..6a78880 100644
--- a/gui/initialsettingswizard.ui
+++ b/gui/initialsettingswizard.ui
@@ -741,6 +741,23 @@
        </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>
@@ -750,14 +767,14 @@
         </property>
        </widget>
       </item>
-      <item row="2" column="1">
+      <item row="3" column="1">
        <widget class="OnOffButton" name="storeStreamsInMpdDir" native="true">
         <property name="text" stdset="0">
          <string/>
         </property>
        </widget>
       </item>
-      <item row="10" column="0">
+      <item row="4" column="0">
        <spacer name="verticalSpacer_5x">
         <property name="orientation">
          <enum>Qt::Vertical</enum>
@@ -773,7 +790,7 @@
         </property>
        </spacer>
       </item>
-      <item row="11" column="0" colspan="2">
+      <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>
@@ -951,7 +968,7 @@
   </customwidget>
   <customwidget>
    <class>OnOffButton</class>
-   <extends>QWidget</extends>
+   <extends>QCheckBox</extends>
    <header>onoffbutton.h</header>
   </customwidget>
  </customwidgets>
diff --git a/gui/interfacesettings.cpp b/gui/interfacesettings.cpp
index 6b33742..d286d2c 100644
--- a/gui/interfacesettings.cpp
+++ b/gui/interfacesettings.cpp
@@ -28,7 +28,11 @@
 #include "musiclibraryitemalbum.h"
 #include "onoffbutton.h"
 #include <QComboBox>
-#include <qglobal.h>
+
+#define REMOVE(w) \
+    w->setVisible(false); \
+    w->deleteLater(); \
+    w=0;
 
 static void addImageSizes(QComboBox *box)
 {
@@ -67,38 +71,127 @@ static inline int getViewType(QComboBox *box)
     return box->itemData(box->currentIndex()).toInt();
 }
 
-InterfaceSettings::InterfaceSettings(QWidget *p)
+InterfaceSettings::InterfaceSettings(QWidget *p, const QStringList &hiddenPages)
     : QWidget(p)
 {
+    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;
+    }
+    #else
+    enabledViews-=V_Devices;
+    #endif
+
     setupUi(this);
-    addImageSizes(libraryCoverSize);
-    addImageSizes(albumsCoverSize);
-    addViewTypes(libraryView, true);
-    addViewTypes(albumsView, true);
-    addViewTypes(folderView);
-    addViewTypes(playlistsView, false, true);
-    addViewTypes(streamsView);
-    addViewTypes(onlineView);
+    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
-    addViewTypes(devicesView);
+    if (enabledViews&V_Devices) {
+        addViewTypes(devicesView);
+    }
     #endif
+    if (!(enabledViews&V_Devices)) {
+        REMOVE(devicesView)
+        REMOVE(devicesViewLabel)
+    }
+
+    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:"));
+        }
+    }
+
     groupMultiple->addItem(i18n("Grouped by \'Album Artist\'"));
     groupMultiple->addItem(i18n("Grouped under \'Various Artists\'"));
-    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(playListsStyleChanged()));
+    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(playQueueGrouped, SIGNAL(currentIndexChanged(int)), SLOT(playQueueGroupedChanged()));
     #ifndef ENABLE_DEVICES_SUPPORT
-    devicesView->setVisible(false);
-    devicesViewLabel->setVisible(false);
-    showDeleteAction->setVisible(false);
-    showDeleteActionLabel->setVisible(false);
-    #endif
-    #ifdef Q_OS_WIN
-    gnomeMediaKeys->setVisible(false);
-    gnomeMediaKeysLabel->setVisible(false);
+    REMOVE(showDeleteAction);
+    REMOVE(showDeleteActionLabel);
     #endif
     connect(systemTrayCheckBox, SIGNAL(toggled(bool)), minimiseOnClose, SLOT(setEnabled(bool)));
     connect(systemTrayCheckBox, SIGNAL(toggled(bool)), minimiseOnCloseLabel, SLOT(setEnabled(bool)));
@@ -107,32 +200,54 @@ InterfaceSettings::InterfaceSettings(QWidget *p)
 
 void InterfaceSettings::load()
 {
-    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());
-    selectEntry(streamsView, Settings::self()->streamsView());
-    selectEntry(onlineView, Settings::self()->onlineView());
+    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());
+    }
     groupSingle->setChecked(Settings::self()->groupSingle());
+    useComposer->setChecked(Settings::self()->useComposer());
     groupMultiple->setCurrentIndex(Settings::self()->groupMultiple() ? 1 : 0);
     #ifdef ENABLE_DEVICES_SUPPORT
-    showDeleteAction->setChecked(Settings::self()->showDeleteAction());
-    selectEntry(devicesView, Settings::self()->devicesView());
+    if (showDeleteAction) {
+        showDeleteAction->setChecked(Settings::self()->showDeleteAction());
+    }
+    if (devicesView) {
+        selectEntry(devicesView, Settings::self()->devicesView());
+    }
     #endif
     playQueueGrouped->setCurrentIndex(Settings::self()->playQueueGrouped() ? 1 : 0);
     playQueueAutoExpand->setChecked(Settings::self()->playQueueAutoExpand());
     playQueueStartClosed->setChecked(Settings::self()->playQueueStartClosed());
     playQueueScroll->setChecked(Settings::self()->playQueueScroll());
     playQueueBackground->setChecked(Settings::self()->playQueueBackground());
-    albumsViewChanged();
-    albumsCoverSizeChanged();
-    playListsStyleChanged();
+    playQueueConfirmClear->setChecked(Settings::self()->playQueueConfirmClear());
+    if (enabledViews&V_Albums) {
+        albumsViewChanged();
+        albumsCoverSizeChanged();
+    }
+    if (enabledViews&V_Playlists) {
+        playListsStyleChanged();
+    }
     playQueueGroupedChanged();
     forceSingleClick->setChecked(Settings::self()->forceSingleClick());
     systemTrayCheckBox->setChecked(Settings::self()->useSystemTray());
@@ -140,43 +255,55 @@ void InterfaceSettings::load()
     minimiseOnClose->setChecked(Settings::self()->minimiseOnClose());
     minimiseOnClose->setEnabled(systemTrayCheckBox->isChecked());
     minimiseOnCloseLabel->setEnabled(systemTrayCheckBox->isChecked());
-    #ifndef Q_OS_WIN
-    gnomeMediaKeys->setChecked(Settings::self()->gnomeMediaKeys());
-    #endif
 }
 
 void InterfaceSettings::save()
 {
-    Settings::self()->saveLibraryArtistImage(libraryArtistImage->isChecked());
-    Settings::self()->saveLibraryView(getViewType(libraryView));
-    Settings::self()->saveLibraryCoverSize(libraryCoverSize->currentIndex());
-    Settings::self()->saveLibraryYear(libraryYear->isChecked());
-    Settings::self()->saveAlbumsView(getViewType(albumsView));
-    Settings::self()->saveAlbumsCoverSize(albumsCoverSize->currentIndex());
-    Settings::self()->saveAlbumSort(albumSort->currentIndex());
-    Settings::self()->saveFolderView(getViewType(folderView));
-    Settings::self()->savePlaylistsView(getViewType(playlistsView));
-    Settings::self()->savePlayListsStartClosed(playListsStartClosed->isChecked());
-    Settings::self()->saveStreamsView(getViewType(streamsView));
-    Settings::self()->saveOnlineView(getViewType(onlineView));
+    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()->saveGroupSingle(groupSingle->isChecked());
+    Settings::self()->saveUseComposer(useComposer->isChecked());
     Settings::self()->saveGroupMultiple(1==groupMultiple->currentIndex());
     #ifdef ENABLE_DEVICES_SUPPORT
-    Settings::self()->saveShowDeleteAction(showDeleteAction->isChecked());
-    Settings::self()->saveDevicesView(getViewType(devicesView));
+    if (showDeleteAction) {
+        Settings::self()->saveShowDeleteAction(showDeleteAction->isChecked());
+    }
+    if (enabledViews&V_Devices) {
+        Settings::self()->saveDevicesView(getViewType(devicesView));
+    }
     #endif
     Settings::self()->savePlayQueueGrouped(1==playQueueGrouped->currentIndex());
     Settings::self()->savePlayQueueAutoExpand(playQueueAutoExpand->isChecked());
     Settings::self()->savePlayQueueStartClosed(playQueueStartClosed->isChecked());
     Settings::self()->savePlayQueueScroll(playQueueScroll->isChecked());
     Settings::self()->savePlayQueueBackground(playQueueBackground->isChecked());
+    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());
-    #ifndef Q_OS_WIN
-    Settings::self()->saveGnomeMediaKeys(gnomeMediaKeys->isChecked());
-    #endif
 }
 
 void InterfaceSettings::libraryViewChanged()
diff --git a/gui/interfacesettings.h b/gui/interfacesettings.h
index 7bd3972..ae606e9 100644
--- a/gui/interfacesettings.h
+++ b/gui/interfacesettings.h
@@ -26,12 +26,28 @@
 
 #include "ui_interfacesettings.h"
 
+class QStringList;
+
 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);
+    InterfaceSettings(QWidget *p, const QStringList &hiddenPages);
     virtual ~InterfaceSettings() { }
 
     void load();
@@ -45,6 +61,9 @@ private Q_SLOTS:
     void playListsStyleChanged();
     void playQueueGroupedChanged();
     void forceSingleClickChanged();
+
+private:
+    int enabledViews;
 };
 
 #endif
diff --git a/gui/interfacesettings.ui b/gui/interfacesettings.ui
index d994438..d3b9602 100644
--- a/gui/interfacesettings.ui
+++ b/gui/interfacesettings.ui
@@ -246,7 +246,7 @@ within the folder of the current track, or within its parent folder. If no image
         <enum>QFormLayout::ExpandingFieldsGrow</enum>
        </property>
        <item row="0" column="0">
-        <widget class="BuddyLabel" name="label_2">
+        <widget class="BuddyLabel" name="folderViewLabel">
          <property name="text">
           <string>Folder view style:</string>
          </property>
@@ -259,7 +259,7 @@ within the folder of the current track, or within its parent folder. If no image
         <widget class="QComboBox" name="folderView"/>
        </item>
        <item row="1" column="0">
-        <widget class="BuddyLabel" name="label_x">
+        <widget class="BuddyLabel" name="streamsViewLabel">
          <property name="text">
           <string>Streams view style:</string>
          </property>
@@ -272,7 +272,7 @@ within the folder of the current track, or within its parent folder. If no image
         <widget class="QComboBox" name="streamsView"/>
        </item>
        <item row="2" column="0">
-        <widget class="BuddyLabel" name="label_xx">
+        <widget class="BuddyLabel" name="onlineViewLabel">
          <property name="text">
           <string>Online view style:</string>
          </property>
@@ -391,6 +391,19 @@ within the folder of the current track, or within its parent folder. If no image
        <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>
+         </property>
+        </widget>
+       </item>
+       <item row="5" column="1">
+        <widget class="OnOffButton" name="playQueueConfirmClear"/>
+       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_7">
@@ -455,19 +468,6 @@ within the folder of the current track, or within its parent folder. If no image
          </property>
         </widget>
        </item>
-       <item row="3" column="0">
-        <widget class="BuddyLabel" name="gnomeMediaKeysLabel">
-         <property name="text">
-          <string>Support media keys under GNOME/Unity:</string>
-         </property>
-         <property name="buddy">
-          <cstring>gnomeMediaKeys</cstring>
-         </property>
-        </widget>
-       </item>
-       <item row="3" column="1">
-        <widget class="OnOffButton" name="gnomeMediaKeys"/>
-       </item>
       </layout>
      </widget>
      <widget class="QWidget" name="tab_4">
@@ -498,6 +498,23 @@ within the folder of the current track, or within its parent folder. If no image
           </widget>
          </item>
          <item row="1" column="0">
+          <widget class="BuddyLabel" name="useComposerLabel">
+           <property name="text">
+            <string>Group albums by composer:</string>
+           </property>
+           <property name="buddy">
+            <cstring>useComposer</cstring>
+           </property>
+          </widget>
+         </item>
+         <item row="1" column="1">
+          <widget class="OnOffButton" name="useComposer">
+           <property name="text">
+            <string/>
+           </property>
+          </widget>
+         </item>
+         <item row="2" column="0">
           <widget class="BuddyLabel" name="groupMultipleLabel">
            <property name="text">
             <string>Multiple artist albums:</string>
@@ -507,10 +524,10 @@ within the folder of the current track, or within its parent folder. If no image
            </property>
           </widget>
          </item>
-         <item row="1" column="1">
+         <item row="2" column="1">
           <widget class="QComboBox" name="groupMultiple"/>
          </item>
-         <item row="2" column="0">
+         <item row="3" column="0">
           <widget class="BuddyLabel" name="showDeleteActionLabel">
            <property name="text">
             <string>Show delete action in context menus:</string>
@@ -520,14 +537,14 @@ within the folder of the current track, or within its parent folder. If no image
            </property>
           </widget>
          </item>
-         <item row="2" column="1">
+         <item row="3" column="1">
           <widget class="OnOffButton" name="showDeleteAction">
            <property name="text">
             <string/>
            </property>
           </widget>
          </item>
-         <item row="3" column="0">
+         <item row="4" column="0">
           <widget class="BuddyLabel" name="forceSingleClick_label">
            <property name="text">
             <string>Enforce single-click activation of items:</string>
@@ -537,7 +554,7 @@ within the folder of the current track, or within its parent folder. If no image
            </property>
           </widget>
          </item>
-         <item row="3" column="1">
+         <item row="4" column="1">
           <widget class="OnOffButton" name="forceSingleClick">
            <property name="text">
             <string/>
@@ -625,7 +642,6 @@ within the folder of the current track, or within its parent folder. If no image
   <tabstop>systemTrayCheckBox</tabstop>
   <tabstop>minimiseOnClose</tabstop>
   <tabstop>systemTrayPopup</tabstop>
-  <tabstop>gnomeMediaKeys</tabstop>
   <tabstop>groupSingle</tabstop>
   <tabstop>groupMultiple</tabstop>
   <tabstop>showDeleteAction</tabstop>
diff --git a/gui/librarypage.cpp b/gui/librarypage.cpp
index da5837d..09c5638 100644
--- a/gui/librarypage.cpp
+++ b/gui/librarypage.cpp
@@ -33,6 +33,7 @@
 #include "messagebox.h"
 #include "settings.h"
 #include "stdactions.h"
+#include "utils.h"
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KLocale>
 #include <KDE/KGlobalSettings>
@@ -48,6 +49,7 @@ LibraryPage::LibraryPage(QWidget *p)
     searchButton->setDefaultAction(StdActions::self()->searchAction);
 
     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);
@@ -95,6 +97,12 @@ void LibraryPage::setView(int v)
     MusicLibraryModel::self()->setLargeImages(ItemView::Mode_IconTop==v);
 }
 
+void LibraryPage::showEvent(QShowEvent *e)
+{
+    view->focusView();
+    QWidget::showEvent(e);
+}
+
 void LibraryPage::setItemSize(int v)
 {
     if (ItemView::Mode_IconTop!=v) {
@@ -125,7 +133,12 @@ void LibraryPage::clear()
     view->setLevel(0);
 }
 
-QStringList LibraryPage::selectedFiles(bool allowPlaylists) const
+static inline QString nameKey(const QString &artist, const QString &album)
+{
+    return '{'+artist+"}{"+album+'}';
+}
+
+QStringList LibraryPage::selectedFiles(bool allowPlaylists, bool randomAlbums) const
 {
     QModelIndexList selected = view->selectedIndexes();
     if (selected.isEmpty()) {
@@ -137,6 +150,43 @@ QStringList LibraryPage::selectedFiles(bool allowPlaylists) const
         mapped.append(proxy.mapToSource(idx));
     }
 
+    if (randomAlbums) {
+        QModelIndexList albumIndexes;
+        QSet<QString> albumNames;
+        foreach (const QModelIndex &idx, mapped) {
+            MusicLibraryItem *item=static_cast<MusicLibraryItem *>(idx.internalPointer());
+            if (MusicLibraryItem::Type_Album==item->itemType()) {
+                QString name=nameKey(item->parentItem()->data(), item->data());
+                if (!albumNames.contains(name)) {
+                    albumNames.insert(name);
+                    albumIndexes.append(idx);
+                }
+            } else if (MusicLibraryItem::Type_Artist==item->itemType()) {
+                for (int row=0; row<static_cast<MusicLibraryItemContainer *>(item)->childCount(); ++row) {
+                MusicLibraryItem *album=static_cast<MusicLibraryItemContainer *>(item)->childItem(row);
+                    QString name=nameKey(item->data(), album->data());
+                    if (!albumNames.contains(name)) {
+                        albumNames.insert(name);
+                        albumIndexes.append(MusicLibraryModel::self()->index(row, 0, idx));
+                    }
+                }
+            }
+        }
+
+        if (albumIndexes.isEmpty()) {
+            return QStringList();
+        }
+
+        if (1==albumIndexes.count()) {
+            mapped=albumIndexes;
+        } else {
+            mapped.clear();
+            while (!albumIndexes.isEmpty()) {
+                mapped.append(albumIndexes.takeAt(Utils::random(albumIndexes.count())));
+            }
+        }
+    }
+
     return MusicLibraryModel::self()->filenames(mapped, allowPlaylists);
 }
 
@@ -174,9 +224,9 @@ Song LibraryPage::coverRequest() const
     return Song();
 }
 
-void LibraryPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty)
+void LibraryPage::addSelectionToPlaylist(const QString &name, bool replace, quint8 priorty, bool randomAlbums)
 {
-    QStringList files=selectedFiles(true);
+    QStringList files=selectedFiles(name.isEmpty(), randomAlbums);
 
     if (!files.isEmpty()) {
         if (name.isEmpty()) {
@@ -346,4 +396,15 @@ void LibraryPage::controlActions()
     } else {
         StdActions::self()->setCoverAction->setEnabled(false);
     }
+
+    bool allowRandomAlbum=!selected.isEmpty();
+    if (allowRandomAlbum) {
+        foreach (const QModelIndex &idx, selected) {
+            if (MusicLibraryItem::Type_Song==static_cast<MusicLibraryItem *>(proxy.mapToSource(idx).internalPointer())->itemType()) {
+                allowRandomAlbum=false;
+                break;
+            }
+        }
+    }
+    StdActions::self()->addRandomToPlayQueueAction->setEnabled(allowRandomAlbum);
 }
diff --git a/gui/librarypage.h b/gui/librarypage.h
index c8a139c..1a21ff5 100644
--- a/gui/librarypage.h
+++ b/gui/librarypage.h
@@ -40,10 +40,10 @@ public:
 
     void refresh();
     void clear();
-    QStringList selectedFiles(bool allowPlaylists=false) const;
+    QStringList selectedFiles(bool allowPlaylists=false, bool randomAlbums=false) const;
     QList<Song> selectedSongs(bool allowPlaylists=false) const;
     Song coverRequest() const;
-    void addSelectionToPlaylist(const QString &name=QString(), bool replace=false, quint8 priorty=0);
+    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();
@@ -55,6 +55,7 @@ public:
     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);
diff --git a/gui/librarypage.ui b/gui/librarypage.ui
index 300da92..700c6e4 100644
--- a/gui/librarypage.ui
+++ b/gui/librarypage.ui
@@ -11,6 +11,9 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="vlayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <property name="leftMargin">
     <number>0</number>
    </property>
@@ -29,7 +32,7 @@
    <item>
     <layout class="QHBoxLayout" name="hlayout">
      <property name="spacing">
-      <number>0</number>
+      <number>1</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
@@ -53,6 +56,9 @@
       <widget class="GenreCombo" name="genreCombo"/>
      </item>
      <item>
+      <widget class="SizeWidget" name="sizeWidget"/>
+     </item>
+     <item>
       <widget class="ToolButton" name="addToPlayQueue"/>
      </item>
      <item>
@@ -78,6 +84,11 @@
    <extends>QToolButton</extends>
    <header>toolbutton.h</header>
   </customwidget>
+  <customwidget>
+   <class>SizeWidget</class>
+   <extends>QWidget</extends>
+   <header>sizewidget.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/gui/main.cpp b/gui/main.cpp
index b1d9a5e..64e4318 100644
--- a/gui/main.cpp
+++ b/gui/main.cpp
@@ -53,6 +53,37 @@
 #include "backdropcreator.h"
 #include "dynamic.h"
 #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>
+#include <QTextStream>
+#include <QDateTime>
+static QMutex msgMutex;
+static bool firstMsg=true;
+#if QT_VERSION < 0x050000
+static void cantataQtMsgHandler(QtMsgType, const char *msg)
+#else
+static void cantataQtMsgHandler(QtMsgType, const QMessageLogContext &, const QString &msg)
+#endif
+{
+    QMutexLocker locker(&msgMutex);
+    QFile f(Utils::cacheDir(QString(), true)+"cantata.log");
+    if (f.open(QIODevice::WriteOnly|QIODevice::Append|QIODevice::Text)) {
+        QTextStream stream(&f);
+        if (firstMsg) {
+            stream << "------------START------------" << endl;
+            firstMsg=false;
+        }
+        stream << QDateTime::currentDateTime().toString(Qt::ISODate).replace("T", " ") << " - " << msg << endl;
+    }
+}
 
 #ifndef ENABLE_KDE_SUPPORT
 // Taken from Clementine!
@@ -108,14 +139,27 @@ enum Debug {
     Dbg_Context_Widget    = 0x0040,
     Dbg_Context_Backdrop  = 0x0080,
     Dbg_Dynamic           = 0x0100,
-    Dbg_StreamFetching    = 0x0200
+    Dbg_StreamFetching    = 0x0200,
+    Dbg_HttpServer        = 0x0400,
+    Dbg_SongDialogs       = 0x0800,
+    Dbg_NetworkAccess     = 0x1000,
+    Dbg_Context_Lyrics    = 0x2000,
+
+    Dbg_TagHelper         = 0x4000,
+    // NOTE: MUST UPDATE Dbg_All IF ADD NEW ITEMS!!!
+
+    Dbg_All               = 0x7FFF
 };
 
-int main(int argc, char *argv[])
+static void installDebugMessageHandler()
 {
     QString debug=qgetenv("CANTATA_DEBUG");
     if (!debug.isEmpty()) {
         int dbg=debug.toInt();
+        bool logToFile=dbg>0;
+        if (dbg<0) {
+            dbg*=-1;
+        }
         if (dbg&Dbg_Mpd) {
             MPDConnection::enableDebug();
         }
@@ -146,14 +190,41 @@ int main(int argc, char *argv[])
         if (dbg&Dbg_StreamFetching) {
             StreamFetcher::enableDebug();
         }
+        if (dbg&Dbg_HttpServer) {
+            HttpServer::enableDebug();
+        }
+        if (dbg&Dbg_SongDialogs) {
+            SongDialog::enableDebug();
+        }
+        if (dbg&Dbg_NetworkAccess) {
+            NetworkAccessManager::enableDebug();
+        }
+        if (dbg&Dbg_Context_Lyrics) {
+            UltimateLyricsProvider::enableDebug();
+        }
+        #ifdef ENABLE_EXTERNAL_TAGS
+        if (dbg&Dbg_TagHelper) {
+            TagClient::enableDebug();
+        }
+        #endif
+        if (dbg&Dbg_All && logToFile) {
+            #if QT_VERSION < 0x050000
+            qInstallMsgHandler(cantataQtMsgHandler);
+            #else
+            qInstallMessageHandler(cantataQtMsgHandler);
+            #endif
+        }
     }
+}
 
+int main(int argc, char *argv[])
+{
     #ifdef ENABLE_KDE_SUPPORT
     KAboutData aboutData(PACKAGE_NAME, 0,
                          ki18n("Cantata"), PACKAGE_VERSION_STRING,
                          ki18n("A KDE client for MPD"),
                          KAboutData::License_GPL_V3,
-                         ki18n("Copyright (C) 2011-2013 Craig Drummond"),
+                         ki18n("Copyright (c) 2011–2013 Craig Drummond"),
                          KLocalizedString(),
                          "http://"CANTATA_URL, "craig.p.drummond at gmail.com");
 
@@ -181,6 +252,9 @@ int main(int argc, char *argv[])
     }
 
     Application app;
+    
+    installDebugMessageHandler();
+
     #else // ENABLE_KDE_SUPPORT
     QCoreApplication::setApplicationName(PACKAGE_NAME);
     #ifdef Q_OS_WIN
@@ -223,6 +297,7 @@ int main(int argc, char *argv[])
     QFile::setPermissions(s.fileName(), QFile::ReadOwner | QFile::WriteOwner);
     #endif
 
+    installDebugMessageHandler();
 
     if (Settings::self()->firstRun()) {
         InitialSettingsWizard wz;
@@ -231,10 +306,10 @@ int main(int argc, char *argv[])
         }
     }
     MainWindow mw;
+    #if !defined Q_OS_MAC
     app.setActivationWindow(&mw);
-    #ifdef TAGLIB_FOUND
+    #endif // !defined Q_OS_MAC
     app.loadFiles();
-    #endif // TAGLIB_FOUND
     if (!Settings::self()->startHidden()) {
         mw.show();
     }
diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index 1ae10ff..e3636e2 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -28,21 +28,27 @@
 #include <QString>
 #include <QTimer>
 #include <QClipboard>
-#include <QVBoxLayout>
+#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.
+#include <QMacNativeToolBar>
+#endif
+#endif
+#include <QDialogButtonBox>
 #include <QTextStream>
 #include <cstdlib>
 #ifdef ENABLE_KDE_SUPPORT
 #include <kdeversion.h>
 #include <KDE/KApplication>
-#include <KDE/KAction>
-#include <KDE/KActionCollection>
 #include <KDE/KStandardAction>
 #include <KDE/KMenuBar>
 #include <KDE/KMenu>
 #include <KDE/KShortcutsDialog>
 #else
 #include <QMenuBar>
-#include "networkproxyfactory.h"
+#include "mediakeys.h"
 #endif
 #include "localize.h"
 #include "qtplural.h"
@@ -70,8 +76,6 @@
 #include "albumspage.h"
 #include "folderpage.h"
 #include "streamspage.h"
-#include "onlineservicespage.h"
-#include "onlineservicesmodel.h"
 #include "gtkstyle.h"
 #ifdef ENABLE_DEVICES_SUPPORT
 #include "filejob.h"
@@ -83,8 +87,10 @@
 #include "audiocddevice.h"
 #endif
 #endif
-#ifdef TAGLIB_FOUND
+#include "onlineservicespage.h"
+#include "onlineservicesmodel.h"
 #include "httpserver.h"
+#ifdef TAGLIB_FOUND
 #include "trackorganiser.h"
 #include "tageditor.h"
 #ifdef ENABLE_REPLAYGAIN_SUPPORT
@@ -97,10 +103,12 @@
 #include "playlistspage.h"
 #include "fancytabwidget.h"
 #include "timeslider.h"
-#ifndef Q_OS_WIN
+#ifdef QT_QTDBUS_FOUND
 #include "mpris.h"
 #include "cantataadaptor.h"
-#include "gnomemediakeys.h"
+#include "powermanagement.h"
+#endif
+#if !defined Q_OS_WIN && !defined Q_OS_MAC
 #include "mountpoints.h"
 #include "gtkproxystyle.h"
 #endif
@@ -110,7 +118,7 @@
 #include "groupedview.h"
 #include "actionitemdelegate.h"
 #include "icons.h"
-#include "volumecontrol.h"
+#include "volumeslider.h"
 #include "action.h"
 #include "actioncollection.h"
 #include "stdactions.h"
@@ -134,42 +142,9 @@ bool DeleteKeyEventHandler::eventFilter(QObject *obj, QEvent *event)
     return QObject::eventFilter(obj, event);
 }
 
-bool VolumeSliderEventHandler::eventFilter(QObject *obj, QEvent *event)
-{
-    if (QEvent::Wheel==event->type() && (!MPDConnection::self()->isMuted() || !qstrcmp("VolumeControl", obj->metaObject()->className()))) {
-        int numDegrees = static_cast<QWheelEvent *>(event)->delta() / 8;
-        int numSteps = numDegrees / 15;
-        if (numSteps > 0) {
-            for (int i = 0; i < numSteps; ++i) {
-                window->increaseVolumeAction->trigger();
-            }
-        } else {
-            for (int i = 0; i > numSteps; --i) {
-                window->decreaseVolumeAction->trigger();
-            }
-        }
-        return true;
-    }
-
-    return QObject::eventFilter(obj, event);
-}
-
-bool VolumeButtonEventHandler::eventFilter(QObject *obj, QEvent *event)
+static int nextKey(int &key)
 {
-    if (QEvent::MouseButtonPress==event->type() && Qt::MiddleButton==static_cast<QMouseEvent *>(event)->buttons()) {
-        down=true;
-    } else if (QEvent::MouseButtonRelease==event->type()) {
-        if (down) {
-            window->muteAction->trigger();
-        }
-        down=false;
-    }
-    return VolumeSliderEventHandler::eventFilter(obj, event);
-}
-
-static int nextKey(int &key) {
     int k=key;
-
     if (Qt::Key_0==key) {
         key=Qt::Key_A;
     } else {
@@ -182,22 +157,17 @@ static int nextKey(int &key) {
 }
 
 MainWindow::MainWindow(QWidget *parent)
-    #ifdef ENABLE_KDE_SUPPORT
-    : KXmlGuiWindow(parent)
-    #else
-    : QMainWindow(parent)
-    #endif
+    : MAIN_WINDOW_BASE_CLASS(parent)
     , loaded(0)
     , lastState(MPDState_Inactive)
     , lastSongId(-1)
     , autoScrollPlayQueue(true)
-    #if !defined Q_OS_WIN
+    #ifdef QT_QTDBUS_FOUND
     , mpris(0)
-    , gnomeMediaKeys(0)
     #endif
     , statusTimer(0)
     , playQueueSearchTimer(0)
-    #ifdef Q_OS_LINUX
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC
     , mpdAccessibilityTimer(0)
     #endif
     , connectedState(CS_Init)
@@ -212,11 +182,10 @@ MainWindow::MainWindow(QWidget *parent)
     #endif
 {
     QPoint p=pos();
-
     ActionCollection::setMainWidget(this);
     trayItem=new TrayItem(this);
 
-    #ifndef Q_OS_WIN
+    #ifdef QT_QTDBUS_FOUND
     new CantataAdaptor(this);
     QDBusConnection::sessionBus().registerObject("/cantata", this);
     #endif
@@ -231,11 +200,25 @@ MainWindow::MainWindow(QWidget *parent)
     // Need to set these values here, as used in library/device loading...
     MPDParseUtils::setGroupSingle(Settings::self()->groupSingle());
     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());
     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
     // want a gap - as this looks odd with a background. To workaround this, the tabwidget and playqueue sides of the splitter have a
@@ -245,13 +228,13 @@ MainWindow::MainWindow(QWidget *parent)
         tabWidgetSpacer->changeSize(spacing, spacing, QSizePolicy::Fixed, QSizePolicy::Fixed);
         playQueueSpacer->changeSize(spacing, spacing, QSizePolicy::Fixed, QSizePolicy::Fixed);
     }
+    detailsLayout->setSpacing(spacing);
 
     #ifdef ENABLE_KDE_SUPPORT
     prefAction=static_cast<Action *>(KStandardAction::preferences(this, SLOT(showPreferencesDialog()), ActionCollection::get()));
     quitAction=static_cast<Action *>(KStandardAction::quit(this, SLOT(quit()), ActionCollection::get()));
     #else
     setWindowIcon(Icons::self()->appIcon);
-    QNetworkProxyFactory::setApplicationProxyFactory(NetworkProxyFactory::self());
 
     quitAction = ActionCollection::get()->createAction("quit", i18n("Quit"), "application-exit");
     connect(quitAction, SIGNAL(triggered(bool)), this, SLOT(quit()));
@@ -263,22 +246,15 @@ MainWindow::MainWindow(QWidget *parent)
     connectAction = ActionCollection::get()->createAction("connect", i18n("Connect"), Icons::self()->connectIcon);
     connectionsAction = ActionCollection::get()->createAction("connections", i18n("Collection"), "network-server");
     outputsAction = ActionCollection::get()->createAction("outputs", i18n("Outputs"), Icons::self()->speakerIcon);
-    prevTrackAction = ActionCollection::get()->createAction("prevtrack", i18n("Previous Track"), Icons::self()->toolbarPrevIcon);
-    nextTrackAction = ActionCollection::get()->createAction("nexttrack", i18n("Next Track"), Icons::self()->toolbarNextIcon);
-    playPauseTrackAction = ActionCollection::get()->createAction("playpausetrack", i18n("Play/Pause"), Icons::self()->toolbarPlayIcon);
-    stopPlaybackAction = ActionCollection::get()->createAction("stopplayback", i18n("Stop"), Icons::self()->toolbarStopIcon);
-    stopAfterCurrentTrackAction = ActionCollection::get()->createAction("stopaftercurrenttrack", i18n("Stop After Current Track"), Icons::self()->toolbarStopIcon);
     stopAfterTrackAction = ActionCollection::get()->createAction("stopaftertrack", i18n("Stop After Track"), Icons::self()->toolbarStopIcon);
-    increaseVolumeAction = ActionCollection::get()->createAction("increasevolume", i18n("Increase Volume"));
-    decreaseVolumeAction = ActionCollection::get()->createAction("decreasevolume", i18n("Decrease Volume"));
-    muteAction = ActionCollection::get()->createAction("mute", i18n("Mute"));
     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"));
+    shufflePlayQueueAction = ActionCollection::get()->createAction("shuffleplaylist", i18n("Shuffle Tracks"));
+    shufflePlayQueueAlbumsAction = ActionCollection::get()->createAction("shuffleplaylistalbums", i18n("Shuffle Albums"));
     addStreamToPlayQueueAction = ActionCollection::get()->createAction("addstreamtoplayqueue", i18n("Add Stream URL"), Icons::self()->addRadioStreamIcon);
-    clearPlayQueueAction = ActionCollection::get()->createAction("clearplaylist", i18n("Clear"), Icons::self()->clearListIcon);
+    promptClearPlayQueueAction = ActionCollection::get()->createAction("clearplaylist", i18n("Clear"), Icons::self()->clearListIcon);
     expandInterfaceAction = ActionCollection::get()->createAction("expandinterface", i18n("Expanded Interface"), "view-media-playlist");
     songInfoAction = ActionCollection::get()->createAction("showsonginfo", i18n("Show Current Song Information"), Icons::self()->infoIcon);
     songInfoAction->setShortcut(Qt::Key_F12);
@@ -312,25 +288,27 @@ MainWindow::MainWindow(QWidget *parent)
     #endif
     expandAllAction = ActionCollection::get()->createAction("expandall", i18n("Expand All"));
     collapseAllAction = ActionCollection::get()->createAction("collapseall", i18n("Collapse All"));
-
-    playPauseTrackAction->setEnabled(false);
-    nextTrackAction->setEnabled(false);
+    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);
+    cancelAction->setShortcut(Qt::AltModifier+Qt::Key_Escape);
+    connect(cancelAction, SIGNAL(triggered(bool)), messageWidget, SLOT(animatedHide()));
+    connect(clearPlayQueueAction, SIGNAL(triggered(bool)), messageWidget, SLOT(animatedHide()));
+    connect(clearPlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(clearPlayQueue()));
+
+    StdActions::self()->playPauseTrackAction->setEnabled(false);
+    StdActions::self()->nextTrackAction->setEnabled(false);
     updateNextTrack(-1);
-    prevTrackAction->setEnabled(false);
+    StdActions::self()->prevTrackAction->setEnabled(false);
     enableStopActions(false);
+    volumeSlider->initActions();
 
-    addAction(increaseVolumeAction);
-    addAction(decreaseVolumeAction);
-    addAction(muteAction);
     #if defined ENABLE_KDE_SUPPORT
-    prevTrackAction->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_Left));
-    nextTrackAction->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_Right));
-    playPauseTrackAction->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_C));
-    stopPlaybackAction->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_X));
-    stopAfterCurrentTrackAction->setGlobalShortcut(KShortcut());
-    increaseVolumeAction->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_Up));
-    decreaseVolumeAction->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_Down));
-    muteAction->setGlobalShortcut(KShortcut(Qt::META + Qt::Key_M));
+    StdActions::self()->prevTrackAction->setGlobalShortcut(KShortcut(Qt::Key_MediaPrevious));
+    StdActions::self()->nextTrackAction->setGlobalShortcut(KShortcut(Qt::Key_MediaNext));
+    StdActions::self()->playPauseTrackAction->setGlobalShortcut(KShortcut(Qt::Key_MediaPlay));
+    StdActions::self()->stopPlaybackAction->setGlobalShortcut(KShortcut(Qt::Key_MediaStop));
+    StdActions::self()->stopAfterCurrentTrackAction->setGlobalShortcut(KShortcut());
     #endif
 
     copyTrackInfoAction->setShortcut(QKeySequence::Copy);
@@ -350,30 +328,20 @@ MainWindow::MainWindow(QWidget *parent)
     devicesTabAction->setShortcut(Qt::AltModifier+nextKey(pageKey));
     #endif // ENABLE_DEVICES_SUPPORT
 
-    volumeSliderEventHandler = new VolumeSliderEventHandler(this);
-    volumeControl = new VolumeControl(volumeButton);
-    volumeControl->installEventFilter(volumeSliderEventHandler);
-    volumeControl->installSliderEventFilter(volumeSliderEventHandler);
-    volumeButton->installEventFilter(new VolumeButtonEventHandler(this));
-    volumeButton->setMenu(volumeControl);
-
     connectionsAction->setMenu(new QMenu(this));
     connectionsGroup=new QActionGroup(connectionsAction->menu());
     outputsAction->setMenu(new QMenu(this));
     outputsAction->setVisible(false);
     addPlayQueueToStoredPlaylistAction->setMenu(PlaylistsModel::self()->menu());
 
-    menuButton->setMenu(mainMenu);
-    volumeButton->setIcon(Icons::self()->toolbarVolumeHighIcon);
-
-    playPauseTrackButton->setDefaultAction(playPauseTrackAction);
-    stopTrackButton->setDefaultAction(stopPlaybackAction);
-    nextTrackButton->setDefaultAction(nextTrackAction);
-    prevTrackButton->setDefaultAction(prevTrackAction);
+    playPauseTrackButton->setDefaultAction(StdActions::self()->playPauseTrackAction);
+    stopTrackButton->setDefaultAction(StdActions::self()->stopPlaybackAction);
+    nextTrackButton->setDefaultAction(StdActions::self()->nextTrackAction);
+    prevTrackButton->setDefaultAction(StdActions::self()->prevTrackAction);
 
     QMenu *stopMenu=new QMenu(this);
-    stopMenu->addAction(stopPlaybackAction);
-    stopMenu->addAction(stopAfterCurrentTrackAction);
+    stopMenu->addAction(StdActions::self()->stopPlaybackAction);
+    stopMenu->addAction(StdActions::self()->stopAfterCurrentTrackAction);
     stopTrackButton->setMenu(stopMenu);
     stopTrackButton->setPopupMode(QToolButton::DelayedPopup);
 
@@ -388,11 +356,10 @@ MainWindow::MainWindow(QWidget *parent)
     devicesPage = new DevicesPage(this);
     #endif
 
-    initSizes();
-    clearPlayQueueAction->setEnabled(false);
+    promptClearPlayQueueAction->setEnabled(false);
     StdActions::self()->savePlayQueueAction->setEnabled(false);
     addStreamToPlayQueueAction->setEnabled(false);
-    clearPlayQueueButton->setDefaultAction(clearPlayQueueAction);
+    clearPlayQueueButton->setDefaultAction(promptClearPlayQueueAction);
     savePlayQueueButton->setDefaultAction(StdActions::self()->savePlayQueueAction);
     searchPlayQueueButton->setDefaultAction(searchPlayQueueAction);
     randomButton->setDefaultAction(randomPlayQueueAction);
@@ -435,6 +402,7 @@ MainWindow::MainWindow(QWidget *parent)
     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);
@@ -461,6 +429,8 @@ MainWindow::MainWindow(QWidget *parent)
     }
 
     tabWidget->SetMode(FancyTabWidget::Mode_LargeSidebar);
+    initSizes();
+
     expandInterfaceAction->setCheckable(true);
     fullScreenAction->setCheckable(true);
     randomPlayQueueAction->setCheckable(true);
@@ -476,39 +446,35 @@ MainWindow::MainWindow(QWidget *parent)
     QList<QToolButton *> playbackBtns;
     QList<QToolButton *> controlBtns;
     playbackBtns << prevTrackButton << stopTrackButton << playPauseTrackButton << nextTrackButton;
-    controlBtns << volumeButton << menuButton << songInfoButton;
+    controlBtns << menuButton << songInfoButton;
 
     int playbackIconSize=28;
     int controlIconSize=22;
-    int buttonSize=32;
+    int controlButtonSize=32;
 
     if (repeatButton->iconSize().height()>=32) {
-        controlIconSize=48;
-        playbackIconSize=48;
-        buttonSize=54;
+        controlIconSize=playbackIconSize=48;
+        controlButtonSize=54;
     } else if (repeatButton->iconSize().height()>=22) {
-        controlIconSize=32;
-        playbackIconSize=32;
-        buttonSize=36;
-    } else if (QLatin1String("oxygen")!=Icon::currentTheme().toLower()) {
-        // Oxygen does not have 24x24 icons, and media players eem to use scaled 28x28 icons...
+        controlIconSize=playbackIconSize=32;
+        controlButtonSize=36;
+    } else if (QLatin1String("oxygen")!=Icon::currentTheme().toLower() || (GtkStyle::isActive() && GtkStyle::useLightIcons())) {
+        // 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;
     }
-
+    int playbackButtonSize=28==playbackIconSize ? 34 : controlButtonSize;
     foreach (QToolButton *b, controlBtns) {
         b->setAutoRaise(true);
         b->setToolButtonStyle(Qt::ToolButtonIconOnly);
-        b->setMinimumSize(QSize(buttonSize, buttonSize));
-        b->setMaximumSize(QSize(buttonSize, buttonSize));
         b->setIconSize(QSize(controlIconSize, controlIconSize));
+        b->setFixedSize(QSize(controlButtonSize, controlButtonSize));
     }
     foreach (QToolButton *b, playbackBtns) {
         b->setAutoRaise(true);
         b->setToolButtonStyle(Qt::ToolButtonIconOnly);
-        b->setMinimumSize(QSize(buttonSize, buttonSize));
-        b->setMaximumSize(QSize(buttonSize, buttonSize));
         b->setIconSize(QSize(playbackIconSize, playbackIconSize));
+        b->setFixedSize(QSize(playbackButtonSize, playbackButtonSize));
     }
 
     trackLabel->setText(QString());
@@ -525,12 +491,12 @@ MainWindow::MainWindow(QWidget *parent)
     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());
     expandedSize=Settings::self()->mainWindowSize();
     collapsedSize=Settings::self()->mainWindowCollapsedSize();
@@ -586,6 +552,9 @@ MainWindow::MainWindow(QWidget *parent)
     mainMenu->addMenu(helpMenu());
     #else
     prefAction=ActionCollection::get()->createAction("configure", i18n("Configure Cantata..."), Icons::self()->configureIcon);
+    #ifdef Q_OS_MAC
+    prefAction->setMenuRole(QAction::PreferencesRole);
+    #endif
     connect(prefAction, SIGNAL(triggered(bool)),this, SLOT(showPreferencesDialog()));
     mainMenu->addAction(prefAction);
     mainMenu->addSeparator();
@@ -598,7 +567,9 @@ MainWindow::MainWindow(QWidget *parent)
     mainMenu->addAction(quitAction);
 
     #if !defined Q_OS_WIN
-    if (qgetenv("XDG_CURRENT_DESKTOP")=="Unity") {
+    #if !defined Q_OS_MAC
+    if (Utils::Unity==Utils::currentDe()) {
+    #endif
         QMenu *menu=new QMenu(i18n("&File"), this);
         menu->addAction(quitAction);
         menuBar()->addMenu(menu);
@@ -628,8 +599,10 @@ MainWindow::MainWindow(QWidget *parent)
         menu->addAction(aboutAction);
         #endif
         menuBar()->addMenu(menu);
+    #if !defined Q_OS_MAC
     }
     #endif
+    #endif
 
     dynamicLabel->setVisible(false);
     stopDynamicButton->setVisible(false);
@@ -645,12 +618,13 @@ MainWindow::MainWindow(QWidget *parent)
     playQueueProxyModel.setSourceModel(&playQueueModel);
     playQueue->setModel(&playQueueProxyModel);
     playQueue->addAction(removeFromPlayQueueAction);
-    playQueue->addAction(clearPlayQueueAction);
+    playQueue->addAction(promptClearPlayQueueAction);
     playQueue->addAction(StdActions::self()->savePlayQueueAction);
     playQueue->addAction(addStreamToPlayQueueAction);
     playQueue->addAction(addPlayQueueToStoredPlaylistAction);
     playQueue->addAction(cropPlayQueueAction);
     playQueue->addAction(shufflePlayQueueAction);
+    playQueue->addAction(shufflePlayQueueAlbumsAction);
     Action *sep=new Action(this);
     sep->setSeparator(true);
     playQueue->addAction(sep);
@@ -663,7 +637,6 @@ MainWindow::MainWindow(QWidget *parent)
     //playQueue->addAction(copyTrackInfoAction);
     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());
@@ -682,9 +655,8 @@ MainWindow::MainWindow(QWidget *parent)
     connect(MPDConnection::self(), SIGNAL(outputsUpdated(const QList<Output> &)), this, SLOT(outputsUpdated(const QList<Output> &)));
     connect(this, SIGNAL(enableOutput(int, bool)), MPDConnection::self(), SLOT(enableOutput(int, bool)));
     connect(this, SIGNAL(outputs()), MPDConnection::self(), SLOT(outputs()));
-    connect(this, SIGNAL(removeSongs(const QList<qint32> &)), MPDConnection::self(), SLOT(removeSongs(const QList<qint32> &)));
     connect(this, SIGNAL(pause(bool)), MPDConnection::self(), SLOT(setPause(bool)));
-    connect(this, SIGNAL(play()), MPDConnection::self(), SLOT(startPlayingSong()));
+    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)));
@@ -707,6 +679,8 @@ MainWindow::MainWindow(QWidget *parent)
     connect(playQueue, SIGNAL(itemsSelected(bool)), SLOT(playQueueItemsSelected(bool)));
     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)));
+    connect(onlinePage, SIGNAL(showPreferencesPage(QString)), this, SLOT(showPreferencesDialog(QString)));
     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> &)));
@@ -722,17 +696,13 @@ MainWindow::MainWindow(QWidget *parent)
     connect(StdActions::self()->refreshAction, SIGNAL(triggered(bool)), this, SLOT(refresh()));
     connect(StdActions::self()->refreshAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(update()));
     connect(connectAction, SIGNAL(triggered(bool)), this, SLOT(connectToMpd()));
-    connect(prevTrackAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(goToPrevious()));
-    connect(nextTrackAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(goToNext()));
-    connect(playPauseTrackAction, SIGNAL(triggered(bool)), this, SLOT(playPauseTrack()));
-    connect(stopPlaybackAction, SIGNAL(triggered(bool)), this, SLOT(stopPlayback()));
-    connect(stopAfterCurrentTrackAction, SIGNAL(triggered(bool)), this, SLOT(stopAfterCurrentTrack()));
+    connect(StdActions::self()->prevTrackAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(goToPrevious()));
+    connect(StdActions::self()->nextTrackAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(goToNext()));
+    connect(StdActions::self()->playPauseTrackAction, SIGNAL(triggered(bool)), this, SLOT(playPauseTrack()));
+    connect(StdActions::self()->stopPlaybackAction, SIGNAL(triggered(bool)), this, SLOT(stopPlayback()));
+    connect(StdActions::self()->stopAfterCurrentTrackAction, SIGNAL(triggered(bool)), this, SLOT(stopAfterCurrentTrack()));
     connect(stopAfterTrackAction, SIGNAL(triggered(bool)), this, SLOT(stopAfterTrack()));
-    connect(volumeControl, SIGNAL(valueChanged(int)), MPDConnection::self(), SLOT(setVolume(int)));
     connect(this, SIGNAL(setVolume(int)), MPDConnection::self(), SLOT(setVolume(int)));
-    connect(increaseVolumeAction, SIGNAL(triggered(bool)), volumeControl, SLOT(increaseVolume()));
-    connect(decreaseVolumeAction, SIGNAL(triggered(bool)), volumeControl, SLOT(decreaseVolume()));
-    connect(muteAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(toggleMute()));
     connect(positionSlider, SIGNAL(sliderReleased()), this, SLOT(setPosition()));
     connect(randomPlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(setRandom(bool)));
     connect(repeatPlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(setRepeat(bool)));
@@ -740,6 +710,7 @@ MainWindow::MainWindow(QWidget *parent)
     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(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()));
@@ -747,13 +718,15 @@ MainWindow::MainWindow(QWidget *parent)
     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()));
+    connect(StdActions::self()->addRandomToPlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(addRandomToPlayQueue()));
     connect(StdActions::self()->replacePlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(replacePlayQueue()));
     connect(removeFromPlayQueueAction, SIGNAL(triggered(bool)), this, SLOT(removeFromPlayQueue()));
-    connect(clearPlayQueueAction, SIGNAL(triggered(bool)), playQueueSearchWidget, SLOT(clear()));
-    connect(clearPlayQueueAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(clear()));
+    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()));
     connect(expandInterfaceAction, SIGNAL(triggered(bool)), this, SLOT(expandOrCollapse()));
     connect(songInfoAction, SIGNAL(triggered(bool)), this, SLOT(showSongInfo()));
     connect(fullScreenAction, SIGNAL(triggered(bool)), this, SLOT(fullScreen()));
@@ -776,7 +749,7 @@ MainWindow::MainWindow(QWidget *parent)
     connect(onlineTabAction, SIGNAL(triggered(bool)), this, SLOT(showOnlineTab()));
     addAction(StdActions::self()->searchAction); // Weird, but if I dont add thiis action, it does not work!!!!
     connect(StdActions::self()->searchAction, SIGNAL(triggered(bool)), SLOT(showSearch()));
-    connect(searchPlayQueueAction, SIGNAL(triggered(bool)), playQueueSearchWidget, SLOT(toggle()));
+    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
@@ -805,10 +778,10 @@ MainWindow::MainWindow(QWidget *parent)
     connect(playlistsPage, SIGNAL(add(const QStringList &, bool, quint8)), &playQueueModel, SLOT(addItems(const QStringList &, bool, quint8)));
     connect(coverWidget, SIGNAL(clicked()), expandInterfaceAction, SLOT(trigger()));
     connect(coverWidget, SIGNAL(albumCover(QImage)), playQueue, SLOT(setImage(QImage)));
-    #ifdef Q_OS_LINUX
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC
     connect(MountPoints::self(), SIGNAL(updated()), SLOT(checkMpdAccessibility()));
-    #endif // Q_OS_LINUX
-
+    #endif
+    connect(OnlineServicesModel::self(), SIGNAL(error(const QString &)), this, SLOT(showError(const QString &)));
     playQueueItemsSelected(false);
     playQueue->setFocus();
     playQueue->initHeader();
@@ -833,16 +806,15 @@ MainWindow::MainWindow(QWidget *parent)
     readSettings();
     updateConnectionsMenu();
     fadeStop=Settings::self()->stopFadeDuration()>Settings::MinFade;
-    playlistsPage->refresh();
-    #if !defined Q_OS_WIN
+    //playlistsPage->refresh();
+    #ifdef QT_QTDBUS_FOUND
     mpris=new Mpris(this);
     connect(coverWidget, SIGNAL(coverFile(const QString &)), mpris, SLOT(updateCurrentCover(const QString &)));
     #endif
     ActionCollection::get()->readSettings();
 
     if (testAttribute(Qt::WA_TranslucentBackground)) {
-        // Work-around non-showing main window on start-up with transparent QtCurve windows.
-        // BUG: 146
+        // BUG: 146 - Work-around non-showing main window on start-up with transparent QtCurve windows.
         move(p.isNull() ? QPoint(96, 96) : p);
     }
 
@@ -856,20 +828,22 @@ MainWindow::MainWindow(QWidget *parent)
     if (Settings::self()->firstRun() && MPDConnection::self()->isConnected()) {
         mpdConnectionStateChanged(true);
     }
+    #ifndef ENABLE_KDE_SUPPORT
+    MediaKeys::self()->load();
+    #endif
+    updateActionToolTips();
 }
 
 MainWindow::~MainWindow()
 {
+    playQueueModel.removeCantataStreams();
     Settings::self()->saveShowFullScreen(fullScreenAction->isChecked());
     if (!fullScreenAction->isChecked()) {
         Settings::self()->saveMainWindowSize(expandInterfaceAction->isChecked() ? size() : expandedSize);
         Settings::self()->saveMainWindowCollapsedSize(expandInterfaceAction->isChecked() ? collapsedSize : size());
     }
-    #if defined ENABLE_REMOTE_DEVICES && defined ENABLE_DEVICES_SUPPORT
-    DevicesModel::self()->unmountRemote();
-    #endif
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    Settings::self()->savePlayStream(streamPlayAction->isChecked());
+    Settings::self()->savePlayStream(streamPlayAction->isVisible() && streamPlayAction->isChecked());
     #endif
     if (!fullScreenAction->isChecked()) {
         if (!tabWidget->isEnabled(PAGE_PLAYQUEUE)) {
@@ -881,19 +855,12 @@ MainWindow::~MainWindow()
     Settings::self()->saveSidebar((int)(tabWidget->mode()));
     Settings::self()->savePage(tabWidget->currentWidget()->metaObject()->className());
     playQueue->saveHeader();
-    QStringList hiddenPages;
-    for (int i=0; i<tabWidget->count(); ++i) {
-        if (!tabWidget->isEnabled(i)) {
-            QWidget *w=tabWidget->widget(i);
-            if (w) {
-                hiddenPages << w->metaObject()->className();
-            }
-        }
-    }
-    Settings::self()->saveHiddenPages(hiddenPages);
+    Settings::self()->saveHiddenPages(tabWidget->hiddenPages());
     context->saveConfig();
     streamsPage->save();
     positionSlider->saveConfig();
+    StreamsModel::self()->save();
+    OnlineServicesModel::self()->save();
     Settings::self()->saveForceSingleClick(TreeView::getForceSingleClick());
     Settings::self()->saveStartHidden(trayItem->isActive() && isHidden() && Settings::self()->minimiseOnClose());
     Settings::self()->save(true);
@@ -907,12 +874,13 @@ MainWindow::~MainWindow()
     }
     MPDConnection::self()->stop();
     Covers::self()->stop();
-    #if defined ENABLE_DEVICES_SUPPORT
+    #ifdef ENABLE_DEVICES_SUPPORT
     FileThread::self()->stop();
+    DevicesModel::self()->stop();
     #endif
     OnlineServicesModel::self()->stop();
-    #ifdef ENABLE_DEVICES_SUPPORT
-    DevicesModel::self()->stop();
+    #ifndef ENABLE_KDE_SUPPORT
+    MediaKeys::self()->stop();
     #endif
 }
 
@@ -931,6 +899,10 @@ void MainWindow::initSizes()
     artistLabel->adjustSize();
     positionSlider->adjustSize();
     int cwSize=qMax(playPauseTrackButton->height(), trackLabel->height()+artistLabel->height()+spacing)+positionSlider->height()+spacing;
+    int tabSize=tabWidget->tabSize().width();
+    if ((cwSize<tabSize && (tabSize-cwSize)<(tabSize/3)) || (cwSize>tabSize && (cwSize-tabSize)<(cwSize/3))) {
+        cwSize=tabSize;
+    }
 
     coverWidget->setMinimumSize(cwSize, cwSize);
     coverWidget->setMaximumSize(cwSize, cwSize);
@@ -938,7 +910,6 @@ void MainWindow::initSizes()
 
 void MainWindow::load(const QStringList &urls)
 {
-    #ifdef TAGLIB_FOUND
     QStringList useable;
     bool haveHttp=HttpServer::self()->isAlive();
 
@@ -959,9 +930,6 @@ void MainWindow::load(const QStringList &urls)
     if (useable.count()) {
         playQueueModel.addItems(useable, playQueueModel.rowCount(), false, 0);
     }
-    #else
-    Q_UNUSED(urls)
-    #endif
 }
 
 void MainWindow::songLoaded()
@@ -984,25 +952,21 @@ void MainWindow::showError(const QString &message, bool showActions)
         messageWidget->setError(message);
     }
     if (showActions) {
-        messageWidget->addAction(prefAction);
-        messageWidget->addAction(connectAction);
+        messageWidget->setActions(QList<QAction*>() << prefAction << connectAction);
     } else {
-        messageWidget->removeAction(prefAction);
-        messageWidget->removeAction(connectAction);
+        messageWidget->removeAllActions();
     }
 }
 
 void MainWindow::showInformation(const QString &message)
 {
     messageWidget->setInformation(message);
-    messageWidget->removeAction(prefAction);
-    messageWidget->removeAction(connectAction);
+    messageWidget->removeAllActions();
 }
 
 void MainWindow::messageWidgetVisibility(bool v)
 {
     Q_UNUSED(v)
-
     if (!expandInterfaceAction->isChecked()) {
         int prevWidth=width();
         int compactHeight=calcCompactHeight();
@@ -1065,25 +1029,23 @@ void MainWindow::closeEvent(QCloseEvent *event)
         }
     } else {
         GtkStyle::cleanup();
-        #ifdef ENABLE_KDE_SUPPORT
-        KXmlGuiWindow::closeEvent(event);
-        #else
-        QMainWindow::closeEvent(event);
-        #endif
+        MAIN_WINDOW_BASE_CLASS::closeEvent(event);
     }
 }
 
 void MainWindow::playQueueItemsSelected(bool s)
 {
-    bool haveItems=playQueue->model()->rowCount()>0;
+    int rc=playQueue->model()->rowCount();
+    bool haveItems=rc>0;
     bool singleSelection=1==playQueue->selectedIndexes(false).count(); // Dont need sorted selection here...
     removeFromPlayQueueAction->setEnabled(s && haveItems);
     locateTrackAction->setEnabled(singleSelection);
     copyTrackInfoAction->setEnabled(s && haveItems);
     cropPlayQueueAction->setEnabled(playQueue->haveUnSelectedItems() && haveItems);
-    shufflePlayQueueAction->setEnabled(haveItems);
+    shufflePlayQueueAction->setEnabled(rc>1);
+    shufflePlayQueueAlbumsAction->setEnabled(rc>1);
     #ifdef TAGLIB_FOUND
-    editPlayQueueTagsAction->setEnabled(s && haveItems && editPlayQueueTagsAction);
+    editPlayQueueTagsAction->setEnabled(s && haveItems && MPDConnection::self()->getDetails().dirReadable);
     #endif
     addPlayQueueToStoredPlaylistAction->setEnabled(haveItems);
     stopAfterTrackAction->setEnabled(singleSelection);
@@ -1114,6 +1076,17 @@ void MainWindow::connectToMpd()
     connectToMpd(Settings::self()->connectionDetails());
 }
 
+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);
+    #else
+    Q_UNUSED(u)
+    #endif
+}
+
 void MainWindow::refresh()
 {
     MusicLibraryModel::self()->removeCache();
@@ -1133,7 +1106,6 @@ void MainWindow::saveShortcuts()
 {
     ActionCollection::get()->writeSettings();
 }
-
 #endif
 
 bool MainWindow::canShowDialog()
@@ -1155,21 +1127,34 @@ bool MainWindow::canShowDialog()
     return true;
 }
 
-void MainWindow::showPreferencesDialog()
+void MainWindow::showPreferencesDialog(const QString &page)
 {
+    if (PreferencesDialog::instanceCount() && !page.isEmpty()) {
+        emit showPreferencesPage(page);
+    }
     if (PreferencesDialog::instanceCount() || !canShowDialog()) {
         return;
     }
-    PreferencesDialog *pref=new PreferencesDialog(this);
+    PreferencesDialog *pref=new PreferencesDialog(this, tabWidget->hiddenPages());
     controlConnectionsMenu(false);
     connect(pref, SIGNAL(settingsSaved()), this, SLOT(updateSettings()));
     connect(pref, SIGNAL(reloadStreams()), streamsPage, SLOT(refresh()));
     connect(pref, SIGNAL(destroyed()), SLOT(controlConnectionsMenu()));
+    connect(this, SIGNAL(showPreferencesPage(QString)), pref, SLOT(showPage(QString)));
     pref->show();
+    if (!page.isEmpty()) {
+        pref->showPage(page);
+    }
 }
 
 void MainWindow::quit()
 {
+    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();
     #ifdef ENABLE_REPLAYGAIN_SUPPORT
     if (RgDialog::instanceCount()) {
         return;
@@ -1198,8 +1183,7 @@ void MainWindow::checkMpdDir()
     if (mpdAccessibilityTimer) {
         mpdAccessibilityTimer->stop();
     }
-    QString dir=MPDConnection::self()->getDetails().dir;
-    MPDConnection::self()->setDirReadable(dir.isEmpty() ? false : QDir(dir).isReadable());
+    MPDConnection::self()->setDirReadable();
     #endif
 
     #ifdef TAGLIB_FOUND
@@ -1271,6 +1255,7 @@ void MainWindow::updateConnectionsMenu()
         connectionsAction->setVisible(false);
     } else {
         connectionsAction->setVisible(true);
+        QString current=Settings::self()->currentConnection();
         QSet<QString> cfg;
         QSet<QString> menuItems;
         QMenu *menu=connectionsAction->menu();
@@ -1280,12 +1265,12 @@ void MainWindow::updateConnectionsMenu()
 
         foreach (QAction *act, menu->actions()) {
             menuItems.insert(act->data().toString());
+            act->setChecked(act->data().toString()==current);
         }
 
         if (menuItems!=cfg) {
             menu->clear();
             qSort(connections);
-            QString current=Settings::self()->currentConnection();
             int i=Qt::Key_1;
             foreach (const MPDConnectionDetails &d, connections) {
                 QAction *act=menu->addAction(d.getName(), this, SLOT(changeConnection()));
@@ -1319,22 +1304,15 @@ void MainWindow::readSettings()
 {
     checkMpdDir();
     Covers::self()->setSaveInMpdDir(Settings::self()->storeCoversInMpdDir());
-    #ifdef TAGLIB_FOUND
     HttpServer::self()->readConfig();
-    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     StdActions::self()->deleteSongsAction->setVisible(Settings::self()->showDeleteAction());
     #endif
     MPDParseUtils::setGroupSingle(Settings::self()->groupSingle());
     MPDParseUtils::setGroupMultiple(Settings::self()->groupMultiple());
+    Song::setUseComposer(Settings::self()->useComposer());
     albumsPage->setView(Settings::self()->albumsView());
     AlbumsModel::self()->setAlbumSort(Settings::self()->albumSort());
-
-    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    streamPlayAction->setVisible(!Settings::self()->streamUrl().isEmpty());
-    streamPlayAction->setChecked(streamPlayAction->isVisible() && Settings::self()->playStream());
-    toggleStream(streamPlayAction->isChecked());
-    #endif
     libraryPage->setView(Settings::self()->libraryView());
     MusicLibraryModel::self()->setUseArtistImages(Settings::self()->libraryArtistImage());
     playlistsPage->setView(Settings::self()->playlistsView());
@@ -1348,13 +1326,11 @@ void MainWindow::readSettings()
     autoScrollPlayQueue=Settings::self()->playQueueScroll();
     updateWindowTitle();
     TreeView::setForceSingleClick(Settings::self()->forceSingleClick());
-    #ifndef Q_OS_WIN
-    if (!gnomeMediaKeys && Settings::self()->gnomeMediaKeys()) {
-        gnomeMediaKeys=new GnomeMediaKeys(this);
-    }
-    if (gnomeMediaKeys) {
-        gnomeMediaKeys->setEnabled(Settings::self()->gnomeMediaKeys());
-    }
+    #ifdef QT_QTDBUS_FOUND
+    PowerManagement::self()->setInhibitSuspend(Settings::self()->inhibitSuspend());
+    #endif
+    #ifndef ENABLE_KDE_SUPPORT
+    MediaKeys::self()->load();
     #endif
     context->readConfig();
 }
@@ -1380,7 +1356,8 @@ void MainWindow::updateSettings()
                       useLibSizeForAl!=AlbumsModel::useLibrarySizes();
     bool diffLibYear=MusicLibraryItemAlbum::showDate()!=Settings::self()->libraryYear();
     bool diffGrouping=MPDParseUtils::groupSingle()!=Settings::self()->groupSingle() ||
-                      MPDParseUtils::groupMultiple()!=Settings::self()->groupMultiple();
+                      MPDParseUtils::groupMultiple()!=Settings::self()->groupMultiple() ||
+                      Song::useComposer()!=Settings::self()->useComposer();
 
     readSettings();
 
@@ -1446,6 +1423,7 @@ void MainWindow::updateSettings()
     if (ItemView::Mode_GroupedTree==Settings::self()->playlistsView() && wasStartClosed!=playlistsPage->isStartClosed()) {
         playlistsPage->updateRows();
     }
+    updateActionToolTips();
 }
 
 void MainWindow::toggleOutput()
@@ -1471,8 +1449,7 @@ 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/>")+
-//                       (ContextWidget::constHtbApiKey.latin1() ? i18nc("Qt-only", "Context view backdrops courtesy of <a href=\"http://www.htbackdrops.com\">Home Theater Backdrops</a><br/>") : "")+
+                       QLatin1String("<br/><br/><i><small>")+i18n("Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 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>")+
@@ -1491,8 +1468,8 @@ void MainWindow::showServerInfo()
                                        "<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,
-                                       MPDParseUtils::formatDuration(MPDStats::self()->uptime()),
-                                       MPDParseUtils::formatDuration(MPDStats::self()->playtime()))+
+                                       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>"
@@ -1502,11 +1479,11 @@ void MainWindow::showServerInfo()
                                        "<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(", "),
-                                       MPDParseUtils::formatDuration(MPDStats::self()->dbPlaytime()), MPDStats::self()->dbUpdate().toString(Qt::SystemLocaleShortDate)),
+                                       Utils::formatDuration(MPDStats::self()->dbPlaytime()), MPDStats::self()->dbUpdate().toString(Qt::SystemLocaleShortDate)),
                             i18n("Server Information"));
 }
 
-void MainWindow::toggleStream(bool s)
+void MainWindow::toggleStream(bool s, const QString &url)
 {
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
     MPDStatus * const status = MPDStatus::self();
@@ -1517,7 +1494,7 @@ void MainWindow::toggleStream(bool s)
         }
     } else {
         static const char *constUrlProperty="url";
-        if (httpStream && httpStream->property(constUrlProperty).toString()!=Settings::self()->streamUrl()) {
+        if (httpStream && httpStream->property(constUrlProperty).toString()!=url) {
             httpStream->stop();
             httpStream->deleteLater();
             httpStream=0;
@@ -1540,23 +1517,23 @@ void MainWindow::toggleStream(bool s)
             #if QT_VERSION < 0x050000
             httpStream=new Phonon::MediaObject(this);
             Phonon::createPath(httpStream, new Phonon::AudioOutput(Phonon::MusicCategory, this));
-            httpStream->setCurrentSource(Settings::self()->streamUrl());
+            httpStream->setCurrentSource(url);
             #else
             httpStream=new QMediaPlayer(this);
-            httpStream->setMedia(QUrl(Settings::self()->streamUrl()));
+            httpStream->setMedia(QUrl(url));
             #endif
-            httpStream->setProperty(constUrlProperty, Settings::self()->streamUrl());
+            httpStream->setProperty(constUrlProperty, url);
         }
     }
     #else
-    Q_UNUSED(s)
+    Q_UNUSED(s) Q_UNUSED(url)
     #endif
 }
 
 void MainWindow::enableStopActions(bool enable)
 {
-    stopAfterCurrentTrackAction->setEnabled(enable);
-    stopPlaybackAction->setEnabled(enable);
+    StdActions::self()->stopAfterCurrentTrackAction->setEnabled(enable);
+    StdActions::self()->stopPlaybackAction->setEnabled(enable);
 }
 
 void MainWindow::stopPlayback()
@@ -1565,8 +1542,8 @@ void MainWindow::stopPlayback()
         emit stop();
     }
     enableStopActions(false);
-    nextTrackAction->setEnabled(false);
-    prevTrackAction->setEnabled(false);
+    StdActions::self()->nextTrackAction->setEnabled(false);
+    StdActions::self()->prevTrackAction->setEnabled(false);
     startVolumeFade();
 }
 
@@ -1593,13 +1570,13 @@ void MainWindow::startVolumeFade()
     }
 
     stopState=StopState_Stopping;
+    volumeSlider->setFadingStop(true);
     if (!volumeFade) {
         volumeFade = new QPropertyAnimation(this, "volume");
         volumeFade->setDuration(Settings::self()->stopFadeDuration());
     }
-    origVolume=volume;
-    lastVolume=volume;
-    volumeFade->setStartValue(volume);
+    origVolume=lastVolume=volumeSlider->value();
+    volumeFade->setStartValue(origVolume);
     volumeFade->setEndValue(-1);
     volumeFade->start();
 }
@@ -1613,11 +1590,16 @@ void MainWindow::stopVolumeFade()
     }
 }
 
+int MainWindow::mpdVolume() const
+{
+    return volumeSlider->value();
+}
+
 void MainWindow::setMpdVolume(int v)
 {
     if (-1==v) {
-        volume=origVolume;
-        emit setVolume(origVolume);
+        volumeSlider->setFadingStop(false);
+        emit setVolume(volumeSlider->value());
         if (StopState_Stopping==stopState) {
             emit stop();
         }
@@ -1647,16 +1629,6 @@ void MainWindow::playPauseTrack()
     }
 }
 
-void MainWindow::nextTrack()
-{
-    nextTrackAction->trigger();
-}
-
-void MainWindow::prevTrack()
-{
-    prevTrackAction->trigger();
-}
-
 void MainWindow::setPosition()
 {
     emit setSeekId(MPDStatus::self()->songId(), positionSlider->value());
@@ -1701,11 +1673,11 @@ void MainWindow::realSearchPlayQueue()
 
 void MainWindow::updatePlayQueue(const QList<Song> &songs)
 {
-    playPauseTrackAction->setEnabled(!songs.isEmpty());
-    nextTrackAction->setEnabled(stopPlaybackAction->isEnabled() && songs.count()>1);
-    prevTrackAction->setEnabled(stopPlaybackAction->isEnabled() && songs.count()>1);
+    StdActions::self()->playPauseTrackAction->setEnabled(!songs.isEmpty());
+    StdActions::self()->nextTrackAction->setEnabled(StdActions::self()->stopPlaybackAction->isEnabled() && songs.count()>1);
+    StdActions::self()->prevTrackAction->setEnabled(StdActions::self()->stopPlaybackAction->isEnabled() && songs.count()>1);
     StdActions::self()->savePlayQueueAction->setEnabled(!songs.isEmpty());
-    clearPlayQueueAction->setEnabled(!songs.isEmpty());
+    promptClearPlayQueueAction->setEnabled(!songs.isEmpty());
 
     bool wasEmpty=0==playQueueModel.rowCount();
     playQueueModel.update(songs);
@@ -1743,21 +1715,21 @@ void MainWindow::updateWindowTitle()
         setWindowTitle(multipleConnections ? i18n("Cantata (%1)", connection) : "Cantata");
     } else if (current.isStream() && !current.isCantataStream() && !current.isCdda()) {
         setWindowTitle(multipleConnections
-                        ? i18nc("track :: Cantata (connection)", "%1 :: Cantata (%2)", trackLabel->text(), connection)
-                        : i18nc("track :: Cantata", "%1 :: Cantata", trackLabel->text()));
+                        ? i18nc("track :: Cantata (connection)", "%1 :: Cantata (%2)", trackLabel->fullText(), connection)
+                        : i18nc("track :: Cantata", "%1 :: Cantata", trackLabel->fullText()));
     } else if (current.artist.isEmpty()) {
-        if (trackLabel->text().isEmpty()) {
+        if (trackLabel->fullText().isEmpty()) {
             setWindowTitle(multipleConnections ? i18n("Cantata (%1)", connection) : "Cantata");
         } else {
             setWindowTitle(multipleConnections
-                            ? i18nc("track :: Cantata (connection)", "%1 :: Cantata (%2)", trackLabel->text(), connection)
-                            : i18nc("track :: Cantata", "%1 :: Cantata", trackLabel->text()));
+                            ? i18nc("track :: Cantata (connection)", "%1 :: Cantata (%2)", trackLabel->fullText(), connection)
+                            : i18nc("track :: Cantata", "%1 :: Cantata", trackLabel->fullText()));
         }
     } else {
         setWindowTitle(multipleConnections
                         ? i18nc("track - artist :: Cantata (connection)", "%1 - %2 :: Cantata (%3)",
-                                trackLabel->text(), current.artist, connection)
-                        : i18nc("track - artist :: Cantata", "%1 - %2 :: Cantata", trackLabel->text(), current.artist));
+                                trackLabel->fullText(), current.artist, connection)
+                        : i18nc("track - artist :: Cantata", "%1 - %2 :: Cantata", trackLabel->fullText(), current.artist));
     }
 }
 
@@ -1780,7 +1752,6 @@ void MainWindow::updateCurrentSong(const Song &song)
         }
     }
 
-    #ifdef TAGLIB_FOUND
     if (current.isCantataStream()) {
         Song mod=HttpServer::self()->decodeUrl(current.file);
         if (!mod.title.isEmpty()) {
@@ -1788,9 +1759,8 @@ void MainWindow::updateCurrentSong(const Song &song)
             current.id=song.id;
         }
     }
-    #endif
 
-    #if !defined Q_OS_WIN
+    #ifdef QT_QTDBUS_FOUND
     mpris->updateCurrentSong(current);
     #endif
     if (current.time<5 && MPDStatus::self()->songId()==current.id && MPDStatus::self()->timeTotal()>5) {
@@ -1813,7 +1783,7 @@ void MainWindow::updateCurrentSong(const Song &song)
             trackLabel->setText(current.title);
         }
         if (current.album.isEmpty() && current.artist.isEmpty()) {
-            artistLabel->setText(trackLabel->text().isEmpty() ? QString() : i18n("Unknown"));
+            artistLabel->setText(trackLabel->fullText().isEmpty() ? QString() : i18n("Unknown"));
         } else if (current.album.isEmpty()) {
             artistLabel->setText(current.artist);
         } else {
@@ -1872,7 +1842,7 @@ void MainWindow::updateStatus()
 void MainWindow::updateStatus(MPDStatus * const status)
 {
     if (!status->error().isEmpty()) {
-        showError(status->error());
+        showError(i18n("MPD reported the following error: %1", status->error()));
     }
 
     if (MPDState_Stopped==status->state() || MPDState_Inactive==status->state()) {
@@ -1906,44 +1876,6 @@ void MainWindow::updateStatus(MPDStatus * const status)
         }
     }
 
-    if (!stopState) {
-        volume=status->volume();
-
-        if (volume<=0) {
-            volumeButton->setIcon(Icons::self()->toolbarVolumeMutedIcon);
-        } else if (volume<=33) {
-            volumeButton->setIcon(Icons::self()->toolbarVolumeLowIcon);
-        } else if (volume<=67) {
-            volumeButton->setIcon(Icons::self()->toolbarVolumeMediumIcon);
-        } else {
-            volumeButton->setIcon(Icons::self()->toolbarVolumeHighIcon);
-        }
-
-        volumeControl->blockSignals(true);
-        if (volume<0) {
-            volumeButton->setEnabled(false);
-            volumeButton->setToolTip(i18n("Volume Disabled"));
-            volumeControl->setToolTip(i18n("Volume Disabled"));
-            volumeControl->setValue(0);
-        } else {
-            int unmuteVolume=-1;
-            if (0==volume) {
-                unmuteVolume=MPDConnection::self()->unmuteVolume();
-                if (unmuteVolume>0) {
-                    volume=unmuteVolume;
-                }
-            }
-            volumeButton->setEnabled(true);
-            volumeButton->setToolTip(unmuteVolume>0 ? i18n("Volume %1% (Muted)", volume) : i18n("Volume %1%", volume));
-            volumeControl->setToolTip(volumeButton->toolTip());
-            volumeControl->setValue(volume);
-        }
-        muteAction->setEnabled(volumeButton->isEnabled());
-        increaseVolumeAction->setEnabled(volumeButton->isEnabled());
-        decreaseVolumeAction->setEnabled(volumeButton->isEnabled());
-        volumeControl->blockSignals(false);
-    }
-
     randomPlayQueueAction->setChecked(status->random());
     repeatPlayQueueAction->setChecked(status->repeat());
     singlePlayQueueAction->setChecked(status->single());
@@ -1966,13 +1898,13 @@ void MainWindow::updateStatus(MPDStatus * const status)
             httpStream->play();
         }
         #endif
-        playPauseTrackAction->setIcon(Icons::self()->toolbarPauseIcon);
-        playPauseTrackAction->setEnabled(0!=playQueueModel.rowCount());
+        StdActions::self()->playPauseTrackAction->setIcon(Icons::self()->toolbarPauseIcon);
+        StdActions::self()->playPauseTrackAction->setEnabled(0!=status->playlistLength());
         //playPauseTrackButton->setChecked(false);
         if (StopState_Stopping!=stopState) {
             enableStopActions(true);
-            nextTrackAction->setEnabled(playQueueModel.rowCount()>1);
-            prevTrackAction->setEnabled(playQueueModel.rowCount()>1);
+            StdActions::self()->nextTrackAction->setEnabled(status->playlistLength()>1);
+            StdActions::self()->prevTrackAction->setEnabled(status->playlistLength()>1);
         }
         positionSlider->startTimer();
 
@@ -1989,12 +1921,12 @@ void MainWindow::updateStatus(MPDStatus * const status)
             httpStream->stop();
         }
         #endif
-        playPauseTrackAction->setIcon(Icons::self()->toolbarPlayIcon);
-        playPauseTrackAction->setEnabled(0!=playQueueModel.rowCount());
+        StdActions::self()->playPauseTrackAction->setIcon(Icons::self()->toolbarPlayIcon);
+        StdActions::self()->playPauseTrackAction->setEnabled(0!=status->playlistLength());
         enableStopActions(false);
-        nextTrackAction->setEnabled(false);
-        prevTrackAction->setEnabled(false);
-        if (!playPauseTrackAction->isEnabled()) {
+        StdActions::self()->nextTrackAction->setEnabled(false);
+        StdActions::self()->prevTrackAction->setEnabled(false);
+        if (!StdActions::self()->playPauseTrackAction->isEnabled()) {
             trackLabel->setText(QString());
             artistLabel->setText(QString());
             current=Song();
@@ -2017,11 +1949,11 @@ void MainWindow::updateStatus(MPDStatus * const status)
             httpStream->pause();
         }
         #endif
-        playPauseTrackAction->setIcon(Icons::self()->toolbarPlayIcon);
-        playPauseTrackAction->setEnabled(0!=playQueueModel.rowCount());
-        enableStopActions(0!=playQueueModel.rowCount());
-        nextTrackAction->setEnabled(playQueueModel.rowCount()>1);
-        prevTrackAction->setEnabled(playQueueModel.rowCount()>1);
+        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
@@ -2034,8 +1966,7 @@ void MainWindow::updateStatus(MPDStatus * const status)
         break;
     }
 
-    // Check if song has changed or we're playing again after being stopped
-    // and update song info if needed
+    // Check if song has changed or we're playing again after being stopped, and update song info if needed
     if (MPDState_Inactive!=status->state() &&
         (MPDState_Inactive==lastState || (MPDState_Stopped==lastState && MPDState_Playing==status->state()) || lastSongId != status->songId())) {
         emit currentSong();
@@ -2050,20 +1981,32 @@ void MainWindow::playQueueItemActivated(const QModelIndex &index)
     emit startPlayingSongId(playQueueModel.getIdByRow(playQueueProxyModel.mapToSource(index).row()));
 }
 
-void MainWindow::removeFromPlayQueue()
+void MainWindow::promptClearPlayQueue()
 {
-    const QModelIndexList items = playQueue->selectedIndexes();
-    QList<qint32> toBeRemoved;
-
-    if (items.isEmpty()) {
-        return;
+    if (Settings::self()->playQueueConfirmClear()) {
+        if (QDialogButtonBox::GnomeLayout==style()->styleHint(QStyle::SH_DialogButtonLayout)) {
+            messageWidget->setActions(QList<QAction*>() << cancelAction << clearPlayQueueAction);
+        } else {
+            messageWidget->setActions(QList<QAction*>() << clearPlayQueueAction << cancelAction);
+        }
+        messageWidget->setWarning(i18n("Remove all songs from play queue?"), false);
+    } else {
+        clearPlayQueue();
     }
+}
 
-    foreach (const QModelIndex &idx, items) {
-        toBeRemoved.append(playQueueModel.getIdByRow(playQueueProxyModel.mapToSource(idx).row()));
+void MainWindow::clearPlayQueue()
+{
+    if (dynamicLabel->isVisible()) {
+        Dynamic::self()->stop(true);
+    } else {
+        emit clear();
     }
+}
 
-    emit removeSongs(toBeRemoved);
+void MainWindow::removeFromPlayQueue()
+{
+    playQueueModel.remove(playQueueProxyModel.mapToSourceRows(playQueue->selectedIndexes()));
 }
 
 void MainWindow::replacePlayQueue()
@@ -2076,13 +2019,18 @@ void MainWindow::addToPlayQueue()
     addToPlayQueue(false);
 }
 
-void MainWindow::addToPlayQueue(bool replace, quint8 priority)
+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);
+        libraryPage->addSelectionToPlaylist(QString(), replace, priority, randomAlbums);
     } else if (albumsPage->isVisible()) {
-        albumsPage->addSelectionToPlaylist(QString(), replace, priority);
+        albumsPage->addSelectionToPlaylist(QString(), replace, priority, randomAlbums);
     } else if (folderPage->isVisible()) {
         folderPage->addSelectionToPlaylist(QString(), replace, priority);
     } else if (playlistsPage->isVisible()) {
@@ -2239,9 +2187,9 @@ void MainWindow::updatePlayQueueStats(int songs, quint32 time)
     }
 
     #ifdef ENABLE_KDE_SUPPORT
-    playQueueStatsLabel->setText(i18np("1 Track (%2)", "%1 Tracks (%2)", songs, MPDParseUtils::formatDuration(time)));
+    playQueueStatsLabel->setText(i18np("1 Track (%2)", "%1 Tracks (%2)", songs, Utils::formatDuration(time)));
     #else
-    playQueueStatsLabel->setText(QTP_TRACKS_DURATION_STR(songs, MPDParseUtils::formatDuration(time)));
+    playQueueStatsLabel->setText(QTP_TRACKS_DURATION_STR(songs, Utils::formatDuration(time)));
     #endif
 }
 
@@ -2379,22 +2327,9 @@ void MainWindow::sidebarModeChanged()
     }
 }
 
-// Do this by taking the set off all song id's and subtracting from that the set of selected song id's. Feed that list to emit removeSongs
 void MainWindow::cropPlayQueue()
 {
-    const QModelIndexList items = playQueue->selectedIndexes();
-    if (items.isEmpty()) {
-        return;
-    }
-
-    QSet<qint32> songs = playQueueModel.getSongIdSet();
-    QSet<qint32> selected;
-
-    foreach (const QModelIndex &idx, items) {
-        selected << playQueueModel.getIdByRow(playQueueProxyModel.mapToSource(idx).row());
-    }
-
-    emit removeSongs((songs - selected).toList());
+    playQueueModel.crop(playQueueProxyModel.mapToSourceRows(playQueue->selectedIndexes()));
 }
 
 void MainWindow::currentTabChanged(int index)
@@ -2494,6 +2429,9 @@ void MainWindow::tabToggled(int index)
         folderPage->setEnabled(!folderPage->isEnabled());
         if (folderPage->isEnabled() && loaded&TAB_FOLDERS) loaded-=TAB_FOLDERS;
         break;
+    case PAGE_PLAYLISTS:
+        setPlaylistsEnabled(tabWidget->isEnabled(index));
+        break;
     case PAGE_STREAMS:
         streamsPage->setEnabled(!streamsPage->isEnabled());
         if (streamsPage->isEnabled() && loaded&TAB_STREAMS) loaded-=TAB_STREAMS;
@@ -2553,9 +2491,7 @@ void MainWindow::toggleMonoIcons()
 
 void MainWindow::locateTrack()
 {
-    if (!libraryPage->isVisible()) {
-        showLibraryTab();
-    }
+    showLibraryTab();
     libraryPage->showSongs(playQueue->selectedSongs());
 }
 
@@ -2565,9 +2501,7 @@ void MainWindow::locateArtist(const QString &artist)
         songInfoAction->setChecked(false);
         showSongInfo();
     }
-    if (!libraryPage->isVisible()) {
-        showLibraryTab();
-    }
+    showLibraryTab();
     libraryPage->showArtist(artist);
 }
 
@@ -2577,9 +2511,7 @@ void MainWindow::locateAlbum(const QString &artist, const QString &album)
         songInfoAction->setChecked(false);
         showSongInfo();
     }
-    if (!libraryPage->isVisible()) {
-        showLibraryTab();
-    }
+    showLibraryTab();
     libraryPage->showAlbum(artist, album);
 }
 
@@ -2709,13 +2641,13 @@ void MainWindow::showSearch()
     }
     #endif
     else if (playQueuePage->isVisible()) {
-        playQueueSearchWidget->toggle();
+        playQueueSearchWidget->activate();
     }
 }
 
 bool MainWindow::fadeWhenStop() const
 {
-    return fadeStop && volumeButton->isEnabled();
+    return fadeStop && volumeSlider->isEnabled();
 }
 
 void MainWindow::expandAll()
@@ -2769,12 +2701,13 @@ void MainWindow::editTags(const QList<Song> &songs, bool isPlayQueue)
     }
     QSet<QString> artists;
     QSet<QString> albumArtists;
+    QSet<QString> composers;
     QSet<QString> albums;
     QSet<QString> genres;
     QString udi;
     #ifdef ENABLE_DEVICES_SUPPORT
     if (!isPlayQueue && devicesPage->isVisible()) {
-        DevicesModel::self()->getDetails(artists, albumArtists, albums, genres);
+        DevicesModel::self()->getDetails(artists, albumArtists, composers, albums, genres);
         udi=devicesPage->activeFsDeviceUdi();
         if (udi.isEmpty()) {
             return;
@@ -2783,8 +2716,8 @@ void MainWindow::editTags(const QList<Song> &songs, bool isPlayQueue)
     #else
     Q_UNUSED(isPlayQueue)
     #endif
-    MusicLibraryModel::self()->getDetails(artists, albumArtists, albums, genres);
-    TagEditor *dlg=new TagEditor(this, songs, artists, albumArtists, albums, genres, udi);
+    MusicLibraryModel::self()->getDetails(artists, albumArtists, composers, albums, genres);
+    TagEditor *dlg=new TagEditor(this, songs, artists, albumArtists, composers, albums, genres, udi);
     dlg->show();
 }
 #endif
@@ -2871,9 +2804,7 @@ void MainWindow::copyToDevice(const QString &from, const QString &to, const QLis
     ActionDialog *dlg=new ActionDialog(this);
     dlg->copy(from, to, songs);
     #else
-    Q_UNUSED(from)
-    Q_UNUSED(to)
-    Q_UNUSED(songs)
+    Q_UNUSED(from) Q_UNUSED(to) Q_UNUSED(songs)
     #endif
 }
 
@@ -2886,8 +2817,7 @@ void MainWindow::deleteSongs(const QString &from, const QList<Song> &songs)
     ActionDialog *dlg=new ActionDialog(this);
     dlg->remove(from, songs);
     #else
-    Q_UNUSED(from)
-    Q_UNUSED(songs)
+    Q_UNUSED(from) Q_UNUSED(songs)
     #endif
 }
 
@@ -2963,30 +2893,54 @@ void MainWindow::updateNextTrack(int nextTrackId)
     if (-1!=nextTrackId && MPDState_Stopped==MPDStatus::self()->state()) {
         nextTrackId=-1; // nextSongId is not accurate if we are stopped.
     }
-    QString tt=nextTrackAction->property("tooltip").toString();
+    QString tt=StdActions::self()->nextTrackAction->property("tooltip").toString();
     if (-1==nextTrackId && tt.isEmpty()) {
-        nextTrackAction->setProperty("tooltip", nextTrackAction->toolTip());
+        StdActions::self()->nextTrackAction->setProperty("tooltip", StdActions::self()->nextTrackAction->toolTip());
     } else if (-1==nextTrackId) {
-        nextTrackAction->setToolTip(tt);
-        nextTrackAction->setProperty("trackid", nextTrackId);
-    } else if (nextTrackId!=nextTrackAction->property("trackid").toInt()) {
+        StdActions::self()->nextTrackAction->setToolTip(tt);
+        StdActions::self()->nextTrackAction->setProperty("trackid", nextTrackId);
+    } else if (nextTrackId!=StdActions::self()->nextTrackAction->property("trackid").toInt()) {
         Song s=playQueueModel.getSongByRow(playQueueModel.getRowById(nextTrackId));
         if (!s.artist.isEmpty() && !s.title.isEmpty()) {
             tt+=QLatin1String("<br/><i><small>")+s.artistSong()+QLatin1String("<small></i>");
         } else {
             nextTrackId=-1;
         }
-        nextTrackAction->setToolTip(tt);
-        nextTrackAction->setProperty("trackid", nextTrackId);
+        StdActions::self()->nextTrackAction->setToolTip(tt);
+        StdActions::self()->nextTrackAction->setProperty("trackid", nextTrackId);
     }
 }
 
-#ifndef Q_OS_WIN
-#if QT_VERSION < 0x050000
+void MainWindow::updateActionToolTips()
+{
+    ActionCollection::get()->updateToolTips();
+    tabWidget->SetToolTip(PAGE_PLAYQUEUE, showPlayQueueAction->toolTip());
+    tabWidget->SetToolTip(PAGE_LIBRARY, libraryTabAction->toolTip());
+    tabWidget->SetToolTip(PAGE_ALBUMS, albumsTabAction->toolTip());
+    tabWidget->SetToolTip(PAGE_FOLDERS, foldersTabAction->toolTip());
+    tabWidget->SetToolTip(PAGE_PLAYLISTS, playlistsTabAction->toolTip());
+    tabWidget->SetToolTip(PAGE_DYNAMIC, dynamicTabAction->toolTip());
+    tabWidget->SetToolTip(PAGE_STREAMS, streamsTabAction->toolTip());
+    tabWidget->SetToolTip(PAGE_ONLINE, onlineTabAction->toolTip());
+    #ifdef ENABLE_DEVICES_SUPPORT
+    tabWidget->SetToolTip(PAGE_DEVICES, devicesTabAction->toolTip());
+    #endif
+    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());
+}
+
+#if !defined Q_OS_WIN && !defined Q_OS_MAC && QT_VERSION < 0x050000
 #include <QX11Info>
 #include <X11/Xlib.h>
 #endif
-#endif
 
 void MainWindow::hideWindow()
 {
@@ -2997,14 +2951,13 @@ void MainWindow::hideWindow()
 void MainWindow::restoreWindow()
 {
     bool wasHidden=isHidden();
-    #ifdef Q_OS_WIN
+    #ifdef Q_OS_WIN // FIXME - need on mac?
     raiseWindow(this);
     #endif
     raise();
     showNormal();
     activateWindow();
-    #ifndef Q_OS_WIN
-    #if QT_VERSION < 0x050000
+    #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!
@@ -3019,13 +2972,8 @@ void MainWindow::restoreWindow()
     xev.xclient.window = effectiveWinId();
     xev.xclient.format = 32;
     xev.xclient.data.l[0] = 2;
-    xev.xclient.data.l[1] = 0;
-    xev.xclient.data.l[2] = 0;
-    xev.xclient.data.l[3] = 0;
-    xev.xclient.data.l[4] = 0;
-    XSendEvent(QX11Info::display(), QX11Info::appRootWindow(info.screen()), False,
-               SubstructureRedirectMask | SubstructureNotifyMask, &xev);
-    #endif
+    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
     if (wasHidden && !lastPos.isNull()) {
         move(lastPos);
diff --git a/gui/mainwindow.h b/gui/mainwindow.h
index 038a319..c23f861 100644
--- a/gui/mainwindow.h
+++ b/gui/mainwindow.h
@@ -70,13 +70,11 @@ class DevicesPage;
 class QAbstractItemView;
 #ifndef Q_OS_WIN
 class Mpris;
-class GnomeMediaKeys;
 #endif // !defined Q_OS_WIN
 class QTimer;
 class QPropertyAnimation;
 class QActionGroup;
 class QDateTime;
-class VolumeControl;
 class TrayItem;
 class GtkProxyStyle;
 
@@ -105,31 +103,13 @@ private:
     QAction *act;
 };
 
-class VolumeSliderEventHandler : public QObject
-{
-public:
-    VolumeSliderEventHandler(MainWindow *w) : QObject((QObject *)w), window(w) { }
-protected:
-    bool eventFilter(QObject *obj, QEvent *event);
-protected:
-    MainWindow * const window;
-};
-
-class VolumeButtonEventHandler : public VolumeSliderEventHandler
-{
-public:
-    VolumeButtonEventHandler(MainWindow *w) : VolumeSliderEventHandler(w), down(false) { }
-protected:
-    bool eventFilter(QObject *obj, QEvent *event);
-private:
-    bool down;
-};
-
 #ifdef ENABLE_KDE_SUPPORT
-class MainWindow : public KXmlGuiWindow, private Ui::MainWindow
+#define MAIN_WINDOW_BASE_CLASS KXmlGuiWindow
 #else
-class MainWindow : public QMainWindow, private Ui::MainWindow
+#define MAIN_WINDOW_BASE_CLASS QMainWindow
 #endif
+
+class MainWindow : public MAIN_WINDOW_BASE_CLASS, private Ui::MainWindow
 {
     Q_OBJECT
 
@@ -155,7 +135,7 @@ public:
     MainWindow(QWidget *parent = 0);
     ~MainWindow();
 
-    int mpdVolume() const { return volume; }
+    int mpdVolume() const;
     int currentTrackPosition() const;
     QString coverFile() const;
 
@@ -170,7 +150,6 @@ private:
 Q_SIGNALS:
     // These are for communicating with MPD object (which is in its own thread, so need to talk via signal/slots)
     void setDetails(const MPDConnectionDetails &det);
-    void removeSongs(const QList<qint32> &);
     void pause(bool p);
     void play();
     void stop(bool afterCurrent=false);
@@ -188,6 +167,7 @@ Q_SIGNALS:
     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);
@@ -201,30 +181,29 @@ public Q_SLOTS:
     void configureShortcuts();
     void saveShortcuts();
     #endif
-    void setMpdVolume(int );
+    void setMpdVolume(int v);
     void songLoaded();
     void messageWidgetVisibility(bool v);
     void mpdConnectionStateChanged(bool connected);
     void playQueueItemsSelected(bool s);
-    void showPreferencesDialog();
+    void showPreferencesDialog(const QString &page=QString());
     void quit();
     void updateSettings();
     void toggleOutput();
     void changeConnection();
     void connectToMpd();
     void connectToMpd(const MPDConnectionDetails &details);
+    void streamUrl(const QString &u);
     void refresh();
     #ifndef ENABLE_KDE_SUPPORT
     void showAboutDialog();
     #endif
     void showServerInfo();
-    void toggleStream(bool s);
+    void toggleStream(bool s, const QString &url=QString());
     void stopPlayback();
     void stopAfterCurrentTrack();
     void stopAfterTrack();
     void playPauseTrack();
-    void nextTrack();
-    void prevTrack();
     void setPosition();
     void searchPlayQueue();
     void realSearchPlayQueue();
@@ -234,9 +213,12 @@ public Q_SLOTS:
     void updateStats();
     void updateStatus();
     void playQueueItemActivated(const QModelIndex &);
+    void promptClearPlayQueue();
+    void clearPlayQueue();
     void removeFromPlayQueue();
     void replacePlayQueue();
     void addToPlayQueue();
+    void addRandomToPlayQueue();
     void addWithPriority();
     void addToNewStoredPlaylist();
     void addToExistingStoredPlaylist(const QString &name);
@@ -299,7 +281,7 @@ private:
     void readSettings();
     int calcMinHeight();
     int calcCompactHeight();
-    void addToPlayQueue(bool replace, quint8 priority=0);
+    void addToPlayQueue(bool replace, quint8 priority=0, bool randomAlbums=false);
     #ifdef TAGLIB_FOUND
     void editTags(const QList<Song> &songs, bool isPlayQueue);
     #endif
@@ -310,6 +292,8 @@ private:
     void showTab(int page);
     bool fadeWhenStop() const;
     void updateNextTrack(int nextTrackId);
+    void updateActionToolTips();
+    void setPlaylistsEnabled(bool e);
 
 private:
     int loaded;
@@ -318,8 +302,6 @@ private:
     PlayQueueModel playQueueModel;
     PlayQueueProxyModel playQueueProxyModel;
     bool autoScrollPlayQueue;
-    VolumeSliderEventHandler *volumeSliderEventHandler;
-    VolumeControl *volumeControl;
     Action *prefAction;
     #ifdef ENABLE_KDE_SUPPORT
     Action *shortcutsAction;
@@ -328,21 +310,14 @@ private:
     Action *connectionsAction;
     Action *outputsAction;
     QActionGroup *connectionsGroup;
-    Action *prevTrackAction;
-    Action *nextTrackAction;
-    Action *playPauseTrackAction;
-    Action *stopPlaybackAction;
-    Action *stopAfterCurrentTrackAction;
     Action *stopAfterTrackAction;
-    Action *increaseVolumeAction;
-    Action *decreaseVolumeAction;
-    Action *muteAction;
     Action *removeFromPlayQueueAction;
     Action *addPlayQueueToStoredPlaylistAction;
-    Action *clearPlayQueueAction;
+    Action *promptClearPlayQueueAction;
     Action *copyTrackInfoAction;
     Action *cropPlayQueueAction;
     Action *shufflePlayQueueAction;
+    Action *shufflePlayQueueAlbumsAction;
     Action *addStreamToPlayQueueAction;
     Action *randomPlayQueueAction;
     Action *repeatPlayQueueAction;
@@ -376,6 +351,8 @@ private:
     Action *expandAllAction;
     Action *collapseAllAction;
     Action *serverInfoAction;
+    Action *clearPlayQueueAction;
+    Action *cancelAction;
     QAction *autoHideSplitterAction;
     QAction *monoIconsAction;
     TrayItem *trayItem;
@@ -397,12 +374,11 @@ private:
     #endif
     #ifndef Q_OS_WIN
     Mpris *mpris;
-    GnomeMediaKeys *gnomeMediaKeys;
     GtkProxyStyle *gtkStyle;
     #endif // Q_OS_WIN
     QTimer *statusTimer;
     QTimer *playQueueSearchTimer;
-    #ifdef Q_OS_LINUX
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC
     QTimer *mpdAccessibilityTimer;
     #endif
 
@@ -435,9 +411,6 @@ private:
     QMediaPlayer *httpStream;
     #endif
     #endif
-
-    friend class VolumeSliderEventHandler;
-    friend class VolumeButtonEventHandler;
     friend class CoverEventHandler;
     friend class TrayItem;
 };
diff --git a/gui/mainwindow.ui b/gui/mainwindow.ui
index 1c4c3ec..dd5de22 100644
--- a/gui/mainwindow.ui
+++ b/gui/mainwindow.ui
@@ -14,16 +14,34 @@
    <property name="spacing">
     <number>0</number>
    </property>
-   <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="ToolBar" name="toolbar" native="true">
      <layout class="QGridLayout" name="gridLayout_2">
-      <property name="verticalSpacing">
+      <property name="leftMargin">
+       <number>0</number>
+      </property>
+      <property name="topMargin">
+       <number>0</number>
+      </property>
+      <property name="rightMargin">
        <number>0</number>
       </property>
-      <property name="margin">
+      <property name="bottomMargin">
+       <number>0</number>
+      </property>
+      <property name="verticalSpacing">
        <number>0</number>
       </property>
       <item row="0" column="0" rowspan="2">
@@ -68,19 +86,26 @@
        </layout>
       </item>
       <item row="0" column="2">
-       <layout class="QVBoxLayout" name="verticalLayout_3">
+       <layout class="QVBoxLayout" name="detailsLayout">
         <item>
-         <widget class="PaddedSqueezedTextLabel" name="trackLabel">
+         <widget class="SqueezedTextLabel" name="trackLabel">
           <property name="font">
            <font>
             <weight>75</weight>
             <bold>true</bold>
            </font>
           </property>
+          <property name="alignment">
+           <set>Qt::AlignBottom|Qt::AlignLeading|Qt::AlignLeft</set>
+          </property>
          </widget>
         </item>
         <item>
-         <widget class="PaddedSqueezedTextLabel" name="artistLabel"/>
+         <widget class="SqueezedTextLabel" name="artistLabel">
+          <property name="alignment">
+           <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
+          </property>
+         </widget>
         </item>
        </layout>
       </item>
@@ -90,34 +115,29 @@
          <number>0</number>
         </property>
         <item>
-         <widget class="ToolButton" name="songInfoButton">
-          <property name="iconSize">
-           <size>
-            <width>20</width>
-            <height>20</height>
-           </size>
-          </property>
-         </widget>
+         <widget class="VolumeSlider" name="volumeSlider"/>
         </item>
         <item>
-         <widget class="ToolButton" name="volumeButton">
-          <property name="iconSize">
+         <spacer name="volumeSliderSpacer">
+          <property name="orientation">
+           <enum>Qt::Horizontal</enum>
+          </property>
+          <property name="sizeType">
+           <enum>QSizePolicy::Fixed</enum>
+          </property>
+          <property name="sizeHint" stdset="0">
            <size>
-            <width>20</width>
-            <height>20</height>
+            <width>4</width>
+            <height>4</height>
            </size>
           </property>
-         </widget>
+         </spacer>
         </item>
         <item>
-         <widget class="MenuButton" name="menuButton">
-          <property name="iconSize">
-           <size>
-            <width>20</width>
-            <height>20</height>
-           </size>
-          </property>
-         </widget>
+         <widget class="ToolButton" name="songInfoButton"/>
+        </item>
+        <item>
+         <widget class="MenuButton" name="menuButton"/>
         </item>
        </layout>
       </item>
@@ -157,7 +177,16 @@
         <property name="spacing">
          <number>0</number>
         </property>
-        <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>
@@ -196,7 +225,19 @@
         </sizepolicy>
        </property>
        <layout class="QVBoxLayout" name="vlayoutx">
-        <property name="margin">
+        <property name="spacing">
+         <number>2</number>
+        </property>
+        <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>
@@ -224,9 +265,18 @@
         <item>
          <layout class="QHBoxLayout" name="hlayout">
           <property name="spacing">
+           <number>1</number>
+          </property>
+          <property name="leftMargin">
+           <number>0</number>
+          </property>
+          <property name="topMargin">
+           <number>0</number>
+          </property>
+          <property name="rightMargin">
            <number>0</number>
           </property>
-          <property name="margin">
+          <property name="bottomMargin">
            <number>0</number>
           </property>
           <item>
@@ -296,20 +346,7 @@
            </widget>
           </item>
           <item>
-           <spacer name="horizontalSpacer_4">
-            <property name="orientation">
-             <enum>Qt::Horizontal</enum>
-            </property>
-            <property name="sizeType">
-             <enum>QSizePolicy::Fixed</enum>
-            </property>
-            <property name="sizeHint" stdset="0">
-             <size>
-              <width>16</width>
-              <height>16</height>
-             </size>
-            </property>
-           </spacer>
+           <widget class="SpacerWidget" name="horizontalSpacer_4b" native="true"/>
           </item>
           <item>
            <widget class="ToolButton" name="searchPlayQueueButton"/>
@@ -318,10 +355,13 @@
            <widget class="ToolButton" name="savePlayQueueButton"/>
           </item>
           <item>
+           <widget class="SpacerWidget" name="horizontalSpacer_4" native="true"/>
+          </item>
+          <item>
            <widget class="ToolButton" name="clearPlayQueueButton"/>
           </item>
           <item>
-           <widget class="QSizeGrip" name="sizeGrip"/>
+           <widget class="SizeGrip" name="sizeGrip" native="true"/>
           </item>
          </layout>
         </item>
@@ -335,11 +375,6 @@
  </widget>
  <customwidgets>
   <customwidget>
-   <class>PaddedSqueezedTextLabel</class>
-   <extends>QLabel</extends>
-   <header>squeezedtextlabel.h</header>
-  </customwidget>
-  <customwidget>
    <class>SqueezedTextLabel</class>
    <extends>QLabel</extends>
    <header>squeezedtextlabel.h</header>
@@ -350,11 +385,6 @@
    <header>toolbar.h</header>
   </customwidget>
   <customwidget>
-   <class>LineEdit</class>
-   <extends>QLineEdit</extends>
-   <header>lineedit.h</header>
-  </customwidget>
-  <customwidget>
    <class>PlayQueueView</class>
    <extends>QTreeView</extends>
    <header>playqueueview.h</header>
@@ -407,6 +437,21 @@
    <extends>QLineEdit</extends>
    <header>searchwidget.h</header>
   </customwidget>
+  <customwidget>
+   <class>SpacerWidget</class>
+   <extends>QWidget</extends>
+   <header>spacerwidget.h</header>
+  </customwidget>
+  <customwidget>
+   <class>SizeGrip</class>
+   <extends>QWidget</extends>
+   <header>sizegrip.h</header>
+  </customwidget>
+  <customwidget>
+   <class>VolumeSlider</class>
+   <extends>QSlider</extends>
+   <header>volumeslider.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/gui/mediakeys.cpp b/gui/mediakeys.cpp
new file mode 100644
index 0000000..2090cb7
--- /dev/null
+++ b/gui/mediakeys.cpp
@@ -0,0 +1,210 @@
+/*
+ * 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 "mediakeys.h"
+#ifdef QT_QTDBUS_FOUND
+#include "gnomemediakeys.h"
+#endif
+#ifdef CANTATA_USE_QXT_MEDIAKEYS
+#include "qxtmediakeys.h"
+#endif
+#include "multimediakeysinterface.h"
+#include "stdactions.h"
+#include "settings.h"
+#ifdef ENABLE_KDE_SUPPORT
+K_GLOBAL_STATIC(MediaKeys, instance)
+#endif
+
+MediaKeys * MediaKeys::self()
+{
+    #ifdef ENABLE_KDE_SUPPORT
+    return instance;
+    #else
+    static MediaKeys *instance=0;
+    if(!instance) {
+        instance=new MediaKeys;
+    }
+    return instance;
+    #endif
+}
+
+QString MediaKeys::toString(InterfaceType i)
+{
+    switch (i) {
+    case NoInterface:
+    default:
+        return QString();
+    case GnomeInteface:
+        return "gnome";
+    case QxtInterface:
+        return "qxt";
+    }
+}
+
+MediaKeys::InterfaceType MediaKeys::toIface(const QString &i)
+{
+    #if defined Q_OS_MAC
+    return NoInterface;
+    #endif
+
+    if (i==toString(GnomeInteface)) {
+        #ifdef QT_QTDBUS_FOUND
+        return GnomeInteface;
+        #else
+        return NoInterface;
+        #endif
+    }
+
+    if (i==toString(QxtInterface)) {
+        #if QT_VERSION < 0x050000
+        return QxtInterface;
+        #else
+        return NoInterface;
+        #endif
+    }
+    return NoInterface;
+}
+
+MediaKeys::MediaKeys()
+{
+    #ifdef QT_QTDBUS_FOUND
+    gnome=0;
+    #endif
+
+    #ifdef CANTATA_USE_QXT_MEDIAKEYS
+    qxt=0;
+    #endif
+}
+
+MediaKeys::~MediaKeys()
+{
+    #ifdef CANTATA_USE_QXT_MEDIAKEYS
+    if (qxt) {
+        delete qxt;
+    }
+    #endif
+    #ifdef QT_QTDBUS_FOUND
+    if (gnome) {
+        delete gnome;
+    }
+    #endif
+}
+
+void MediaKeys::load()
+{
+    InterfaceType current=NoInterface;
+    InterfaceType configured=toIface(Settings::self()->mediaKeysIface());
+    #ifdef QT_QTDBUS_FOUND
+    if (gnome && gnome->isEnabled()) {
+        current=GnomeInteface;
+    }
+    #endif
+
+    #ifdef CANTATA_USE_QXT_MEDIAKEYS
+    if (qxt && qxt->isEnabled()) {
+        current=QxtInterface;
+    }
+    #endif
+
+    if (current==configured) {
+        return;
+    }
+
+    #ifdef QT_QTDBUS_FOUND
+    if (gnome && GnomeInteface==current) {
+        disable(gnome);
+        gnome->deleteLater();
+        gnome=0;
+    }
+    #endif
+
+    #ifdef CANTATA_USE_QXT_MEDIAKEYS
+    if (qxt && QxtInterface==current) {
+        disable(qxt);
+        qxt->deleteLater();
+        qxt=0;
+    }
+    #endif
+
+    #ifdef QT_QTDBUS_FOUND
+    if (GnomeInteface==configured) {
+        if (!gnome) {
+            gnome=new GnomeMediaKeys(0);
+        }
+        enable(gnome);
+    }
+    #endif
+
+    #ifdef CANTATA_USE_QXT_MEDIAKEYS
+    if (QxtInterface==configured) {
+        if (!qxt) {
+            qxt=new QxtMediaKeys(0);
+        }
+        enable(qxt);
+    }
+    #endif
+}
+
+void MediaKeys::stop()
+{
+    #ifdef QT_QTDBUS_FOUND
+    if (gnome) {
+        disable(gnome);
+        gnome->deleteLater();
+        gnome=0;
+    }
+    #endif
+
+    #ifdef CANTATA_USE_QXT_MEDIAKEYS
+    if (qxt) {
+        disable(qxt);
+        qxt->deleteLater();
+        qxt=0;
+    }
+    #endif
+}
+
+void MediaKeys::enable(MultiMediaKeysInterface *iface)
+{
+    if (!iface || iface->isEnabled()) {
+        return;
+    }
+    QObject::connect(iface, SIGNAL(playPause()), StdActions::self()->playPauseTrackAction, SIGNAL(triggered()));
+    QObject::connect(iface, SIGNAL(stop()), StdActions::self()->stopPlaybackAction, SIGNAL(triggered()));
+    QObject::connect(iface, SIGNAL(next()), StdActions::self()->nextTrackAction, SIGNAL(triggered()));
+    QObject::connect(iface, SIGNAL(previous()), StdActions::self()->prevTrackAction, SIGNAL(triggered()));
+    iface->setEnabled(true);
+}
+
+void MediaKeys::disable(MultiMediaKeysInterface *iface)
+{
+    if (!iface || !iface->isEnabled()) {
+        return;
+    }
+    QObject::disconnect(iface, SIGNAL(playPause()), StdActions::self()->playPauseTrackAction, SIGNAL(triggered()));
+    QObject::disconnect(iface, SIGNAL(stop()), StdActions::self()->stopPlaybackAction, SIGNAL(triggered()));
+    QObject::disconnect(iface, SIGNAL(next()), StdActions::self()->nextTrackAction, SIGNAL(triggered()));
+    QObject::disconnect(iface, SIGNAL(previous()), StdActions::self()->prevTrackAction, SIGNAL(triggered()));
+    iface->setEnabled(false);
+}
+
diff --git a/http/httpserver.h b/gui/mediakeys.h
similarity index 54%
copy from http/httpserver.h
copy to gui/mediakeys.h
index 9be3789..52a4e32 100644
--- a/http/httpserver.h
+++ b/gui/mediakeys.h
@@ -21,39 +21,50 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef _HTTP_SERVER_H
-#define _HTTP_SERVER_H
+#ifndef MEDIA_KEYS_H
+#define MEDIA_KEYS_H
 
 #include <qglobal.h>
-#include <QByteArray>
-#include "song.h"
+#include "config.h"
 
-class HttpSocket;
-class Thread;
-class QUrl;
+class GnomeMediaKeys;
+class QxtMediaKeys;
+class MultiMediaKeysInterface;
 
-class HttpServer
+#if defined Q_OS_WIN || defined Q_OS_MAC || QT_VERSION < 0x050000
+#define CANTATA_USE_QXT_MEDIAKEYS
+#endif
+
+class MediaKeys
 {
 public:
-    static HttpServer * self();
+    enum InterfaceType {
+        NoInterface,
+        GnomeInteface,
+        QxtInterface
+    };
+
+    static MediaKeys * self();
+    static QString toString(InterfaceType i);
+    static InterfaceType toIface(const QString &i);
 
-    HttpServer() : thread(0), socket(0) { }
-    virtual ~HttpServer() { }
+    MediaKeys();
+    ~MediaKeys();
 
+    void load();
     void stop();
-    bool isAlive() const;
-    bool readConfig();
-    QString address() const;
-    bool isOurs(const QString &url) const;
-    QByteArray encodeUrl(const Song &s) const;
-    QByteArray encodeUrl(const QString &file) const;
-    Song decodeUrl(const QUrl &url) const;
-    Song decodeUrl(const QString &file) const;
 
 private:
-    Thread *thread;
-    HttpSocket *socket;
+    void enable(MultiMediaKeysInterface *iface);
+    void disable(MultiMediaKeysInterface *iface);
+
+private:
+    #ifdef QT_QTDBUS_FOUND
+    GnomeMediaKeys *gnome;
+    #endif
+    #ifdef CANTATA_USE_QXT_MEDIAKEYS
+    QxtMediaKeys *qxt;
+    #endif
 };
 
 #endif
-
diff --git a/devices/mountpoints.h b/gui/multimediakeysinterface.h
similarity index 65%
copy from devices/mountpoints.h
copy to gui/multimediakeysinterface.h
index d4ba7be..6ddbb8b 100644
--- a/devices/mountpoints.h
+++ b/gui/multimediakeysinterface.h
@@ -21,36 +21,32 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef MOUNTPOINTS_H
-#define MOUNTPOINTS_H
+#ifndef MULTI_MEDIA_KEYS_INTERFACE_H
+#define MULTI_MEDIA_KEYS_INTERFACE_H
 
 #include <QObject>
-#include <QSet>
-#include <QString>
 
-class QFile;
-
-class MountPoints : public QObject
+class MultiMediaKeysInterface : public QObject
 {
     Q_OBJECT
-
 public:
-    static MountPoints * self();
+    MultiMediaKeysInterface(QObject *p) : QObject(p), enabled(false) { }
+    ~MultiMediaKeysInterface() { }
 
-    MountPoints();
-    int currentToken() const { return token; }
-    bool isMounted(const QString &mp) const;
+    void setEnabled(bool e) { activate(e); enabled=e; }
+    bool isEnabled() const { return enabled; }
 
-Q_SIGNALS:
-    void updated();
+private:
+    virtual void activate(bool a)=0;
 
-private Q_SLOTS:
-    void updateMountPoints();
+Q_SIGNALS:
+    void playPause();
+    void stop();
+    void next();
+    void previous();
 
-private:
-    int token;
-    QSet<QString> current;
-    QFile *mounts;
+protected:
+    bool enabled;
 };
 
-#endif // MOUNTPOINTS_H
+#endif
diff --git a/gui/playbacksettings.cpp b/gui/playbacksettings.cpp
index 92d646f..75e7b60 100644
--- a/gui/playbacksettings.cpp
+++ b/gui/playbacksettings.cpp
@@ -62,9 +62,12 @@ PlaybackSettings::PlaybackSettings(QWidget *p)
     messageIcon->setMinimumSize(iconSize, iconSize);
     messageIcon->setMaximumSize(iconSize, iconSize);
     mpdConnectionStateChanged(MPDConnection::self()->isConnected());
-    #ifndef ENABLE_HTTP_STREAM_PLAYBACK
-    REMOVE(streamBox)
+    #ifdef Q_OS_WIN
+    REMOVE(inhibitSuspendLabel)
+    REMOVE(inhibitSuspend)
     #endif
+    outputsView->setVisible(outputsView->count()>1);
+    outputsViewLabel->setVisible(outputsView->count()>1);
 }
 
 void PlaybackSettings::load()
@@ -72,15 +75,15 @@ void PlaybackSettings::load()
     stopOnExit->setChecked(Settings::self()->stopOnExit());
     stopFadeDuration->setValue(Settings::self()->stopFadeDuration());
     stopDynamizerOnExit->setChecked(Settings::self()->stopDynamizerOnExit());
+    #ifndef Q_OS_WIN
+    inhibitSuspend->setChecked(Settings::self()->inhibitSuspend());
+    #endif
 
     crossfading->setValue(MPDStatus::self()->crossFade());
     if (MPDConnection::self()->isConnected()) {
         emit getReplayGain();
         emit outputs();
     }
-    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    streamUrl->setText(Settings::self()->streamUrl());
-    #endif
 }
 
 void PlaybackSettings::save()
@@ -88,22 +91,40 @@ void PlaybackSettings::save()
     Settings::self()->saveStopOnExit(stopOnExit->isChecked());
     Settings::self()->saveStopFadeDuration(stopFadeDuration->value());
     Settings::self()->saveStopDynamizerOnExit(stopDynamizerOnExit->isChecked());
+    #ifndef Q_OS_WIN
+    Settings::self()->saveInhibitSuspend(inhibitSuspend->isChecked());
+    #endif
 
     if (MPDConnection::self()->isConnected()) {
-        emit setCrossFade(crossfading->value());
-        emit setReplayGain(replayGain->itemData(replayGain->currentIndex()).toString());
-        for (int i=0; i<outputsView->count(); ++i) {
-            QListWidgetItem *item=outputsView->item(i);
-            emit enableOutput(item->data(Qt::UserRole).toInt(), Qt::Checked==item->checkState());
+        int crossFade=crossfading->value();
+        if (crossFade!=MPDStatus::self()->crossFade()) {
+            emit setCrossFade(crossFade);
+        }
+        QString rg=replayGain->itemData(replayGain->currentIndex()).toString();
+        if (rgSetting!=rg) {
+            rgSetting=rg;
+            emit setReplayGain(rg);
+        }
+        if (outputsView->isVisible()) {
+            for (int i=0; i<outputsView->count(); ++i) {
+                QListWidgetItem *item=outputsView->item(i);
+                bool isEnabled=Qt::Checked==item->checkState();
+                int id=item->data(Qt::UserRole).toInt();
+                if (isEnabled && !enabledOutputs.contains(id)) {
+                    enabledOutputs.insert(id);
+                    emit enableOutput(id, isEnabled);
+                } else if (!isEnabled && enabledOutputs.contains(id)) {
+                    enabledOutputs.remove(id);
+                    emit enableOutput(id, isEnabled);
+                }
+            }
         }
     }
-    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    Settings::self()->saveStreamUrl(streamUrl->text().trimmed());
-    #endif
 }
 
 void PlaybackSettings::replayGainSetting(const QString &rg)
 {
+    rgSetting=rg;
     replayGain->setCurrentIndex(0);
 
     for(int i=0; i<replayGain->count(); ++i) {
@@ -117,10 +138,14 @@ void PlaybackSettings::replayGainSetting(const QString &rg)
 void PlaybackSettings::updateOutputs(const QList<Output> &outputs)
 {
     outputsView->clear();
+    enabledOutputs.clear();
     foreach(const Output &output, outputs) {
         QListWidgetItem *item=new QListWidgetItem(output.name, outputsView);
         item->setCheckState(output.enabled ? Qt::Checked : Qt::Unchecked);
         item->setData(Qt::UserRole, output.id);
+        if (output.enabled) {
+            enabledOutputs.insert(output.id);
+        }
     }
     outputsView->setVisible(outputsView->count()>1);
     outputsViewLabel->setVisible(outputsView->count()>1);
@@ -134,10 +159,6 @@ void PlaybackSettings::mpdConnectionStateChanged(bool c)
     replayGain->setEnabled(c);
     crossfadingLabel->setEnabled(c);
     replayGainLabel->setEnabled(c);
-    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
-    streamUrl->setEnabled(c);
-    streamUrlLabel->setEnabled(c);
-    #endif
     messageIcon->setPixmap(Icon(c ? "dialog-information" : "dialog-warning").pixmap(messageIcon->minimumSize()));
     if (c) {
         messageLabel->setText(i18n("<i>Connected to %1<br/>The entries below apply to the currently connected MPD collection.</i>",
@@ -157,6 +178,6 @@ void PlaybackSettings::showAboutReplayGain()
                                        "<li><i>None</i> - No ReplayGain is applied.</li>"
                                        "<li><i>Track</i> - 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.</li>"
+                                       "<li><i>Auto</i> - Volume will be adjusted using the track's ReplayGain tags if random play is activated, otherwise the album's tags will be used.</li>"
                                        "</ul></p>"));
 }
diff --git a/gui/playbacksettings.h b/gui/playbacksettings.h
index dd84d94..24527fa 100644
--- a/gui/playbacksettings.h
+++ b/gui/playbacksettings.h
@@ -27,6 +27,7 @@
 #include "ui_playbacksettings.h"
 #include "output.h"
 #include <QList>
+#include <QSet>
 
 class PlaybackSettings : public QWidget, private Ui::PlaybackSettings
 {
@@ -52,6 +53,10 @@ private Q_SLOTS:
     void updateOutputs(const QList<Output> &outputs);
     void mpdConnectionStateChanged(bool c);
     void showAboutReplayGain();
+
+private:
+    QSet<int> enabledOutputs;
+    QString rgSetting;
 };
 
 #endif
diff --git a/gui/playbacksettings.ui b/gui/playbacksettings.ui
index 35695db..2ad3b86 100644
--- a/gui/playbacksettings.ui
+++ b/gui/playbacksettings.ui
@@ -127,44 +127,9 @@
     </widget>
    </item>
    <item>
-    <widget class="QGroupBox" name="streamBox">
-     <property name="title">
-      <string>HTTP Stream</string>
-     </property>
-     <layout class="QFormLayout" name="formLayout_2">
-      <property name="fieldGrowthPolicy">
-       <enum>QFormLayout::ExpandingFieldsGrow</enum>
-      </property>
-      <item row="1" column="0">
-       <widget class="BuddyLabel" name="streamUrlLabel">
-        <property name="text">
-         <string>URL:</string>
-        </property>
-        <property name="buddy">
-         <cstring>streamUrl</cstring>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="1">
-       <widget class="QLineEdit" name="streamUrl"/>
-      </item>
-      <item row="2" column="0" colspan="2">
-       <widget class="QLabel" name="streamUrlInfoLabel">
-        <property name="text">
-         <string><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></string>
-        </property>
-        <property name="wordWrap">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-     </layout>
-    </widget>
-   </item>
-   <item>
     <widget class="QGroupBox" name="stopPlaybackBox">
      <property name="title">
-      <string>Stopping Playback</string>
+      <string>Playback</string>
      </property>
      <layout class="QFormLayout" name="formLayout">
       <property name="fieldGrowthPolicy">
@@ -213,7 +178,40 @@
         </property>
        </widget>
       </item>
-      <item row="3" column="0" colspan="2">
+      <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>
@@ -267,10 +265,10 @@
   <tabstop>crossfading</tabstop>
   <tabstop>replayGain</tabstop>
   <tabstop>outputsView</tabstop>
-  <tabstop>streamUrl</tabstop>
   <tabstop>stopFadeDuration</tabstop>
   <tabstop>stopOnExit</tabstop>
   <tabstop>stopDynamizerOnExit</tabstop>
+  <tabstop>inhibitSuspend</tabstop>
  </tabstops>
  <resources/>
  <connections/>
diff --git a/gui/playlistspage.cpp b/gui/playlistspage.cpp
index 2ccb247..5360942 100644
--- a/gui/playlistspage.cpp
+++ b/gui/playlistspage.cpp
@@ -91,6 +91,12 @@ PlaylistsPage::~PlaylistsPage()
 {
 }
 
+void PlaylistsPage::showEvent(QShowEvent *e)
+{
+    view->focusView();
+    QWidget::showEvent(e);
+}
+
 void PlaylistsPage::setStartClosed(bool sc)
 {
     view->setStartClosed(sc);
@@ -139,12 +145,12 @@ void PlaylistsPage::addSelectionToPlaylist(bool replace, quint8 priorty)
 
 void PlaylistsPage::setView(int mode)
 {
-    bool diff=view->viewMode()!=mode;
+    //bool diff=view->viewMode()!=mode;
     view->setMode((ItemView::Mode)mode);
-    if (diff) {
-        clear();
-        refresh();
-    }
+    //if (diff) {
+    //    clear();
+    //    refresh();
+    //}
 }
 
 void PlaylistsPage::removeItems()
@@ -339,7 +345,7 @@ void PlaylistsPage::searchItems()
 {
     QString text=view->searchText().trimmed();
     bool updated=proxy.update(text, genreCombo->currentIndex()<=0 ? QString() : genreCombo->currentText());
-    if (proxy.enabled() && !text.isEmpty()) {
+    if (proxy.enabled() && !proxy.filterText().isEmpty()) {
         view->expandAll();
     }
     if(updated) {
diff --git a/gui/playlistspage.h b/gui/playlistspage.h
index bbe0884..da8540b 100644
--- a/gui/playlistspage.h
+++ b/gui/playlistspage.h
@@ -51,6 +51,7 @@ public:
     QList<Song> selectedSongs() const;
     void addSelectionToDevice(const QString &udi);
     #endif
+    void showEvent(QShowEvent *e);
 
 Q_SIGNALS:
     // These are for communicating with MPD object (which is in its own thread, so need to talk via signal/slots)
diff --git a/gui/playlistspage.ui b/gui/playlistspage.ui
index e8e0cd9..775441c 100644
--- a/gui/playlistspage.ui
+++ b/gui/playlistspage.ui
@@ -11,6 +11,9 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="vlayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <property name="leftMargin">
     <number>0</number>
    </property>
@@ -29,7 +32,7 @@
    <item>
     <layout class="QHBoxLayout" name="hlayout">
      <property name="spacing">
-      <number>0</number>
+      <number>1</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
@@ -53,6 +56,9 @@
       <widget class="GenreCombo" name="genreCombo"/>
      </item>
      <item>
+      <widget class="SizeWidget" name="sizeWidget"/>
+     </item>
+     <item>
       <widget class="MenuButton" name="menuButton"/>
      </item>
      <item>
@@ -83,6 +89,11 @@
    <extends>QToolButton</extends>
    <header>menubutton.h</header>
   </customwidget>
+  <customwidget>
+   <class>SizeWidget</class>
+   <extends>QWidget</extends>
+   <header>sizewidget.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/gui/preferencesdialog.cpp b/gui/preferencesdialog.cpp
index c469f34..20a4e79 100644
--- a/gui/preferencesdialog.cpp
+++ b/gui/preferencesdialog.cpp
@@ -26,28 +26,28 @@
 #include "settings.h"
 #include "icons.h"
 #include "interfacesettings.h"
+#include "streamssettings.h"
+#include "onlinesettings.h"
 #include "serversettings.h"
 #include "playbacksettings.h"
 #include "filesettings.h"
-#ifdef TAGLIB_FOUND
 #include "httpserversettings.h"
-#endif
 #include "contextsettings.h"
 #include "cachesettings.h"
 #include "localize.h"
 #include "mpdconnection.h"
-#include "pagewidget.h"
 #ifdef ENABLE_PROXY_CONFIG
 #include "proxysettings.h"
 #endif
 #ifndef ENABLE_KDE_SUPPORT
 #include "shortcutssettingspage.h"
-#include "actioncollection.h"
-#include "basicitemdelegate.h"
 #endif
 #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
 #include "audiocdsettings.h"
 #endif
+#ifndef ENABLE_KDE_SUPPORT
+#include "shortcutssettingspage.h"
+#endif
 
 static int iCount=0;
 
@@ -56,69 +56,76 @@ int PreferencesDialog::instanceCount()
     return iCount;
 }
 
-PreferencesDialog::PreferencesDialog(QWidget *parent)
+PreferencesDialog::PreferencesDialog(QWidget *parent, const QStringList &hiddenPages)
     : Dialog(parent, "PreferencesDialog")
 {
     iCount++;
     setButtons(Ok|Apply|Cancel);
 
-    PageWidget *widget = new PageWidget(this);
+    pageWidget = new PageWidget(this);
     server = new ServerSettings(0);
     playback = new PlaybackSettings(0);
     files = new FileSettings(0);
-    interface = new InterfaceSettings(0);
+    interface = new InterfaceSettings(0, hiddenPages);
+    streams = hiddenPages.contains(QLatin1String("StreamsPage")) ? 0 : new StreamsSettings(0);
+    online = hiddenPages.contains(QLatin1String("OnlineServicesPage")) ? 0 : new OnlineSettings(0);
     context = new ContextSettings(0);
+    http = new HttpServerSettings(0);
     cache = new CacheSettings(0);
     server->load();
     playback->load();
     files->load();
     interface->load();
     context->load();
-    widget->addPage(server, i18n("Collection"), Icons::self()->libraryIcon, i18n("Collection Settings"));
-    widget->addPage(playback, i18n("Playback"), Icon("media-playback-start"), i18n("Playback Settings"));
-    widget->addPage(files, i18n("Files"), Icons::self()->filesIcon, i18n("File Settings"));
-    widget->addPage(interface, i18n("Interface"), Icon("preferences-other"), i18n("Interface Settings"));
-    widget->addPage(context, i18n("Context"), Icons::self()->contextIcon, i18n("Context View Settings"));
-    #ifdef TAGLIB_FOUND
-    http = new HttpServerSettings(0);
+    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();
+    }
+    pageWidget->addPage(context, i18n("Context"), Icons::self()->contextIcon, i18n("Context View Settings"));
     if (http->haveMultipleInterfaces()) {
         http->load();
-        widget->addPage(http, i18n("HTTP Server"), Icon("network-server"), i18n("HTTP Server Settings"));
+        Icon icon("network-server");
+        if (icon.isNull()) {
+            icon=Icons::self()->audioFileIcon;
+        }
+        pageWidget->addPage(http, i18n("HTTP Server"), icon, i18n("HTTP Server Settings"));
     } else {
         http->deleteLater();
         http=0;
     }
-    #endif
     #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
     audiocd = new AudioCdSettings(0);
     audiocd->load();
-    widget->addPage(audiocd, i18n("Audio CD"), Icon("media-optical"), i18n("Audio CD Settings"));
+    pageWidget->addPage(audiocd, i18n("Audio CD"), Icon("media-optical"), i18n("Audio CD Settings"));
     #endif
     #ifdef ENABLE_PROXY_CONFIG
     proxy = new ProxySettings(0);
     proxy->load();
-    widget->addPage(proxy, i18n("Proxy"), Icon("preferences-system-network"), i18nc("Qt-only", "Proxy Settings"));
-    #endif
-    #ifndef ENABLE_KDE_SUPPORT
-    QHash<QString, ActionCollection *> map;
-    map.insert("Cantata", ActionCollection::get());
-    shortcuts = new ShortcutsSettingsPage(map, widget);
-    widget->addPage(shortcuts, i18nc("Qt-only", "Shortcuts"), Icons::self()->shortcutsIcon, i18nc("Qt-only", "Keyboard Shortcut Settings"));
-    shortcuts->view()->setAlternatingRowColors(false);
-    shortcuts->view()->setItemDelegate(new BasicItemDelegate(shortcuts->view()));
+    pageWidget->addPage(proxy, i18n("Proxy"), Icon("preferences-system-network"), i18nc("Qt-only", "Proxy Settings"));
     #endif
-    widget->addPage(cache, i18n("Cache"), Icon("folder"), i18n("Cached Items"));
-//    widget->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
-    widget->allPagesAdded();
     #ifndef ENABLE_KDE_SUPPORT
-    int h=(widget->minimumHeight()/widget->count())*(qMax(widget->count(), 10)+0.5);
-    setMinimumHeight(h);
-    setMinimumWidth(h*1.333);
+    shortcuts = new ShortcutsSettingsPage(pageWidget);
+    pageWidget->addPage(shortcuts, i18nc("Qt-only", "Shortcuts"), Icons::self()->shortcutsIcon, i18nc("Qt-only", "Keyboard Shortcut Settings"));
+    shortcuts->load();
     #endif
+    pageWidget->addPage(cache, i18n("Cache"), Icon("folder"), i18n("Cached Items"));
     setCaption(i18n("Configure"));
-    setMainWidget(widget);
+    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
     setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
 }
 
@@ -127,6 +134,13 @@ PreferencesDialog::~PreferencesDialog()
     iCount--;
 }
 
+void PreferencesDialog::showPage(const QString &page)
+{
+    if (pages.contains(page)) {
+        pageWidget->setCurrentPage(pages[page]);
+    }
+}
+
 void PreferencesDialog::writeSettings()
 {
     // *Must* save server settings first, so that MPD settings go to the correct instance!
@@ -134,11 +148,15 @@ void PreferencesDialog::writeSettings()
     playback->save();
     files->save();
     interface->save();
-    #ifdef TAGLIB_FOUND
+    if (streams) {
+        streams->save();
+    }
+    if (online) {
+        online->save();
+    }
     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 6a762f4..1d55aa0 100644
--- a/gui/preferencesdialog.h
+++ b/gui/preferencesdialog.h
@@ -26,6 +26,8 @@
 
 #include "config.h"
 #include "dialog.h"
+#include "pagewidget.h"
+
 #ifndef ENABLE_KDE_SUPPORT
 class ProxySettings;
 class ShortcutsSettingsPage;
@@ -35,15 +37,16 @@ class ServerSettings;
 class PlaybackSettings;
 class FileSettings;
 class InterfaceSettings;
+class StreamsSettings;
+class OnlineSettings;
 class ContextSettings;
-#ifdef TAGLIB_FOUND
 class HttpServerSettings;
-#endif
 struct MPDConnectionDetails;
 class CacheSettings;
 #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
 class AudioCdSettings;
 #endif
+class QStringList;
 
 class PreferencesDialog : public Dialog
 {
@@ -52,12 +55,15 @@ class PreferencesDialog : public Dialog
 public:
     static int instanceCount();
 
-    PreferencesDialog(QWidget *parent);
+    PreferencesDialog(QWidget *parent, const QStringList &hiddenPages);
     virtual ~PreferencesDialog();
 
 private:
     void slotButtonClicked(int button);
 
+public Q_SLOTS:
+    void showPage(const QString &page);
+
 private Q_SLOTS:
     void writeSettings();
 
@@ -66,14 +72,15 @@ Q_SIGNALS:
     void reloadStreams();
 
 private:
+    PageWidget *pageWidget;
     ServerSettings *server;
     PlaybackSettings *playback;
     FileSettings *files;
     InterfaceSettings *interface;
+    StreamsSettings *streams;
+    OnlineSettings *online;
     ContextSettings *context;
-    #ifdef TAGLIB_FOUND
     HttpServerSettings *http;
-    #endif
     #ifdef ENABLE_PROXY_CONFIG
     ProxySettings *proxy;
     #endif
@@ -84,6 +91,7 @@ private:
     #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
     AudioCdSettings *audiocd;
     #endif
+    QMap<QString, PageWidgetItem *> pages;
 };
 
 #endif
diff --git a/gui/qtplural.h b/gui/qtplural.h
index 989b33b..0d63c35 100644
--- a/gui/qtplural.h
+++ b/gui/qtplural.h
@@ -54,6 +54,14 @@
     (1==(C) ? QObject::tr("1 Rule", "Singular") : \
      QObject::tr("%1 Rules", "Plural (N!=1)").arg((C)))
 
+#define QTP_PODCASTS_STR(C) \
+    (1==(C) ? QObject::tr("1 Podcast", "Singular") : \
+     QObject::tr("%1 Podcasts", "Plural (N!=1)").arg((C)))
+
+#define QTP_EPISODES_STR(C) \
+    (1==(C) ? QObject::tr("1 Episode", "Singular") : \
+     QObject::tr("%1 Episodes", "Plural (N!=1)").arg((C)))
+
 #endif
 
 #endif
diff --git a/gui/qxtmediakeys.cpp b/gui/qxtmediakeys.cpp
new file mode 100644
index 0000000..6d06a8f
--- /dev/null
+++ b/gui/qxtmediakeys.cpp
@@ -0,0 +1,66 @@
+/*
+ * 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 "qxtmediakeys.h"
+#include "qxtglobalshortcut.h"
+
+QxtMediaKeys::QxtMediaKeys(QObject *p)
+    : MultiMediaKeysInterface(p)
+{
+}
+
+void QxtMediaKeys::activate(bool a)
+{
+    if (a) {
+        createShortcuts();
+    } else {
+        clear();
+    }
+}
+
+void QxtMediaKeys::createShortcuts()
+{
+    if (!shortcuts.isEmpty()) {
+        return;
+    }
+    QxtGlobalShortcut *shortcut = new QxtGlobalShortcut(Qt::Key_MediaPlay, this);
+    connect(shortcut, SIGNAL(activated()), this, SIGNAL(playPause()));
+    shortcuts.append(shortcut);
+    shortcut = new QxtGlobalShortcut(Qt::Key_MediaStop, this);
+    connect(shortcut, SIGNAL(activated()), this, SIGNAL(stop()));
+    shortcuts.append(shortcut);
+    shortcut = new QxtGlobalShortcut(Qt::Key_MediaNext, this);
+    connect(shortcut, SIGNAL(activated()), this, SIGNAL(next()));
+    shortcuts.append(shortcut);
+    shortcut = new QxtGlobalShortcut(Qt::Key_MediaPrevious, this);
+    connect(shortcut, SIGNAL(activated()), this, SIGNAL(previous()));
+    shortcuts.append(shortcut);
+}
+
+void QxtMediaKeys::clear()
+{
+    if (!shortcuts.isEmpty()) {
+        qDeleteAll(shortcuts);
+        shortcuts.clear();
+    }
+}
diff --git a/context/lyricsdialog.h b/gui/qxtmediakeys.h
similarity index 70%
copy from context/lyricsdialog.h
copy to gui/qxtmediakeys.h
index f27d543..202e3c9 100644
--- a/context/lyricsdialog.h
+++ b/gui/qxtmediakeys.h
@@ -21,29 +21,28 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef LYRICSDIALOG_H
-#define LYRICSDIALOG_H
+#ifndef QXT_MEDIA_KEYS_H
+#define QXT_MEDIA_KEYS_H
 
-#include "dialog.h"
-#include "lineedit.h"
-#include "song.h"
+#include "multimediakeysinterface.h"
+#include <QList>
 
-class LyricsDialog : public Dialog
-{
-    Q_OBJECT
+class QxtGlobalShortcut;
 
+class QxtMediaKeys : public MultiMediaKeysInterface
+{
 public:
-    LyricsDialog(const Song &s, QWidget *parent);
+    QxtMediaKeys(QObject *p);
+    virtual ~QxtMediaKeys() { clear(); }
 
-    Song song() const;
+    void activate(bool a);
 
-private Q_SLOTS:
-    void changed();
+private:
+    void createShortcuts();
+    void clear();
 
 private:
-    Song prev;
-    LineEdit *titleEntry;
-    LineEdit *artistEntry;
+    QList<QxtGlobalShortcut *> shortcuts;
 };
 
 #endif
diff --git a/gui/serversettings.cpp b/gui/serversettings.cpp
index dc1d077..35c6f0c 100644
--- a/gui/serversettings.cpp
+++ b/gui/serversettings.cpp
@@ -41,6 +41,11 @@
 #include <QDesktopServices>
 #endif
 
+#define REMOVE(w) \
+    w->setVisible(false); \
+    w->deleteLater(); \
+    w=0;
+
 class CoverNameValidator : public QValidator
 {
     public:
@@ -121,6 +126,11 @@ ServerSettings::ServerSettings(QWidget *p)
     coverName->setValidator(new CoverNameValidator(this));
     basicCoverName->setValidator(new CoverNameValidator(this));
     name->setValidator(new CollectionNameValidator(this));
+    #ifndef ENABLE_HTTP_STREAM_PLAYBACK
+    REMOVE(streamUrlLabel)
+    REMOVE(streamUrl)
+    REMOVE(streamUrlNoteLabel)
+    #endif
 }
 
 void ServerSettings::load()
@@ -173,7 +183,11 @@ void ServerSettings::save()
                 existingInConfig.removeAt(i);
                 found=true;
                 if (c.details.hostname!=e.hostname || c.details.port!=e.port || c.details.password!=e.password ||
-                    c.details.dir!=e.dir || c.details.dynamizerPort!=e.dynamizerPort || c.details.coverName!=e.coverName) {
+                    c.details.dir!=e.dir || c.details.dynamizerPort!=e.dynamizerPort || c.details.coverName!=e.coverName
+                    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+                    || c.details.streamUrl!=e.streamUrl
+                    #endif
+                    ) {
                     toAdd.append(c);
                 }
             }
@@ -331,7 +345,7 @@ QString ServerSettings::generateName(int ignore) const
 void ServerSettings::setDetails(const MPDConnectionDetails &details)
 {
     if (details.name==MPDUser::constName) {
-        basicDir->setText(details.dir);
+        basicDir->setText(Utils::convertDirForDisplay(details.dir));
         basicCoverName->setText(details.coverName);
         stackedWidget->setCurrentIndex(1);
     } else {
@@ -339,9 +353,12 @@ void ServerSettings::setDetails(const MPDConnectionDetails &details)
         host->setText(details.hostname);
         port->setValue(details.port);
         password->setText(details.password);
-        dir->setText(details.dir);
+        dir->setText(Utils::convertDirForDisplay(details.dir));
         dynamizerPort->setValue(details.dynamizerPort);
         coverName->setText(details.coverName);
+        #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+        streamUrl->setText(details.streamUrl);
+        #endif
         stackedWidget->setCurrentIndex(0);
     }
 }
@@ -357,15 +374,18 @@ MPDConnectionDetails ServerSettings::getDetails() const
         details.hostname=host->text().trimmed();
         details.port=port->value();
         details.password=password->text();
-        details.dir=Utils::fixPath(dir->text().trimmed());
+        details.dir=Utils::convertDirFromDisplay(dir->text());
         details.dynamizerPort=dynamizerPort->value();
         details.coverName=coverName->text().trimmed();
+        #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+        details.streamUrl=streamUrl->text().trimmed();
+        #endif
     } else {
         details=MPDUser::self()->details(true);
-        details.dir=Utils::fixPath(basicDir->text().trimmed());
+        details.dir=Utils::convertDirFromDisplay(basicDir->text());
         details.coverName=basicCoverName->text().trimmed();
         MPDUser::self()->setMusicFolder(details.dir);
     }
-    details.dirReadable=details.dir.isEmpty() ? false : QDir(details.dir).isReadable();
+    details.setDirReadable();
     return details;
 }
diff --git a/gui/serversettings.ui b/gui/serversettings.ui
index 31b3a6e..5bfa7c5 100644
--- a/gui/serversettings.ui
+++ b/gui/serversettings.ui
@@ -162,6 +162,19 @@
          <item row="6" column="1">
           <widget class="SpinBox" name="dynamizerPort"/>
          </item>
+         <item row="7" column="0">
+          <widget class="BuddyLabel" name="streamUrlLabel">
+           <property name="text">
+            <string>HTTP stream URL:</string>
+           </property>
+           <property name="buddy">
+            <cstring>streamUrl</cstring>
+           </property>
+          </widget>
+         </item>
+         <item row="7" column="1">
+          <widget class="LineEdit" name="streamUrl"/>
+         </item>
         </layout>
        </item>
        <item row="1" column="0">
@@ -243,6 +256,32 @@
         </widget>
        </item>
        <item row="7" column="0">
+        <spacer name="verticalSpacer_streamUrlNote">
+         <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="8" column="0" colspan="2">
+        <widget class="QLabel" name="streamUrlNoteLabel">
+         <property name="text">
+          <string><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></string>
+         </property>
+         <property name="wordWrap">
+          <bool>true</bool>
+         </property>
+        </widget>
+       </item>
+       <item row="9" column="0">
         <spacer name="verticalSpacer_2">
          <property name="orientation">
           <enum>Qt::Vertical</enum>
diff --git a/gui/settings.cpp b/gui/settings.cpp
index 29ac6dd..9b7bad1 100644
--- a/gui/settings.cpp
+++ b/gui/settings.cpp
@@ -22,22 +22,26 @@
  */
 
 #include "settings.h"
-#include "config.h"
 #include "musiclibraryitemalbum.h"
 #include "fancytabwidget.h"
 #include "albumsmodel.h"
 #include "itemview.h"
 #include "mpdparseutils.h"
 #include "utils.h"
+#include "mediakeys.h"
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KGlobal>
 #include <KDE/KConfig>
-#include "kwallet.h"
+#ifdef ENABLE_KWALLET
+#include <kwallet.h>
+#endif
 #include <QApplication>
 #include <QWidget>
 #include <QTimer>
 
 K_GLOBAL_STATIC(Settings, instance)
+#else
+#include "mediakeys.h"
 #endif
 #include <QFile>
 #include <QDir>
@@ -137,8 +141,10 @@ Settings::Settings()
     , ver(-1)
     #ifdef ENABLE_KDE_SUPPORT
     , cfg(KGlobal::config(), "General")
+    #ifdef ENABLE_KWALLET
     , wallet(0)
     #endif
+    #endif
 {
     // Only need to read system defaults if we have not previously been configured...
     if (version()<CANTATA_MAKE_VERSION(0, 8, 0)
@@ -150,7 +156,7 @@ Settings::Settings()
 
 Settings::~Settings()
 {
-    #ifdef ENABLE_KDE_SUPPORT
+    #if defined ENABLE_KDE_SUPPORT && defined ENABLE_KWALLET
     delete wallet;
     #endif
 }
@@ -165,7 +171,7 @@ MPDConnectionDetails Settings::connectionDetails(const QString &name)
     MPDConnectionDetails details;
     if (version()<CANTATA_MAKE_VERSION(0, 8, 0) || (name.isEmpty() && !HAS_GROUP(MPDConnectionDetails::configGroupName(name)))) {
         details.hostname=GET_STRING("connectionHost", name.isEmpty() ? mpdDefaults.host : QString());
-        #ifdef ENABLE_KDE_SUPPORT
+        #if defined ENABLE_KDE_SUPPORT && defined ENABLE_KWALLET
         if (GET_BOOL("connectionPasswd", false)) {
             if (openWallet()) {
                 wallet->readPassword("mpd", details.password);
@@ -177,7 +183,11 @@ MPDConnectionDetails Settings::connectionDetails(const QString &name)
         details.password=GET_STRING("connectionPasswd", name.isEmpty() ? mpdDefaults.passwd : QString());
         #endif
         details.port=GET_INT("connectionPort", name.isEmpty() ? mpdDefaults.port : 6600);
+        #ifdef Q_OS_WIN32
+        details.dir=Utils::fixPath(QDir::fromNativeSeparators(GET_STRING("mpdDir", mpdDefaults.dir)));
+        #else
         details.dir=Utils::fixPath(GET_STRING("mpdDir", mpdDefaults.dir));
+        #endif
         details.dynamizerPort=0;
     } else {
         QString n=MPDConnectionDetails::configGroupName(name);
@@ -192,6 +202,7 @@ MPDConnectionDetails Settings::connectionDetails(const QString &name)
             details.hostname=CFG_GET_STRING(grp, "host", name.isEmpty() ? mpdDefaults.host : QString());
             details.port=CFG_GET_INT(grp, "port", name.isEmpty() ? mpdDefaults.port : 6600);
             details.dir=Utils::fixPath(CFG_GET_STRING(grp, "dir", name.isEmpty() ? mpdDefaults.dir : "/var/lib/mpd/music"));
+            #ifdef ENABLE_KWALLET
             if (KWallet::Wallet::isEnabled()) {
                 if (CFG_GET_BOOL(grp, "passwd", false)) {
                     if (openWallet()) {
@@ -200,21 +211,33 @@ MPDConnectionDetails Settings::connectionDetails(const QString &name)
                 } else if (name.isEmpty()) {
                     details.password=mpdDefaults.passwd;
                 }
-            } else {
+            } else 
+            #endif // ENABLE_KWALLET
+            {
                 details.password=CFG_GET_STRING(grp, "pass", name.isEmpty() ? mpdDefaults.passwd : QString());
             }
             details.dynamizerPort=CFG_GET_INT(grp, "dynamizerPort", 0);
             details.coverName=CFG_GET_STRING(grp, "coverName", QString());
-            #else
+            #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+            details.streamUrl=CFG_GET_STRING(grp, "streamUrl", QString());
+            #endif
+            #else // ENABLE_KDE_SUPPORT
             cfg.beginGroup(n);
             details.hostname=GET_STRING("host", name.isEmpty() ? mpdDefaults.host : QString());
             details.port=GET_INT("port", name.isEmpty() ? mpdDefaults.port : 6600);
+            #ifdef Q_OS_WIN32
+            details.dir=Utils::fixPath(QDir::fromNativeSeparators(GET_STRING("dir", name.isEmpty() ? mpdDefaults.dir : "/var/lib/mpd/music")));
+            #else
             details.dir=Utils::fixPath(GET_STRING("dir", name.isEmpty() ? mpdDefaults.dir : "/var/lib/mpd/music"));
+            #endif
             details.password=GET_STRING("passwd", name.isEmpty() ? mpdDefaults.passwd : QString());
             details.dynamizerPort=GET_INT("dynamizerPort", 0);
             details.coverName=GET_STRING("coverName", QString());
-            cfg.endGroup();
+            #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+            details.streamUrl=GET_STRING("streamUrl", QString());
             #endif
+            cfg.endGroup();
+            #endif // ENABLE_KDE_SUPPORT
         } else {
             details.hostname=mpdDefaults.host;
             details.port=mpdDefaults.port;
@@ -222,9 +245,12 @@ MPDConnectionDetails Settings::connectionDetails(const QString &name)
             details.password=mpdDefaults.passwd;
             details.dynamizerPort=0;
             details.coverName=QString();
+            #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+            details.streamUrl=QString();
+            #endif
         }
     }
-    details.dirReadable=details.dir.isEmpty() ? false : QDir(details.dir).isReadable();
+    details.setDirReadable();
     return details;
 }
 
@@ -249,7 +275,7 @@ QList<MPDConnectionDetails> Settings::allConnections()
     return connections;
 }
 
-#ifdef ENABLE_KDE_SUPPORT
+#if defined ENABLE_KDE_SUPPORT && defined ENABLE_KWALLET
 bool Settings::openWallet()
 {
     if (wallet) {
@@ -267,7 +293,9 @@ bool Settings::openWallet()
 
     return false;
 }
-#else
+#endif
+
+#ifndef ENABLE_KDE_SUPPORT
 QString Settings::iconTheme()
 {
     return GET_STRING("iconTheme", QString());
@@ -357,6 +385,11 @@ bool Settings::storeStreamsInMpdDir()
     return GET_BOOL("storeStreamsInMpdDir", def);
 }
 
+bool Settings::storeBackdropsInMpdDir()
+{
+    return GET_BOOL("storeBackdropsInMpdDir", false);
+}
+
 int Settings::libraryView()
 {
     int v=version();
@@ -441,6 +474,11 @@ bool Settings::groupMultiple()
     return GET_BOOL("groupMultiple", MPDParseUtils::groupMultiple());
 }
 
+bool Settings::useComposer()
+{
+    return GET_BOOL("useComposer", Song::useComposer());
+}
+
 QStringList Settings::lyricProviders()
 {
     QStringList def;
@@ -511,10 +549,16 @@ QStringList Settings::hiddenPages()
     return GET_STRINGLIST("hiddenPages", def);
 }
 
-bool Settings::gnomeMediaKeys()
+#ifndef ENABLE_KDE_SUPPORT
+QString Settings::mediaKeysIface()
 {
-    return GET_BOOL("gnomeMediaKeys", true);
+    #if defined Q_OS_WIN
+    return GET_STRING("mediaKeysIface", MediaKeys::toString(MediaKeys::QxtInterface));
+    #else
+    return GET_STRING("mediaKeysIface", MediaKeys::toString(MediaKeys::GnomeInteface));
+    #endif
 }
+#endif
 
 #ifdef ENABLE_DEVICES_SUPPORT
 bool Settings::overwriteSongs()
@@ -564,7 +608,6 @@ int Settings::stopFadeDuration()
     return v;
 }
 
-#ifdef TAGLIB_FOUND
 int Settings::httpAllocatedPort()
 {
     return GET_INT("httpAllocatedPort", 0);
@@ -574,7 +617,6 @@ QString Settings::httpInterface()
 {
     return GET_STRING("httpInterface", QString());
 }
-#endif
 
 bool Settings::playQueueGrouped()
 {
@@ -601,6 +643,11 @@ bool Settings::playQueueBackground()
     return GET_BOOL("playQueueBackground", false);
 }
 
+bool Settings::playQueueConfirmClear()
+{
+    return GET_BOOL("playQueueConfirmClear", true);
+}
+
 bool Settings::playListsStartClosed()
 {
     return GET_BOOL("playListsStartClosed", true);
@@ -611,11 +658,6 @@ bool Settings::playStream()
 {
     return GET_BOOL("playStream", false);
 }
-
-QString Settings::streamUrl()
-{
-    return GET_STRING("streamUrl", QString());
-}
 #endif
 
 #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
@@ -678,6 +720,80 @@ bool Settings::showTimeRemaining()
     return GET_BOOL("showTimeRemaining", false);
 }
 
+QStringList Settings::hiddenStreamCategories()
+{
+    return GET_STRINGLIST("hiddenStreamCategories", QStringList());
+}
+
+QStringList Settings::hiddenOnlineProviders()
+{
+    return GET_STRINGLIST("hiddenOnlineProviders", QStringList());
+}
+
+#ifndef Q_OS_WIN32
+bool Settings::inhibitSuspend()
+{
+    return GET_BOOL("inhibitSuspend", false);
+}
+#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;
+    int v=GET_INT("rssUpdate", 0);
+    return RESTRICT(v, 0, constMax);
+}
+
+QDateTime Settings::lastRssUpdate()
+{
+    return GET_DATE_TIME("lastRssUpdate");
+}
+
+QString Settings::podcastDownloadPath()
+{
+    return Utils::fixPath(GET_STRING("podcastDownloadPath", Utils::fixPath(QDir::homePath())+QLatin1String("Podcasts/")));
+}
+
+bool Settings::podcastAutoDownload()
+{
+    return GET_BOOL("podcastAutoDownload", false);
+}
+
+int Settings::maxCoverFindPerIteration()
+{
+    int v=GET_INT("maxCoverFindPerIteration", 5);
+    return RESTRICT(v, 0, 20);
+}
+
+int Settings::maxCoverUpdatePerIteration()
+{
+    int v=GET_INT("maxCoverUpdatePerIteration", 5);
+    return RESTRICT(v, 1, 20);
+}
+
+QStringList Settings::cueFileCodecs()
+{
+    return GET_STRINGLIST("cueFileCodecs", QStringList());
+}
+
+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);
+}
+
 void Settings::removeConnectionDetails(const QString &v)
 {
     if (v==currentConnection()) {
@@ -707,6 +823,10 @@ void Settings::saveConnectionDetails(const MPDConnectionDetails &v)
     CFG_SET_VALUE(grp, "dir", v.dir);
     CFG_SET_VALUE(grp, "dynamizerPort", (int)v.dynamizerPort);
     CFG_SET_VALUE(grp, "coverName", v.coverName);
+    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+    CFG_SET_VALUE(grp, "streamUrl", v.streamUrl);
+    #endif
+    #ifdef ENABLE_KWALLET
     if (KWallet::Wallet::isEnabled()) {
         CFG_SET_VALUE(grp, "passwd", !v.password.isEmpty());
         QString walletEntry=v.name.isEmpty() ? "mpd" : v.name;
@@ -718,7 +838,9 @@ void Settings::saveConnectionDetails(const MPDConnectionDetails &v)
         else if (openWallet()) {
             wallet->writePassword(walletEntry, v.password);
         }
-    } else {
+    } else 
+    #endif // ENABLE_KWALLET
+    {
         CFG_SET_VALUE(grp, "pass", v.password);
     }
     #else
@@ -729,6 +851,9 @@ void Settings::saveConnectionDetails(const MPDConnectionDetails &v)
     SET_VALUE("passwd", v.password);
     SET_VALUE("dynamizerPort", (int)v.dynamizerPort);
     SET_VALUE("coverName", v.coverName);
+    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+    SET_VALUE("streamUrl", v.streamUrl);
+    #endif
     cfg.endGroup();
     #endif
     modified=true;
@@ -817,6 +942,12 @@ void Settings::saveStoreStreamsInMpdDir(bool v)
     SET_VALUE_MOD(storeStreamsInMpdDir)
 }
 
+
+void Settings::saveStoreBackdropsInMpdDir(bool v)
+{
+    SET_VALUE_MOD(storeBackdropsInMpdDir)
+}
+
 void Settings::saveLibraryView(int v)
 {
     SET_ITEMVIEW_MODE_VALUE_MOD(libraryView)
@@ -887,6 +1018,11 @@ void Settings::saveGroupMultiple(bool v)
     SET_VALUE_MOD(groupMultiple)
 }
 
+void Settings::saveUseComposer(bool v)
+{
+    SET_VALUE_MOD(useComposer)
+}
+
 void Settings::saveLyricProviders(const QStringList &v)
 {
     SET_VALUE_MOD(lyricProviders)
@@ -937,10 +1073,12 @@ void Settings::saveHiddenPages(const QStringList &v)
     SET_VALUE_MOD(hiddenPages)
 }
 
-void Settings::saveGnomeMediaKeys(bool v)
+#ifndef ENABLE_KDE_SUPPORT
+void Settings::saveMediaKeysIface(const QString &v)
 {
-    SET_VALUE_MOD(gnomeMediaKeys)
+    SET_VALUE_MOD(mediaKeysIface)
 }
+#endif
 
 #ifdef ENABLE_DEVICES_SUPPORT
 void Settings::saveOverwriteSongs(bool v)
@@ -969,7 +1107,6 @@ void Settings::saveStopFadeDuration(int v)
     SET_VALUE_MOD(stopFadeDuration)
 }
 
-#ifdef TAGLIB_FOUND
 void Settings::saveHttpAllocatedPort(int v)
 {
     SET_VALUE_MOD(httpAllocatedPort)
@@ -979,7 +1116,6 @@ void Settings::saveHttpInterface(const QString &v)
 {
     SET_VALUE_MOD(httpInterface)
 }
-#endif
 
 void Settings::savePlayQueueGrouped(bool v)
 {
@@ -1006,6 +1142,11 @@ void Settings::savePlayQueueBackground(bool v)
     SET_VALUE_MOD(playQueueBackground)
 }
 
+void Settings::savePlayQueueConfirmClear(bool v)
+{
+    SET_VALUE_MOD(playQueueConfirmClear);
+}
+
 void Settings::savePlayListsStartClosed(bool v)
 {
     SET_VALUE_MOD(playListsStartClosed)
@@ -1016,11 +1157,6 @@ void Settings::savePlayStream(bool v)
 {
     SET_VALUE_MOD(playStream)
 }
-
-void Settings::saveStreamUrl(const QString &v)
-{
-    SET_VALUE_MOD(streamUrl)
-}
 #endif
 
 #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
@@ -1079,6 +1215,43 @@ void Settings::saveShowTimeRemaining(bool v)
     SET_VALUE_MOD(showTimeRemaining);
 }
 
+void Settings::saveHiddenStreamCategories(const QStringList &v)
+{
+    SET_VALUE_MOD(hiddenStreamCategories);
+}
+
+void Settings::saveHiddenOnlineProviders(const QStringList &v)
+{
+    SET_VALUE_MOD(hiddenOnlineProviders);
+}
+
+#ifndef Q_OS_WIN32
+void Settings::saveInhibitSuspend(bool v)
+{
+    SET_VALUE_MOD(inhibitSuspend);
+}
+#endif
+
+void Settings::saveRssUpdate(int v)
+{
+    SET_VALUE_MOD(rssUpdate);
+}
+
+void Settings::saveLastRssUpdate(const QDateTime &v)
+{
+    SET_VALUE_MOD(lastRssUpdate);
+}
+
+void Settings::savePodcastDownloadPath(const QString &v)
+{
+    SET_VALUE_MOD(podcastDownloadPath);
+}
+
+void Settings::savePodcastAutoDownload(bool v)
+{
+    SET_VALUE_MOD(podcastAutoDownload);
+}
+
 void Settings::save(bool force)
 {
     if (force) {
diff --git a/gui/settings.h b/gui/settings.h
index 22433a6..ebb0add 100644
--- a/gui/settings.h
+++ b/gui/settings.h
@@ -24,6 +24,7 @@
 #ifndef SETTINGS_H
 #define SETTINGS_H
 
+#include <QDateTime>
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KGlobal>
 #include <KDE/KConfig>
@@ -44,6 +45,7 @@ class Wallet;
 #define CFG_GET_INT(CFG, KEY, DEF)        (CFG.readEntry(KEY, DEF))
 #define CFG_GET_BYTE_ARRAY(CFG, KEY)      (CFG.readEntry(KEY, QByteArray()))
 #define CFG_GET_SIZE(CFG, KEY)            (CFG.readEntry(KEY, QSize()))
+#define CFG_GET_DATE_TIME(CFG, KEY)       (CFG.readEntry(KEY, QDateTime()))
 #define CFG_SET_VALUE(CFG, KEY, V)        (CFG.writeEntry(KEY, V))
 #define HAS_GROUP(GRP)                    (KGlobal::config()->hasGroup(GRP))
 #define REMOVE_GROUP(GRP)                 (KGlobal::config()->deleteGroup(GRP))
@@ -54,6 +56,7 @@ class Wallet;
 #define GET_INT(KEY, DEF)                 CFG_GET_INT(cfg, KEY, DEF)
 #define GET_BYTE_ARRAY(KEY)               CFG_GET_BYTE_ARRAY(cfg, KEY)
 #define GET_SIZE(KEY)                     CFG_GET_SIZE(cfg, KEY)
+#define GET_DATE_TIME(KEY)                CFG_GET_DATE_TIME(cfg, KEY)
 #define SET_VALUE(KEY, V)                 CFG_SET_VALUE(cfg, KEY, V)
 #define HAS_ENTRY(KEY)                    (cfg.hasKey(KEY))
 #define CFG_SYNC                          KGlobal::config()->sync()
@@ -64,6 +67,7 @@ class Wallet;
 #define GET_INT(KEY, DEF)        (cfg.contains(KEY) ? cfg.value(KEY).toInt() : DEF)
 #define GET_BYTE_ARRAY(KEY)      (cfg.value(KEY).toByteArray())
 #define GET_SIZE(KEY)            (cfg.contains(KEY) ? cfg.value(KEY).toSize() : QSize())
+#define GET_DATE_TIME(KEY)       (cfg.contains(KEY) ? cfg.value(KEY).toDateTime() : QDateTime())
 #define SET_VALUE(KEY, V)        (cfg.setValue(KEY, V))
 #define HAS_GROUP(GRP)           (-1!=cfg.childGroups().indexOf(GRP))
 #define REMOVE_GROUP(GRP)        (cfg.remove(GRP))
@@ -109,6 +113,7 @@ public:
     bool storeCoversInMpdDir();
     bool storeLyricsInMpdDir();
     bool storeStreamsInMpdDir();
+    bool storeBackdropsInMpdDir();
     int libraryView();
     int albumsView();
     int folderView();
@@ -123,6 +128,7 @@ public:
     bool libraryYear();
     bool groupSingle();
     bool groupMultiple();
+    bool useComposer();
     QStringList lyricProviders();
     QStringList wikipediaLangs();
     bool wikipediaIntroOnly();
@@ -133,7 +139,9 @@ public:
     QByteArray contextSplitterState();
     QString page();
     QStringList hiddenPages();
-    bool gnomeMediaKeys();
+    #ifndef ENABLE_KDE_SUPPORT
+    QString mediaKeysIface();
+    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     bool overwriteSongs();
     bool showDeleteAction();
@@ -141,19 +149,17 @@ public:
     #endif
     int version();
     int stopFadeDuration();
-    #ifdef TAGLIB_FOUND
     int httpAllocatedPort();
     QString httpInterface();
-    #endif
     bool playQueueGrouped();
     bool playQueueAutoExpand();
     bool playQueueStartClosed();
     bool playQueueScroll();
     bool playQueueBackground();
+    bool playQueueConfirmClear();
     bool playListsStartClosed();
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
     bool playStream();
-    QString streamUrl();
     #endif
     #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
     bool cdAuto();
@@ -171,6 +177,21 @@ public:
     bool startHidden();
     bool monoSidebarIcons();
     bool showTimeRemaining();
+    QStringList hiddenStreamCategories();
+    QStringList hiddenOnlineProviders();
+    #ifndef Q_OS_WIN32
+    bool inhibitSuspend();
+    #endif
+    int rssUpdate();
+    QDateTime lastRssUpdate();
+    QString podcastDownloadPath();
+    bool podcastAutoDownload();
+    int maxCoverFindPerIteration();
+    int maxCoverUpdatePerIteration();
+    QStringList cueFileCodecs();
+    bool networkAccessEnabled();
+    bool albumViewLoadAll();
+    int volumeStep();
 
     void removeConnectionDetails(const QString &v);
     void saveConnectionDetails(const MPDConnectionDetails &v);
@@ -190,6 +211,7 @@ public:
     void saveStoreCoversInMpdDir(bool v);
     void saveStoreLyricsInMpdDir(bool v);
     void saveStoreStreamsInMpdDir(bool v);
+    void saveStoreBackdropsInMpdDir(bool v);
     void saveLibraryView(int v);
     void saveAlbumsView(int v);
     void saveFolderView(int v);
@@ -204,6 +226,7 @@ public:
     void saveLibraryYear(bool v);
     void saveGroupSingle(bool v);
     void saveGroupMultiple(bool v);
+    void saveUseComposer(bool v);
     void saveLyricProviders(const QStringList &v);
     void saveWikipediaLangs(const QStringList &v);
     void saveWikipediaIntroOnly(bool v);
@@ -214,26 +237,26 @@ public:
     void saveContextSplitterState(const QByteArray &v);
     void savePage(const QString &v);
     void saveHiddenPages(const QStringList &v);
-    void saveGnomeMediaKeys(bool v);
+    #ifndef ENABLE_KDE_SUPPORT
+    void saveMediaKeysIface(const QString &v);
+    #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     void saveOverwriteSongs(bool v);
     void saveShowDeleteAction(bool v);
     void saveDevicesView(int v);
     #endif
     void saveStopFadeDuration(int v);
-    #ifdef TAGLIB_FOUND
     void saveHttpAllocatedPort(int v);
     void saveHttpInterface(const QString &v);
-    #endif
     void savePlayQueueGrouped(bool v);
     void savePlayQueueAutoExpand(bool v);
     void savePlayQueueStartClosed(bool v);
     void savePlayQueueScroll(bool v);
     void savePlayQueueBackground(bool v);
+    void savePlayQueueConfirmClear(bool v);
     void savePlayListsStartClosed(bool v);
     #ifdef ENABLE_HTTP_STREAM_PLAYBACK
     void savePlayStream(bool v);
-    void saveStreamUrl(const QString &v);
     #endif
     #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
     void saveCdAuto(bool v);
@@ -251,8 +274,17 @@ public:
     void saveStartHidden(bool v);
     void saveMonoSidebarIcons(bool v);
     void saveShowTimeRemaining(bool v);
+    void saveHiddenStreamCategories(const QStringList &v);
+    void saveHiddenOnlineProviders(const QStringList &v);
+    #ifndef Q_OS_WIN32
+    void saveInhibitSuspend(bool v);
+    #endif
+    void saveRssUpdate(int v);
+    void saveLastRssUpdate(const QDateTime &v);
+    void savePodcastDownloadPath(const QString &v);
+    void savePodcastAutoDownload(bool v);
     void save(bool force=false);
-    #ifdef ENABLE_KDE_SUPPORT
+    #if defined ENABLE_KDE_SUPPORT && defined ENABLE_KWALLET
     bool openWallet();
     #else
     QString iconTheme();
@@ -271,7 +303,9 @@ private:
     int ver;
     #ifdef ENABLE_KDE_SUPPORT
     KConfigGroup cfg;
+    #ifdef ENABLE_KWALLET
     KWallet::Wallet *wallet;
+    #endif
     #else
     QSettings cfg;
     #endif
diff --git a/gui/shortcutssettingspage.cpp b/gui/shortcutssettingspage.cpp
new file mode 100644
index 0000000..2b023ad
--- /dev/null
+++ b/gui/shortcutssettingspage.cpp
@@ -0,0 +1,183 @@
+/*
+ * 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 "shortcutssettingspage.h"
+#include "mediakeys.h"
+#include "toolbutton.h"
+#include "actioncollection.h"
+#include "shortcutssettingswidget.h"
+#include "basicitemdelegate.h"
+#include "localize.h"
+#include "settings.h"
+#include "icons.h"
+#include "buddylabel.h"
+#include "utils.h"
+#include <QBoxLayout>
+#include <QComboBox>
+#include <QGroupBox>
+#include <QFormLayout>
+#include <QProcess>
+
+static const char * constMkEnabledVal="mk-enabled-val";
+
+ShortcutsSettingsPage::ShortcutsSettingsPage(QWidget *p)
+    : QWidget(p)
+    , mediaKeysIfaceCombo(0)
+    , settingsButton(0)
+    , mediaKeysEnabled(0)
+{
+    QBoxLayout *lay=new QBoxLayout(QBoxLayout::TopToBottom, this);
+    lay->setMargin(0);
+
+    QHash<QString, ActionCollection *> map;
+    map.insert("Cantata", ActionCollection::get());
+    shortcuts = new ShortcutsSettingsWidget(map, this);
+    shortcuts->view()->setAlternatingRowColors(false);
+    shortcuts->view()->setItemDelegate(new BasicItemDelegate(shortcuts->view()));
+    lay->addWidget(shortcuts);
+
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC
+    Utils::Desktop de=Utils::currentDe();
+    bool useDesktop=true;
+    bool isGnome=Utils::Unity==de || Utils::Gnome==de;
+    #else
+    bool useDesktop=false;
+    bool isGnome=false;
+    #endif
+
+    #ifdef CANTATA_USE_QXT_MEDIAKEYS
+    bool useQxt=true;
+    #else
+    bool useQxt=false;
+    #endif
+
+    if (useDesktop || useQxt) {
+        QGroupBox *box=new QGroupBox(i18n("Multi-Media Keys"));
+
+        if (useDesktop && useQxt) {
+            QBoxLayout *boxLay=new QBoxLayout(QBoxLayout::LeftToRight, box);
+            mediaKeysIfaceCombo=new QComboBox(box);
+            boxLay->addWidget(mediaKeysIfaceCombo);
+            mediaKeysIfaceCombo->addItem(i18n("Do not use media keys to control Cantata"), (unsigned int)MediaKeys::NoInterface);
+            mediaKeysIfaceCombo->addItem(i18n("Use media keys to control Cantata"), (unsigned int)MediaKeys::QxtInterface);
+
+            mediaKeysIfaceCombo->addItem(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"), (unsigned int)MediaKeys::GnomeInteface);
+
+            settingsButton=new ToolButton(box);
+            settingsButton->setToolTip(i18n("Configure..."));
+            settingsButton->setIcon(Icons::self()->configureIcon);
+            boxLay->addWidget(settingsButton);
+            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);
+            mediaKeysEnabled->setProperty(constMkEnabledVal, (unsigned int)MediaKeys::QxtInterface);
+        } else if (useDesktop) {
+            QFormLayout *boxLay=new QFormLayout(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);
+            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);
+            mediaKeysEnabled->setProperty(constMkEnabledVal, (unsigned int)MediaKeys::GnomeInteface);
+            connect(mediaKeysEnabled, SIGNAL(toggled(bool)), settingsButton, SLOT(setEnabled(bool)));
+            connect(settingsButton, SIGNAL(clicked(bool)), SLOT(showGnomeSettings()));
+        }
+        lay->addWidget(box);
+    }
+}
+
+void ShortcutsSettingsPage::load()
+{
+    if (settingsButton) {
+        settingsButton->setEnabled(false);
+    }
+    if (mediaKeysIfaceCombo) {
+        unsigned int iface=(unsigned int)MediaKeys::toIface(Settings::self()->mediaKeysIface());
+        for (int i=0; i<mediaKeysIfaceCombo->count(); ++i) {
+            if (mediaKeysIfaceCombo->itemData(i).toUInt()==iface) {
+                mediaKeysIfaceCombo->setCurrentIndex(i);
+                if (settingsButton) {
+                    settingsButton->setEnabled(iface==MediaKeys::GnomeInteface);
+                }
+                break;
+            }
+        }
+    } else if (mediaKeysEnabled) {
+        mediaKeysEnabled->setChecked(MediaKeys::NoInterface!=MediaKeys::toIface(Settings::self()->mediaKeysIface()));
+        if (settingsButton) {
+            settingsButton->setEnabled(mediaKeysEnabled->isChecked());
+        }
+    }
+}
+
+void ShortcutsSettingsPage::save()
+{
+    shortcuts->save();
+    if (mediaKeysIfaceCombo) {
+        Settings::self()->saveMediaKeysIface(MediaKeys::toString((MediaKeys::InterfaceType)mediaKeysIfaceCombo->itemData(mediaKeysIfaceCombo->currentIndex()).toUInt()));
+    } else if (mediaKeysEnabled) {
+        Settings::self()->saveMediaKeysIface(MediaKeys::toString(
+                                                mediaKeysEnabled->isChecked()
+                                                    ? (MediaKeys::InterfaceType)mediaKeysEnabled->property(constMkEnabledVal).toUInt()
+                                                    : MediaKeys::NoInterface));
+    }
+}
+
+void ShortcutsSettingsPage::mediaKeysIfaceChanged()
+{
+    if (!settingsButton) {
+        return;
+    }
+    settingsButton->setEnabled(MediaKeys::GnomeInteface==mediaKeysIfaceCombo->itemData(mediaKeysIfaceCombo->currentIndex()).toUInt());
+}
+
+void ShortcutsSettingsPage::showGnomeSettings()
+{
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC
+    if (Utils::Unity==Utils::currentDe() && !Utils::findExe("unity-control-center").isEmpty()) {
+        QProcess::startDetached("unity-control-center", QStringList() << "keyboard");
+        return;
+    }
+    #endif
+    QProcess::startDetached("gnome-control-center", QStringList() << "keyboard");
+}
diff --git a/network/proxysettings.h b/gui/shortcutssettingspage.h
similarity index 66%
copy from network/proxysettings.h
copy to gui/shortcutssettingspage.h
index e07fa5a..4296c78 100644
--- a/network/proxysettings.h
+++ b/gui/shortcutssettingspage.h
@@ -21,25 +21,35 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef PROXYSETTINGS_H
-#define PROXYSETTINGS_H
+#ifndef SHORTCUT_SETTINGS_PAGE_H
+#define SHORTCUT_SETTINGS_PAGE_H
 
 #include <QWidget>
-#include "ui_proxysettings.h"
+#include "onoffbutton.h"
 
-class ProxySettings : public QWidget, public Ui::ProxySettings
+class ShortcutsSettingsWidget;
+class QComboBox;
+class ToolButton;
+
+class ShortcutsSettingsPage : public QWidget
 {
-  Q_OBJECT
+    Q_OBJECT
 
 public:
-    ProxySettings(QWidget *parent);
-    ~ProxySettings();
+    ShortcutsSettingsPage(QWidget *p);
 
     void load();
     void save();
 
 private Q_SLOTS:
-    void toggleMode();
+    void mediaKeysIfaceChanged();
+    void showGnomeSettings();
+
+private:
+    ShortcutsSettingsWidget *shortcuts;
+    QComboBox *mediaKeysIfaceCombo;
+    ToolButton *settingsButton;
+    OnOffButton *mediaKeysEnabled;
 };
 
 #endif
diff --git a/gui/stdactions.cpp b/gui/stdactions.cpp
index 92d45f5..6cc9007 100644
--- a/gui/stdactions.cpp
+++ b/gui/stdactions.cpp
@@ -52,8 +52,17 @@ StdActions * StdActions::self()
 
 StdActions::StdActions()
 {
+    prevTrackAction = ActionCollection::get()->createAction("prevtrack", i18n("Previous Track"), Icons::self()->toolbarPrevIcon);
+    nextTrackAction = ActionCollection::get()->createAction("nexttrack", i18n("Next Track"), Icons::self()->toolbarNextIcon);
+    playPauseTrackAction = ActionCollection::get()->createAction("playpausetrack", i18n("Play/Pause"), Icons::self()->toolbarPlayIcon);
+    stopPlaybackAction = ActionCollection::get()->createAction("stopplayback", i18n("Stop"), Icons::self()->toolbarStopIcon);
+    stopAfterCurrentTrackAction = ActionCollection::get()->createAction("stopaftercurrenttrack", i18n("Stop After Current Track"), Icons::self()->toolbarStopIcon);
+    stopAfterTrackAction = ActionCollection::get()->createAction("stopaftertrack", i18n("Stop After Track"), Icons::self()->toolbarStopIcon);
+    increaseVolumeAction = ActionCollection::get()->createAction("increasevolume", i18n("Increase Volume"));
+    decreaseVolumeAction = ActionCollection::get()->createAction("decreasevolume", i18n("Decrease Volume"));
     savePlayQueueAction = ActionCollection::get()->createAction("saveplaylist", i18n("Save As"), "document-save-as");
     addToPlayQueueAction = ActionCollection::get()->createAction("addtoplaylist", i18n("Add To Play Queue"), "list-add");
+    addRandomToPlayQueueAction = ActionCollection::get()->createAction("addrandomalbumstoplaylist", i18n("Add Albums In Random Order"), Icons::self()->shuffleIcon);
     replacePlayQueueAction = ActionCollection::get()->createAction("replaceplaylist", i18n("Replace Play Queue"), "media-playback-start");
     addWithPriorityAction = ActionCollection::get()->createAction("addwithprio", i18n("Add With Priority"), Icon("favorites"));
     addPrioHighestAction = new Action(i18n("Highest Priority (255)"), 0);
@@ -68,7 +77,7 @@ StdActions::StdActions()
     editTagsAction = ActionCollection::get()->createAction("edittags", i18n("Edit Tags"), "document-edit");
     #endif
     #ifdef ENABLE_REPLAYGAIN_SUPPORT
-    replaygainAction = ActionCollection::get()->createAction("replaygain", i18n("ReplayGain"), "audio-x-generic");
+    replaygainAction = ActionCollection::get()->createAction("replaygain", i18n("ReplayGain"), Icons::self()->audioFileIcon);
     #endif
     #ifdef ENABLE_DEVICES_SUPPORT
     copyToDeviceAction = ActionCollection::get()->createAction("copytodevice", i18n("Copy Songs To Device"), "multimedia-player");
diff --git a/gui/stdactions.h b/gui/stdactions.h
index 892541b..2649e65 100644
--- a/gui/stdactions.h
+++ b/gui/stdactions.h
@@ -35,8 +35,17 @@ public:
 
     StdActions();
 
+    Action *nextTrackAction;
+    Action *prevTrackAction;
+    Action *playPauseTrackAction;
+    Action *stopPlaybackAction;
+    Action *stopAfterCurrentTrackAction;
+    Action *stopAfterTrackAction;
+    Action *increaseVolumeAction;
+    Action *decreaseVolumeAction;
     Action *savePlayQueueAction;
     Action *addToPlayQueueAction;
+    Action *addRandomToPlayQueueAction;
     Action *replacePlayQueueAction;
     Action *addWithPriorityAction;
     Action *addToStoredPlaylistAction;
diff --git a/gui/trayitem.cpp b/gui/trayitem.cpp
index 82fef04..dc326a8 100644
--- a/gui/trayitem.cpp
+++ b/gui/trayitem.cpp
@@ -26,7 +26,7 @@
 #include <KDE/KMenu>
 #include <QPixmap>
 #endif
-#ifndef Q_OS_WIN
+#ifdef QT_QTDBUS_FOUND
 #include "notify.h"
 #endif
 #include "localize.h"
@@ -35,13 +35,40 @@
 #include "action.h"
 #include "icons.h"
 #include "song.h"
+#include "stdactions.h"
+
+class VolumeSliderEventHandler : public QObject
+{
+public:
+    VolumeSliderEventHandler(QObject *p) : QObject(p) { }
+protected:
+    bool eventFilter(QObject *obj, QEvent *event)
+    {
+        if (QEvent::Wheel==event->type()) {
+            int numDegrees = static_cast<QWheelEvent *>(event)->delta() / 8;
+            int numSteps = numDegrees / 15;
+            if (numSteps > 0) {
+                for (int i = 0; i < numSteps; ++i) {
+                    StdActions::self()->increaseVolumeAction->trigger();
+                }
+            } else {
+                for (int i = 0; i > numSteps; --i) {
+                    StdActions::self()->decreaseVolumeAction->trigger();
+                }
+            }
+            return true;
+        }
+
+        return QObject::eventFilter(obj, event);
+    }
+};
 
 TrayItem::TrayItem(MainWindow *p)
     : QObject(p)
     , mw(p)
     , trayItem(0)
     , trayItemMenu(0)
-    #ifndef Q_OS_WIN
+    #ifdef QT_QTDBUS_FOUND
     , notification(0)
     #endif
 {
@@ -73,11 +100,11 @@ void TrayItem::setup()
     trayItem->setToolTip("cantata", i18n("Cantata"), QString());
 
     trayItemMenu = new KMenu(0);
-    trayItemMenu->addAction(mw->prevTrackAction);
-    trayItemMenu->addAction(mw->playPauseTrackAction);
-    trayItemMenu->addAction(mw->stopPlaybackAction);
-    trayItemMenu->addAction(mw->stopAfterCurrentTrackAction);
-    trayItemMenu->addAction(mw->nextTrackAction);
+    trayItemMenu->addAction(StdActions::self()->prevTrackAction);
+    trayItemMenu->addAction(StdActions::self()->playPauseTrackAction);
+    trayItemMenu->addAction(StdActions::self()->stopPlaybackAction);
+    trayItemMenu->addAction(StdActions::self()->stopAfterCurrentTrackAction);
+    trayItemMenu->addAction(StdActions::self()->nextTrackAction);
     trayItem->setContextMenu(trayItemMenu);
     trayItem->setStatus(KStatusNotifierItem::Active);
     trayItemMenu->addSeparator();
@@ -92,13 +119,13 @@ void TrayItem::setup()
     }
 
     trayItem = new QSystemTrayIcon(this);
-    trayItem->installEventFilter(mw->volumeSliderEventHandler);
+    trayItem->installEventFilter(new VolumeSliderEventHandler(this));
     trayItemMenu = new QMenu(0);
-    trayItemMenu->addAction(mw->prevTrackAction);
-    trayItemMenu->addAction(mw->playPauseTrackAction);
-    trayItemMenu->addAction(mw->stopPlaybackAction);
-    trayItemMenu->addAction(mw->stopAfterCurrentTrackAction);
-    trayItemMenu->addAction(mw->nextTrackAction);
+    trayItemMenu->addAction(StdActions::self()->prevTrackAction);
+    trayItemMenu->addAction(StdActions::self()->playPauseTrackAction);
+    trayItemMenu->addAction(StdActions::self()->stopPlaybackAction);
+    trayItemMenu->addAction(StdActions::self()->stopAfterCurrentTrackAction);
+    trayItemMenu->addAction(StdActions::self()->nextTrackAction);
     trayItemMenu->addSeparator();
     trayItemMenu->addAction(mw->restoreAction);
     trayItemMenu->addSeparator();
@@ -125,9 +152,9 @@ void TrayItem::trayItemScrollRequested(int delta, Qt::Orientation orientation)
 {
     if (Qt::Vertical==orientation) {
         if (delta>0) {
-            mw->increaseVolumeAction->trigger();
+            StdActions::self()->increaseVolumeAction->trigger();
         } else if(delta<0) {
-            mw->decreaseVolumeAction->trigger();
+            StdActions::self()->decreaseVolumeAction->trigger();
         }
     }
 }
@@ -188,7 +215,7 @@ void TrayItem::songChanged(const Song &song, bool isPlaying)
                 trayItem->setToolTip(i18n("Cantata")+"\n\n"+text);
                 #endif // ENABLE_KDE_SUPPORT
             }
-            #ifndef Q_OS_WIN
+            #ifdef QT_QTDBUS_FOUND
             if (Settings::self()->showPopups() && isPlaying) {
                 if (!notification) {
                     notification=new Notify(this);
diff --git a/gui/trayitem.h b/gui/trayitem.h
index 9551e72..d0a4aa1 100644
--- a/gui/trayitem.h
+++ b/gui/trayitem.h
@@ -25,7 +25,6 @@
 #define TRAYITEM_H
 
 #include <QObject>
-
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KStatusNotifierItem>
 class KMenu;
@@ -34,7 +33,9 @@ class KMenu;
 #include "icon.h"
 class QMenu;
 #endif
-#ifndef Q_OS_WIN
+#include "config.h"
+
+#ifdef QT_QTDBUS_FOUND
 class Notify;
 #endif
 class MainWindow;
@@ -92,7 +93,7 @@ private:
     QSystemTrayIcon *trayItem;
     QMenu *trayItemMenu;
     #endif
-    #ifndef Q_OS_WIN
+    #ifdef QT_QTDBUS_FOUND
     Notify *notification;
     #endif
 };
diff --git a/http/httpserver.cpp b/http/httpserver.cpp
index a552832..569153e 100644
--- a/http/httpserver.cpp
+++ b/http/httpserver.cpp
@@ -23,9 +23,12 @@
 
 #include "httpserver.h"
 #include "httpsocket.h"
+#ifdef TAGLIB_FOUND
 #include "tags.h"
+#endif
 #include "settings.h"
 #include "thread.h"
+#include <QFile>
 #include <QUrl>
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
@@ -35,6 +38,27 @@
 K_GLOBAL_STATIC(HttpServer, instance)
 #endif
 
+#include <QDebug>
+static bool debugIsEnabled=false;
+#define DBUG if (debugIsEnabled) qWarning() << "HttpServer" << __FUNCTION__
+
+#ifdef Q_OS_WIN
+static inline QString fixWindowsPath(const QString &f)
+{
+    return f.length()>3 && f.startsWith(QLatin1Char('/')) && QLatin1Char(':')==f.at(2) ? f.mid(1) : f;
+}
+#endif
+
+void HttpServer::enableDebug()
+{
+    debugIsEnabled=true;
+}
+
+bool HttpServer::debugEnabled()
+{
+    return debugIsEnabled;
+}
+
 HttpServer * HttpServer::self()
 {
     #ifdef ENABLE_KDE_SUPPORT
@@ -108,6 +132,7 @@ bool HttpServer::isOurs(const QString &url) const
 
 QByteArray HttpServer::encodeUrl(const Song &s) const
 {
+    DBUG << "song" << s.file << isAlive();
     if (!isAlive()) {
         return QByteArray();
     }
@@ -131,6 +156,9 @@ QByteArray HttpServer::encodeUrl(const Song &s) const
     if (!s.albumartist.isEmpty()) {
         query.addQueryItem("albumartist", s.albumartist);
     }
+    if (!s.composer.isEmpty()) {
+        query.addQueryItem("composer", s.composer);
+    }
     if (!s.title.isEmpty()) {
         query.addQueryItem("title", s.title);
     }
@@ -154,19 +182,47 @@ QByteArray HttpServer::encodeUrl(const Song &s) const
     #if QT_VERSION >= 0x050000
     url.setQuery(query);
     #endif
+    DBUG << "encoded as" << url.toString();
     return url.toEncoded();
 }
 
 QByteArray HttpServer::encodeUrl(const QString &file) const
 {
-    Song s=Tags::read(file);
+    Song s;
+    #ifdef Q_OS_WIN
+    QString f=fixWindowsPath(file);
+    DBUG << "file" << f << "orig" << file;
+    // For some reason, drag'n' drop of \\share\path\file.mp3 is changed to share/path/file.mp3!
+    if (!f.startsWith(QLatin1String("//")) && !QFile::exists(f)) {
+        QString share=f.startsWith(QLatin1Char('/')) ? (QLatin1Char('/')+f) : (QLatin1String("//")+f);
+        if (QFile::exists(share)) {
+            f=share;
+            DBUG << "converted to share-path" << f;
+        }
+    }
+    #ifdef TAGLIB_FOUND
+    s=Tags::read(f);
+    #endif
+    s.file=f;
+    #else
+    DBUG << "file" << file;
+    #ifdef TAGLIB_FOUND
+    s=Tags::read(file);
+    #endif
     s.file=file;
+    #endif
     return encodeUrl(s);
 }
 
 Song HttpServer::decodeUrl(const QString &url) const
 {
+    #if QT_VERSION >= 0x050000
     return decodeUrl(QUrl(url));
+    #else
+    QUrl u;
+    u.setEncodedUrl(url.toUtf8());
+    return decodeUrl(u);
+    #endif
 }
 
 Song HttpServer::decodeUrl(const QUrl &url) const
@@ -188,6 +244,9 @@ Song HttpServer::decodeUrl(const QUrl &url) const
         if (q.hasQueryItem("albumartist")) {
             s.albumartist=q.queryItemValue("albumartist");
         }
+        if (q.hasQueryItem("composer")) {
+            s.composer=q.queryItemValue("composer");
+        }
         if (q.hasQueryItem("title")) {
             s.title=q.queryItemValue("title");
         }
@@ -211,12 +270,16 @@ Song HttpServer::decodeUrl(const QUrl &url) const
         }
         s.file=url.path();
         s.type=Song::CantataStream;
+        #ifdef Q_OS_WIN
+        s.file=fixWindowsPath(s.file);
+        #endif
         #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
         if (s.file.startsWith(QChar('/')+Song::constCddaProtocol)) {
             s.file=s.file.mid(1);
             s.type=Song::Cdda;
         }
         #endif
+        DBUG << s.file << s.albumArtist() << s.album << s.title;
     }
 
     return s;
diff --git a/http/httpserver.h b/http/httpserver.h
index 9be3789..231898e 100644
--- a/http/httpserver.h
+++ b/http/httpserver.h
@@ -27,6 +27,7 @@
 #include <qglobal.h>
 #include <QByteArray>
 #include "song.h"
+#include "config.h"
 
 class HttpSocket;
 class Thread;
@@ -35,6 +36,9 @@ class QUrl;
 class HttpServer
 {
 public:
+    static void enableDebug();
+    static bool debugEnabled();
+
     static HttpServer * self();
 
     HttpServer() : thread(0), socket(0) { }
diff --git a/http/httpsocket.cpp b/http/httpsocket.cpp
index 1291c4a..8705921 100644
--- a/http/httpsocket.cpp
+++ b/http/httpsocket.cpp
@@ -43,12 +43,11 @@
 #include <KDE/KMimeType>
 #endif
 #include <QFileInfo>
-#ifdef TAGLIB_FOUND
-#include <taglib/oggflacfile.h>
-#include <taglib/trueaudiofile.h>
-#include <taglib/vorbisfile.h>
-#include <taglib/audioproperties.h>
+#if defined TAGLIB_FOUND && !defined ENABLE_EXTERNAL_TAGS
+#include "tags.h"
 #endif
+#include <QDebug>
+#define DBUG if (HttpServer::debugEnabled()) qWarning() << "HttpSocket" << __FUNCTION__
 
 static QString detectMimeType(const QString &file)
 {
@@ -62,83 +61,82 @@ static QString detectMimeType(const QString &file)
     if (suffix == QLatin1String("mp3")) {
         return QLatin1String("audio/mpeg");
     }
-    #ifdef TAGLIB_FOUND
+    #if defined TAGLIB_FOUND && !defined ENABLE_EXTERNAL_TAGS
+    if (suffix == QLatin1String("ogg")) {
+        return Tags::oggMimeType(file);
+    }
+    #else
     if (suffix == QLatin1String("ogg")) {
-        #ifdef Q_OS_WIN32
-        const wchar_t *encodedName = reinterpret_cast< const wchar_t * >(file.utf16());
-        #elif defined COMPLEX_TAGLIB_FILENAME
-        const wchar_t *encodedName = reinterpret_cast< const wchar_t * >(file.utf16());
-        #else
-        QByteArray fileName = QFile::encodeName(file);
-        const char *encodedName = fileName.constData(); // valid as long as fileName exists
-        #endif
-
-        QString mime;
-        TagLib::File *result = new TagLib::Ogg::Vorbis::File(encodedName, false, TagLib::AudioProperties::Fast);
-        if (result->isValid()) {
-            mime=QLatin1String("audio/x-vorbis+ogg");
-        }
-        delete result;
-        if (mime.isEmpty()) {
-            result = new TagLib::Ogg::FLAC::File(encodedName, false, TagLib::AudioProperties::Fast);
-            if (result->isValid()) {
-                mime=QLatin1String("audio/x-flac+ogg");
-            }
-            delete result;
-        }
-        if (mime.isEmpty()) {
-            result = new TagLib::TrueAudio::File(encodedName, false, TagLib::AudioProperties::Fast);
-            if (result->isValid()) {
-                mime=QLatin1String("audio/x-speex+ogg");
-            }
-            delete result;
-        }
         return QLatin1String("audio/ogg");
     }
     #endif
-    else if (suffix == QLatin1String("flac")) {
+    if (suffix == QLatin1String("flac")) {
         return QLatin1String("audio/x-flac");
-    } else if (suffix == QLatin1String("wma")) {
+    }
+    if (suffix == QLatin1String("wma")) {
         return QLatin1String("audio/x-ms-wma");
-    } else if (suffix == QLatin1String("m4a") || suffix == QLatin1String("m4b") || suffix == QLatin1String("m4p") || suffix == QLatin1String("mp4")) {
+    }
+    if (suffix == QLatin1String("m4a") || suffix == QLatin1String("m4b") || suffix == QLatin1String("m4p") || suffix == QLatin1String("mp4")) {
         return QLatin1String("audio/mp4");
-    } else if (suffix == QLatin1String("wav")) {
+    }
+    if (suffix == QLatin1String("wav")) {
         return QLatin1String("audio/x-wav");
-    } else if (suffix == QLatin1String("wv") || suffix == QLatin1String("wvp")) {
+    }
+    if (suffix == QLatin1String("wv") || suffix == QLatin1String("wvp")) {
         return QLatin1String("audio/x-wavpack");
-    } else if (suffix == QLatin1String("ape")) {
+    }
+    if (suffix == QLatin1String("ape")) {
         return QLatin1String("audio/x-monkeys-audio"); // "audio/x-ape";
-    } else if (suffix == QLatin1String("spx")) {
+    }
+    if (suffix == QLatin1String("spx")) {
         return QLatin1String("audio/x-speex");
-    } else if (suffix == QLatin1String("tta")) {
+    }
+    if (suffix == QLatin1String("tta")) {
         return QLatin1String("audio/x-tta");
-    } else if (suffix == QLatin1String("aiff") || suffix == QLatin1String("aif") || suffix == QLatin1String("aifc")) {
+    }
+    if (suffix == QLatin1String("aiff") || suffix == QLatin1String("aif") || suffix == QLatin1String("aifc")) {
         return QLatin1String("audio/x-aiff");
-    } else if (suffix == QLatin1String("mpc") || suffix == QLatin1String("mpp") || suffix == QLatin1String("mp+")) {
+    }
+    if (suffix == QLatin1String("mpc") || suffix == QLatin1String("mpp") || suffix == QLatin1String("mp+")) {
         return QLatin1String("audio/x-musepack");
-    } else if (suffix == QLatin1String("dff")) {
+    }
+    if (suffix == QLatin1String("dff")) {
         return QLatin1String("application/x-dff");
-    } else if (suffix == QLatin1String("dsf")) {
+    }
+    if (suffix == QLatin1String("dsf")) {
         return QLatin1String("application/x-dsf");
     }
+    if (suffix == QLatin1String("opus")) {
+        return QLatin1String("audio/opus");
+    }
 
     return QString();
 }
 
-static void writeMimeType(const QString &mimeType, QTcpSocket *socket, qint32 size, bool allowSeek)
+static void writeMimeType(const QString &mimeType, QTcpSocket *socket, qint32 from, qint32 size, bool allowSeek)
 {
     if (!mimeType.isEmpty()) {
         QTextStream os(socket);
         os.setAutoDetectUnicode(true);
         if (allowSeek) {
-            os << "HTTP/1.0 200 OK"
-               << "\r\nAccept-Ranges: bytes"
-               << "\r\nContent-Length: " << QString::number(size)
-               << "\r\nContent-Type: " << mimeType << "\r\n\r\n";
+            if (0==from) {
+                os << "HTTP/1.0 200 OK"
+                   << "\r\nAccept-Ranges: bytes"
+                   << "\r\nContent-Length: " << QString::number(size)
+                   << "\r\nContent-Type: " << mimeType << "\r\n\r\n";
+            } else {
+                os << "HTTP/1.0 200 OK"
+                   << "\r\nAccept-Ranges: bytes"
+                   << "\r\nContent-Range: bytes " << QString::number(from) << "-" << QString::number(size-1) << "/" << QString::number(size)
+                   << "\r\nContent-Length: " << QString::number(size-from)
+                   << "\r\nContent-Type: " << mimeType << "\r\n\r\n";
+            }
+            DBUG << mimeType << QString::number(size) << "Can seek";
         } else {
             os << "HTTP/1.0 200 OK"
                << "\r\nContent-Length: " << QString::number(size)
                << "\r\nContent-Type: " << mimeType << "\r\n\r\n";
+            DBUG << mimeType << QString::number(size);
         }
     }
 }
@@ -260,6 +258,11 @@ HttpSocket::HttpSocket(const QString &iface, quint16 port)
     if (isListening() && ifaceAddress.isEmpty()) {
         ifaceAddress=QLatin1String("127.0.0.1");
     }
+
+    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 HttpSocket::openPort(const QHostAddress &a, quint16 p)
@@ -314,7 +317,22 @@ void HttpSocket::readClient()
         if (tokens.length()>=2 && "GET"==tokens[0]) {
             QStringList params = QString(socket->readAll()).split(QRegExp("[\r\n][\r\n]*"));
 
+            DBUG << "params" << params << "tokens" << tokens;
             if (!isFromMpd(params)) {
+                sendErrorResponse(socket, 400);
+                socket->close();
+                DBUG << "Not from MPD";
+                return;
+            }
+
+            QString peer=socket->peerAddress().toString();
+            bool hostOk=peer==ifaceAddress || peer==mpdAddr || peer==QLatin1String("127.0.0.1");
+
+            DBUG << "peer:" << peer << "mpd:" << mpdAddr << "iface:" << ifaceAddress << "ok:" << hostOk;
+            if (!hostOk) {
+                sendErrorResponse(socket, 400);
+                socket->close();
+                DBUG << "Not from valid host";
                 return;
             }
 
@@ -330,8 +348,17 @@ void HttpSocket::readClient()
             qint32 readBytesTo=0;
             getRange(params, readBytesFrom, readBytesTo);
 
+            DBUG << "readBytesFrom" << readBytesFrom << "readBytesTo" << readBytesTo;
             if (q.hasQueryItem("cantata")) {
                 Song song=HttpServer::self()->decodeUrl(url);
+
+                if (!isCantataStream(song.file)) {
+                    sendErrorResponse(socket, 400);
+                    socket->close();
+                    DBUG << "Not cantata stream file";
+                    return;
+                }
+
                 if (song.isCdda()) {
                     #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
                     QStringList parts=song.file.split("/", QString::SkipEmptyParts);
@@ -344,19 +371,23 @@ void HttpSocket::readClient()
                             int lastSector = cdparanoia.lastSectorOfTrack(song.id);
                             qint32 totalSize = ((lastSector-firstSector)+1)*CD_FRAMESIZE_RAW;
                             int count = 0;
-                            //int bytesToDiscard = 0; // Number of bytes to discard in first read sector due to range request in HTTP header
+//                            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;
+//                            }
 
-                            //if (readBytesFrom>0) {
-                            //    int sectorsToSeek=readBytesFrom/CD_FRAMESIZE_RAW;
-                            //    firstSector+=sectorsToSeek;
-                            //    bytesToDiscard=readBytesFrom-(sectorsToSeek*CD_FRAMESIZE_RAW);
-                            //}
+//                            if (readBytesFrom>0) {
+//                                int sectorsToSeek=readBytesFrom/CD_FRAMESIZE_RAW;
+//                                firstSector+=sectorsToSeek;
+//                                bytesToDiscard=readBytesFrom-(sectorsToSeek*CD_FRAMESIZE_RAW);
+//                            }
                             cdparanoia.seek(firstSector, SEEK_SET);
                             ok=true;
-                            writeMimeType(QLatin1String("audio/x-wav"), socket, totalSize+ExtractJob::constWavHeaderSize, false);
-                            //if (0==readBytesFrom) { // Only write header if we are no seeking...
+                            writeMimeType(QLatin1String("audio/x-wav"), socket, readBytesFrom, totalSize+ExtractJob::constWavHeaderSize, false);
+                            if (0==readBytesFrom) { // Only write header if we are not seeking...
                                 ExtractJob::writeWavHeader(*socket, totalSize);
-                            //}
+                            }
                             bool stop=false;
                             while (!terminated && (firstSector+count) <= lastSector && !stop) {
                                 qint16 *buf = cdparanoia.read();
@@ -367,33 +398,38 @@ void HttpSocket::readClient()
                                 qint32 writePos=0;
                                 qint32 toWrite=CD_FRAMESIZE_RAW;
 
-                                //if (0==count && bytesToDiscard) {
-                                //    writePos=bytesToDiscard;
-                                //    toWrite-=bytesToDiscard;
-                                //    bytesToDiscard=0;
-                                //}
-
-                                do {
-                                    qint32 bytesWritten=socket->write(&buffer[writePos], toWrite - writePos);
-                                    if (terminated || -1==bytesWritten) {
-                                        stop=true;
-                                        break;
-                                    }
-                                    socket->flush();
-                                    writePos+=bytesWritten;
-                                } while (!terminated && writePos<toWrite);
+//                                if (bytesToDiscard>0) {
+//                                    int toSkip=qMin(toWrite, bytesToDiscard);
+//                                    writePos=toSkip;
+//                                    toWrite-=toSkip;
+//                                    bytesToDiscard-=toSkip;
+//                                }
+
+                                if (toWrite>0 && !write(socket, &buffer[writePos], toWrite, stop)) {
+                                    break;
+                                }
                                 count++;
                             }
                         }
                     }
                     #endif
-                } else {
-                    QFile f(url.path());
+                } else if (!song.file.isEmpty()) {
+                    #ifdef Q_OS_WIN
+                    if (tokens[1].startsWith("//") && !song.file.startsWith(QLatin1String("//")) && !QFile::exists(song.file)) {
+                        QString share=QLatin1String("//")+url.host()+song.file;
+                        if (QFile::exists(share)) {
+                            song.file=share;
+                            DBUG << "fixed share-path" << song.file;
+                        }
+                    }
+                    #endif
+
+                    QFile f(song.file);
 
                     if (f.open(QIODevice::ReadOnly)) {                        
                         qint32 totalBytes = f.size();
 
-                        writeMimeType(detectMimeType(url.path()), socket, totalBytes, true);
+                        writeMimeType(detectMimeType(song.file), socket, readBytesFrom, totalBytes, true);
                         ok=true;
                         static const int constChunkSize=32768;
                         char buffer[constChunkSize];
@@ -416,43 +452,17 @@ void HttpSocket::readClient()
                             do {
                                 bytesRead = f.read(buffer, constChunkSize);
                                 readPos+=bytesRead;
-                                if (bytesRead<0 || terminated) {
+                                if (!write(socket, buffer, bytesRead, stop) || f.atEnd()) {
                                     break;
                                 }
-
-                                qint32 writePos=0;
-                                do {
-                                    qint32 bytesWritten = socket->write(&buffer[writePos], bytesRead - writePos);
-                                    if (terminated || -1==bytesWritten) {
-                                        stop=true;
-                                        break;
-                                    }
-                                    socket->flush();
-                                    writePos+=bytesWritten;
-                                } while (writePos<bytesRead);
-
-                                if (f.atEnd()) {
-                                    break;
-                                }
-                                if (QAbstractSocket::ConnectedState==socket->state()) {
-                                    socket->waitForBytesWritten();
-                                }
-                                if (QAbstractSocket::ConnectedState!=socket->state()) {
-                                    break;
-                                }
-                            } while ((readPos+bytesRead)<totalBytes && !stop && !terminated);
+                            } while (readPos<totalBytes && !stop && !terminated);
                         }
                     }
                 }
             }
 
             if (!ok) {
-                QTextStream os(socket);
-                os.setAutoDetectUnicode(true);
-                os << "HTTP/1.0 404 Ok\r\n"
-                      "Content-Type: text/html; charset=\"utf-8\"\r\n"
-                      "\r\n"
-                      "<h1>Nothing to see here</h1>\n";
+                sendErrorResponse(socket, 404);
             }
 
             socket->close();
@@ -469,3 +479,83 @@ void HttpSocket::discardClient()
     QTcpSocket *socket = (QTcpSocket*)sender();
     socket->deleteLater();
 }
+
+
+void HttpSocket::mpdAddress(const QString &a)
+{
+    mpdAddr=a;
+}
+
+bool HttpSocket::isCantataStream(const QString &file) const
+{
+    DBUG << file << newlyAddedFiles.contains(file) << streamIds.values().contains(file);
+    return newlyAddedFiles.contains(file) || streamIds.values().contains(file);
+}
+
+void HttpSocket::sendErrorResponse(QTcpSocket *socket, int code)
+{
+    QTextStream os(socket);
+    os.setAutoDetectUnicode(true);
+    os << "HTTP/1.0 " << code << " OK\r\n"
+          "Content-Type: text/html; charset=\"utf-8\"\r\n"
+          "\r\n";
+}
+
+void HttpSocket::cantataStreams(const QStringList &files)
+{
+    DBUG << files;
+    foreach (const QString &f, files) {
+        Song s=HttpServer::self()->decodeUrl(f);
+        if (s.isCantataStream() || s.isCdda()) {
+            DBUG << s.file;
+            newlyAddedFiles+=s.file;
+        }
+    }
+}
+
+void HttpSocket::cantataStreams(const QList<Song> &songs, bool isUpdate)
+{
+    DBUG << isUpdate << songs.count();
+    if (!isUpdate) {
+        streamIds.clear();
+    }
+
+    foreach (const Song &s, songs) {
+        DBUG << s.file;
+        streamIds.insert(s.id, s.file);
+        newlyAddedFiles.remove(s.file);
+    }
+}
+
+void HttpSocket::removedIds(const QSet<qint32> &ids)
+{
+    foreach (qint32 id, ids) {
+        streamIds.remove(id);
+    }
+}
+
+bool HttpSocket::write(QTcpSocket *socket, char *buffer, qint32 bytesRead, bool &stop)
+{
+    if (bytesRead<0 || terminated) {
+        return false;
+    }
+
+    qint32 writePos=0;
+    do {
+        qint32 bytesWritten = socket->write(&buffer[writePos], bytesRead - writePos);
+        if (terminated || -1==bytesWritten) {
+            stop=true;
+            break;
+        }
+        socket->flush();
+        writePos+=bytesWritten;
+    } while (writePos<bytesRead);
+
+    if (QAbstractSocket::ConnectedState==socket->state()) {
+        socket->waitForBytesWritten();
+    }
+    if (QAbstractSocket::ConnectedState!=socket->state()) {
+        return false;
+    }
+    return true;
+}
diff --git a/http/httpsocket.h b/http/httpsocket.h
index 9e86926..2ac951b 100644
--- a/http/httpsocket.h
+++ b/http/httpsocket.h
@@ -25,32 +25,49 @@
 #define _HTTP_SOCKET_H_
 
 #include <QTcpServer>
+#include <QMap>
+#include <QList>
+#include <QSet>
 
+class Song;
 class QHostAddress;
+class QTcpSocket;
 
 class HttpSocket : public QTcpServer
 {
     Q_OBJECT
 
 public:
-     HttpSocket(const QString &iface, quint16 port);
-     virtual ~HttpSocket() { }
+    HttpSocket(const QString &iface, quint16 port);
+    virtual ~HttpSocket() { }
 
-     void terminate();
-     void incomingConnection(int socket);
-     QString address() const { return ifaceAddress; }
-     QString configuredInterface() { return cfgInterface; }
+    void terminate();
+    void incomingConnection(int socket);
+    QString address() const { return ifaceAddress; }
+    QString configuredInterface() { return cfgInterface; }
 
 private:
-     bool openPort(const QHostAddress &a, quint16 p);
+    bool openPort(const QHostAddress &a, quint16 p);
+    bool isCantataStream(const QString &file) const;
+    void sendErrorResponse(QTcpSocket *socket, int code);
 
 private Q_SLOTS:
-     void readClient();
-     void discardClient();
+    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);
 
 private:
+    bool write(QTcpSocket *socket, char *buffer, qint32 bytesRead, bool &stop);
+
+private:
+    QSet<QString> newlyAddedFiles; // Holds cantata strema filenames as added to MPD via "add"
+    QMap<qint32, QString> streamIds; // Maps MPD playqueue song ID to fileName
     QString cfgInterface;
     QString ifaceAddress;
+    QString mpdAddr;
     bool terminated;
 };
 
diff --git a/icons/cantata.svg b/icons/cantata.svg
index 2de14b1..1c428ea 100644
--- a/icons/cantata.svg
+++ b/icons/cantata.svg
@@ -1,45 +1,45 @@
-<svg viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128">
 <defs>
 <filter id="AI_Sfocatura_4">
 <feGaussianBlur stdDeviation="4"/>
 </filter>
-<linearGradient gradientUnits="userSpaceOnUse" id="linearGradient3242" x1="17.9487" x2="110.0518">
-<stop offset="0" stop-color="#fff"/>
-<stop offset="0.8" stop-color="#fff" stop-opacity="0"/>
+<linearGradient id="linearGradient3242" gradientUnits="userSpaceOnUse" x2="110.05" x1="17.949">
+<stop stop-color="#fff" offset="0"/>
+<stop stop-color="#fff" stop-opacity="0" offset=".8"/>
 </linearGradient>
-<linearGradient gradientUnits="userSpaceOnUse" id="linearGradient3251" x2="0" y1="116" y2="0.0005">
-<stop offset="0" stop-color="#555"/>
-<stop offset="0.274" stop-color="#595959"/>
-<stop offset="0.562" stop-color="#666"/>
-<stop offset="0.856" stop-color="#7b7b7b"/>
-<stop offset="1" stop-color="#888"/>
+<linearGradient id="linearGradient3251" gradientUnits="userSpaceOnUse" x2="0" y2=".0005" y1="116">
+<stop stop-color="#555" offset="0"/>
+<stop stop-color="#595959" offset=".274"/>
+<stop stop-color="#666" offset=".562"/>
+<stop stop-color="#7b7b7b" offset=".856"/>
+<stop stop-color="#888" offset="1"/>
 </linearGradient>
 <linearGradient id="linearGradient3579">
-<stop offset="0" stop-color="#fff"/>
-<stop offset="1" stop-color="#fff" stop-opacity="0"/>
+<stop stop-color="#fff" offset="0"/>
+<stop stop-color="#fff" stop-opacity="0" offset="1"/>
 </linearGradient>
-<linearGradient gradientTransform="matrix(1.2691,-0.13167,0.08088,0.77957,0,0)" gradientUnits="userSpaceOnUse" id="linearGradient10462" x1="-19.0399" x2="15.2238" xlink:href="#linearGradient3579" y1="52.7139" y2="111.3392"/>
-<linearGradient gradientTransform="matrix(0.60451,-0.06272,0.1698,1.63661,0,0)" gradientUnits="userSpaceOnUse" id="linearGradient10464" x1="71.0883" x2="97.3432" xlink:href="#linearGradient3579" y1="-6.6212" y2="37.1639"/>
-<linearGradient gradientTransform="scale(0.583,1.715)" gradientUnits="userSpaceOnUse" id="linearGradient13837" x1="95.2246" x2="156.68" xlink:href="#linearGradient3579" y1="4.4251" y2="20.7928"/>
-<radialGradient cx="64" cy="64" gradientUnits="userSpaceOnUse" id="radialGradient3246" r="52">
-<stop offset="0" stop-color="#fff"/>
-<stop offset="0.574" stop-color="#fff"/>
-<stop offset="0.684" stop-color="#fbfbfb"/>
-<stop offset="0.8" stop-color="#eee"/>
-<stop offset="0.9" stop-color="#ddd"/>
-<stop offset="1" stop-color="#bbb"/>
+<linearGradient id="linearGradient10462" y2="111.34" xlink:href="#linearGradient3579" gradientUnits="userSpaceOnUse" y1="52.714" gradientTransform="matrix(1.2691 -.13167 .08088 .77957 0 0)" x2="15.224" x1="-19.04"/>
+<linearGradient id="linearGradient10464" y2="37.164" xlink:href="#linearGradient3579" gradientUnits="userSpaceOnUse" y1="-6.6212" gradientTransform="matrix(.60451 -.06272 .1698 1.6366 0 0)" x2="97.343" x1="71.088"/>
+<linearGradient id="linearGradient13837" y2="20.793" xlink:href="#linearGradient3579" gradientUnits="userSpaceOnUse" y1="4.4251" gradientTransform="scale(.583 1.715)" x2="156.68" x1="95.225"/>
+<radialGradient id="radialGradient3246" gradientUnits="userSpaceOnUse" cy="64" cx="64" r="52">
+<stop stop-color="#fff" offset="0"/>
+<stop stop-color="#fff" offset=".574"/>
+<stop stop-color="#fbfbfb" offset=".684"/>
+<stop stop-color="#eee" offset=".8"/>
+<stop stop-color="#ddd" offset=".9"/>
+<stop stop-color="#bbb" offset="1"/>
 </radialGradient>
 </defs>
-<path d="M 116,58a58,58 0 1,0 -116,0 58,58 0 1,0 116,0" fill="url(#linearGradient3251)" transform="matrix(1.10345,0,0,1.10345,0,-2.8e-6)"/>
-<g filter="url(#AI_Sfocatura_4)" opacity="0.8" transform="matrix(1.08333,0,0,1.08333,1.16667,1.16667)">
-<path d="m 10,58c0,26.467 21.533,48 48,48s48-21.533 48-48-21.533-48-48-48-48,21.533-48,48z"/>
+<path transform="matrix(1.10345,0,0,1.10345,0,-2.8e-6)" d="m116 58a58 58 0 1 0 -116 0 58 58 0 1 0 116 0" fill="url(#linearGradient3251)"/>
+<g filter="url(#AI_Sfocatura_4)" opacity=".8" transform="matrix(1.0833 0 0 1.0833 1.1667 1.1667)">
+<path d="m10 58c0 26.467 21.533 48 48 48s48-21.533 48-48-21.533-48-48-48-48 21.533-48 48z"/>
 </g>
-<path d="m 12,64 c 0,28.6726 23.3274,52 52,52 28.6726,0 52,-23.3274 52,-52 C 116,35.3274 92.6726,12 64,12 35.3274,12 12,35.3274 12,64 z" id="path52" style="fill:url(#radialGradient3246)"/>
-<path d="M 64,64 C 81.789,64 97.967,58.87 110.052,50.491 104.2,30.582 85.776,16 64,16 42.224,16 23.799,30.583 17.949,50.491 30.032,58.87 46.21,64 64,64 z" id="path54" style="opacity:0.5;fill:url(#linearGradient3242)"/>
-<g transform="matrix(0.98393,-0.18258,0.25614,0.66198,0.43822,35.06687)" id="g56">
-<path d="M 69,2.3125 C 64.818,9.0354 63.8376,17.8881 60.8464,25.3984 L 48.9062,63.1563 C 37.9066,50.6595 14.2765,58.4077 12.9064,75.1148 9.9696,90.8046 28.3172,105.0021 42.8125,97.8125 56.4869,90.6245 56.8611,73.1864 61.7949,60.3158 L 72.5,24.8437 c 3.6591,9.5669 8.8614,23.0287 -0.8167,30.7965 C 65.6452,58.4897 67.398,69.6743 74.9062,67.375 88.0466,61.9163 92.9191,43.9691 86.9613,31.5148 82.5424,22.2217 76.9498,13.3476 71.7409,4.4321 70.9783,3.7492 70.4752,1.402 69,2.3125 z" id="path58" style="fill:#00438a"/>
-<path d="M 28.3428,60.4153 C 21.0458,62.7709 17.1001,68.146 15.874,74.6433 22.5209,103.1044 30.2836,63.2631 49.2656,68.4559 49.6345,66.4657 40.3035,56.8865 28.3428,60.4152 z" id="path60" style="fill:url(#linearGradient10462)"/>
-<path d="M 50.7056,66.9342 C 55.5071,64.6617 65.4098,16.594 71.681,16.5808 69.841,16.1513 69.5097,13.3407 69.3949,6.7896 69.0669,7.8415 50.9212,67.1565 50.7056,66.9341 z" id="path62" style="fill:url(#linearGradient10464)"/>
-<path d="m 71.5421,16.8521 c 0,0 22.4165,33.8633 6.5183,35.93 3.6566,-4.2925 3.8156,-16.5342 -6.5183,-35.93 z" id="path64" style="fill:url(#linearGradient13837);fill-rule:evenodd"/>
+<path id="path52" fill="url(#radialGradient3246)" d="m12 64c0 28.673 23.327 52 52 52s52-23.327 52-52-23.327-52-52-52-52 23.327-52 52z"/>
+<path id="path54" opacity=".5" fill="url(#linearGradient3242)" d="m64 64c17.789 0 33.967-5.13 46.05-13.509-5.85-19.909-24.274-34.491-46.05-34.491s-40.201 14.583-46.051 34.491c12.083 8.379 28.261 13.509 46.051 13.509z"/>
+<g id="g56" transform="matrix(.98393 -.18258 .25614 .66198 .43822 35.067)">
+<path id="path58" fill="#00438a" d="m69 2.3125c-4.182 6.7229-5.162 15.576-8.154 23.086l-11.94 37.758c-10.999-12.496-34.63-4.748-36 11.959-2.9364 15.69 15.411 29.885 29.906 22.697 13.675-7.188 14.049-24.626 18.983-37.496l10.705-35.472c3.6591 9.5669 8.8614 23.029-0.8167 30.796-6.038 2.85-4.285 14.034 3.223 11.735 13.141-5.459 18.013-23.406 12.055-35.86-4.419-9.293-10.011-18.167-15.22-27.083-0.763-0.6828-1.266-3.03-2.741-2.1195z"/>
+<path id="path60" fill="url(#linearGradient10462)" d="m28.343 60.415c-7.297 2.356-11.243 7.731-12.469 14.228 6.647 28.457 14.41-11.38 33.392-6.187 0.368-1.99-8.962-11.57-20.923-8.041z"/>
+<path id="path62" fill="url(#linearGradient10464)" d="m50.706 66.934c4.801-2.272 14.704-50.34 20.975-50.353-1.84-0.43-2.171-3.24-2.286-9.7914-0.328 1.0519-18.474 60.366-18.689 60.144z"/>
+<path id="path64" fill-rule="evenodd" fill="url(#linearGradient13837)" d="m71.542 16.852s22.416 33.863 6.5183 35.93c3.6566-4.2925 3.8156-16.534-6.5183-35.93z"/>
 </g>
-</svg>
\ No newline at end of file
+</svg>
diff --git a/icons/sidebar-albums-dark.svg b/icons/sidebar-albums-dark.svg
index 52150fb..182b919 100755
--- a/icons/sidebar-albums-dark.svg
+++ b/icons/sidebar-albums-dark.svg
@@ -1,4 +1,4 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m256,0c-141.385,0-256,114.615-256,256s114.615,256 256,256 256-114.615 256-256-114.615-256-256-256zm0,448c-106.039,0-192-85.961-192-192s85.961-192 192-192 192,85.961 192,192-85.961,192-192,192z"/>
-<path d="m256,145.125c-63.3684,0-115.2188,51.8504-115.2188,115.2188s51.8504,115.2188 115.2188,115.2188 115.2188-51.8505 115.2188-115.2188-51.8504-115.2188-115.2188-115.2188zm0,70.9688c24.7884,0 44.25,19.4616 44.25,44.25s-19.4616,44.25-44.25,44.25-44.25-19.4616-44.25-44.25 19.4616-44.25 44.25-44.25z" transform="matrix(.75867,0,0,.75867,61.54063,57.50551)"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m256 0c-141.38 0-256 114.62-256 256s114.62 256 256 256 256-114.62 256-256-114.62-256-256-256zm0 448c-106.04 0-192-85.961-192-192s85.961-192 192-192 192 85.961 192 192-85.961 192-192 192z"/>
+<path d="m256 145.12c-63.368 0-115.22 51.85-115.22 115.22s51.85 115.22 115.22 115.22 115.22-51.85 115.22-115.22-51.85-115.22-115.22-115.22zm0 70.969c24.788 0 44.25 19.462 44.25 44.25s-19.462 44.25-44.25 44.25-44.25-19.462-44.25-44.25 19.462-44.25 44.25-44.25z" transform="matrix(.75867 0 0 .75867 61.541 57.506)"/>
 </svg>
diff --git a/icons/sidebar-albums-light.svg b/icons/sidebar-albums-light.svg
index 5249a05..93a4c03 100644
--- a/icons/sidebar-albums-light.svg
+++ b/icons/sidebar-albums-light.svg
@@ -1,4 +1,4 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m256,0c-141.385,0-256,114.615-256,256s114.615,256 256,256 256-114.615 256-256-114.615-256-256-256zm0,448c-106.039,0-192-85.961-192-192s85.961-192 192-192 192,85.961 192,192-85.961,192-192,192z"/>
-<path d="m256,145.125c-63.3684,0-115.2188,51.8504-115.2188,115.2188s51.8504,115.2188 115.2188,115.2188 115.2188-51.8505 115.2188-115.2188-51.8504-115.2188-115.2188-115.2188zm0,70.9688c24.7884,0 44.25,19.4616 44.25,44.25s-19.4616,44.25-44.25,44.25-44.25-19.4616-44.25-44.25 19.4616-44.25 44.25-44.25z" transform="matrix(.75867,0,0,.75867,61.54063,57.50551)"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m256 0c-141.38 0-256 114.62-256 256s114.62 256 256 256 256-114.62 256-256-114.62-256-256-256zm0 448c-106.04 0-192-85.961-192-192s85.961-192 192-192 192 85.961 192 192-85.961 192-192 192z"/>
+<path d="m256 145.12c-63.368 0-115.22 51.85-115.22 115.22s51.85 115.22 115.22 115.22 115.22-51.85 115.22-115.22-51.85-115.22-115.22-115.22zm0 70.969c24.788 0 44.25 19.462 44.25 44.25s-19.462 44.25-44.25 44.25-44.25-19.462-44.25-44.25 19.462-44.25 44.25-44.25z" transform="matrix(.75867 0 0 .75867 61.541 57.506)"/>
 </svg>
diff --git a/icons/sidebar-artists-dark.svg b/icons/sidebar-artists-dark.svg
index 9a4cd30..4286228 100755
--- a/icons/sidebar-artists-dark.svg
+++ b/icons/sidebar-artists-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m144.503,402.687c9.476-1.494 9.692-27.327 9.692-27.327s-27.844-27.328-33.912-64.076c-16.326,0-26.407-39.069-10.082-52.814-.681-14.47-20.984-113.588 81.799-113.588s82.479,99.118 81.799,113.588c16.327,13.745 6.244,52.814-10.081,52.814-6.067,36.748-33.913,64.076-33.913,64.076s.216,25.833 9.692,27.327c30.524,4.816 144.503,54.658 144.503,109.313h-192-192c0-54.655 113.979-104.497 144.503-109.313zm195.47,8.718c-22.047-13.575-48.813-26.154-70.769-33.712 7.876-11.216 16.647-26.468 22.165-44.531 7.703-6.283 13.972-15.266 17.999-26.301 4.033-11.052 5.561-23.426 4.304-34.842-.902-8.196-3.239-15.833-6.825-22.544 2.175-23.293 3.707-69.017-26.224-102.366-11.607-12.933-26.278-22.23-43.85-27.843 3.137-32.38 19.58-70.385 83.227-70.385 102.782,0 82.479,99.118 81.799,113.588 16.327,13.745 6.244,52.814-10.081,52.814-6.067,36.748-33.913,64.076-33.913,64.076s.216,25.833 9.692,27.327c30.524,4.817 144.503,54.659 144.503,109.314h-164.798c-2.355-1.537-4.753-3.07-7.229-4.595z"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m144.5 402.69c9.476-1.494 9.692-27.327 9.692-27.327s-27.844-27.328-33.912-64.076c-16.326 0-26.407-39.069-10.082-52.814-0.681-14.47-20.984-113.59 81.799-113.59s82.479 99.118 81.799 113.59c16.327 13.745 6.244 52.814-10.081 52.814-6.067 36.748-33.913 64.076-33.913 64.076s0.216 25.833 9.692 27.327c30.524 4.816 144.5 54.658 144.5 109.31h-384c0-54.655 113.98-104.5 144.5-109.31zm195.47 8.718c-22.047-13.575-48.813-26.154-70.769-33.712 7.876-11.216 16.647-26.468 22.165-44.531 7.703-6.283 13.972-15.266 17.999-26.301 4.033-11.052 5.561-23.426 4.304-34.842-0.902-8.196-3.239-15.833-6.825-22.544 2.175-23.293 3.707-69.017-26.224-102.37-11.607-12.933-26.278-22.23-43.85-27.843 3.137-32.38 19.58-70.385 83.227-70.385 102.78 0 82.479 99.118 81.799 113.59 16.327 13.745 6.244 52.814-10.081 52.814-6.067 36.748-33.913 64.076-33.913 64.076s0.216 25.833 9.692 27.327c30.524 4.817 144.5 54.659 144.5 109.31h-164.8c-2.355-1.537-4.753-3.07-7.229-4.595z"/>
 </svg>
diff --git a/icons/sidebar-artists-light.svg b/icons/sidebar-artists-light.svg
index a3e49e6..194beba 100644
--- a/icons/sidebar-artists-light.svg
+++ b/icons/sidebar-artists-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m144.503,402.687c9.476-1.494 9.692-27.327 9.692-27.327s-27.844-27.328-33.912-64.076c-16.326,0-26.407-39.069-10.082-52.814-.681-14.47-20.984-113.588 81.799-113.588s82.479,99.118 81.799,113.588c16.327,13.745 6.244,52.814-10.081,52.814-6.067,36.748-33.913,64.076-33.913,64.076s.216,25.833 9.692,27.327c30.524,4.816 144.503,54.658 144.503,109.313h-192-192c0-54.655 113.979-104.497 144.503-109.313zm195.47,8.718c-22.047-13.575-48.813-26.154-70.769-33.712 7.876-11.216 16.647-26.468 22.165-44.531 7.703-6.283 13.972-15.266 17.999-26.301 4.033-11.052 5.561-23.426 4.304-34.842-.902-8.196-3.239-15.833-6.825-22.544 2.175-23.293 3.707-69.017-26.224-102.366-11.607-12.933-26.278-22.23-43.85-27.843 3.137-32.38 19.58-70.385 83.227-70.385 102.782,0 82.479,99.118 81.799,113.588 16.327,13.745 6.244,52.814-10.081,52.814-6.067,36.748-33.913,64.076-33.913,64.076s.216,25.833 9.692,27.327c30.524,4.817 144.503,54.659 144.503,109.314h-164.798c-2.355-1.537-4.753-3.07-7.229-4.595z"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m144.5 402.69c9.476-1.494 9.692-27.327 9.692-27.327s-27.844-27.328-33.912-64.076c-16.326 0-26.407-39.069-10.082-52.814-0.681-14.47-20.984-113.59 81.799-113.59s82.479 99.118 81.799 113.59c16.327 13.745 6.244 52.814-10.081 52.814-6.067 36.748-33.913 64.076-33.913 64.076s0.216 25.833 9.692 27.327c30.524 4.816 144.5 54.658 144.5 109.31h-384c0-54.655 113.98-104.5 144.5-109.31zm195.47 8.718c-22.047-13.575-48.813-26.154-70.769-33.712 7.876-11.216 16.647-26.468 22.165-44.531 7.703-6.283 13.972-15.266 17.999-26.301 4.033-11.052 5.561-23.426 4.304-34.842-0.902-8.196-3.239-15.833-6.825-22.544 2.175-23.293 3.707-69.017-26.224-102.37-11.607-12.933-26.278-22.23-43.85-27.843 3.137-32.38 19.58-70.385 83.227-70.385 102.78 0 82.479 99.118 81.799 113.59 16.327 13.745 6.244 52.814-10.081 52.814-6.067 36.748-33.913 64.076-33.913 64.076s0.216 25.833 9.692 27.327c30.524 4.817 144.5 54.659 144.5 109.31h-164.8c-2.355-1.537-4.753-3.07-7.229-4.595z"/>
 </svg>
diff --git a/icons/sidebar-devices-dark.svg b/icons/sidebar-devices-dark.svg
index 1ff0b14..b15d7a1 100755
--- a/icons/sidebar-devices-dark.svg
+++ b/icons/sidebar-devices-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m368,0h-224c-26.4,0-48,21.6-48,48v416c0,26.4 21.6,48 48,48h224c26.4,0 48-21.6 48-48v-416c0-26.4-21.6-48-48-48zm-176,24h128v16h-128v-16zm64,456c-17.673,0-32-14.327-32-32s14.327-32 32-32 32,14.327 32,32-14.327,32-32,32zm128-96h-256v-320h256v320z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m368 0h-224c-26.4 0-48 21.6-48 48v416c0 26.4 21.6 48 48 48h224c26.4 0 48-21.6 48-48v-416c0-26.4-21.6-48-48-48zm-176 24h128v16h-128v-16zm64 456c-17.673 0-32-14.327-32-32s14.327-32 32-32 32 14.327 32 32-14.327 32-32 32zm128-96h-256v-320h256v320z"/>
 </svg>
diff --git a/icons/sidebar-devices-light.svg b/icons/sidebar-devices-light.svg
index 8d7b41c..b2199bf 100644
--- a/icons/sidebar-devices-light.svg
+++ b/icons/sidebar-devices-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m368,0h-224c-26.4,0-48,21.6-48,48v416c0,26.4 21.6,48 48,48h224c26.4,0 48-21.6 48-48v-416c0-26.4-21.6-48-48-48zm-176,24h128v16h-128v-16zm64,456c-17.673,0-32-14.327-32-32s14.327-32 32-32 32,14.327 32,32-14.327,32-32,32zm128-96h-256v-320h256v320z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m368 0h-224c-26.4 0-48 21.6-48 48v416c0 26.4 21.6 48 48 48h224c26.4 0 48-21.6 48-48v-416c0-26.4-21.6-48-48-48zm-176 24h128v16h-128v-16zm64 456c-17.673 0-32-14.327-32-32s14.327-32 32-32 32 14.327 32 32-14.327 32-32 32zm128-96h-256v-320h256v320z"/>
 </svg>
diff --git a/icons/sidebar-dynamic-dark.svg b/icons/sidebar-dynamic-dark.svg
index 4a7c814..ebc6023 100755
--- a/icons/sidebar-dynamic-dark.svg
+++ b/icons/sidebar-dynamic-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m80,96h256c44,0 80,36 80,80v256c0,44-36,80-80,80h-256c-44,0-80-36-80-80v-256c0-44 36-80 80-80zm224,352c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm0-192c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm-96,96c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm-96,96c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm0-192c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm-14.38-192c7.465-36.402 39.855-64 78.38-64h256c44,0 80,36 80,80v256c0,38.523-27.598,70.915-64,78.38v-318.38c0-17.6-14.4-32-32-32h-318.38z"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m80 96h256c44 0 80 36 80 80v256c0 44-36 80-80 80h-256c-44 0-80-36-80-80v-256c0-44 36-80 80-80zm224 352c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm0-192c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm-96 96c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm-96 96c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm0-192c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm-14.38-192c7.465-36.402 39.855-64 78.38-64h256c44 0 80 36 80 80v256c0 38.523-27.598 70.915-64 78.38v-318.38c0-17.6-14.4-32-32-32h-318.38z"/>
 </svg>
diff --git a/icons/sidebar-dynamic-light.svg b/icons/sidebar-dynamic-light.svg
index 638e961..92c32f8 100644
--- a/icons/sidebar-dynamic-light.svg
+++ b/icons/sidebar-dynamic-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m80,96h256c44,0 80,36 80,80v256c0,44-36,80-80,80h-256c-44,0-80-36-80-80v-256c0-44 36-80 80-80zm224,352c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm0-192c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm-96,96c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm-96,96c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm0-192c26.51,0 48-21.49 48-48s-21.49-48-48-48-48,21.49-48,48 21.49,48 48,48zm-14.38-192c7.465-36.402 39.855-64 78.38-64h256c44,0 80,36 80,80v256c0,38.523-27.598,70.915-64,78.38v-318.38c0-17.6-14.4-32-32-32h-318.38z"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m80 96h256c44 0 80 36 80 80v256c0 44-36 80-80 80h-256c-44 0-80-36-80-80v-256c0-44 36-80 80-80zm224 352c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm0-192c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm-96 96c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm-96 96c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm0-192c26.51 0 48-21.49 48-48s-21.49-48-48-48-48 21.49-48 48 21.49 48 48 48zm-14.38-192c7.465-36.402 39.855-64 78.38-64h256c44 0 80 36 80 80v256c0 38.523-27.598 70.915-64 78.38v-318.38c0-17.6-14.4-32-32-32h-318.38z"/>
 </svg>
diff --git a/icons/sidebar-folders-dark.svg b/icons/sidebar-folders-dark.svg
index 530c290..25b30e5 100755
--- a/icons/sidebar-folders-dark.svg
+++ b/icons/sidebar-folders-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m416,480 96-256h-416l-96,256zm-352-288-64,288v-416h144l64,64h208v64z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m416 480 96-256h-416l-96 256zm-352-288-64 288v-416h144l64 64h208v64z"/>
 </svg>
diff --git a/icons/sidebar-folders-light.svg b/icons/sidebar-folders-light.svg
index b5465e3..217bab4 100644
--- a/icons/sidebar-folders-light.svg
+++ b/icons/sidebar-folders-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m416,480 96-256h-416l-96,256zm-352-288-64,288v-416h144l64,64h208v64z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m416 480 96-256h-416l-96 256zm-352-288-64 288v-416h144l64 64h208v64z"/>
 </svg>
diff --git a/icons/sidebar-info-dark.svg b/icons/sidebar-info-dark.svg
index 713d1ce..d98fd7e 100755
--- a/icons/sidebar-info-dark.svg
+++ b/icons/sidebar-info-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m256,0c-141.385,0-256,114.615-256,256s114.615,256 256,256 256-114.615 256-256-114.615-256-256-256zm-32,96h64v64h-64v-64zm96,320h-128v-32h32v-128h-32v-32h96v160h32v32z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m256 0c-141.38 0-256 114.62-256 256s114.62 256 256 256 256-114.62 256-256-114.62-256-256-256zm-32 96h64v64h-64v-64zm96 320h-128v-32h32v-128h-32v-32h96v160h32v32z"/>
 </svg>
diff --git a/icons/sidebar-info-light.svg b/icons/sidebar-info-light.svg
index 62528ba..aae7cb8 100644
--- a/icons/sidebar-info-light.svg
+++ b/icons/sidebar-info-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m256,0c-141.385,0-256,114.615-256,256s114.615,256 256,256 256-114.615 256-256-114.615-256-256-256zm-32,96h64v64h-64v-64zm96,320h-128v-32h32v-128h-32v-32h96v160h32v32z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m256 0c-141.38 0-256 114.62-256 256s114.62 256 256 256 256-114.62 256-256-114.62-256-256-256zm-32 96h64v64h-64v-64zm96 320h-128v-32h32v-128h-32v-32h96v160h32v32z"/>
 </svg>
diff --git a/icons/sidebar-online-dark.svg b/icons/sidebar-online-dark.svg
index a80dbaf..115d1a1 100755
--- a/icons/sidebar-online-dark.svg
+++ b/icons/sidebar-online-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m256.2712-.5424c-141.5343,0-256.2712,114.7369-256.2712,256.2712s114.7369,256.2712 256.2712,256.2712 256.2712-114.7358 256.2712-256.2712-114.7358-256.2712-256.2712-256.2712zm145.0014,341.6949c4.5808-21.5983 7.4724-44.5228 8.4132-68.339h68.0432c-1.7811,23.5962-7.2738,46.51-16.38,68.339h-60.0764zm-290.0029-170.8475c-4.5808,21.5983-7.4724,44.5228-8.4132,68.339h-68.0421c1.7811-23.5951 7.2728-46.51 16.3789-68.339h60.0764zm255.0037,0c5.1329,21.8696 8.221,44.7695 9.2258,68.339h-102.1433v-68.339h92.9175zm-92.9175-34.1695v-100.0194c7.7896,2.2669 15.5066,6.0704 23.0794,11.4094 14.1921,10.0053 27.7691,25.4178 39.2629,44.573 7.9455,13.2417 14.8168,27.9848 20.553,44.0381h-82.8952zm-96.5117-44.0381c11.4938-19.1552 25.0697-34.5688 39.2629-44.573 7.5717-5.339 15.2898-9.1425 23.0794-11.4094v100.0205h-82.8952c5.7373-16.0522 12.6085-30.7952 20.553-44.0381zm62.3422,78.2076v68.339h-102.1422c1.0037-23.5695 4.0929-46.4694 9.2247-68.339h92.9175zm-187.992,170.8475c-9.1062-21.829-14.5978-44.7428-16.3789-68.339h68.0421c.9407,23.8161 3.8323,46.7407 8.4132,68.339h-60.0764zm85.8498-68.339h102.1422v68.339h-92.9175c-5.1318-21.8685-8.221-44.7695-9.2247-68.339zm102.1422,102.5085v100.0205c-7.7885-2.2669-15.5065-6.0715-23.0794-11.4094-14.1932-10.0053-27.7702-25.4189-39.2629-44.573-7.9455-13.2428-14.8157-27.9859-20.554-44.0381h82.8962zm96.5117,44.0381c-11.4938,19.1541-25.0708,34.5678-39.2629,44.573-7.5728,5.3379-15.2898,9.1425-23.0794,11.4094v-100.0205h82.8963c-5.7373,16.0522-12.6085,30.7953-20.554,44.0381zm-62.3422-78.2075v-68.339h102.1422c-1.0037,23.5695-4.0929,46.4705-9.2258,68.339h-92.9165zm136.3299-102.5085c-.9407-23.8161-3.8323-46.7407-8.4132-68.339h60.0764c9.1062,21.829 14.5989,44.7439 16.38,68.339h-68.0432zm33.8011-102.5085h-51.2009c-9.9508-31.3729-23.6923-58.8858-40.2111-80.8471 22.7099,10.8595 43.2767,25.4221 61.2456,43.391 11.4681,11.4671 21.5492,23.9923 30.1663,37.4562zm-344.2651-37.4562c17.97-17.9699 38.5368-32.5315 61.2456-43.391-16.5199,21.9614-30.2592,49.4742-40.2111,80.8471h-51.1998c8.616-13.4638 18.6982-25.9891 30.1653-37.4562zm-30.1653,276.6426h51.1998c9.9519,31.3729 23.6923,58.8858 40.2122,80.8482-22.7099-10.8595-43.2767-25.4221-61.2456-43.392-11.4681-11.4671-21.5503-23.9923-30.1663-37.4562zm344.264,37.4562c-17.9689,17.97-38.5368,32.5326-61.2456,43.392 16.5199-21.9614 30.2603-49.4753 40.2111-80.8482h51.2009c-8.6171,13.4639-18.6982,25.9891-30.1663,37.4562z"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m256.27-0.5424c-141.53 0-256.27 114.74-256.27 256.27s114.74 256.27 256.27 256.27 256.27-114.74 256.27-256.27-114.74-256.27-256.27-256.27zm145 341.69c4.5808-21.598 7.4724-44.523 8.4132-68.339h68.043c-1.7811 23.596-7.2738 46.51-16.38 68.339h-60.076zm-290-170.85c-4.5808 21.598-7.4724 44.523-8.4132 68.339h-68.042c1.7811-23.595 7.2728-46.51 16.379-68.339h60.076zm255 0c5.1329 21.87 8.221 44.77 9.2258 68.339h-102.14v-68.339h92.918zm-92.918-34.17v-100.02c7.7896 2.2669 15.507 6.0704 23.079 11.409 14.192 10.005 27.769 25.418 39.263 44.573 7.9455 13.242 14.817 27.985 20.553 44.038h-82.895zm-96.512-44.038c11.494-19.155 25.07-34.569 39.263-44.573 7.5717-5.339 15.29-9.1425 23.079-11.409v100.02h-82.895c5.7373-16.052 12.608-30.795 20.553-44.038zm62.342 78.208v68.339h-102.14c1.0037-23.57 4.0929-46.469 9.2247-68.339h92.918zm-187.99 170.85c-9.1062-21.829-14.598-44.743-16.379-68.339h68.042c0.9407 23.816 3.8323 46.741 8.4132 68.339h-60.076zm85.85-68.339h102.14v68.339h-92.918c-5.1318-21.868-8.221-44.77-9.2247-68.339zm102.14 102.51v100.02c-7.7885-2.2669-15.506-6.0715-23.079-11.409-14.193-10.005-27.77-25.419-39.263-44.573-7.9455-13.243-14.816-27.986-20.554-44.038h82.896zm96.512 44.038c-11.494 19.154-25.071 34.568-39.263 44.573-7.5728 5.3379-15.29 9.1425-23.079 11.409v-100.02h82.896c-5.7373 16.052-12.608 30.795-20.554 44.038zm-62.342-78.208v-68.339h102.14c-1.0037 23.57-4.0929 46.47-9.2258 68.339h-92.916zm136.33-102.51c-0.9407-23.816-3.8323-46.741-8.4132-68.339h60.076c9.1062 21.829 14.599 44.744 16.38 68.339h-68.043zm33.801-102.51h-51.201c-9.9508-31.373-23.692-58.886-40.211-80.847 22.71 10.86 43.277 25.422 61.246 43.391 11.468 11.467 21.549 23.992 30.166 37.456zm-344.27-37.456c17.97-17.97 38.537-32.532 61.246-43.391-16.52 21.961-30.259 49.474-40.211 80.847h-51.2c8.616-13.464 18.698-25.989 30.165-37.456zm-30.165 276.64h51.2c9.9519 31.373 23.692 58.886 40.212 80.848-22.71-10.86-43.277-25.422-61.246-43.392-11.468-11.467-21.55-23.992-30.166-37.456zm344.26 37.456c-17.969 17.97-38.537 32.533-61.246 43.392 16.52-21.961 30.26-49.475 40.211-80.848h51.201c-8.6171 13.464-18.698 25.989-30.166 37.456z"/>
 </svg>
diff --git a/icons/sidebar-online-light.svg b/icons/sidebar-online-light.svg
index 4cc4adf..35a79e1 100644
--- a/icons/sidebar-online-light.svg
+++ b/icons/sidebar-online-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m256.2712-.5424c-141.5343,0-256.2712,114.7369-256.2712,256.2712s114.7369,256.2712 256.2712,256.2712 256.2712-114.7358 256.2712-256.2712-114.7358-256.2712-256.2712-256.2712zm145.0014,341.6949c4.5808-21.5983 7.4724-44.5228 8.4132-68.339h68.0432c-1.7811,23.5962-7.2738,46.51-16.38,68.339h-60.0764zm-290.0029-170.8475c-4.5808,21.5983-7.4724,44.5228-8.4132,68.339h-68.0421c1.7811-23.5951 7.2728-46.51 16.3789-68.339h60.0764zm255.0037,0c5.1329,21.8696 8.221,44.7695 9.2258,68.339h-102.1433v-68.339h92.9175zm-92.9175-34.1695v-100.0194c7.7896,2.2669 15.5066,6.0704 23.0794,11.4094 14.1921,10.0053 27.7691,25.4178 39.2629,44.573 7.9455,13.2417 14.8168,27.9848 20.553,44.0381h-82.8952zm-96.5117-44.0381c11.4938-19.1552 25.0697-34.5688 39.2629-44.573 7.5717-5.339 15.2898-9.1425 23.0794-11.4094v100.0205h-82.8952c5.7373-16.0522 12.6085-30.7952 20.553-44.0381zm62.3422,78.2076v68.339h-102.1422c1.0037-23.5695 4.0929-46.4694 9.2247-68.339h92.9175zm-187.992,170.8475c-9.1062-21.829-14.5978-44.7428-16.3789-68.339h68.0421c.9407,23.8161 3.8323,46.7407 8.4132,68.339h-60.0764zm85.8498-68.339h102.1422v68.339h-92.9175c-5.1318-21.8685-8.221-44.7695-9.2247-68.339zm102.1422,102.5085v100.0205c-7.7885-2.2669-15.5065-6.0715-23.0794-11.4094-14.1932-10.0053-27.7702-25.4189-39.2629-44.573-7.9455-13.2428-14.8157-27.9859-20.554-44.0381h82.8962zm96.5117,44.0381c-11.4938,19.1541-25.0708,34.5678-39.2629,44.573-7.5728,5.3379-15.2898,9.1425-23.0794,11.4094v-100.0205h82.8963c-5.7373,16.0522-12.6085,30.7953-20.554,44.0381zm-62.3422-78.2075v-68.339h102.1422c-1.0037,23.5695-4.0929,46.4705-9.2258,68.339h-92.9165zm136.3299-102.5085c-.9407-23.8161-3.8323-46.7407-8.4132-68.339h60.0764c9.1062,21.829 14.5989,44.7439 16.38,68.339h-68.0432zm33.8011-102.5085h-51.2009c-9.9508-31.3729-23.6923-58.8858-40.2111-80.8471 22.7099,10.8595 43.2767,25.4221 61.2456,43.391 11.4681,11.4671 21.5492,23.9923 30.1663,37.4562zm-344.2651-37.4562c17.97-17.9699 38.5368-32.5315 61.2456-43.391-16.5199,21.9614-30.2592,49.4742-40.2111,80.8471h-51.1998c8.616-13.4638 18.6982-25.9891 30.1653-37.4562zm-30.1653,276.6426h51.1998c9.9519,31.3729 23.6923,58.8858 40.2122,80.8482-22.7099-10.8595-43.2767-25.4221-61.2456-43.392-11.4681-11.4671-21.5503-23.9923-30.1663-37.4562zm344.264,37.4562c-17.9689,17.97-38.5368,32.5326-61.2456,43.392 16.5199-21.9614 30.2603-49.4753 40.2111-80.8482h51.2009c-8.6171,13.4639-18.6982,25.9891-30.1663,37.4562z"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m256.27-0.5424c-141.53 0-256.27 114.74-256.27 256.27s114.74 256.27 256.27 256.27 256.27-114.74 256.27-256.27-114.74-256.27-256.27-256.27zm145 341.69c4.5808-21.598 7.4724-44.523 8.4132-68.339h68.043c-1.7811 23.596-7.2738 46.51-16.38 68.339h-60.076zm-290-170.85c-4.5808 21.598-7.4724 44.523-8.4132 68.339h-68.042c1.7811-23.595 7.2728-46.51 16.379-68.339h60.076zm255 0c5.1329 21.87 8.221 44.77 9.2258 68.339h-102.14v-68.339h92.918zm-92.918-34.17v-100.02c7.7896 2.2669 15.507 6.0704 23.079 11.409 14.192 10.005 27.769 25.418 39.263 44.573 7.9455 13.242 14.817 27.985 20.553 44.038h-82.895zm-96.512-44.038c11.494-19.155 25.07-34.569 39.263-44.573 7.5717-5.339 15.29-9.1425 23.079-11.409v100.02h-82.895c5.7373-16.052 12.608-30.795 20.553-44.038zm62.342 78.208v68.339h-102.14c1.0037-23.57 4.0929-46.469 9.2247-68.339h92.918zm-187.99 170.85c-9.1062-21.829-14.598-44.743-16.379-68.339h68.042c0.9407 23.816 3.8323 46.741 8.4132 68.339h-60.076zm85.85-68.339h102.14v68.339h-92.918c-5.1318-21.868-8.221-44.77-9.2247-68.339zm102.14 102.51v100.02c-7.7885-2.2669-15.506-6.0715-23.079-11.409-14.193-10.005-27.77-25.419-39.263-44.573-7.9455-13.243-14.816-27.986-20.554-44.038h82.896zm96.512 44.038c-11.494 19.154-25.071 34.568-39.263 44.573-7.5728 5.3379-15.29 9.1425-23.079 11.409v-100.02h82.896c-5.7373 16.052-12.608 30.795-20.554 44.038zm-62.342-78.208v-68.339h102.14c-1.0037 23.57-4.0929 46.47-9.2258 68.339h-92.916zm136.33-102.51c-0.9407-23.816-3.8323-46.741-8.4132-68.339h60.076c9.1062 21.829 14.599 44.744 16.38 68.339h-68.043zm33.801-102.51h-51.201c-9.9508-31.373-23.692-58.886-40.211-80.847 22.71 10.86 43.277 25.422 61.246 43.391 11.468 11.467 21.549 23.992 30.166 37.456zm-344.27-37.456c17.97-17.97 38.537-32.532 61.246-43.391-16.52 21.961-30.259 49.474-40.211 80.847h-51.2c8.616-13.464 18.698-25.989 30.165-37.456zm-30.165 276.64h51.2c9.9519 31.373 23.692 58.886 40.212 80.848-22.71-10.86-43.277-25.422-61.246-43.392-11.468-11.467-21.55-23.992-30.166-37.456zm344.26 37.456c-17.969 17.97-38.537 32.533-61.246 43.392 16.52-21.961 30.26-49.475 40.211-80.848h51.201c-8.6171 13.464-18.698 25.989-30.166 37.456z"/>
 </svg>
diff --git a/icons/sidebar-playlists-dark.svg b/icons/sidebar-playlists-dark.svg
index bdc8b68..9eb989a 100755
--- a/icons/sidebar-playlists-dark.svg
+++ b/icons/sidebar-playlists-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m192,32h320v64h-320v-64zm0,192h320v64h-320v-64zm0,192h320v64h-320v-64zm-192-352a64,64 0 1,0 128,0 64,64 0 1,0 -128,0zm0,192a64,64 0 1,0 128,0 64,64 0 1,0 -128,0zm0,192a64,64 0 1,0 128,0 64,64 0 1,0 -128,0z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m192 32h320v64h-320v-64zm0 192h320v64h-320v-64zm0 192h320v64h-320v-64zm-192-352a64 64 0 1 0 128 0 64 64 0 1 0 -128 0zm0 192a64 64 0 1 0 128 0 64 64 0 1 0 -128 0zm0 192a64 64 0 1 0 128 0 64 64 0 1 0 -128 0z"/>
 </svg>
diff --git a/icons/sidebar-playlists-light.svg b/icons/sidebar-playlists-light.svg
index 3b4da08..5b6dda2 100644
--- a/icons/sidebar-playlists-light.svg
+++ b/icons/sidebar-playlists-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m192,32h320v64h-320v-64zm0,192h320v64h-320v-64zm0,192h320v64h-320v-64zm-192-352a64,64 0 1,0 128,0 64,64 0 1,0 -128,0zm0,192a64,64 0 1,0 128,0 64,64 0 1,0 -128,0zm0,192a64,64 0 1,0 128,0 64,64 0 1,0 -128,0z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m192 32h320v64h-320v-64zm0 192h320v64h-320v-64zm0 192h320v64h-320v-64zm-192-352a64 64 0 1 0 128 0 64 64 0 1 0 -128 0zm0 192a64 64 0 1 0 128 0 64 64 0 1 0 -128 0zm0 192a64 64 0 1 0 128 0 64 64 0 1 0 -128 0z"/>
 </svg>
diff --git a/icons/sidebar-playqueue-dark.svg b/icons/sidebar-playqueue-dark.svg
index 868baf8..5fdf1a0 100755
--- a/icons/sidebar-playqueue-dark.svg
+++ b/icons/sidebar-playqueue-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m96,64 320,192-320,192z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m96 64 320 192-320 192z"/>
 </svg>
diff --git a/icons/sidebar-playqueue-light.svg b/icons/sidebar-playqueue-light.svg
index 0876ef2..f646935 100644
--- a/icons/sidebar-playqueue-light.svg
+++ b/icons/sidebar-playqueue-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m96,64 320,192-320,192z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m96 64 320 192-320 192z"/>
 </svg>
diff --git a/icons/sidebar-streams-dark.svg b/icons/sidebar-streams-dark.svg
index 9946009..7d1911d 100755
--- a/icons/sidebar-streams-dark.svg
+++ b/icons/sidebar-streams-dark.svg
@@ -1,3 +1,3 @@
-<svg fill="#404040" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m192,256a64,64 0 1,0 128,0 64,64 0 1,0 -128,0zm140.174-140.737c49.926,27.079 83.826,79.949 83.826,140.737s-33.9,113.658-83.826,140.737c22.033-35.063 35.826-85.135 35.826-140.737s-13.793-105.674-35.826-140.737zm-188.174,140.737c0,55.602 13.792,105.674 35.826,140.737-49.926-27.08-83.826-79.949-83.826-140.737s33.9-113.657 83.826-140.737c-22.034,35.063-35.826,85.135-35.826,140.737zm-96,0c0,85.95 27.202,163.092 70.326,215.861-71.151-45.474-118.326-125.157-118.326-215.861s47.175-170.387 118.326-215.861c-43.124,52.769-70.326,129.911-70.326,215.861zm345.676-215.86c71.149,45.473 118.324,125.156 118.324,215.86s-47.175,170.387-118.324,215.86c43.122-52.768 70.324-129.91 70.324-215.86s-27.202-163.092-70.324-215.86z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#404040">
+<path d="m192 256a64 64 0 1 0 128 0 64 64 0 1 0 -128 0zm140.17-140.74c49.926 27.079 83.826 79.949 83.826 140.74s-33.9 113.66-83.826 140.74c22.033-35.063 35.826-85.135 35.826-140.74s-13.793-105.67-35.826-140.74zm-188.17 140.74c0 55.602 13.792 105.67 35.826 140.74-49.926-27.08-83.826-79.949-83.826-140.74s33.9-113.66 83.826-140.74c-22.034 35.063-35.826 85.135-35.826 140.74zm-96 0c0 85.95 27.202 163.09 70.326 215.86-71.151-45.474-118.33-125.16-118.33-215.86s47.175-170.39 118.33-215.86c-43.124 52.769-70.326 129.91-70.326 215.86zm345.68-215.86c71.149 45.473 118.32 125.16 118.32 215.86s-47.175 170.39-118.32 215.86c43.122-52.768 70.324-129.91 70.324-215.86s-27.202-163.09-70.324-215.86z"/>
 </svg>
diff --git a/icons/sidebar-streams-light.svg b/icons/sidebar-streams-light.svg
index 4aa07e9..b662adb 100644
--- a/icons/sidebar-streams-light.svg
+++ b/icons/sidebar-streams-light.svg
@@ -1,3 +1,3 @@
-<svg fill="#f0f0f0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
-<path d="m192,256a64,64 0 1,0 128,0 64,64 0 1,0 -128,0zm140.174-140.737c49.926,27.079 83.826,79.949 83.826,140.737s-33.9,113.658-83.826,140.737c22.033-35.063 35.826-85.135 35.826-140.737s-13.793-105.674-35.826-140.737zm-188.174,140.737c0,55.602 13.792,105.674 35.826,140.737-49.926-27.08-83.826-79.949-83.826-140.737s33.9-113.657 83.826-140.737c-22.034,35.063-35.826,85.135-35.826,140.737zm-96,0c0,85.95 27.202,163.092 70.326,215.861-71.151-45.474-118.326-125.157-118.326-215.861s47.175-170.387 118.326-215.861c-43.124,52.769-70.326,129.911-70.326,215.861zm345.676-215.86c71.149,45.473 118.324,125.156 118.324,215.86s-47.175,170.387-118.324,215.86c43.122-52.768 70.324-129.91 70.324-215.86s-27.202-163.092-70.324-215.86z"></path>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="#f0f0f0">
+<path d="m192 256a64 64 0 1 0 128 0 64 64 0 1 0 -128 0zm140.17-140.74c49.926 27.079 83.826 79.949 83.826 140.74s-33.9 113.66-83.826 140.74c22.033-35.063 35.826-85.135 35.826-140.74s-13.793-105.67-35.826-140.74zm-188.17 140.74c0 55.602 13.792 105.67 35.826 140.74-49.926-27.08-83.826-79.949-83.826-140.74s33.9-113.66 83.826-140.74c-22.034 35.063-35.826 85.135-35.826 140.74zm-96 0c0 85.95 27.202 163.09 70.326 215.86-71.151-45.474-118.33-125.16-118.33-215.86s47.175-170.39 118.33-215.86c-43.124 52.769-70.326 129.91-70.326 215.86zm345.68-215.86c71.149 45.473 118.32 125.16 118.32 215.86s-47.175 170.39-118.32 215.86c43.122-52.768 70.324-129.91 70.324-215.86s-27.202-163.09-70.324-215.86z"/>
 </svg>
diff --git a/mac/CMakeLists.txt b/mac/CMakeLists.txt
new file mode 100644
index 0000000..42c4b34
--- /dev/null
+++ b/mac/CMakeLists.txt
@@ -0,0 +1,7 @@
+set(MACOSX_BUNDLE_RESOURCES "${CMAKE_BINARY_DIR}/cantata.app/Contents/Resources")
+
+install(FILES ${MACOSX_BUNDLE_ICON_FILE} DESTINATION ${MACOSX_BUNDLE_RESOURCES})
+
+if (CANTATA_OXYGEN_DIR)
+    add_subdirectory(icons)
+endif (CANTATA_OXYGEN_DIR)
diff --git a/mac/cantata.icns b/mac/cantata.icns
new file mode 100644
index 0000000..0a6ca18
Binary files /dev/null and b/mac/cantata.icns differ
diff --git a/windows/icons/CMakeLists.txt b/mac/icons/CMakeLists.txt
similarity index 90%
copy from windows/icons/CMakeLists.txt
copy to mac/icons/CMakeLists.txt
index d909b93..fc7922d 100644
--- a/windows/icons/CMakeLists.txt
+++ b/mac/icons/CMakeLists.txt
@@ -47,13 +47,9 @@ set(OXYGEN_ICONS
 32x32/actions/configure-shortcuts.png
 32x32/actions/document-export.png
 32x32/actions/edit-clear-locationbar-ltr.png
-32x32/status/audio-volume-low.png
 32x32/status/media-playlist-shuffle.png
-32x32/status/audio-volume-muted.png
-32x32/status/audio-volume-high.png
 32x32/status/dialog-error.png
 32x32/status/dialog-warning.png
-32x32/status/audio-volume-medium.png
 32x32/status/dialog-information.png
 32x32/status/object-locked.png
 32x32/mimetypes/inode-directory.png
@@ -126,13 +122,9 @@ set(OXYGEN_ICONS
 22x22/actions/configure-shortcuts.png
 22x22/actions/document-export.png
 22x22/actions/edit-clear-locationbar-ltr.png
-22x22/status/audio-volume-low.png
 22x22/status/media-playlist-shuffle.png
-22x22/status/audio-volume-muted.png
-22x22/status/audio-volume-high.png
 22x22/status/dialog-error.png
 22x22/status/dialog-warning.png
-22x22/status/audio-volume-medium.png
 22x22/status/dialog-information.png
 22x22/status/object-locked.png
 22x22/mimetypes/inode-directory.png
@@ -195,13 +187,9 @@ set(OXYGEN_ICONS
 16x16/actions/configure-shortcuts.png
 16x16/actions/document-export.png
 16x16/actions/edit-clear-locationbar-ltr.png
-16x16/status/audio-volume-low.png
 16x16/status/media-playlist-shuffle.png
-16x16/status/audio-volume-muted.png
-16x16/status/audio-volume-high.png
 16x16/status/dialog-error.png
 16x16/status/dialog-warning.png
-16x16/status/audio-volume-medium.png
 16x16/status/dialog-information.png
 16x16/status/object-locked.png
 16x16/mimetypes/inode-directory.png
@@ -217,13 +205,9 @@ set(OXYGEN_ICONS
 16x16/apps/preferences-desktop-keyboard.png
 48x48/actions/view-fullscreen.png
 48x48/actions/configure-shortcuts.png
-48x48/status/audio-volume-low.png
 48x48/status/media-playlist-shuffle.png
-48x48/status/audio-volume-muted.png
-48x48/status/audio-volume-high.png
 48x48/status/dialog-error.png
 48x48/status/dialog-warning.png
-48x48/status/audio-volume-medium.png
 48x48/status/dialog-information.png
 48x48/status/object-locked.png
 48x48/categories/preferences-system-network.png
@@ -257,8 +241,22 @@ set(OXYGEN_ICONS
 
 foreach(ICON ${OXYGEN_ICONS})
     get_filename_component(ICON_PATH ${ICON} PATH)
-    install(FILES ${CANTATA_OXYGEN_DIR}/${ICON} DESTINATION ${CMAKE_INSTALL_PREFIX}/icons/oxygen/${ICON_PATH})
+    install(FILES ${CANTATA_OXYGEN_DIR}/${ICON} DESTINATION ${MACOSX_BUNDLE_RESOURCES}/icons/oxygen/${ICON_PATH})
 endforeach(ICON ${OXYGEN_ICONS})
-install(FILES index.theme DESTINATION ${CMAKE_INSTALL_PREFIX}/icons/oxygen)
-install(FILES "LICENSE.Creative Common Attribution-ShareAlike 3.0 License.html" LICENSE.LGPL_V3 README DESTINATION ${CMAKE_INSTALL_PREFIX}/icons)
+install(FILES index.theme DESTINATION ${MACOSX_BUNDLE_RESOURCES}/icons/oxygen)
+install(FILES "LICENSE.Creative Common Attribution-ShareAlike 3.0 License.html" LICENSE.LGPL_V3 README DESTINATION ${MACOSX_BUNDLE_RESOURCES}/icons)
+
+png
+16x16/actions/go-home.png
+32x32/actions/go-home.png
+48x48/actions/go-home.png
+22x22/actions/go-home.png
+)
+
+foreach(ICON ${OXYGEN_ICONS})
+    get_filename_component(ICON_PATH ${ICON} PATH)
+    install(FILES ${CANTATA_OXYGEN_DIR}/${ICON} DESTINATION ${MACOSX_BUNDLE_RESOURCES}/icons/oxygen/${ICON_PATH})
+endforeach(ICON ${OXYGEN_ICONS})
+install(FILES index.theme DESTINATION ${MACOSX_BUNDLE_RESOURCES}/icons/oxygen)
+install(FILES "LICENSE.Creative Common Attribution-ShareAlike 3.0 License.html" LICENSE.LGPL_V3 README DESTINATION ${MACOSX_BUNDLE_RESOURCES}/icons)
 
diff --git a/windows/icons/LICENSE.Creative Common Attribution-ShareAlike 3.0 License.html b/mac/icons/LICENSE.Creative Common Attribution-ShareAlike 3.0 License.html
similarity index 100%
copy from windows/icons/LICENSE.Creative Common Attribution-ShareAlike 3.0 License.html
copy to mac/icons/LICENSE.Creative Common Attribution-ShareAlike 3.0 License.html
diff --git a/windows/icons/LICENSE.LGPL_V3 b/mac/icons/LICENSE.LGPL_V3
similarity index 100%
copy from windows/icons/LICENSE.LGPL_V3
copy to mac/icons/LICENSE.LGPL_V3
diff --git a/windows/icons/README b/mac/icons/README
similarity index 100%
copy from windows/icons/README
copy to mac/icons/README
diff --git a/windows/icons/index.theme b/mac/icons/index.theme
similarity index 100%
copy from windows/icons/index.theme
copy to mac/icons/index.theme
diff --git a/models/albumsmodel.cpp b/models/albumsmodel.cpp
index 7cb8bd4..14d1d70 100644
--- a/models/albumsmodel.cpp
+++ b/models/albumsmodel.cpp
@@ -46,6 +46,11 @@
 #include "mpdparseutils.h"
 #include "icons.h"
 #include "utils.h"
+#include "config.h"
+
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
 
 #ifdef CACHE_SCALED_COVERS
 static QString cacheCoverName(const QString &artist, const QString &album, int size, bool createDir=false)
@@ -68,6 +73,9 @@ AlbumsModel * AlbumsModel::self()
     static AlbumsModel *instance=0;
     if(!instance) {
         instance=new AlbumsModel;
+        #if defined ENABLE_MODEL_TEST
+        new ModelTest(instance, instance);
+        #endif
     }
     return instance;
     #endif
@@ -235,11 +243,11 @@ QVariant AlbumsModel::data(const QModelIndex &index, int role) const
                                             .scaled(QSize(cSize, cSize), Qt::IgnoreAspectRatio, Qt::SmoothTransformation));
             }
             if (!al->coverRequested && iSize && Song::SingleTracks!=al->type) {
+                al->coverRequested=true;
                 al->getCover();
                 if (al->cover) {
                     return *(al->cover);
                 }
-                al->coverRequested=true;
             }
             return *theDefaultIcon;
         }
@@ -288,7 +296,7 @@ QVariant AlbumsModel::data(const QModelIndex &index, int role) const
         }
         case Qt::DisplayRole:
             if (Song::Playlist==si->type) {
-                return si->file.endsWith(".cue", Qt::CaseInsensitive) ? i18n("Cue Sheet") : i18n("Playlist");
+                return si->isCueFile() ? i18n("Cue Sheet") : i18n("Playlist");
             }
             if (Song::SingleTracks==si->parent->type) {
                 return si->artistSong();
@@ -308,9 +316,8 @@ Qt::ItemFlags AlbumsModel::flags(const QModelIndex &index) const
 {
     if (index.isValid()) {
         return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled;
-    } else {
-        return Qt::NoItemFlags;
     }
+    return Qt::NoItemFlags;
 }
 
 QStringList AlbumsModel::filenames(const QModelIndexList &indexes, bool allowPlaylists) const
@@ -373,6 +380,7 @@ void AlbumsModel::update(const MusicLibraryItemRoot *root)
         return;
     }
 
+    bool changesMade=false;
     bool resettingModel=items.isEmpty() || 0==root->childCount();
     if (resettingModel) {
         beginResetModel();
@@ -422,6 +430,7 @@ void AlbumsModel::update(const MusicLibraryItemRoot *root)
             }
 
             if (!found) {
+                changesMade=true;
                 AlbumItem *a=new AlbumItem(artist, album, albumItem->year());
                 a->setSongs(albumItem);
                 a->genres=albumItem->genres();
@@ -452,6 +461,10 @@ void AlbumsModel::update(const MusicLibraryItemRoot *root)
             }
         }
     }
+
+    if (changesMade) {
+        emit updated();
+    }
 }
 
 void AlbumsModel::setCover(const Song &song, const QImage &img, const QString &file, bool update)
@@ -463,9 +476,10 @@ void AlbumsModel::setCover(const Song &song, const QImage &img, const QString &f
     QList<AlbumItem *>::Iterator it=items.begin();
     QList<AlbumItem *>::Iterator end=items.end();
     QString artist=MusicLibraryItemRoot::artistName(song);
+    QString album=song.albumName();
 
     for (int row=0; it!=end; ++it, ++row) {
-        if ((*it)->artist==artist && (*it)->album==song.album) {
+        if ((*it)->artist==artist && (*it)->album==album) {
             if (!(*it)->cover || update) {
                 (*it)->setCover(img);
                 QModelIndex idx=index(row, 0, QModelIndex());
@@ -531,6 +545,23 @@ 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)
@@ -619,12 +650,14 @@ void AlbumsModel::AlbumItem::getCover()
             s.artist=firstSong->albumArtist();
         } else {
             s.artist=firstSong->artist;
-            s.albumartist=artist;
+            s.albumartist=Song::useComposer() && !firstSong->composer.isEmpty()
+                            ? firstSong->albumArtist() : artist;
         }
         s.album=album;
         s.year=year;
         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);
@@ -646,6 +679,10 @@ void AlbumsModel::AlbumItem::getCover()
 
 void AlbumsModel::AlbumItem::setCover(const QImage &img)
 {
+    if (cover) {
+        delete cover;
+    }
+
     #ifdef CACHE_SCALED_COVERS
     if (Song::SingleTracks!=type && songs.count() && !img.isNull()) {
         SongItem *firstSong=songs.first();
@@ -670,7 +707,7 @@ void AlbumsModel::AlbumItem::setCover(const QImage &img)
 const AlbumsModel::SongItem *AlbumsModel::AlbumItem::getCueFile() const
 {
     foreach (SongItem *s, songs) {
-        if (Song::Playlist==s->type && s->file.endsWith(".cue", Qt::CaseInsensitive)) {
+        if (s->isCueFile()) {
             return s;
         }
     }
diff --git a/models/albumsmodel.h b/models/albumsmodel.h
index 0dc5baf..96b61b3 100644
--- a/models/albumsmodel.h
+++ b/models/albumsmodel.h
@@ -124,7 +124,10 @@ public:
     void setEnabled(bool e);
     int albumSort() const;
     void setAlbumSort(int s);
-//     void getCovers();
+    void loadAllCovers();
+
+Q_SIGNALS:
+    void updated();
 
 public Q_SLOTS:
     void setCover(const Song &song, const QImage &img, const QString &file, bool update=false);
diff --git a/models/devicesmodel.cpp b/models/devicesmodel.cpp
index 80157da..09d80b1 100644
--- a/models/devicesmodel.cpp
+++ b/models/devicesmodel.cpp
@@ -39,6 +39,7 @@
 #include "mountpoints.h"
 #include "stdactions.h"
 #include "actioncollection.h"
+#include "config.h"
 #if defined CDDB_FOUND || defined MUSICBRAINZ5_FOUND
 #include "audiocddevice.h"
 #endif
@@ -69,6 +70,10 @@ K_GLOBAL_STATIC(DevicesModel, instance)
 #include "solid-lite/opticaldisc.h"
 #endif
 
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
+
 #include <QDebug>
 #define DBUG qDebug()
 
@@ -94,6 +99,9 @@ DevicesModel * DevicesModel::self()
     static DevicesModel *instance=0;
     if(!instance) {
         instance=new DevicesModel;
+        #if defined ENABLE_MODEL_TEST
+        new ModelTest(instance, instance);
+        #endif
     }
     return instance;
     #endif
@@ -129,6 +137,15 @@ QVariant DevicesModel::data(const QModelIndex &index, int role) const
     MusicLibraryItem *item = static_cast<MusicLibraryItem *>(index.internalPointer());
 
     switch (role) {
+    case Qt::DisplayRole:
+        if (MusicLibraryItem::Type_Song==item->itemType()) {
+            MusicLibraryItemSong *song = static_cast<MusicLibraryItemSong *>(item);
+            if (MusicLibraryItem::Type_Root==song->parentItem()->itemType()) {
+                Device *dev=static_cast<Device *>(song->parentItem());
+                return song->song().trackAndTitleStr(Device::AudioCd!=dev->devType() || !song->song().albumartist.startsWith(dev->data()));
+            }
+        }
+        break;
     case ItemView::Role_SubText:
         if (MusicLibraryItem::Type_Root==item->itemType()) {
             Device *dev=static_cast<Device *>(item);
@@ -260,6 +277,9 @@ void DevicesModel::stop()
 //        disconnect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)),
 //                   this, SLOT(setCover(const Song &, const QImage &, const QString &)));
     disconnect(MountPoints::self(), SIGNAL(updated()), this, SLOT(mountsChanged()));
+    #if defined ENABLE_REMOTE_DEVICES
+    unmountRemote();
+    #endif
 }
 
 Device * DevicesModel::device(const QString &udi)
@@ -322,7 +342,7 @@ Qt::ItemFlags DevicesModel::flags(const QModelIndex &index) const
     if (index.isValid()) {
         return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled;
     }
-    return Qt::ItemIsEnabled;
+    return Qt::NoItemFlags;
 }
 
 QStringList DevicesModel::playableUrls(const QModelIndexList &indexes) const
@@ -402,7 +422,7 @@ void DevicesModel::addLocalDevice(const QString &udi)
         if (Device::AudioCd==dev->devType()) {
             connect(static_cast<AudioCdDevice *>(dev), SIGNAL(matches(const QString &, const QList<CdAlbum> &)),
                     SIGNAL(matches(const QString &, const QList<CdAlbum> &)));
-            if (!autoplayCd.isEmpty() && static_cast<AudioCdDevice *>(dev)->isDevice(autoplayCd)) {
+            if (!autoplayCd.isEmpty() && static_cast<AudioCdDevice *>(dev)->isAudioDevice(autoplayCd)) {
                 autoplayCd=QString();
                 static_cast<AudioCdDevice *>(dev)->autoplay();
             }
@@ -656,7 +676,7 @@ void DevicesModel::playCd(const QString &dev)
 {
     foreach (MusicLibraryItemRoot *col, collections) {
         Device *d=static_cast<Device *>(col);
-        if (Device::AudioCd==d->devType() && static_cast<AudioCdDevice *>(d)->isDevice(dev)) {
+        if (Device::AudioCd==d->devType() && static_cast<AudioCdDevice *>(d)->isAudioDevice(dev)) {
             static_cast<AudioCdDevice *>(d)->autoplay();
             return;
         }
diff --git a/models/digitallyimported.cpp b/models/digitallyimported.cpp
index 879ffec..cb01647 100644
--- a/models/digitallyimported.cpp
+++ b/models/digitallyimported.cpp
@@ -148,6 +148,7 @@ void DigitallyImported::save()
     cfg.endGroup();
     #endif
     CFG_SYNC;
+    emit updated();
 }
 
 QString DigitallyImported::modifyUrl(const QString &u) const
diff --git a/models/digitallyimported.h b/models/digitallyimported.h
index 289bb2d..086557e 100644
--- a/models/digitallyimported.h
+++ b/models/digitallyimported.h
@@ -68,6 +68,7 @@ public Q_SLOTS:
 
 Q_SIGNALS:
     void loginStatus(bool ok, const QString &msg);
+    void updated();
 
 private Q_SLOTS:
     void timeout();
diff --git a/models/dirviewitemfile.h b/models/dirviewitemfile.h
index 85a0df0..ee0212e 100644
--- a/models/dirviewitemfile.h
+++ b/models/dirviewitemfile.h
@@ -40,7 +40,7 @@ public:
 
     DirViewItemFile(const QString &name, DirViewItem *parent) : DirViewItem(name, parent) {
         fType=MPDConnection::isPlaylist(name)
-                ? name.endsWith(".cue", Qt::CaseInsensitive)
+                ? name.endsWith(QLatin1String(".cue"), Qt::CaseInsensitive)
                     ? CueSheet
                     : Playlist
                 : Audio;
diff --git a/models/dirviewmodel.cpp b/models/dirviewmodel.cpp
index a647e90..f068ef3 100644
--- a/models/dirviewmodel.cpp
+++ b/models/dirviewmodel.cpp
@@ -39,6 +39,11 @@
 #include "mpdconnection.h"
 #include "icon.h"
 #include "icons.h"
+#include "config.h"
+
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
 
 #ifdef ENABLE_KDE_SUPPORT
 K_GLOBAL_STATIC(DirViewModel, instance)
@@ -52,6 +57,9 @@ DirViewModel * DirViewModel::self()
     static DirViewModel *instance=0;
     if(!instance) {
         instance=new DirViewModel;
+        #if defined ENABLE_MODEL_TEST
+        new ModelTest(instance, instance);
+        #endif
     }
     return instance;
     #endif
@@ -79,6 +87,7 @@ void DirViewModel::setEnabled(bool e)
     if (enabled) {
         connect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *)), this, SLOT(updateDirView(DirViewItemRoot *)));
     } else {
+        clear();
         disconnect(MPDConnection::self(), SIGNAL(dirViewUpdated(DirViewItemRoot *)), this, SLOT(updateDirView(DirViewItemRoot *)));
     }
 }
@@ -159,7 +168,7 @@ QVariant DirViewModel::data(const QModelIndex &index, int role) const
     switch (role) {
     case Qt::DecorationRole: {
         if (item->type() == DirViewItem::Type_Dir) {
-            return Icon("inode-directory");
+            return Icons::self()->folderIcon;
         } else if (item->type() == DirViewItem::Type_File) {
             return DirViewItemFile::Audio!=static_cast<DirViewItemFile *>(item)->fileType() ? Icons::self()->playlistIcon : Icons::self()->audioFileIcon;
         }
diff --git a/models/modeltest.cpp b/models/modeltest.cpp
new file mode 100644
index 0000000..4bc757d
--- /dev/null
+++ b/models/modeltest.cpp
@@ -0,0 +1,565 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#include <QtGui/QtGui>
+
+#include "modeltest.h"
+
+#include <QtTest/QtTest>
+
+Q_DECLARE_METATYPE ( QModelIndex )
+
+/*!
+    Connect to all of the models signals.  Whenever anything happens recheck everything.
+*/
+ModelTest::ModelTest ( QAbstractItemModel *_model, QObject *parent ) : QObject ( parent ), model ( _model ), fetchingMore ( false )
+{
+    if (!model)
+        qFatal("%s: model must not be null", Q_FUNC_INFO);
+
+    connect ( model, SIGNAL ( columnsAboutToBeInserted ( const QModelIndex &, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( columnsAboutToBeRemoved ( const QModelIndex &, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( columnsInserted ( const QModelIndex &, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( columnsRemoved ( const QModelIndex &, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( dataChanged ( const QModelIndex &, const QModelIndex & ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( headerDataChanged ( Qt::Orientation, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( layoutAboutToBeChanged () ), this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( layoutChanged () ), this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( modelReset () ), this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( rowsAboutToBeInserted ( const QModelIndex &, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( rowsAboutToBeRemoved ( const QModelIndex &, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( rowsInserted ( const QModelIndex &, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+    connect ( model, SIGNAL ( rowsRemoved ( const QModelIndex &, int, int ) ),
+              this, SLOT ( runAllTests() ) );
+
+    // Special checks for inserting/removing
+    connect ( model, SIGNAL ( layoutAboutToBeChanged() ),
+              this, SLOT ( layoutAboutToBeChanged() ) );
+    connect ( model, SIGNAL ( layoutChanged() ),
+              this, SLOT ( layoutChanged() ) );
+
+    connect ( model, SIGNAL ( rowsAboutToBeInserted ( const QModelIndex &, int, int ) ),
+              this, SLOT ( rowsAboutToBeInserted ( const QModelIndex &, int, int ) ) );
+    connect ( model, SIGNAL ( rowsAboutToBeRemoved ( const QModelIndex &, int, int ) ),
+              this, SLOT ( rowsAboutToBeRemoved ( const QModelIndex &, int, int ) ) );
+    connect ( model, SIGNAL ( rowsInserted ( const QModelIndex &, int, int ) ),
+              this, SLOT ( rowsInserted ( const QModelIndex &, int, int ) ) );
+    connect ( model, SIGNAL ( rowsRemoved ( const QModelIndex &, int, int ) ),
+              this, SLOT ( rowsRemoved ( const QModelIndex &, int, int ) ) );
+
+    runAllTests();
+}
+
+void ModelTest::runAllTests()
+{
+    if ( fetchingMore )
+        return;
+    nonDestructiveBasicTest();
+    rowCount();
+    columnCount();
+    hasIndex();
+    index();
+    parent();
+    data();
+}
+
+/*!
+    nonDestructiveBasicTest tries to call a number of the basic functions (not all)
+    to make sure the model doesn't outright segfault, testing the functions that makes sense.
+*/
+void ModelTest::nonDestructiveBasicTest()
+{
+    QVERIFY( model->buddy ( QModelIndex() ) == QModelIndex() );
+    model->canFetchMore ( QModelIndex() );
+    QVERIFY( model->columnCount ( QModelIndex() ) >= 0 );
+    QVERIFY( model->data ( QModelIndex() ) == QVariant() );
+    fetchingMore = true;
+    model->fetchMore ( QModelIndex() );
+    fetchingMore = false;
+    Qt::ItemFlags flags = model->flags ( QModelIndex() );
+    QVERIFY( flags == Qt::ItemIsDropEnabled || flags == 0 );
+    model->hasChildren ( QModelIndex() );
+    model->hasIndex ( 0, 0 );
+    model->headerData ( 0, Qt::Horizontal );
+    model->index ( 0, 0 );
+    model->itemData ( QModelIndex() );
+    QVariant cache;
+    model->match ( QModelIndex(), -1, cache );
+    model->mimeTypes();
+    QVERIFY( model->parent ( QModelIndex() ) == QModelIndex() );
+    QVERIFY( model->rowCount() >= 0 );
+    QVariant variant;
+    model->setData ( QModelIndex(), variant, -1 );
+    model->setHeaderData ( -1, Qt::Horizontal, QVariant() );
+    model->setHeaderData ( 999999, Qt::Horizontal, QVariant() );
+    QMap<int, QVariant> roles;
+    model->sibling ( 0, 0, QModelIndex() );
+    model->span ( QModelIndex() );
+    model->supportedDropActions();
+}
+
+/*!
+    Tests model's implementation of QAbstractItemModel::rowCount() and hasChildren()
+
+    Models that are dynamically populated are not as fully tested here.
+ */
+void ModelTest::rowCount()
+{
+//     qDebug() << "rc";
+    // check top row
+    QModelIndex topIndex = model->index ( 0, 0, QModelIndex() );
+    int rows = model->rowCount ( topIndex );
+    QVERIFY( rows >= 0 );
+    if ( rows > 0 )
+        QVERIFY( model->hasChildren ( topIndex ) );
+
+    QModelIndex secondLevelIndex = model->index ( 0, 0, topIndex );
+    if ( secondLevelIndex.isValid() ) { // not the top level
+        // check a row count where parent is valid
+        rows = model->rowCount ( secondLevelIndex );
+        QVERIFY( rows >= 0 );
+        if ( rows > 0 )
+            QVERIFY( model->hasChildren ( secondLevelIndex ) );
+    }
+
+    // The models rowCount() is tested more extensively in checkChildren(),
+    // but this catches the big mistakes
+}
+
+/*!
+    Tests model's implementation of QAbstractItemModel::columnCount() and hasChildren()
+ */
+void ModelTest::columnCount()
+{
+    // check top row
+    QModelIndex topIndex = model->index ( 0, 0, QModelIndex() );
+    QVERIFY( model->columnCount ( topIndex ) >= 0 );
+
+    // check a column count where parent is valid
+    QModelIndex childIndex = model->index ( 0, 0, topIndex );
+    if ( childIndex.isValid() )
+        QVERIFY( model->columnCount ( childIndex ) >= 0 );
+
+    // columnCount() is tested more extensively in checkChildren(),
+    // but this catches the big mistakes
+}
+
+/*!
+    Tests model's implementation of QAbstractItemModel::hasIndex()
+ */
+void ModelTest::hasIndex()
+{
+//     qDebug() << "hi";
+    // Make sure that invalid values returns an invalid index
+    QVERIFY( !model->hasIndex ( -2, -2 ) );
+    QVERIFY( !model->hasIndex ( -2, 0 ) );
+    QVERIFY( !model->hasIndex ( 0, -2 ) );
+
+    int rows = model->rowCount();
+    int columns = model->columnCount();
+
+    // check out of bounds
+    QVERIFY( !model->hasIndex ( rows, columns ) );
+    QVERIFY( !model->hasIndex ( rows + 1, columns + 1 ) );
+
+    if ( rows > 0 )
+        QVERIFY( model->hasIndex ( 0, 0 ) );
+
+    // hasIndex() is tested more extensively in checkChildren(),
+    // but this catches the big mistakes
+}
+
+/*!
+    Tests model's implementation of QAbstractItemModel::index()
+ */
+void ModelTest::index()
+{
+//     qDebug() << "i";
+    // Make sure that invalid values returns an invalid index
+    QVERIFY( model->index ( -2, -2 ) == QModelIndex() );
+    QVERIFY( model->index ( -2, 0 ) == QModelIndex() );
+    QVERIFY( model->index ( 0, -2 ) == QModelIndex() );
+
+    int rows = model->rowCount();
+    int columns = model->columnCount();
+
+    if ( rows == 0 )
+        return;
+
+    // Catch off by one errors
+    QVERIFY( model->index ( rows, columns ) == QModelIndex() );
+    QVERIFY( model->index ( 0, 0 ).isValid() );
+
+    // Make sure that the same index is *always* returned
+    QModelIndex a = model->index ( 0, 0 );
+    QModelIndex b = model->index ( 0, 0 );
+    QVERIFY( a == b );
+
+    // index() is tested more extensively in checkChildren(),
+    // but this catches the big mistakes
+}
+
+/*!
+    Tests model's implementation of QAbstractItemModel::parent()
+ */
+void ModelTest::parent()
+{
+//     qDebug() << "p";
+    // Make sure the model wont crash and will return an invalid QModelIndex
+    // when asked for the parent of an invalid index.
+    QVERIFY( model->parent ( QModelIndex() ) == QModelIndex() );
+
+    if ( model->rowCount() == 0 )
+        return;
+
+    // Column 0                | Column 1    |
+    // QModelIndex()           |             |
+    //    \- topIndex          | topIndex1   |
+    //         \- childIndex   | childIndex1 |
+
+    // Common error test #1, make sure that a top level index has a parent
+    // that is a invalid QModelIndex.
+    QModelIndex topIndex = model->index ( 0, 0, QModelIndex() );
+    QVERIFY( model->parent ( topIndex ) == QModelIndex() );
+
+    // Common error test #2, make sure that a second level index has a parent
+    // that is the first level index.
+    if ( model->rowCount ( topIndex ) > 0 ) {
+        QModelIndex childIndex = model->index ( 0, 0, topIndex );
+        QVERIFY( model->parent ( childIndex ) == topIndex );
+    }
+
+    // Common error test #3, the second column should NOT have the same children
+    // as the first column in a row.
+    // Usually the second column shouldn't have children.
+    QModelIndex topIndex1 = model->index ( 0, 1, QModelIndex() );
+    if ( model->rowCount ( topIndex1 ) > 0 ) {
+        QModelIndex childIndex = model->index ( 0, 0, topIndex );
+        QModelIndex childIndex1 = model->index ( 0, 0, topIndex1 );
+        QVERIFY( childIndex != childIndex1 );
+    }
+
+    // Full test, walk n levels deep through the model making sure that all
+    // parent's children correctly specify their parent.
+    checkChildren ( QModelIndex() );
+}
+
+/*!
+    Called from the parent() test.
+
+    A model that returns an index of parent X should also return X when asking
+    for the parent of the index.
+
+    This recursive function does pretty extensive testing on the whole model in an
+    effort to catch edge cases.
+
+    This function assumes that rowCount(), columnCount() and index() already work.
+    If they have a bug it will point it out, but the above tests should have already
+    found the basic bugs because it is easier to figure out the problem in
+    those tests then this one.
+ */
+void ModelTest::checkChildren ( const QModelIndex &parent, int currentDepth )
+{
+    // First just try walking back up the tree.
+    QModelIndex p = parent;
+    while ( p.isValid() )
+        p = p.parent();
+
+    // For models that are dynamically populated
+    if ( model->canFetchMore ( parent ) ) {
+        fetchingMore = true;
+        model->fetchMore ( parent );
+        fetchingMore = false;
+    }
+
+    int rows = model->rowCount ( parent );
+    int columns = model->columnCount ( parent );
+
+    if ( rows > 0 )
+        QVERIFY( model->hasChildren ( parent ) );
+
+    // Some further testing against rows(), columns(), and hasChildren()
+    QVERIFY( rows >= 0 );
+    QVERIFY( columns >= 0 );
+    if ( rows > 0 )
+        QVERIFY( model->hasChildren ( parent ) );
+
+    //qDebug() << "parent:" << model->data(parent).toString() << "rows:" << rows
+    //         << "columns:" << columns << "parent column:" << parent.column();
+
+    QVERIFY( !model->hasIndex ( rows + 1, 0, parent ) );
+    for ( int r = 0; r < rows; ++r ) {
+        if ( model->canFetchMore ( parent ) ) {
+            fetchingMore = true;
+            model->fetchMore ( parent );
+            fetchingMore = false;
+        }
+        QVERIFY( !model->hasIndex ( r, columns + 1, parent ) );
+        for ( int c = 0; c < columns; ++c ) {
+            QVERIFY( model->hasIndex ( r, c, parent ) );
+            QModelIndex index = model->index ( r, c, parent );
+            // rowCount() and columnCount() said that it existed...
+            QVERIFY( index.isValid() );
+
+            // index() should always return the same index when called twice in a row
+            QModelIndex modifiedIndex = model->index ( r, c, parent );
+            QVERIFY( index == modifiedIndex );
+
+            // Make sure we get the same index if we request it twice in a row
+            QModelIndex a = model->index ( r, c, parent );
+            QModelIndex b = model->index ( r, c, parent );
+            QVERIFY( a == b );
+
+            // Some basic checking on the index that is returned
+            QVERIFY( index.model() == model );
+            QCOMPARE( index.row(), r );
+            QCOMPARE( index.column(), c );
+            // While you can technically return a QVariant usually this is a sign
+            // of a bug in data().  Disable if this really is ok in your model.
+//            QVERIFY( model->data ( index, Qt::DisplayRole ).isValid() );
+
+            // If the next test fails here is some somewhat useful debug you play with.
+
+            if (model->parent(index) != parent) {
+                qDebug() << r << c << currentDepth << model->data(index).toString()
+                         << model->data(parent).toString();
+                qDebug() << index << parent << model->parent(index);
+//                 And a view that you can even use to show the model.
+//                 QTreeView view;
+//                 view.setModel(model);
+//                 view.show();
+            }
+
+            // Check that we can get back our real parent.
+            QCOMPARE( model->parent ( index ), parent );
+
+            // recursively go down the children
+            if ( model->hasChildren ( index ) && currentDepth < 10 ) {
+                //qDebug() << r << c << "has children" << model->rowCount(index);
+                checkChildren ( index, ++currentDepth );
+            }/* else { if (currentDepth >= 10) qDebug() << "checked 10 deep"; };*/
+
+            // make sure that after testing the children that the index doesn't change.
+            QModelIndex newerIndex = model->index ( r, c, parent );
+            QVERIFY( index == newerIndex );
+        }
+    }
+}
+
+/*!
+    Tests model's implementation of QAbstractItemModel::data()
+ */
+void ModelTest::data()
+{
+    // Invalid index should return an invalid qvariant
+    QVERIFY( !model->data ( QModelIndex() ).isValid() );
+
+    if ( model->rowCount() == 0 )
+        return;
+
+    // A valid index should have a valid QVariant data
+    QVERIFY( model->index ( 0, 0 ).isValid() );
+
+    // shouldn't be able to set data on an invalid index
+    QVERIFY( !model->setData ( QModelIndex(), QLatin1String ( "foo" ), Qt::DisplayRole ) );
+
+    // General Purpose roles that should return a QString
+    QVariant variant = model->data ( model->index ( 0, 0 ), Qt::ToolTipRole );
+    if ( variant.isValid() ) {
+        QVERIFY( qVariantCanConvert<QString> ( variant ) );
+    }
+    variant = model->data ( model->index ( 0, 0 ), Qt::StatusTipRole );
+    if ( variant.isValid() ) {
+        QVERIFY( qVariantCanConvert<QString> ( variant ) );
+    }
+    variant = model->data ( model->index ( 0, 0 ), Qt::WhatsThisRole );
+    if ( variant.isValid() ) {
+        QVERIFY( qVariantCanConvert<QString> ( variant ) );
+    }
+
+    // General Purpose roles that should return a QSize
+    variant = model->data ( model->index ( 0, 0 ), Qt::SizeHintRole );
+    if ( variant.isValid() ) {
+        QVERIFY( qVariantCanConvert<QSize> ( variant ) );
+    }
+
+    // General Purpose roles that should return a QFont
+    QVariant fontVariant = model->data ( model->index ( 0, 0 ), Qt::FontRole );
+    if ( fontVariant.isValid() ) {
+        QVERIFY( qVariantCanConvert<QFont> ( fontVariant ) );
+    }
+
+    // Check that the alignment is one we know about
+    QVariant textAlignmentVariant = model->data ( model->index ( 0, 0 ), Qt::TextAlignmentRole );
+    if ( textAlignmentVariant.isValid() ) {
+        int alignment = textAlignmentVariant.toInt();
+        QCOMPARE( alignment, ( alignment & ( Qt::AlignHorizontal_Mask | Qt::AlignVertical_Mask ) ) );
+    }
+
+    // General Purpose roles that should return a QColor
+    QVariant colorVariant = model->data ( model->index ( 0, 0 ), Qt::BackgroundColorRole );
+    if ( colorVariant.isValid() ) {
+        QVERIFY( qVariantCanConvert<QColor> ( colorVariant ) );
+    }
+
+    colorVariant = model->data ( model->index ( 0, 0 ), Qt::TextColorRole );
+    if ( colorVariant.isValid() ) {
+        QVERIFY( qVariantCanConvert<QColor> ( colorVariant ) );
+    }
+
+    // Check that the "check state" is one we know about.
+    QVariant checkStateVariant = model->data ( model->index ( 0, 0 ), Qt::CheckStateRole );
+    if ( checkStateVariant.isValid() ) {
+        int state = checkStateVariant.toInt();
+        QVERIFY( state == Qt::Unchecked ||
+                 state == Qt::PartiallyChecked ||
+                 state == Qt::Checked );
+    }
+}
+
+/*!
+    Store what is about to be inserted to make sure it actually happens
+
+    \sa rowsInserted()
+ */
+void ModelTest::rowsAboutToBeInserted ( const QModelIndex &parent, int start, int end )
+{
+//     Q_UNUSED(end);
+//    qDebug() << "rowsAboutToBeInserted" << "start=" << start << "end=" << end << "parent=" << model->data ( parent ).toString()
+//    << "current count of parent=" << model->rowCount ( parent ); // << "display of last=" << model->data( model->index(start-1, 0, parent) );
+//     qDebug() << model->index(start-1, 0, parent) << model->data( model->index(start-1, 0, parent) );
+    Changing c;
+    c.parent = parent;
+    c.oldSize = model->rowCount ( parent );
+    c.last = model->data ( model->index ( start - 1, 0, parent ) );
+    c.next = model->data ( model->index ( start, 0, parent ) );
+    insert.push ( c );
+}
+
+/*!
+    Confirm that what was said was going to happen actually did
+
+    \sa rowsAboutToBeInserted()
+ */
+void ModelTest::rowsInserted ( const QModelIndex & parent, int start, int end )
+{
+    Changing c = insert.pop();
+    QVERIFY( c.parent == parent );
+//    qDebug() << "rowsInserted"  << "start=" << start << "end=" << end << "oldsize=" << c.oldSize
+//    << "parent=" << model->data ( parent ).toString() << "current rowcount of parent=" << model->rowCount ( parent );
+
+//    for (int ii=start; ii <= end; ii++)
+//    {
+//      qDebug() << "itemWasInserted:" << ii << model->data ( model->index ( ii, 0, parent ));
+//    }
+//    qDebug();
+
+    QVERIFY( c.oldSize + ( end - start + 1 ) == model->rowCount ( parent ) );
+    QVERIFY( c.last == model->data ( model->index ( start - 1, 0, c.parent ) ) );
+
+    if (c.next != model->data(model->index(end + 1, 0, c.parent))) {
+        qDebug() << start << end;
+        for (int i=0; i < model->rowCount(); ++i)
+            qDebug() << model->index(i, 0).data().toString();
+        qDebug() << c.next << model->data(model->index(end + 1, 0, c.parent));
+    }
+
+    QVERIFY( c.next == model->data ( model->index ( end + 1, 0, c.parent ) ) );
+}
+
+void ModelTest::layoutAboutToBeChanged()
+{
+    for ( int i = 0; i < qBound ( 0, model->rowCount(), 100 ); ++i )
+        changing.append ( QPersistentModelIndex ( model->index ( i, 0 ) ) );
+}
+
+void ModelTest::layoutChanged()
+{
+    for ( int i = 0; i < changing.count(); ++i ) {
+        QPersistentModelIndex p = changing[i];
+        QVERIFY( p == model->index ( p.row(), p.column(), p.parent() ) );
+    }
+    changing.clear();
+}
+
+/*!
+    Store what is about to be inserted to make sure it actually happens
+
+    \sa rowsRemoved()
+ */
+void ModelTest::rowsAboutToBeRemoved ( const QModelIndex &parent, int start, int end )
+{
+qDebug() << "ratbr" << parent << start << end;
+    Changing c;
+    c.parent = parent;
+    c.oldSize = model->rowCount ( parent );
+    c.last = model->data ( model->index ( start - 1, 0, parent ) );
+    c.next = model->data ( model->index ( end + 1, 0, parent ) );
+    remove.push ( c );
+}
+
+/*!
+    Confirm that what was said was going to happen actually did
+
+    \sa rowsAboutToBeRemoved()
+ */
+void ModelTest::rowsRemoved ( const QModelIndex & parent, int start, int end )
+{
+  qDebug() << "rr" << parent << start << end;
+    Changing c = remove.pop();
+    QVERIFY( c.parent == parent );
+    QVERIFY( c.oldSize - ( end - start + 1 ) == model->rowCount ( parent ) );
+    QVERIFY( c.last == model->data ( model->index ( start - 1, 0, c.parent ) ) );
+    QVERIFY( c.next == model->data ( model->index ( start, 0, c.parent ) ) );
+}
+
+
+
diff --git a/models/modeltest.h b/models/modeltest.h
new file mode 100644
index 0000000..36dc809
--- /dev/null
+++ b/models/modeltest.h
@@ -0,0 +1,95 @@
+/****************************************************************************
+**
+** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Contact: http://www.qt-project.org/legal
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and Digia.  For licensing terms and
+** conditions see http://qt.digia.com/licensing.  For further information
+** use the contact form at http://qt.digia.com/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 2.1 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU Lesser General Public License version 2.1 requirements
+** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Digia gives you certain additional
+** rights.  These rights are described in the Digia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3.0 as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL included in the
+** packaging of this file.  Please review the following information to
+** ensure the GNU General Public License version 3.0 requirements will be
+** met: http://www.gnu.org/copyleft/gpl.html.
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+#ifndef MODELTEST_H
+#define MODELTEST_H
+
+#include <QtCore/QObject>
+#include <QtCore/QAbstractItemModel>
+#include <QtCore/QStack>
+
+class ModelTest : public QObject
+{
+  Q_OBJECT
+
+public:
+  ModelTest( QAbstractItemModel *model, QObject *parent = 0 );
+
+private Q_SLOTS:
+  void nonDestructiveBasicTest();
+  void rowCount();
+  void columnCount();
+  void hasIndex();
+  void index();
+  void parent();
+  void data();
+
+protected Q_SLOTS:
+  void runAllTests();
+  void layoutAboutToBeChanged();
+  void layoutChanged();
+  void rowsAboutToBeInserted( const QModelIndex &parent, int start, int end );
+  void rowsInserted( const QModelIndex & parent, int start, int end );
+  void rowsAboutToBeRemoved( const QModelIndex &parent, int start, int end );
+  void rowsRemoved( const QModelIndex & parent, int start, int end );
+
+private:
+  void checkChildren( const QModelIndex &parent, int currentDepth = 0 );
+
+  QAbstractItemModel *model;
+
+  struct Changing {
+    QModelIndex parent;
+    int oldSize;
+    QVariant last;
+    QVariant next;
+  };
+  QStack<Changing> insert;
+  QStack<Changing> remove;
+
+  bool fetchingMore;
+
+  QList<QPersistentModelIndex> changing;
+};
+
+#endif
+
diff --git a/models/multimusicmodel.cpp b/models/multimusicmodel.cpp
index f453a0a..030e9c3 100644
--- a/models/multimusicmodel.cpp
+++ b/models/multimusicmodel.cpp
@@ -25,6 +25,7 @@
 #include "musiclibraryitemartist.h"
 #include "musiclibraryitemsong.h"
 #include "musiclibraryitemroot.h"
+#include "musiclibraryitempodcast.h"
 #include "multimusicmodel.h"
 #include <QStringList>
 
@@ -103,10 +104,10 @@ void MultiMusicModel::toggleGrouping()
     endResetModel();
 }
 
-void MultiMusicModel::getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &albums, QSet<QString> &genres)
+void MultiMusicModel::getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &composers, QSet<QString> &albums, QSet<QString> &genres)
 {
     foreach (MusicLibraryItemRoot *col, collections) {
-        col->getDetails(artists, albumArtists, albums, genres);
+        col->getDetails(artists, albumArtists, composers, albums, genres);
     }
 }
 
@@ -155,19 +156,37 @@ QList<Song> MultiMusicModel::songs(const QModelIndexList &indexes, bool playable
             } else {
                 // First, sort all artists as they would appear in UI...
                 QList<MusicLibraryItem *> artists=static_cast<const MusicLibraryItemContainer *>(item)->childItems();
-                qSort(artists.begin(), artists.end(), MusicLibraryItemArtist::lessThan);
+                if (artists.isEmpty()) {
+                    break;
+                }
+
+                bool isPodcasts=MusicLibraryItem::Type_Podcast==(*artists.begin())->itemType();
+                if (isPodcasts) {
+                    qSort(artists.begin(), artists.end(), MusicLibraryItemPodcast::lessThan);
+                } else {
+                    qSort(artists.begin(), artists.end(), MusicLibraryItemArtist::lessThan);
+                }
                 foreach (MusicLibraryItem *a, artists) {
-                    const MusicLibraryItemContainer *artist=static_cast<const MusicLibraryItemContainer *>(a);
-                    // Now sort all albums as they would appear in UI...
-                    QList<MusicLibraryItem *> artistAlbums=static_cast<const MusicLibraryItemContainer *>(artist)->childItems();
-                    qSort(artistAlbums.begin(), artistAlbums.end(), MusicLibraryItemAlbum::lessThan);
-                    foreach (MusicLibraryItem *i, artistAlbums) {
-                        const MusicLibraryItemContainer *album=static_cast<const MusicLibraryItemContainer *>(i);
-                        foreach (const MusicLibraryItem *song, static_cast<const MusicLibraryItemContainer *>(album)->childItems()) {
+                    if (isPodcasts) {
+                        const MusicLibraryItemContainer *podcast=static_cast<const MusicLibraryItemContainer *>(a);
+                        foreach (const MusicLibraryItem *song, static_cast<const MusicLibraryItemContainer *>(podcast)->childItems()) {
                             if (MusicLibraryItem::Type_Song==song->itemType() && !colSongs[parent].contains(static_cast<const MusicLibraryItemSong*>(song)->song())) {
                                 colSongs[parent] << parent->fixPath(static_cast<const MusicLibraryItemSong*>(song)->song(), fullPath);
                             }
                         }
+                    } else {
+                        const MusicLibraryItemContainer *artist=static_cast<const MusicLibraryItemContainer *>(a);
+                        // Now sort all albums as they would appear in UI...
+                        QList<MusicLibraryItem *> artistAlbums=artist->childItems();
+                        qSort(artistAlbums.begin(), artistAlbums.end(), MusicLibraryItemAlbum::lessThan);
+                        foreach (MusicLibraryItem *i, artistAlbums) {
+                            const MusicLibraryItemContainer *album=static_cast<const MusicLibraryItemContainer *>(i);
+                            foreach (const MusicLibraryItem *song, album->childItems()) {
+                                if (MusicLibraryItem::Type_Song==song->itemType() && !colSongs[parent].contains(static_cast<const MusicLibraryItemSong*>(song)->song())) {
+                                    colSongs[parent] << parent->fixPath(static_cast<const MusicLibraryItemSong*>(song)->song(), fullPath);
+                                }
+                            }
+                        }
                     }
                 }
             }
@@ -180,7 +199,7 @@ QList<Song> MultiMusicModel::songs(const QModelIndexList &indexes, bool playable
 
             foreach (MusicLibraryItem *i, artistAlbums) {
                 const MusicLibraryItemContainer *album=static_cast<const MusicLibraryItemContainer *>(i);
-                foreach (const MusicLibraryItem *song, static_cast<const MusicLibraryItemContainer *>(album)->childItems()) {
+                foreach (const MusicLibraryItem *song, album->childItems()) {
                     if (MusicLibraryItem::Type_Song==song->itemType() && !colSongs[parent].contains(static_cast<const MusicLibraryItemSong*>(song)->song())) {
                         colSongs[parent] << parent->fixPath(static_cast<const MusicLibraryItemSong*>(song)->song(), fullPath);
                     }
@@ -200,6 +219,13 @@ QList<Song> MultiMusicModel::songs(const QModelIndexList &indexes, bool playable
                 colSongs[parent] << parent->fixPath(static_cast<const MusicLibraryItemSong*>(item)->song(), fullPath);
             }
             break;
+        case MusicLibraryItem::Type_Podcast:
+            foreach (const MusicLibraryItem *song, static_cast<const MusicLibraryItemContainer *>(item)->childItems()) {
+                if (MusicLibraryItem::Type_Song==song->itemType() && !colSongs[parent].contains(static_cast<const MusicLibraryItemSong*>(song)->song())) {
+                    colSongs[parent] << parent->fixPath(static_cast<const MusicLibraryItemSong*>(song)->song(), fullPath);
+                }
+            }
+            break;
         default:
             break;
         }
diff --git a/models/multimusicmodel.h b/models/multimusicmodel.h
index 7306875..b2bb7d5 100644
--- a/models/multimusicmodel.h
+++ b/models/multimusicmodel.h
@@ -41,7 +41,7 @@ public:
     QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const;
     QModelIndex parent(const QModelIndex &index) const;
     int rowCount(const QModelIndex &parent=QModelIndex()) const;
-    void getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &albums, QSet<QString> &genres);
+    void getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &composers, QSet<QString> &albums, QSet<QString> &genres);
     void toggleGrouping();
     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;
diff --git a/models/musiclibraryitem.cpp b/models/musiclibraryitem.cpp
index fe7f39b..a1393b5 100644
--- a/models/musiclibraryitem.cpp
+++ b/models/musiclibraryitem.cpp
@@ -59,6 +59,17 @@ void MusicLibraryItem::setParent(MusicLibraryItemContainer *p)
     m_parentItem->m_genres+=allGenres();
 }
 
+MusicLibraryItem * MusicLibraryItemContainer::childItem(const QString &name) const
+{
+    foreach (MusicLibraryItem *i, m_childItems) {
+        if (i->data()==name) {
+            return i;
+        }
+    }
+
+    return 0;
+}
+
 void MusicLibraryItemContainer::updateGenres()
 {
     m_genres.clear();
@@ -79,3 +90,11 @@ void MusicLibraryItemContainer::resetRows()
         m_rowsSet=false;
     }
 }
+
+void MusicLibraryItemContainer::clear()
+{
+    qDeleteAll(m_childItems);
+    m_childItems.clear();
+    m_genres.clear();
+    m_rowsSet=false;
+}
diff --git a/models/musiclibraryitem.h b/models/musiclibraryitem.h
index a388b05..3a4ce45 100644
--- a/models/musiclibraryitem.h
+++ b/models/musiclibraryitem.h
@@ -39,7 +39,9 @@ public:
         Type_Root,
         Type_Artist,
         Type_Album,
-        Type_Song
+        Type_Song,
+
+        Type_Podcast
     };
 
     MusicLibraryItem(const QString &data, MusicLibraryItemContainer *parent);
@@ -73,10 +75,11 @@ class MusicLibraryItemContainer : public MusicLibraryItem
 {
 public:
     MusicLibraryItemContainer(const QString &data, MusicLibraryItemContainer *parent) : MusicLibraryItem(data, parent), m_rowsSet(false) { }
-    virtual ~MusicLibraryItemContainer() { qDeleteAll(m_childItems); }
+    virtual ~MusicLibraryItemContainer() { clear(); }
 
     virtual void append(MusicLibraryItem *i) { m_childItems.append(i); }
     virtual MusicLibraryItem * childItem(int row) const { return m_childItems.value(row); }
+    MusicLibraryItem * childItem(const QString &name) const;
 
     int childCount() const { return m_childItems.count(); }
     const QList<MusicLibraryItem *> & childItems() const { return m_childItems; }
@@ -86,6 +89,8 @@ public:
     QSet<QString> allGenres() const { return genres(); }
     void updateGenres();
     void resetRows();
+    void clear();
+    int indexOf(MusicLibraryItem *c) const { return m_childItems.indexOf(c); }
 
 protected:
     friend class MusicLibraryItem;
diff --git a/models/musiclibraryitemalbum.cpp b/models/musiclibraryitemalbum.cpp
index 19be86b..130d56f 100644
--- a/models/musiclibraryitemalbum.cpp
+++ b/models/musiclibraryitemalbum.cpp
@@ -30,17 +30,16 @@
 #include "musiclibraryitemsong.h"
 #include "song.h"
 #include "covers.h"
-#include "config.h"
 #include "icons.h"
 #ifdef ENABLE_DEVICES_SUPPORT
 #include "device.h"
 #include "utils.h"
 #endif
 #include "onlineservice.h"
+#include "onlineservicesmodel.h"
 #include <QPixmap>
 #include <QApplication>
 #include <QFontMetrics>
-#include <QFile>
 
 static MusicLibraryItemAlbum::CoverSize coverSize=MusicLibraryItemAlbum::CoverNone;
 static QPixmap *theDefaultIcon=0;
@@ -158,13 +157,14 @@ bool MusicLibraryItemAlbum::lessThan(const MusicLibraryItem *a, const MusicLibra
     return aa->year()<ab->year();
 }
 
-MusicLibraryItemAlbum::MusicLibraryItemAlbum(const QString &data, quint32 year, MusicLibraryItemContainer *parent)
+MusicLibraryItemAlbum::MusicLibraryItemAlbum(const QString &data, QString original, quint32 year, MusicLibraryItemContainer *parent)
     : MusicLibraryItemContainer(data, parent)
     , m_year(year)
     , m_yearOfTrack(0xFFFF)
     , m_yearOfDisc(0xFFFF)
     , m_totalTime(0)
     , m_numTracks(0)
+    , m_originalName(original!=data ? original : QString())
     , m_coverIsDefault(false)
     , m_cover(0)
     , m_type(Song::Standard)
@@ -178,6 +178,9 @@ MusicLibraryItemAlbum::~MusicLibraryItemAlbum()
 
 void MusicLibraryItemAlbum::setCoverImage(const QImage &img) const
 {
+    if (m_cover) {
+        delete m_cover;
+    }
     int size=iconSize(largeImages());
     QImage scaled=img.scaled(QSize(size, size), Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
     m_cover = new QPixmap(QPixmap::fromImage(scaled));
@@ -247,31 +250,36 @@ const QPixmap & MusicLibraryItemAlbum::cover()
                 song.artist=firstSong->song().albumArtist();
             } else {
                 song.artist=firstSong->song().artist;
-                song.albumartist=parentItem()->data();
+                song.albumartist=Song::useComposer() && !firstSong->song().composer.isEmpty()
+                                    ? firstSong->song().albumArtist() : parentItem()->data();
             }
-            song.album=m_itemData;
+            song.album=Song::useComposer() ? firstSong->song().album : m_itemData;
             song.year=m_year;
             song.file=firstSong->file();
             song.type=m_type;
+            song.composer=firstSong->song().composer;
             Covers::Image img;
+            MusicLibraryItemRoot *root=parentItem() && parentItem()->parentItem() && MusicLibraryItem::Type_Root==parentItem()->parentItem()->itemType()
+                                        ? static_cast<MusicLibraryItemRoot *>(parentItem()->parentItem()) : 0;
+            if (root && !root->useAlbumImages()) {
+                // Not showing album images in this model, so dont request any!
+            }
             #ifdef ENABLE_DEVICES_SUPPORT
-            if (parentItem() && parentItem()->parentItem() && dynamic_cast<Device *>(parentItem()->parentItem()) &&
-                static_cast<MusicLibraryItemRoot *>(parentItem()->parentItem())->useAlbumImages()) {
+            else if (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);
-            } else
+            }
             #endif
-            if (parentItem() && parentItem()->parentItem() && dynamic_cast<OnlineService *>(parentItem()->parentItem()) &&
-                static_cast<MusicLibraryItemRoot *>(parentItem()->parentItem())->useAlbumImages()) {
+            else if (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()) {
-                    song.name=m_imageUrl;
-                    song.title=parentItem()->parentItem()->data().toLower();
-                    img=Covers::self()->requestImage(song);
-                }
-            } else if (parentItem() && parentItem()->parentItem() && !static_cast<MusicLibraryItemRoot *>(parentItem()->parentItem())->useAlbumImages()) {
-                // Not showing album images in this model, so dont request any!
+//                if (!m_imageUrl.isEmpty()) {
+//                    song.name=m_imageUrl;
+//                    song.title=parentItem()->parentItem()->data().toLower();
+//                    song.type=Song::OnlineSvrTrack;
+//                }
+//                img=Covers::self()->requestImage(song);
             } else {
                 img=Covers::self()->requestImage(song);
             }
@@ -420,11 +428,17 @@ bool MusicLibraryItemAlbum::detectIfIsMultipleArtists()
     }
 
     if (Song::Standard==m_type) {
-        QString a;
+        QString artist;
+        QString albumArtist;
         foreach (MusicLibraryItem *track, m_childItems) {
-            if (a.isEmpty()) {
-                a=static_cast<MusicLibraryItemSong*>(track)->song().artist;
-            } else if (static_cast<MusicLibraryItemSong*>(track)->song().artist!=a) {
+            if (artist.isEmpty()) {
+                artist=static_cast<MusicLibraryItemSong*>(track)->song().artist;
+                albumArtist=static_cast<MusicLibraryItemSong*>(track)->song().albumArtist();
+                if (artist==albumArtist) {
+                    albumArtist=QString();
+                }
+            } else if (static_cast<MusicLibraryItemSong*>(track)->song().artist!=artist &&
+                       (albumArtist.isEmpty() || !static_cast<MusicLibraryItemSong*>(track)->song().artist.startsWith(albumArtist))) {
                 m_type=Song::MultipleArtists;
                 break;
             }
@@ -436,8 +450,7 @@ bool MusicLibraryItemAlbum::detectIfIsMultipleArtists()
 const MusicLibraryItemSong * MusicLibraryItemAlbum::getCueFile() const
 {
     foreach (const MusicLibraryItem *s, m_childItems) {
-        if (Song::Playlist==static_cast<const MusicLibraryItemSong *>(s)->song().type &&
-            static_cast<const MusicLibraryItemSong *>(s)->song().file.endsWith(".cue", Qt::CaseInsensitive)) {
+        if (static_cast<const MusicLibraryItemSong *>(s)->song().isCueFile()) {
             return static_cast<const MusicLibraryItemSong *>(s);
         }
     }
diff --git a/models/musiclibraryitemalbum.h b/models/musiclibraryitemalbum.h
index b3ce70f..49b27da 100644
--- a/models/musiclibraryitemalbum.h
+++ b/models/musiclibraryitemalbum.h
@@ -29,11 +29,11 @@
 
 #include <QList>
 #include <QVariant>
-#include <QPixmap>
 #include <QSet>
 #include "musiclibraryitem.h"
 #include "song.h"
 
+class QPixmap;
 class MusicLibraryItemArtist;
 class MusicLibraryItemSong;
 
@@ -61,7 +61,7 @@ public:
 
     static bool lessThan(const MusicLibraryItem *a, const MusicLibraryItem *b);
 
-    MusicLibraryItemAlbum(const QString &data, quint32 year, MusicLibraryItemContainer *parent);
+    MusicLibraryItemAlbum(const QString &data, QString original, quint32 year, MusicLibraryItemContainer *parent);
     virtual ~MusicLibraryItemAlbum();
 
     bool setCover(const QImage &img, bool update=false) const;
@@ -90,6 +90,8 @@ public:
     bool updateYear();
     bool containsArtist(const QString &a);
     void clearImage();
+    // Return orignal album name. If we are grouping by composer, then album will appear as "Album (Artist)"
+    const QString & originalName() const { return m_originalName; }
 
 private:
     void setCoverImage(const QImage &img) const;
@@ -103,12 +105,13 @@ private:
     quint16 m_yearOfDisc;
     quint32 m_totalTime;
     quint32 m_numTracks;
+    QString m_originalName;
     mutable bool m_coverIsDefault;
     mutable QPixmap *m_cover;
     Song::Type m_type;
     QSet<QString> m_singleTrackFiles;
     QString m_imageUrl;
-    // m_artists is used to cache the list of artists in a vraious artists albu
+    // m_artists is used to cache the list of artists in a various artists album
     // this is built when containsArtist() is called, and is mainly used by the
     // context view
     QSet<QString> m_artists;
diff --git a/models/musiclibraryitemartist.cpp b/models/musiclibraryitemartist.cpp
index f8f97b6..74e3cfb 100644
--- a/models/musiclibraryitemartist.cpp
+++ b/models/musiclibraryitemartist.cpp
@@ -39,6 +39,7 @@
 #include "utils.h"
 #endif
 #include "onlineservice.h"
+#include "onlineservicesmodel.h"
 #include <QFile>
 
 #ifdef CACHE_SCALED_COVERS
@@ -74,11 +75,12 @@ void MusicLibraryItemArtist::clearDefaultCover()
     }
 }
 
-MusicLibraryItemArtist::MusicLibraryItemArtist(const QString &data, MusicLibraryItemContainer *parent)
+MusicLibraryItemArtist::MusicLibraryItemArtist(const QString &data, const QString &artistName, MusicLibraryItemContainer *parent)
     : MusicLibraryItemContainer(data, parent)
     , m_coverIsDefault(false)
     , m_cover(0)
     , m_various(false)
+    , m_actualArtist(artistName==data ? QString() : artistName)
 {
     if (m_itemData.startsWith(QLatin1String("The "))) {
         m_nonTheArtist=m_itemData.mid(4);
@@ -95,6 +97,9 @@ bool MusicLibraryItemArtist::setCover(const QImage &img, bool update) const
         if (scaled.width()>size || scaled.height()>size) {
             scaled=scaled.copy((scaled.width()-size)/2, 0, size, size);
         }
+        if (m_cover) {
+            delete m_cover;
+        }
         m_cover = new QPixmap(QPixmap::fromImage(scaled));
         m_coverIsDefault=false;
         #ifdef CACHE_SCALED_COVERS
@@ -108,7 +113,7 @@ bool MusicLibraryItemArtist::setCover(const QImage &img, bool update) const
 
 const QPixmap & MusicLibraryItemArtist::cover()
 {
-    if (m_coverIsDefault && theDefaultIcon) {
+    if (m_coverIsDefault) {
         if (largeImages()) {
             if (theDefaultLargeIcon) {
                 return *theDefaultLargeIcon;
@@ -159,25 +164,24 @@ const QPixmap & MusicLibraryItemArtist::cover()
 
             if (firstSong) {
                 song.file=firstSong->file();
+                if (Song::useComposer() && !firstSong->song().composer.isEmpty()) {
+                    song.albumartist=firstSong->song().albumArtist();
+                }
             }
+            MusicLibraryItemRoot *root=parentItem() && MusicLibraryItem::Type_Root==parentItem()->itemType()
+                                        ? static_cast<MusicLibraryItemRoot *>(parentItem()) : 0;
             // NO ARTIST IMAGES FOR DEVICES!
             //#ifdef ENABLE_DEVICES_SUPPORT
-            //if (parentItem() && parentItem()->parentItem() && qobject_cast<Device *>(parentItem()->parentItem())) {
+            //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())->requestArtistImage(song);
+            //    static_cast<Device *>(root)->requestArtistImage(song);
             //} else
             //#endif
-            if (parentItem() && parentItem()->parentItem() && dynamic_cast<OnlineService *>(parentItem()->parentItem()) &&
-                static_cast<MusicLibraryItemRoot *>(parentItem()->parentItem())->useArtistImages()) {
-                // ONLINE: Image URL is encoded in song.name...
-                if (!m_imageUrl.isEmpty()) {
-                    song.name=m_imageUrl;
-                    song.title=parentItem()->parentItem()->data().toLower();
-                    img=Covers::self()->requestImage(song);
-                }
-            } else if (parentItem() && parentItem()->parentItem() && !static_cast<MusicLibraryItemRoot *>(parentItem()->parentItem())->useArtistImages()) {
+            if (root && !root->useArtistImages()) {
                 // Not showing artist images in this model, so dont request any!
+            } else if (root && root->isOnlineService()) {
+                img.img=OnlineServicesModel::self()->requestImage(static_cast<OnlineService *>(parentItem())->id(), data(), QString(), m_imageUrl);
             } else {
                 img=Covers::self()->requestImage(song);
             }
@@ -213,7 +217,7 @@ void MusicLibraryItemArtist::clearImages()
 
 MusicLibraryItemAlbum * MusicLibraryItemArtist::album(const Song &s, bool create)
 {
-    QHash<QString, int>::ConstIterator it=m_indexes.find(s.album);
+    QHash<QString, int>::ConstIterator it=m_indexes.find(s.albumName());
 
     if (m_indexes.end()==it) {
         return create ? createAlbum(s) : 0;
@@ -223,8 +227,12 @@ MusicLibraryItemAlbum * MusicLibraryItemArtist::album(const Song &s, bool create
 
 MusicLibraryItemAlbum * MusicLibraryItemArtist::createAlbum(const Song &s)
 {
-    MusicLibraryItemAlbum *item=new MusicLibraryItemAlbum(s.album, s.year, this);
-    m_indexes.insert(s.album, m_childItems.count());
+    // If grouping via composer - then album name *might* need to include artist name (if this is different to composer)
+    // So, when creating an album entry we need to use the "Album (Artist)" value for display/sort, and still store just
+    // "Album" (for saving to cache, tag editing, etc.)
+    QString albumName=s.albumName();
+    MusicLibraryItemAlbum *item=new MusicLibraryItemAlbum(albumName, s.album, s.year, this);
+    m_indexes.insert(albumName, m_childItems.count());
     m_childItems.append(item);
     return item;
 }
diff --git a/models/musiclibraryitemartist.h b/models/musiclibraryitemartist.h
index cb2255c..dbdb16f 100644
--- a/models/musiclibraryitemartist.h
+++ b/models/musiclibraryitemartist.h
@@ -32,6 +32,7 @@
 #include <QHash>
 #include "musiclibraryitem.h"
 
+class QPixmap;
 class MusicLibraryItemRoot;
 class MusicLibraryItemAlbum;
 struct Song;
@@ -41,7 +42,7 @@ class MusicLibraryItemArtist : public MusicLibraryItemContainer
 public:
     static bool lessThan(const MusicLibraryItem *a, const MusicLibraryItem *b);
 
-    MusicLibraryItemArtist(const QString &data, MusicLibraryItemContainer *parent = 0);
+    MusicLibraryItemArtist(const QString &data, const QString &artistName, MusicLibraryItemContainer *parent = 0);
     virtual ~MusicLibraryItemArtist() { }
 
     MusicLibraryItemAlbum * album(const Song &s, bool create=true);
@@ -62,6 +63,8 @@ public:
     const QString & imageUrl() const { return m_imageUrl; }
     void setImageUrl(const QString &u) { m_imageUrl=u; }
     void clearImages();
+    // 'data' could be 'Composer' if we are set to use that, but need to save real artist...
+    const QString & actualArtist() const { return m_actualArtist; }
 
 private:
     bool largeImages() const;
@@ -71,6 +74,7 @@ private:
     mutable QPixmap *m_cover;
     bool m_various;
     QString m_nonTheArtist;
+    QString m_actualArtist;
     QHash<QString, int> m_indexes;
     QString m_imageUrl;
 };
diff --git a/models/musiclibraryitempodcast.cpp b/models/musiclibraryitempodcast.cpp
new file mode 100644
index 0000000..3e955d5
--- /dev/null
+++ b/models/musiclibraryitempodcast.cpp
@@ -0,0 +1,383 @@
+/*
+ * 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 "musiclibraryitemroot.h"
+#include "musiclibraryitemartist.h"
+#include "musiclibraryitemalbum.h"
+#include "musiclibraryitempodcast.h"
+#include "musiclibraryitemsong.h"
+#include "onlineservicesmodel.h"
+#include "onlineservice.h"
+#include "song.h"
+#include "icons.h"
+#include "qtiocompressor/qtiocompressor.h"
+#include "utils.h"
+#include "covers.h"
+#include "rssparser.h"
+#include <QPixmap>
+#include <QFile>
+#include <QXmlStreamReader>
+#include <QXmlStreamWriter>
+#include <QCryptographicHash>
+#include <QNetworkReply>
+
+static QPixmap *theDefaultIcon=0;
+static QPixmap *theDefaultLargeIcon=0;
+
+static QLatin1String constTopTag("podcast");
+static QLatin1String constImageAttribute("img");
+static QLatin1String constRssAttribute("rss");
+static QLatin1String constEpisodeTag("episode");
+static QLatin1String constNameAttribute("name");
+static QLatin1String constDateAttribute("date");
+static QLatin1String constUrlAttribute("url");
+static QLatin1String constTimeAttribute("time");
+static QLatin1String constPlayedAttribute("played");
+static QLatin1String constLocalAttribute("local");
+static QLatin1String constTrue("true");
+
+const QString MusicLibraryItemPodcast::constExt=QLatin1String(".xml.gz");
+const QString MusicLibraryItemPodcast::constDir=QLatin1String("podcasts");
+
+static QString generateFileName(const QUrl &url, bool creatingNew)
+{
+    QString hash=QCryptographicHash::hash(url.toString().toUtf8(), QCryptographicHash::Md5).toHex();
+    QString dir=Utils::dataDir(MusicLibraryItemPodcast::constDir, true);
+    QString fileName=dir+hash+MusicLibraryItemPodcast::constExt;
+
+    if (creatingNew) {
+        int i=0;
+        while (QFile::exists(fileName) && i<100) {
+            fileName=dir+hash+QChar('_')+QString::number(i)+MusicLibraryItemPodcast::constExt;
+            i++;
+        }
+    }
+
+    return fileName;
+}
+
+MusicLibraryItemPodcast::MusicLibraryItemPodcast(const QString &fileName, MusicLibraryItemContainer *parent)
+    : MusicLibraryItemContainer(QString(), parent)
+    , m_coverIsDefault(false)
+    , m_cover(0)
+    , m_fileName(fileName)
+    , m_unplayedEpisodeCount(0)
+{
+    if (!m_fileName.isEmpty()) {
+        m_imageFile=m_fileName;
+        m_imageFile=m_imageFile.replace(constExt, ".jpg");
+    }
+}
+
+bool MusicLibraryItemPodcast::load()
+{
+    if (m_fileName.isEmpty()) {
+        return false;
+    }
+
+    QFile file(m_fileName);
+    QtIOCompressor compressor(&file);
+    compressor.setStreamFormat(QtIOCompressor::GzipFormat);
+    if (!compressor.open(QIODevice::ReadOnly)) {
+        return false;
+    }
+
+    QXmlStreamReader reader(&compressor);
+    m_unplayedEpisodeCount=0;
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (!reader.error() && reader.isStartElement()) {
+            QString element = reader.name().toString();
+            QXmlStreamAttributes attributes=reader.attributes();
+
+            if (constTopTag == element) {
+                m_imageUrl=attributes.value(constImageAttribute).toString();
+                m_rssUrl=attributes.value(constRssAttribute).toString();
+                QString name=attributes.value(constNameAttribute).toString();
+                if (m_rssUrl.isEmpty() || name.isEmpty()) {
+                    return false;
+                }
+                m_itemData=name;
+            } else if (constEpisodeTag == element) {
+                QString name=attributes.value(constNameAttribute).toString();
+                QString url=attributes.value(constUrlAttribute).toString();
+                if (!name.isEmpty() && !url.isEmpty()) {
+                    Song s;
+                    s.title=name;
+                    s.file=url;
+                    s.artist=m_itemData;
+                    s.setPlayed(constTrue==attributes.value(constPlayedAttribute).toString());
+                    s.setPodcastImage(m_imageFile);
+                    s.setPodcastPublishedDate(attributes.value(constDateAttribute).toString());
+                    QString time=attributes.value(constTimeAttribute).toString();
+                    s.time=time.isEmpty() ? 0 : time.toUInt();
+                    QString localFile=attributes.value(constLocalAttribute).toString();
+                    if (QFile::exists(localFile)) {
+                        s.setPodcastLocalPath(localFile);
+                    }
+                    MusicLibraryItemPodcastEpisode *song=new MusicLibraryItemPodcastEpisode(s, this);
+                    m_childItems.append(song);
+                    if (!s.hasBeenPlayed()) {
+                        m_unplayedEpisodeCount++;
+                    }
+                }
+            }
+        }
+    }
+
+    return true;
+}
+
+static const QString constRssTag=QLatin1String("rss");
+
+MusicLibraryItemPodcast::RssStatus MusicLibraryItemPodcast::loadRss(QNetworkReply *dev)
+{
+    m_rssUrl=dev->url();
+    if (m_fileName.isEmpty()) {
+        m_fileName=m_imageFile=generateFileName(m_rssUrl, true);
+        m_imageFile=m_imageFile.replace(constExt, ".jpg");
+    }
+
+    RssParser::Channel ch=RssParser::parse(dev);
+
+    if (!ch.isValid()) {
+        return FailedToParse;
+    }
+
+    if (ch.video) {
+        return VideoPodcast;
+    }
+
+    m_imageUrl=ch.image;
+    m_itemData=ch.name;
+
+    m_unplayedEpisodeCount=ch.episodes.count();
+    foreach (const RssParser::Episode &ep, ch.episodes) {
+        Song s;
+        s.title=ep.name;
+        s.file=ep.url.toString(); // ????
+        s.artist=m_itemData;
+        s.time=ep.duration;
+        s.setPlayed(false);
+        s.setPodcastImage(m_imageFile);
+        s.setPodcastPublishedDate(ep.publicationDate.toString(Qt::ISODate));
+        MusicLibraryItemSong *song=new MusicLibraryItemPodcastEpisode(s, this);
+        m_childItems.append(song);
+    }
+
+    return Loaded;
+}
+
+bool MusicLibraryItemPodcast::save()
+{
+    if (m_fileName.isEmpty()) {
+        return false;
+    }
+
+    QFile file(m_fileName);
+    QtIOCompressor compressor(&file);
+    compressor.setStreamFormat(QtIOCompressor::GzipFormat);
+    if (!compressor.open(QIODevice::WriteOnly)) {
+        return false;
+    }
+
+    QXmlStreamWriter writer(&compressor);
+    writer.writeStartElement(constTopTag);
+    writer.writeAttribute(constImageAttribute, m_imageUrl.toString()); // ??
+    writer.writeAttribute(constRssAttribute, m_rssUrl.toString()); // ??
+    writer.writeAttribute(constNameAttribute, m_itemData);
+    foreach (MusicLibraryItem *i, m_childItems) {
+        MusicLibraryItemPodcastEpisode *episode=static_cast<MusicLibraryItemPodcastEpisode *>(i);
+        const Song &s=episode->song();
+        writer.writeStartElement(constEpisodeTag);
+        writer.writeAttribute(constNameAttribute, s.title);
+        writer.writeAttribute(constUrlAttribute, s.file);
+        if (s.time) {
+            writer.writeAttribute(constTimeAttribute, QString::number(s.time));
+        }
+        if (s.hasBeenPlayed()) {
+            writer.writeAttribute(constPlayedAttribute, constTrue);
+        }
+        if (!s.podcastPublishedDate().isEmpty()) {
+            writer.writeAttribute(constDateAttribute, s.podcastPublishedDate());
+        }
+        if (!s.podcastLocalPath().isEmpty()) {
+            writer.writeAttribute(constLocalAttribute, s.podcastLocalPath());
+        }
+        writer.writeEndElement();
+    }
+    writer.writeEndElement();
+    compressor.close();
+    return true;
+}
+
+void MusicLibraryItemPodcast::setCoverImage(const QImage &img) const
+{
+    if (m_cover) {
+        delete m_cover;
+    }
+    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;
+}
+
+bool MusicLibraryItemPodcast::setCover(const QImage &img, bool update) const
+{
+    if ((update || m_coverIsDefault) && !img.isNull()) {
+        setCoverImage(img);
+        return true;
+    }
+
+    return false;
+}
+
+const QPixmap & MusicLibraryItemPodcast::cover()
+{
+    if (m_coverIsDefault) {
+        if (largeImages()) {
+            if (theDefaultLargeIcon) {
+                return *theDefaultLargeIcon;
+            }
+        } else if (theDefaultIcon) {
+            return *theDefaultIcon;
+        }
+    }
+
+    if (!m_cover) {
+        bool useLarge=largeImages();
+        int iSize=MusicLibraryItemAlbum::iconSize(useLarge);
+
+        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;
+        QImage img=OnlineServicesModel::self()->requestImage(static_cast<OnlineService *>(parentItem())->id(), data(), QString(), m_imageUrl.toString(), // ??
+                                                             m_imageFile, 300);
+
+        if (!img.isNull()) {
+            setCoverImage(img);
+            return *m_cover;
+        }
+        return useLarge ? *theDefaultLargeIcon : *theDefaultIcon;
+    }
+
+    return *m_cover;
+}
+
+void MusicLibraryItemPodcast::remove(int row)
+{
+    delete m_childItems.takeAt(row);
+    resetRows();
+}
+
+void MusicLibraryItemPodcast::remove(MusicLibraryItemSong *i)
+{
+    int idx=m_childItems.indexOf(i);
+    if (-1!=idx) {
+        remove(idx);
+    }
+}
+
+void MusicLibraryItemPodcast::clearImage()
+{
+    if (!m_coverIsDefault) {
+        m_coverIsDefault=true;
+        delete m_cover;
+        m_cover=0;
+        if (theDefaultIcon) {
+            m_cover=theDefaultIcon;
+        }
+    }
+}
+
+void MusicLibraryItemPodcast::removeFiles()
+{
+    if (!m_fileName.isEmpty() && QFile::exists(m_fileName)) {
+        QFile::remove(m_fileName);
+    }
+    if (!m_imageFile.isEmpty() && QFile::exists(m_imageFile)) {
+        QFile::remove(m_imageFile);
+    }
+}
+
+void MusicLibraryItemPodcast::setUnplayedCount()
+{
+    m_unplayedEpisodeCount=childCount();
+    foreach (MusicLibraryItem *i, m_childItems) {
+        if (static_cast<MusicLibraryItemSong *>(i)->song().hasBeenPlayed()) {
+            m_unplayedEpisodeCount--;
+        }
+    }
+}
+
+void MusicLibraryItemPodcast::setPlayed(MusicLibraryItemSong *song)
+{
+    if (!song->song().hasBeenPlayed()) {
+        song->setPlayed(true);
+        m_unplayedEpisodeCount--;
+    }
+}
+
+void MusicLibraryItemPodcast::addAll(const QList<MusicLibraryItemPodcastEpisode *> &others)
+{
+    foreach (MusicLibraryItemPodcastEpisode *i, others) {
+        static_cast<MusicLibraryItemSong *>(i)->setPodcastImage(m_imageFile);
+        i->setParent(this);
+    }
+}
+
+MusicLibraryItemPodcastEpisode * MusicLibraryItemPodcast::getEpisode(const QString &file) const
+{
+    foreach (MusicLibraryItem *i, m_childItems) {
+        if (static_cast<MusicLibraryItemSong *>(i)->file()==file) {
+            return static_cast<MusicLibraryItemPodcastEpisode *>(i);
+        }
+    }
+    return 0;
+}
+
+bool MusicLibraryItemPodcast::largeImages() const
+{
+    return m_parentItem && Type_Root==m_parentItem->itemType() &&
+           static_cast<MusicLibraryItemRoot *>(m_parentItem)->useLargeImages();
+}
+
+const QString & MusicLibraryItemPodcastEpisode::published()
+{
+    if (publishedDate.isEmpty()) {
+        QDateTime dt=QDateTime::fromString(song().podcastPublishedDate(), Qt::ISODate);
+        publishedDate=dt.toString(Qt::LocalDate);
+    }
+    return publishedDate;
+}
diff --git a/models/musiclibraryitempodcast.h b/models/musiclibraryitempodcast.h
new file mode 100644
index 0000000..02bb0d2
--- /dev/null
+++ b/models/musiclibraryitempodcast.h
@@ -0,0 +1,112 @@
+/*
+ * 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 MUSIC_LIBRARY_ITEM_PODCAST_H
+#define MUSIC_LIBRARY_ITEM_PODCAST_H
+
+#include <QList>
+#include <QVariant>
+#include <QSet>
+#include <QUrl>
+#include "musiclibraryitem.h"
+#include "musiclibraryitemsong.h"
+#include "song.h"
+
+class QPixmap;
+class QNetworkReply;
+class MusicLibraryItemPodcastEpisode;
+
+class MusicLibraryItemPodcast : public MusicLibraryItemContainer
+{
+public:
+    enum RssStatus {
+        Loaded,
+        FailedToParse,
+        VideoPodcast
+    };
+
+    static const QString constExt;
+    static const QString constDir;
+
+    static bool lessThan(const MusicLibraryItem *a, const MusicLibraryItem *b) {
+        return a->data().localeAwareCompare(b->data())<0;
+    }
+
+    MusicLibraryItemPodcast(const QString &fileName, MusicLibraryItemContainer *parent);
+    virtual ~MusicLibraryItemPodcast() { }
+
+    bool load();
+    RssStatus loadRss(QNetworkReply *dev);
+    bool save();
+    bool setCover(const QImage &img, bool update=false) const;
+    const QPixmap & cover();
+    bool hasRealCover() const { return !m_coverIsDefault; }
+    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();
+    const QUrl & rssUrl() const { return m_rssUrl; }
+    void removeFiles();
+    void setUnplayedCount();
+    quint32 unplayedEpisodes() const { return m_unplayedEpisodeCount; }
+    void setPlayed(MusicLibraryItemSong *song);
+    void addAll(const QList<MusicLibraryItemPodcastEpisode *> &others);
+    MusicLibraryItemPodcastEpisode * getEpisode(const QString &file) const;
+
+private:
+    void setCoverImage(const QImage &img) const;
+    bool largeImages() const;
+    void updateStats();
+
+private:
+    mutable bool m_coverIsDefault;
+    mutable QPixmap *m_cover;
+    QUrl m_imageUrl;
+    QUrl m_rssUrl;
+    QString m_fileName;
+    QString m_imageFile;
+    quint32 m_unplayedEpisodeCount;
+};
+
+class MusicLibraryItemPodcastEpisode : public MusicLibraryItemSong
+{
+public:
+    MusicLibraryItemPodcastEpisode(const Song &s, MusicLibraryItemContainer *parent)
+        : MusicLibraryItemSong(s, parent), downloadProg(-1) { }
+    virtual ~MusicLibraryItemPodcastEpisode() { }
+
+    const QString & published();
+    const QString & localPath() { return m_song.podcastLocalPath(); }
+    void setLocalPath(const QString &l) { m_song.setPodcastLocalPath(l); }
+    void setDownloadProgress(int prog) { downloadProg=prog; }
+    int downloadProgress() const { return downloadProg; }
+
+private:
+    QString publishedDate;
+    QString local;
+    int downloadProg;
+};
+
+#endif
diff --git a/models/musiclibraryitemroot.cpp b/models/musiclibraryitemroot.cpp
index 6020ecd..2a1bad6 100644
--- a/models/musiclibraryitemroot.cpp
+++ b/models/musiclibraryitemroot.cpp
@@ -56,7 +56,7 @@ MusicLibraryItemArtist * MusicLibraryItemRoot::artist(const Song &s, bool create
 MusicLibraryItemArtist * MusicLibraryItemRoot::createArtist(const Song &s)
 {
     QString aa=songArtist(s);
-    MusicLibraryItemArtist *item=new MusicLibraryItemArtist(aa, this);
+    MusicLibraryItemArtist *item=new MusicLibraryItemArtist(aa, Song::Standard==s.type ? s.albumArtist() : QString(), this);
     m_indexes.insert(aa, m_childItems.count());
     m_childItems.append(item);
     return item;
@@ -78,7 +78,7 @@ void MusicLibraryItemRoot::groupSingleTracks()
                 QString artist=i18n("Various Artists");
                 QHash<QString, int>::ConstIterator it=m_indexes.find(artist);
                 if (m_indexes.end()==it) {
-                    various=new MusicLibraryItemArtist(artist, this);
+                    various=new MusicLibraryItemArtist(artist, QString(), this);
                     created=true;
                 } else {
                     various=static_cast<MusicLibraryItemArtist *>(m_childItems.at(*it));
@@ -127,7 +127,7 @@ void MusicLibraryItemRoot::groupMultipleArtists()
                 if (!various) {
                     QHash<QString, int>::ConstIterator it=m_indexes.find(va);
                     if (m_indexes.end()==it) {
-                        various=new MusicLibraryItemArtist(va, this);
+                        various=new MusicLibraryItemArtist(va, QString(), this);
                         created=true;
                     } else {
                         various=static_cast<MusicLibraryItemArtist *>(m_childItems.at(*it));
@@ -244,13 +244,14 @@ QSet<Song> MusicLibraryItemRoot::allSongs(bool revertVa) const
     return songs;
 }
 
-void MusicLibraryItemRoot::getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &albums, QSet<QString> &genres)
+void MusicLibraryItemRoot::getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &composers, QSet<QString> &albums, QSet<QString> &genres)
 {
     foreach (const MusicLibraryItem *child, m_childItems) {
         if (MusicLibraryItem::Type_Song==child->itemType()) {
             const Song &s=static_cast<const MusicLibraryItemSong *>(child)->song();
             artists.insert(s.artist);
             albumArtists.insert(s.albumArtist());
+            composers.insert(s.composer);
             albums.insert(s.album);
             if (!s.genre.isEmpty()) {
                 genres.insert(s.genre);
@@ -261,6 +262,7 @@ void MusicLibraryItemRoot::getDetails(QSet<QString> &artists, QSet<QString> &alb
                     const Song &s=static_cast<const MusicLibraryItemSong *>(song)->song();
                     artists.insert(s.artist);
                     albumArtists.insert(s.albumArtist());
+                    composers.insert(s.composer);
                     albums.insert(s.album);
                     if (!s.genre.isEmpty()) {
                         genres.insert(s.genre);
@@ -326,7 +328,9 @@ static const QString constTrackElement=QLatin1String("Track");
 static const QString constNameAttribute=QLatin1String("name");
 static const QString constArtistAttribute=QLatin1String("artist");
 static const QString constAlbumArtistAttribute=QLatin1String("albumartist");
+static const QString constComposerAttribute=QLatin1String("composer");
 static const QString constAlbumAttribute=QLatin1String("album");
+static const QString constActualAttribute=QLatin1String("actual");
 static const QString constTrackAttribute=QLatin1String("track");
 static const QString constGenreAttribute=QLatin1String("genre");
 static const QString constYearAttribute=QLatin1String("year");
@@ -339,6 +343,7 @@ static const QString constDateAttribute=QLatin1String("date");
 static const QString constVersionAttribute=QLatin1String("version");
 static const QString constGroupSingleAttribute=QLatin1String("groupSingle");
 static const QString constGroupMultipleAttribute=QLatin1String("groupMultiple");
+static const QString constUseComposerAttribute=QLatin1String("useComposer");
 static const QString constSingleTracksAttribute=QLatin1String("singleTracks");
 static const QString constMultipleArtistsAttribute=QLatin1String("multipleArtists");
 static const QString constImageAttribute=QLatin1String("img");
@@ -366,7 +371,9 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
     if (MPDParseUtils::groupMultiple()) {
         writer.writeAttribute(constGroupMultipleAttribute, constTrueValue);
     }
-
+    if (Song::useComposer()) {
+        writer.writeAttribute(constUseComposerAttribute, constTrueValue);
+    }
     foreach (const MusicLibraryItem *a, childItems()) {
         foreach (const MusicLibraryItem *al, static_cast<const MusicLibraryItemArtist *>(a)->childItems()) {
             total+=al->childCount();
@@ -388,6 +395,9 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
         if (!artist->imageUrl().isEmpty()) {
             writer.writeAttribute(constImageAttribute, artist->imageUrl());
         }
+        if (!artist->actualArtist().isEmpty()) {
+            writer.writeAttribute(constActualAttribute, artist->actualArtist());
+        }
         foreach (const MusicLibraryItem *al, artist->childItems()) {
             if (prog && prog->wasStopped()) {
                 return;
@@ -395,7 +405,7 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
             const MusicLibraryItemAlbum *album = static_cast<const MusicLibraryItemAlbum *>(al);
             QString albumGenre=!album->childItems().isEmpty() ? static_cast<const MusicLibraryItemSong *>(album->childItems().at(0))->song().genre : QString();
             writer.writeStartElement(constAlbumElement);
-            writer.writeAttribute(constNameAttribute, album->data());
+            writer.writeAttribute(constNameAttribute, album->originalName().isEmpty() ? album->data() : album->originalName());
             writer.writeAttribute(constYearAttribute, QString::number(album->year()));
             if (!albumGenre.isEmpty() && albumGenre!=unknown) {
                 writer.writeAttribute(constGenreAttribute, albumGenre);
@@ -408,6 +418,8 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
             if (!album->imageUrl().isEmpty()) {
                 writer.writeAttribute(constImageAttribute, album->imageUrl());
             }
+            QString artistName=artist->actualArtist().isEmpty() ? artist->data() : artist->actualArtist();
+
             foreach (const MusicLibraryItem *t, album->childItems()) {
                 const MusicLibraryItemSong *track = static_cast<const MusicLibraryItemSong *>(t);
                 bool wroteArtist=false;
@@ -426,20 +438,23 @@ void MusicLibraryItemRoot::toXML(QXmlStreamWriter &writer, const QDateTime &date
                 if (track->disc() != 0) {
                     writer.writeAttribute(constDiscAttribute, QString::number(track->disc()));
                 }
-                if (!track->song().artist.isEmpty() && track->song().artist!=artist->data()) {
+                if (!track->song().artist.isEmpty() && track->song().artist!=artistName) {
                     writer.writeAttribute(constArtistAttribute, track->song().artist);
                     wroteArtist=true;
                 }
-                if (track->song().albumartist!=artist->data()) {
+                if (track->song().albumartist!=artistName) {
                     writer.writeAttribute(constAlbumArtistAttribute, track->song().albumartist);
                 }
+                if (!track->song().composer.isEmpty()) {
+                    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) {
                     writer.writeAttribute(constGenreAttribute, track->song().genre);
                 }
                 if (album->isSingleTracks()) {
                     writer.writeAttribute(constAlbumAttribute, track->song().album);
-                } else if (!wroteArtist && album->isMultipleArtists() && !track->song().artist.isEmpty() && track->song().artist!=artist->data()) {
+                } else if (!wroteArtist && album->isMultipleArtists() && !track->song().artist.isEmpty() && track->song().artist!=artistName) {
                     writer.writeAttribute(constArtistAttribute, track->song().artist);
                 }
                 if (Song::Playlist==track->song().type) {
@@ -508,6 +523,7 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
     bool gs=MPDParseUtils::groupSingle();
     bool gm=MPDParseUtils::groupMultiple();
     int percent=0;
+    bool online=isOnlineService();
 
     if (prog) {
         prog->readProgress(0.0);
@@ -525,16 +541,23 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
                 xmlDate = attributes.value(constDateAttribute).toString().toUInt();
                 gs = constTrueValue==attributes.value(constGroupSingleAttribute).toString();
                 gm = constTrueValue==attributes.value(constGroupMultipleAttribute).toString();
+                bool uc = constTrueValue==attributes.value(constUseComposerAttribute).toString();
 
-                if ( version < constVersion || (date.isValid() && xmlDate < date.toTime_t())) {
+                if ( version < constVersion || uc!=Song::useComposer() || (date.isValid() && xmlDate < date.toTime_t())) {
                     return 0;
                 }
                 if (prog) {
                     total=attributes.value(constnumTracksAttribute).toString().toUInt();
                 }
             } else if (constArtistElement==element) {
+                QString actual=attributes.value(constActualAttribute).toString();
                 song.type=Song::Standard;
-                song.artist=song.albumartist=attributes.value(constNameAttribute).toString();
+                if (actual.isEmpty()) {
+                    song.artist=song.albumartist=attributes.value(constNameAttribute).toString();
+                } else {
+                    song.artist=song.albumartist=actual;
+                    song.composer=attributes.value(constNameAttribute).toString();
+                }
                 artistItem = createArtist(song);
                 QString img = attributes.value(constImageAttribute).toString();
                 if (!img.isEmpty()) {
@@ -585,14 +608,19 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
                     }
                     if (attributes.hasAttribute(constArtistAttribute)) {
                         song.artist=attributes.value(constArtistAttribute).toString();
-                    } else {
+                    } else if (artistItem->actualArtist().isEmpty()) {
                         song.artist=artistItem->data();
+                    } else {
+                        song.artist=artistItem->actualArtist();
                     }
                     if (attributes.hasAttribute(constAlbumArtistAttribute)) {
                         song.albumartist=attributes.value(constAlbumArtistAttribute).toString();
-                    } else {
+                    } else if (artistItem->actualArtist().isEmpty()) {
                         song.albumartist=artistItem->data();
+                    } else {
+                        song.albumartist=artistItem->actualArtist();
                     }
+                    song.composer=attributes.value(constComposerAttribute).toString();
 
                     // Fix cache error - where MusicLibraryItemSong::data() was saved as name instead of song.name!!!!
                     if (!song.albumartist.isEmpty() && !song.artist.isEmpty() && song.albumartist!=song.artist &&
@@ -627,6 +655,9 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
 
                     song.fillEmptyFields();
                     song.guessed=constTrueValue==attributes.value(constGuessedAttribute).toString();
+                    if (online) {
+                        song.type=Song::OnlineSvrTrack;
+                    }
                     albumItem->append(new MusicLibraryItemSong(song, albumItem));
                     albumItem->addGenre(song.genre);
                     artistItem->addGenre(song.genre);
@@ -642,6 +673,7 @@ quint32 MusicLibraryItemRoot::fromXML(QXmlStreamReader &reader, const QDateTime
                     }
                 }
                 song.time=song.track=0;
+                song.composer=QString();
             }
         }
     }
@@ -708,10 +740,10 @@ void MusicLibraryItemRoot::toggleGrouping()
             currentSong.type=MPDConnection::isPlaylist(currentSong.file) ? Song::Playlist : Song::Standard;
         }
 
-        if (!artistItem || currentSong.albumArtist()!=artistItem->data()) {
+        if (!artistItem || currentSong.artistOrComposer()!=artistItem->data()) {
             artistItem = artist(currentSong);
         }
-        if (!albumItem || currentSong.year!=albumItem->year() || albumItem->parentItem()!=artistItem || currentSong.album!=albumItem->data()) {
+        if (!albumItem || currentSong.year!=albumItem->year() || albumItem->parentItem()!=artistItem || currentSong.albumName()!=albumItem->data()) {
             albumItem = artistItem->album(currentSong);
         }
 
@@ -856,6 +888,7 @@ bool MusicLibraryItemRoot::updateSong(const Song &orig, const Song &edit)
         foreach (MusicLibraryItem *song, albumItem->childItems()) {
             if (static_cast<MusicLibraryItemSong *>(song)->song()==orig) {
                 static_cast<MusicLibraryItemSong *>(song)->setSong(edit);
+                bool yearUpdated=orig.year!=edit.year && albumItem->updateYear();
                 if (orig.genre!=edit.genre) {
                     albumItem->updateGenres();
                     artistItem->updateGenres();
@@ -863,6 +896,10 @@ bool MusicLibraryItemRoot::updateSong(const Song &orig, const Song &edit)
                 }
                 QModelIndex idx=m_model->createIndex(songRow, 0, song);
                 emit m_model->dataChanged(idx, idx);
+                if (yearUpdated) {
+                    idx=m_model->createIndex(albumItem->row(), 0, albumItem);
+                    emit m_model->dataChanged(idx, idx);
+                }
                 return true;
             }
             songRow++;
@@ -975,7 +1012,7 @@ void MusicLibraryItemRoot::clearImages()
 QString MusicLibraryItemRoot::artistName(const Song &s)
 {
     if (Song::Standard==s.type || (Song::Playlist==s.type && !s.albumArtist().isEmpty())) {
-        return s.albumArtist();
+        return s.artistOrComposer();
     }
     return i18n("Various Artists");
 }
diff --git a/models/musiclibraryitemroot.h b/models/musiclibraryitemroot.h
index ff3f92b..e20da9c 100644
--- a/models/musiclibraryitemroot.h
+++ b/models/musiclibraryitemroot.h
@@ -72,6 +72,8 @@ public:
     virtual Song fixPath(const Song &orig, bool) const { return orig; }
     virtual const QString & id() const { return data(); }
     virtual bool canPlaySongs() const { return true; }
+    virtual bool isOnlineService() const { return false; }
+    virtual bool isDevice() const { return false; }
     MusicLibraryItemArtist * artist(const Song &s, bool create=true);
     MusicLibraryItemArtist * createArtist(const Song &s);
     void groupSingleTracks();
@@ -80,7 +82,7 @@ public:
     void refreshIndexes();
     void remove(MusicLibraryItemArtist *artist);
     QSet<Song> allSongs(bool revertVa=false) const;
-    void getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &albums, QSet<QString> &genres);
+    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;
@@ -96,7 +98,7 @@ public:
     void setUseArtistImages(bool a) { artistImages=a; }
     bool useLargeImages() const { return largeImages; }
     void setLargeImages(bool a) { largeImages=a; }
-    void toggleGrouping();
+    virtual void toggleGrouping();
     void applyGrouping();
     void clearItems();
     void setModel(MusicModel *m) { m_model=m; }
diff --git a/models/musiclibraryitemsong.h b/models/musiclibraryitemsong.h
index b4bf19f..882f429 100644
--- a/models/musiclibraryitemsong.h
+++ b/models/musiclibraryitemsong.h
@@ -38,48 +38,26 @@ class MusicLibraryItemSong : public MusicLibraryItem
 {
 public:
     MusicLibraryItemSong(const Song &s, MusicLibraryItemContainer *parent)
-        : MusicLibraryItem(s.displayTitle(), parent)
-        , m_song(s) {
-    }
+        : MusicLibraryItem(s.displayTitle(), parent), m_song(s) { }
 
-    virtual ~MusicLibraryItemSong() {
-    }
+    virtual ~MusicLibraryItemSong() { }
 
-    const QString & file() const {
-        return m_song.file;
-    }
-    void setSong(const Song &s) {
-        m_song=s;
-    }
-    void setFile(const QString &f) {
-        m_song.file=f;
-    }
-    quint16 track() const {
-        return m_song.track;
-    }
-    quint16 disc() const {
-        return m_song.disc;
-    }
-    quint32 time() const {
-        return m_song.time;
-    }
-    const QString & genre() const {
-        return m_song.genre;
-    }
-    const Song & song() const {
-        return m_song;
-    }
-    Type itemType() const {
-        return Type_Song;
-    }
-    bool hasGenre(const QString &genre) const {
-        return m_song.genre==genre;
-    }
-    QSet<QString> allGenres() const {
-        return QSet<QString>()<<m_song.genre;
-    }
+    const QString & file() const { return m_song.file; }
+    void setSong(const Song &s) { m_song=s; }
+    void setFile(const QString &f) { m_song.file=f; }
+    quint16 track() const { return m_song.track; }
+    void setTrack(quint16 t) { m_song.track=t; }
+    void setPlayed(bool p) { m_song.setPlayed(p); }
+    quint16 disc() const { return m_song.disc; }
+    quint32 time() const { return m_song.time; }
+    const QString & genre() const { return m_song.genre; }
+    const Song & song() const { return m_song; }
+    Type itemType() const { return Type_Song; }
+    bool hasGenre(const QString &genre) const { return m_song.genre==genre; }
+    QSet<QString> allGenres() const { return QSet<QString>()<<m_song.genre; }
+    void setPodcastImage(const QString &img) { m_song.setPodcastImage(img); }
 
-private:
+protected:
     Song m_song;
 };
 
diff --git a/models/musiclibrarymodel.cpp b/models/musiclibrarymodel.cpp
index 6bc9c6e..07feb0e 100644
--- a/models/musiclibrarymodel.cpp
+++ b/models/musiclibrarymodel.cpp
@@ -54,6 +54,10 @@
 #include <KDE/KGlobal>
 #endif
 
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
+
 #ifdef ENABLE_KDE_SUPPORT
 K_GLOBAL_STATIC(MusicLibraryModel, instance)
 #endif
@@ -66,6 +70,9 @@ MusicLibraryModel * MusicLibraryModel::self()
     static MusicLibraryModel *instance=0;
     if(!instance) {
         instance=new MusicLibraryModel;
+        #if defined ENABLE_MODEL_TEST
+        new ModelTest(instance, instance);
+        #endif
     }
     return instance;
     #endif
@@ -80,6 +87,7 @@ static QString cacheFileName(const MPDConnectionDetails &details, bool withPort=
     QString fileName=(withPort && !details.isLocal() ? details.hostname+'_'+QString::number(details.port) : details.hostname)
                      +MusicLibraryModel::constLibraryCompressedExt;
     fileName.replace('/', '_');
+    fileName.replace('~', '_');
     return Utils::cacheDir(MusicLibraryModel::constLibraryCache)+fileName;
 }
 
@@ -239,6 +247,8 @@ bool MusicLibraryModel::setData(const QModelIndex &idx, const QVariant &value, i
         }
 
         switch (item->itemType()) {
+        case MusicLibraryItem::Type_Podcast:
+            break;
         case MusicLibraryItem::Type_Artist: {
             MusicLibraryItemArtist *artistItem=static_cast<MusicLibraryItemArtist *>(item);
             QModelIndex artistIndex=index(artistItem->row(), 0, QModelIndex());
@@ -260,16 +270,13 @@ bool MusicLibraryModel::setData(const QModelIndex &idx, const QVariant &value, i
         }
         case MusicLibraryItem::Type_Album: {
             MusicLibraryItemArtist *artistItem=static_cast<MusicLibraryItemArtist *>(item->parentItem());
-            QModelIndex artistIndex=index(artistItem->row(), 0, QModelIndex());
             MusicLibraryItemAlbum *albumItem=static_cast<MusicLibraryItemAlbum *>(item);
-            albumItem->setCheckState(check);
-            QModelIndex albumIndex=index(albumItem->row(), 0, artistIndex);
+            QModelIndex artistIndex=index(artistItem->row(), 0, QModelIndex());
             item->setCheckState(check);
             foreach (MusicLibraryItem *song, albumItem->childItems()) {
                 song->setCheckState(check);
             }
-            emit dataChanged(index(0, 0, albumIndex), index(0, albumItem->childCount(), albumIndex));
-            setParentState(artistIndex, value.toBool(), artistItem, item);
+            setParentState(artistIndex);
             emit dataChanged(idx, idx);
             break;
         }
@@ -279,8 +286,8 @@ bool MusicLibraryModel::setData(const QModelIndex &idx, const QVariant &value, i
             MusicLibraryItemArtist *artistItem=static_cast<MusicLibraryItemArtist *>(albumItem->parentItem());
             QModelIndex artistIndex=index(artistItem->row(), 0, QModelIndex());
             QModelIndex albumIndex=index(albumItem->row(), 0, artistIndex);
-            setParentState(albumIndex, value.toBool(), albumItem, item);
-            setParentState(artistIndex, Qt::Unchecked!=albumItem->checkState(), artistItem, albumItem);
+            setParentState(albumIndex);
+            setParentState(artistIndex);
             emit dataChanged(idx, idx);
             break;
         }
@@ -293,35 +300,36 @@ bool MusicLibraryModel::setData(const QModelIndex &idx, const QVariant &value, i
     return ActionModel::setData(idx, value, role);
 }
 
-void MusicLibraryModel::setParentState(const QModelIndex &parent, bool childChecked, MusicLibraryItemContainer *parentItem, MusicLibraryItem *item)
+void MusicLibraryModel::setParentState(const QModelIndex &parent)
 {
-    Qt::CheckState parentCheck=childChecked ? Qt::PartiallyChecked : Qt::Unchecked;
-    int checkedChildren=childChecked ? 1 : 0;
-    int uncheckedChildren=childChecked ? 0 : 1;
+    MusicLibraryItemContainer *parentItem=static_cast<MusicLibraryItemContainer *>(parent.internalPointer());
+    Qt::CheckState parentCheck=parentItem->checkState();
+    bool haveCheckedChildren=false;
+    bool haveUncheckedChildren=false;
     bool stop=false;
+
     foreach (MusicLibraryItem *child, parentItem->childItems()) {
-        if (child!=item) {
-            switch (child->checkState()) {
-            case Qt::PartiallyChecked:
-                parentCheck=Qt::PartiallyChecked;
-                stop=true;
-                break;
-            case Qt::Unchecked:
-                uncheckedChildren++;
-                parentCheck=checkedChildren ? Qt::PartiallyChecked : Qt::Unchecked;
-                stop=checkedChildren && uncheckedChildren;
-                break;
-            case Qt::Checked:
-                checkedChildren++;
-                parentCheck=uncheckedChildren ? Qt::PartiallyChecked : Qt::Checked;
-                stop=checkedChildren && uncheckedChildren;
-                break;
-            }
+        switch (child->checkState()) {
+        case Qt::PartiallyChecked:
+            parentCheck=Qt::PartiallyChecked;
+            stop=true;
+            break;
+        case Qt::Unchecked:
+            haveUncheckedChildren=true;
+            parentCheck=haveCheckedChildren ? Qt::PartiallyChecked : Qt::Unchecked;
+            stop=haveCheckedChildren && haveUncheckedChildren;
+            break;
+        case Qt::Checked:
+            haveCheckedChildren=true;
+            parentCheck=haveUncheckedChildren ? Qt::PartiallyChecked : Qt::Checked;
+            stop=haveCheckedChildren && haveUncheckedChildren;
+            break;
         }
         if (stop) {
             break;
         }
     }
+
     if (parentItem->checkState()!=parentCheck) {
         parentItem->setCheckState(parentCheck);
         emit dataChanged(parent, parent);
@@ -378,7 +386,7 @@ QModelIndex MusicLibraryModel::findAlbumIndex(const QString &artist, const QStri
     s.album=album;
     MusicLibraryItemArtist *artistItem = rootItem->artist(s, false);
     MusicLibraryItemAlbum *albumItem = artistItem ? artistItem->album(s, false) : 0;
-    return artistItem ? index(albumItem->row(), 0, index(artistItem->row(), 0, QModelIndex())) : QModelIndex();
+    return albumItem ? index(albumItem->row(), 0, index(artistItem->row(), 0, QModelIndex())) : QModelIndex();
 }
 
 void MusicLibraryModel::removeCache()
@@ -415,7 +423,7 @@ QSet<QString> MusicLibraryModel::getAlbumArtists()
 
 void MusicLibraryModel::updateMusicLibrary(MusicLibraryItemRoot *newroot, QDateTime dbUpdate, bool fromFile)
 {
-    if (!mpdModel || databaseTime >= dbUpdate) {
+    if (!mpdModel || (databaseTime.isValid() && databaseTime >= dbUpdate)) {
         delete newroot;
         return;
     }
@@ -425,7 +433,7 @@ void MusicLibraryModel::updateMusicLibrary(MusicLibraryItemRoot *newroot, QDateT
     bool updatedSongs=false;
     bool needToSave=dbUpdate>databaseTime;
     bool incremental=rootItem->childCount() && newroot->childCount();
-    bool needToUpdate=databaseTime.isNull();
+    bool needToUpdate=!databaseTime.isValid();
 
     if (incremental && !QFile::exists(cacheFileName())) {
         incremental=false;
@@ -449,8 +457,17 @@ 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 :-(
+    //
+    if (!databaseTime.isValid() && !dbUpdate.isValid()) {
+        databaseTime=QDateTime::currentDateTime();
+    }
+
     if ((updatedSongs || needToUpdate) && (!fromFile && (needToSave || needToUpdate))) {
-        rootItem->toXML(cacheFileName(), dbUpdate);
+        rootItem->toXML(cacheFileName(), databaseTime);
     }
 
     AlbumsModel::self()->update(rootItem);
@@ -577,26 +594,40 @@ QList<Song> MusicLibraryModel::getAlbumTracks(const Song &s) const
 
 QList<Song> MusicLibraryModel::getArtistAlbumsFirstTracks(const Song &song) const
 {
-    QString artist=song.isVariousArtists() ? song.artist : song.albumArtist();
+    //QString artist=song.isVariousArtists() ? song.artist : song.albumArtist();
     QString basicArtist=song.basicArtist();
     QList<Song> tracks;
+    bool foundCurrent=false;
+    bool checkAll=!song.isVariousArtists() && song.albumArtist()!=basicArtist;
+
     foreach (MusicLibraryItem *ar, rootItem->childItems()) {
-        if (static_cast<MusicLibraryItemArtist *>(ar)->isVarious()) {
+        if (static_cast<MusicLibraryItemArtist *>(ar)->isVarious() || checkAll) {
             foreach (MusicLibraryItem *al, static_cast<MusicLibraryItemContainer *>(ar)->childItems()) {
                 MusicLibraryItemAlbum *a=static_cast<MusicLibraryItemAlbum *>(al);
                 if (a->containsArtist(basicArtist)) {
-                    tracks.append(static_cast<MusicLibraryItemSong *>(a->childItems().first())->song());
+                    Song first=static_cast<MusicLibraryItemSong *>(a->childItems().first())->song();
+                    tracks.append(first);
+                    if (!foundCurrent && first.album==song.album && first.albumArtist()==song.albumArtist()) {
+                        foundCurrent=true;
+                    }
                 }
             }
-        } else if (ar->data()==artist) {
+        } else if (ar->data()==basicArtist) { // i.e. album-artist == basic artist (most cases!)
             foreach (MusicLibraryItem *al, static_cast<MusicLibraryItemContainer *>(ar)->childItems()) {
                 MusicLibraryItemContainer *a=static_cast<MusicLibraryItemContainer *>(al);
                 if (!a->childItems().isEmpty()) {
-                    tracks.append(static_cast<MusicLibraryItemSong *>(a->childItems().first())->song());
+                    Song first=static_cast<MusicLibraryItemSong *>(a->childItems().first())->song();
+                    tracks.append(first);
+                    if (!foundCurrent && first.album==song.album && first.albumArtist()==song.albumArtist()) {
+                        foundCurrent=true;
+                    }
                 }
             }
         }
     }
+    if (!foundCurrent) {
+        tracks.append(song);
+    }
     return tracks;
 }
 
@@ -682,9 +713,8 @@ Qt::ItemFlags MusicLibraryModel::flags(const QModelIndex &index) const
 {
     if (index.isValid()) {
         return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | (checkable ? Qt::ItemIsUserCheckable : Qt::NoItemFlags);
-    } else {
-        return Qt::ItemIsDropEnabled;
     }
+    return Qt::ItemIsDropEnabled;
 }
 
 QStringList MusicLibraryModel::filenames(const QModelIndexList &indexes, bool allowPlaylists) const
@@ -702,7 +732,6 @@ static inline void addSong(const MusicLibraryItem *song, QList<Song> &insertInto
     if (MusicLibraryItem::Type_Song==song->itemType() &&
         (allowPlaylists || Song::Playlist!=static_cast<const MusicLibraryItemSong*>(song)->song().type) &&
         !checkAgainst.contains(static_cast<const MusicLibraryItemSong*>(song)->song())) {
-        static_cast<const MusicLibraryItemSong*>(song)->song().updateSize(MPDConnection::self()->getDetails().dir);
         insertInto << static_cast<const MusicLibraryItemSong*>(song)->song();
     }
 }
diff --git a/models/musiclibrarymodel.h b/models/musiclibrarymodel.h
index 1470d4a..345adc3 100644
--- a/models/musiclibrarymodel.h
+++ b/models/musiclibrarymodel.h
@@ -79,8 +79,8 @@ public:
     void removeSongFromList(const Song &s) { rootItem->removeSongFromList(s); }
     void updateSongFile(const Song &from, const Song &to) { rootItem->updateSongFile(from, to); }
     void removeCache();
-    void getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &albums, QSet<QString> &genres)
-        { rootItem->getDetails(artists, albumArtists, albums, genres); }
+    void getDetails(QSet<QString> &artists, QSet<QString> &albumArtists, QSet<QString> &composers, QSet<QString> &albums, QSet<QString> &genres)
+        { rootItem->getDetails(artists, albumArtists, composers, albums, genres); }
     QSet<QString> getAlbumArtists();
     bool update(const QSet<Song> &songs);
     void uncheckAll();
@@ -112,7 +112,7 @@ Q_SIGNALS:
 
 private:
     void setCover(const Song &song, const QImage &img, const QString &file, bool update);
-    void setParentState(const QModelIndex &parent, bool childChecked, MusicLibraryItemContainer *parentItem, MusicLibraryItem *item);
+    void setParentState(const QModelIndex &parent);
 
 private:
     bool mpdModel;
diff --git a/models/musiclibraryproxymodel.cpp b/models/musiclibraryproxymodel.cpp
index 0196e24..ee3bf11 100644
--- a/models/musiclibraryproxymodel.cpp
+++ b/models/musiclibraryproxymodel.cpp
@@ -28,11 +28,11 @@
 #include "musiclibraryitemartist.h"
 #include "musiclibraryitemalbum.h"
 #include "musiclibraryitemsong.h"
+#include "musiclibraryitempodcast.h"
 #include "musiclibraryproxymodel.h"
 
 MusicLibraryProxyModel::MusicLibraryProxyModel(QObject *parent)
     : ProxyModel(parent)
-    , filter(0)
 {
     setDynamicSortFilter(true);
     setFilterCaseSensitivity(Qt::CaseInsensitive);
@@ -47,6 +47,8 @@ bool MusicLibraryProxyModel::filterAcceptsRoot(const MusicLibraryItem *item) con
             return true;
         } else if (MusicLibraryItem::Type_Song==i->itemType() && filterAcceptsSong(i)) {
             return true;
+        } else if (MusicLibraryItem::Type_Podcast==i->itemType() && filterAcceptsAlbum(i)) {
+            return true;
         }
     }
 
@@ -97,17 +99,14 @@ bool MusicLibraryProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &
     }
 
     if (filter) {
-        if (!sourceParent.isValid()) {
-            // All top level items are valid
+        if (item==filter) { // Accept top-level item!
             return true;
         }
-
         const MusicLibraryItem *p=item->parentItem();
-        while (p->parentItem()) {
+        while (p && p->parentItem()) {
             p=p->parentItem();
         }
-        if (p!=filter) {
-            // If item is not part of 'filter' tree - then we accept it
+        if (p!=filter) {  // Accept all items that are not children of top-level item!
             return true;
         }
     }
@@ -121,6 +120,7 @@ bool MusicLibraryProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &
         return filterAcceptsRoot(item);
     case MusicLibraryItem::Type_Artist:
         return filterAcceptsArtist(item);
+    case MusicLibraryItem::Type_Podcast:
     case MusicLibraryItem::Type_Album:
         return filterAcceptsAlbum(item);
     case MusicLibraryItem::Type_Song:
@@ -137,12 +137,24 @@ bool MusicLibraryProxyModel::lessThan(const QModelIndex &left, const QModelIndex
     if (left.row()<0 || right.row()<0) {
         return left.row()<0;
     }
+
     if (static_cast<MusicLibraryItem *>(left.internalPointer())->itemType() == MusicLibraryItem::Type_Song) {
-        return static_cast<MusicLibraryItemSong *>(left.internalPointer())->song()<static_cast<MusicLibraryItemSong *>(right.internalPointer())->song();
+        MusicLibraryItemSong *l=static_cast<MusicLibraryItemSong *>(left.internalPointer());
+        MusicLibraryItemSong *r=static_cast<MusicLibraryItemSong *>(right.internalPointer());
+
+        if (l->parentItem()->itemType() == MusicLibraryItem::Type_Podcast) {
+            int compare=QString::compare(l->song().podcastPublishedDate(), r->song().podcastPublishedDate());
+            if (0!=compare) {
+                return compare>0;
+            }
+        }
+        return l->song()<r->song();
     } else if (static_cast<MusicLibraryItem *>(left.internalPointer())->itemType() == MusicLibraryItem::Type_Album) {
         return MusicLibraryItemAlbum::lessThan(static_cast<MusicLibraryItem *>(left.internalPointer()), static_cast<MusicLibraryItem *>(right.internalPointer()));
     } else if (static_cast<MusicLibraryItem *>(left.internalPointer())->itemType() == MusicLibraryItem::Type_Artist) {
         return MusicLibraryItemArtist::lessThan(static_cast<MusicLibraryItem *>(left.internalPointer()), static_cast<MusicLibraryItem *>(right.internalPointer()));
+    } else if (static_cast<MusicLibraryItem *>(left.internalPointer())->itemType() == MusicLibraryItem::Type_Podcast) {
+        return MusicLibraryItemPodcast::lessThan(static_cast<MusicLibraryItem *>(left.internalPointer()), static_cast<MusicLibraryItem *>(right.internalPointer()));
     }
 
     return QSortFilterProxyModel::lessThan(left, right);
diff --git a/models/musiclibraryproxymodel.h b/models/musiclibraryproxymodel.h
index e79357c..b7aecbd 100644
--- a/models/musiclibraryproxymodel.h
+++ b/models/musiclibraryproxymodel.h
@@ -39,17 +39,12 @@ public:
     MusicLibraryProxyModel(QObject *parent = 0);
     bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
     bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
-    void setFilterItem(const MusicLibraryItem *f) { filter=f; }
-    const MusicLibraryItem *filterItem() const { return filter; }
 
 private:
     bool filterAcceptsRoot(const MusicLibraryItem *item) const;
     bool filterAcceptsArtist(const MusicLibraryItem *item) const;
     bool filterAcceptsAlbum(const MusicLibraryItem *item) const;
     bool filterAcceptsSong(const MusicLibraryItem *item) const;
-
-private:
-    const MusicLibraryItem *filter;
 };
 
 #endif
diff --git a/models/musicmodel.cpp b/models/musicmodel.cpp
index f6c724e..3ebac49 100644
--- a/models/musicmodel.cpp
+++ b/models/musicmodel.cpp
@@ -25,7 +25,9 @@
 #include "musiclibraryitemartist.h"
 #include "musiclibraryitemsong.h"
 #include "musiclibraryitemroot.h"
+#include "musiclibraryitempodcast.h"
 #include "musicmodel.h"
+#include "onlineservice.h"
 #include "itemview.h"
 #include "localize.h"
 #include "qtplural.h"
@@ -48,7 +50,7 @@ const MusicLibraryItemRoot * MusicModel::root(const MusicLibraryItem *item) cons
         return static_cast<const MusicLibraryItemRoot *>(item);
     }
     
-    if (MusicLibraryItem::Type_Artist==item->itemType()) {
+    if (MusicLibraryItem::Type_Artist==item->itemType() || MusicLibraryItem::Type_Podcast==item->itemType()) {
         return static_cast<const MusicLibraryItemRoot *>(item->parentItem());
     }
     
@@ -104,8 +106,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;
         }
-        case MusicLibraryItem::Type_Album:
+        case MusicLibraryItem::Type_Podcast:
             if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize()) {
+                return Icons::self()->podcastIcon;
+            } else {
+                return static_cast<MusicLibraryItemPodcast *>(item)->cover();
+            }
+        case MusicLibraryItem::Type_Album:
+            if (MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize() || !root(item)->useAlbumImages()) {
                 return Icons::self()->albumIcon;
             } else {
                 return static_cast<MusicLibraryItemAlbum *>(item)->cover();
@@ -117,7 +125,7 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
         if (MusicLibraryItem::Type_Song==item->itemType()) {
             MusicLibraryItemSong *song = static_cast<MusicLibraryItemSong *>(item);
             if (Song::Playlist==song->song().type) {
-                return song->song().file.endsWith(".cue", Qt::CaseInsensitive) ? i18n("Cue Sheet") : i18n("Playlist");
+                return song->song().isCueFile() ? i18n("Cue Sheet") : i18n("Playlist");
             }
             if (MusicLibraryItem::Type_Root==song->parentItem()->itemType()) {
                 return song->song().artistSong();
@@ -125,6 +133,9 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
             if (static_cast<MusicLibraryItemAlbum *>(song->parentItem())->isSingleTracks()) {
                 return song->song().artistSong();
             }
+            if (MusicLibraryItem::Type_Podcast==song->parentItem()->itemType()) {
+                return item->data();
+            }
             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() &&
@@ -134,6 +145,15 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
         return item->data();
     case Qt::ToolTipRole:
         if (MusicLibraryItem::Type_Song==item->itemType()) {
+            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)+
+                       QLatin1String("<br/><small><i>")+static_cast<MusicLibraryItemPodcastEpisode *>(item)->published()+QLatin1String("</i></small>");
+            }
+            if (dynamic_cast<const OnlineService *>(root(item))) {
+                return parentData(item)+data(index, Qt::DisplayRole).toString()+QLatin1String("<br/>")+
+                       Song::formattedTime(static_cast<MusicLibraryItemSong *>(item)->time(), true);
+            }
             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>");
@@ -142,13 +162,15 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
                 (0==item->childCount()
                     ? item->data()
                     : (item->data()+"<br/>"+data(index, ItemView::Role_SubText).toString()));
-    case ItemView::Role_ImageSize:
+    case ItemView::Role_ImageSize: {
+        const MusicLibraryItemRoot *r=root(item);
         if (MusicLibraryItem::Type_Song!=item->itemType() && !MusicLibraryItemAlbum::itemSize().isNull()) { // icon/list style view...
-            return MusicLibraryItemAlbum::iconSize(root(item)->useLargeImages());
-        } else if (MusicLibraryItem::Type_Album==item->itemType() || (root(item)->useArtistImages() && MusicLibraryItem::Type_Artist==item->itemType())) {
+            return MusicLibraryItemAlbum::iconSize(r->useLargeImages());
+        } else if ((r->useAlbumImages() && MusicLibraryItem::Type_Album==item->itemType()) || MusicLibraryItem::Type_Podcast==item->itemType() || (r->useArtistImages() && MusicLibraryItem::Type_Artist==item->itemType())) {
             return MusicLibraryItemAlbum::iconSize();
         }
         break;
+    }
     case ItemView::Role_SubText:
         switch (item->itemType()) {
         case MusicLibraryItem::Type_Root: {
@@ -166,7 +188,6 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
             #else
             return QTP_ARTISTS_STR(item->childCount());
             #endif
-            break;
         }
         case MusicLibraryItem::Type_Artist:
             #ifdef ENABLE_KDE_SUPPORT
@@ -174,7 +195,12 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
             #else
             return QTP_ALBUMS_STR(item->childCount());
             #endif
-            break;
+        case MusicLibraryItem::Type_Podcast:
+            #ifdef ENABLE_KDE_SUPPORT
+            return i18np("1 Episode", "%1 Episodes", item->childCount());
+            #else
+            return QTP_EPISODES_STR(item->childCount());
+            #endif
         case MusicLibraryItem::Type_Song:
             return Song::formattedTime(static_cast<MusicLibraryItemSong *>(item)->time(), true);
         case MusicLibraryItem::Type_Album:
@@ -187,24 +213,29 @@ QVariant MusicModel::data(const QModelIndex &index, int role) const
             #endif
         default: return QVariant();
         }
-    case ItemView::Role_Image:
-        if (MusicLibraryItem::Type_Album==item->itemType()) {
-            QVariant v;
+    case ItemView::Role_Image: {
+        QVariant v;
+        switch (item->itemType()) {
+        case MusicLibraryItem::Type_Album:
             v.setValue<QPixmap>(static_cast<MusicLibraryItemAlbum *>(item)->cover());
-            return v;
-        } else if (MusicLibraryItem::Type_Artist==item->itemType() && static_cast<MusicLibraryItemRoot *>(item->parentItem())->useArtistImages()) {
-            QVariant v;
-            v.setValue<QPixmap>(static_cast<MusicLibraryItemArtist *>(item)->cover());
-            return v;
+            break;
+        case MusicLibraryItem::Type_Artist:
+            if (static_cast<MusicLibraryItemRoot *>(item->parentItem())->useArtistImages()) {
+                v.setValue<QPixmap>(static_cast<MusicLibraryItemArtist *>(item)->cover());
+            }
+            break;
+        case MusicLibraryItem::Type_Podcast:
+            v.setValue<QPixmap>(static_cast<MusicLibraryItemPodcast *>(item)->cover());
+        default:
+            break;
         }
-        return QVariant();
+        return v;
+    }
     case ItemView::Role_TitleText:
-        if (MusicLibraryItem::Type_Artist==item->itemType()) {
-            return item->data();
-        } else if (MusicLibraryItem::Type_Album==item->itemType()) {
+        if (MusicLibraryItem::Type_Album==item->itemType()) {
             return i18nc("Album by Artist", "%1 by %2", item->data(), item->parentItem()->data());
         }
-        break;
+        return item->data();
     case Qt::SizeHintRole: {
         const MusicLibraryItemRoot *r=root(item);
         if (!r->useArtistImages() && MusicLibraryItem::Type_Artist==item->itemType()) {
diff --git a/models/onlineservicesmodel.cpp b/models/onlineservicesmodel.cpp
index 2a84f95..2a61a4a 100644
--- a/models/onlineservicesmodel.cpp
+++ b/models/onlineservicesmodel.cpp
@@ -21,10 +21,12 @@
  * Boston, MA 02110-1301, USA.
  */
 
+#include "config.h"
 #include "musiclibraryitemalbum.h"
 #include "musiclibraryitemartist.h"
 #include "musiclibraryitemsong.h"
 #include "musiclibraryitemroot.h"
+#include "musiclibraryitempodcast.h"
 #include "musiclibrarymodel.h"
 #include "dirviewmodel.h"
 #include "onlineservicesmodel.h"
@@ -35,6 +37,7 @@
 #include "jamendoservice.h"
 #include "magnatuneservice.h"
 #include "soundcloudservice.h"
+#include "podcastservice.h"
 #include "playqueuemodel.h"
 #include "itemview.h"
 #include "mpdparseutils.h"
@@ -43,18 +46,24 @@
 #include "icons.h"
 #include "filejob.h"
 #include "utils.h"
-#include "covers.h"
 #include "stdactions.h"
 #include "actioncollection.h"
+#include "networkaccessmanager.h"
+#include "settings.h"
 #include <QStringList>
 #include <QMimeData>
 #include <QFile>
 #include <QDir>
+#include <QDebug>
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KGlobal>
 K_GLOBAL_STATIC(OnlineServicesModel, instance)
 #endif
 
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
+
 QString OnlineServicesModel::constUdiPrefix("online-service://");
 
 OnlineServicesModel * OnlineServicesModel::self()
@@ -65,6 +74,9 @@ OnlineServicesModel * OnlineServicesModel::self()
     static OnlineServicesModel *instance=0;
     if(!instance) {
         instance=new OnlineServicesModel;
+        #if defined ENABLE_MODEL_TEST
+        new ModelTest(instance, instance);
+        #endif
     }
     return instance;
     #endif
@@ -74,9 +86,14 @@ OnlineServicesModel::OnlineServicesModel(QObject *parent)
     : MultiMusicModel(parent)
     , enabled(false)
     , dev(0)
+    , podcast(0)
 {
-    configureAction = ActionCollection::get()->createAction("configureonlineservice", i18n("Configure Online Service"), Icons::self()->configureIcon);
-    refreshAction = ActionCollection::get()->createAction("refreshonlineservice", i18n("Refresh Online Service"), "view-refresh");
+    configureAction = ActionCollection::get()->createAction("configureonlineservice", i18n("Configure Service"), Icons::self()->configureIcon);
+    refreshAction = ActionCollection::get()->createAction("refreshonlineservice", i18n("Refresh Service"), "view-refresh");
+    subscribeAction = ActionCollection::get()->createAction("subscribeonlineservice", i18n("Add Subscription"), "list-add");
+    unSubscribeAction = ActionCollection::get()->createAction("unsubscribeonlineservice", i18n("Remove Subscription"), "list-remove");
+    refreshSubscriptionAction = ActionCollection::get()->createAction("refreshsubscription", i18n("Refresh Subscription"), "view-refresh");
+    load();
 }
 
 OnlineServicesModel::~OnlineServicesModel()
@@ -85,8 +102,8 @@ OnlineServicesModel::~OnlineServicesModel()
 
 QModelIndex OnlineServicesModel::serviceIndex(const OnlineService *srv) const
 {
-    int row=collections.indexOf(const_cast<OnlineService *>(srv));
-    return -1==row ? QModelIndex() : createIndex(row, 0, (void *)srv);
+    int r=row(const_cast<OnlineService *>(srv));
+    return -1==r ? QModelIndex() : createIndex(r, 0, (void *)srv);
 }
 
 bool OnlineServicesModel::hasChildren(const QModelIndex &index) const
@@ -98,7 +115,8 @@ bool OnlineServicesModel::canFetchMore(const QModelIndex &index) const
 {
     return index.isValid() && MusicLibraryItem::Type_Root==static_cast<MusicLibraryItem *>(index.internalPointer())->itemType() &&
             !static_cast<OnlineService *>(index.internalPointer())->isLoaded() &&
-            !static_cast<OnlineService *>(index.internalPointer())->isSearchBased();
+            !static_cast<OnlineService *>(index.internalPointer())->isSearchBased() &&
+            !static_cast<OnlineService *>(index.internalPointer())->isPodcasts();
 }
 
 void OnlineServicesModel::fetchMore(const QModelIndex &index)
@@ -128,7 +146,8 @@ QVariant OnlineServicesModel::data(const QModelIndex &index, int role) const
         }
         break;
     case ItemView::Role_SubText:
-        if (MusicLibraryItem::Type_Root==item->itemType()) {
+        switch(item->itemType()) {
+        case MusicLibraryItem::Type_Root: {
             OnlineService *srv=static_cast<OnlineService *>(item);
 
             if (srv->isLoading()) {
@@ -137,7 +156,7 @@ QVariant OnlineServicesModel::data(const QModelIndex &index, int role) const
             if (srv->isSearching())  {
                 return i18n("Searching...");
             }
-            if (!srv->isLoaded() && !srv->isSearchBased()) {
+            if (!srv->isLoaded() && !srv->isSearchBased() && !srv->isPodcasts()) {
                 return i18n("Not Loaded");
             }
             if (0==item->childCount() && srv->isSearchBased()) {
@@ -150,6 +169,26 @@ QVariant OnlineServicesModel::data(const QModelIndex &index, int role) const
                 return QTP_TRACKS_STR(item->childCount());
                 #endif
             }
+            if (srv->isPodcasts()) {
+                #ifdef ENABLE_KDE_SUPPORT
+                return i18np("1 Podcast", "%1 Podcasts", item->childCount());
+                #else
+                return QTP_PODCASTS_STR(item->childCount());
+                #endif
+            }
+            break;
+        }
+        case MusicLibraryItem::Type_Song: {
+            if (MusicLibraryItem::Type_Podcast==item->parentItem()->itemType()) {
+                if (static_cast<MusicLibraryItemPodcastEpisode *>(item)->downloadProgress()>=0) {
+                    return MultiMusicModel::data(index, role).toString()+QLatin1Char(' ')+
+                           i18n("(Downloading: %1%)", static_cast<MusicLibraryItemPodcastEpisode *>(item)->downloadProgress());
+                }
+            }
+            break;
+        }
+        default:
+            break;
         }
         break;
     case ItemView::Role_Actions: {
@@ -161,10 +200,17 @@ QVariant OnlineServicesModel::data(const QModelIndex &index, int role) const
             }
             if (srv->canLoad()) {
                 actions << refreshAction;
+            } else if (srv->canSubscribe() && !srv->childItems().isEmpty()) {
+                actions << refreshSubscriptionAction;
             }
             if (srv->isSearchBased() || srv->isLoaded()) {
                 actions << StdActions::self()->searchAction;
             }
+            if (srv->canSubscribe()) {
+                actions << subscribeAction;
+            }
+        } else if (MusicLibraryItem::Type_Podcast==item->itemType()) {
+            actions << refreshSubscriptionAction;
         } else {
             actions << StdActions::self()->replacePlayQueueAction << StdActions::self()->addToPlayQueueAction;
         }
@@ -174,7 +220,28 @@ QVariant OnlineServicesModel::data(const QModelIndex &index, int role) const
             v.setValue<QList<Action *> >(actions);
             return v;
         }
+        break;
     }
+    case Qt::DecorationRole:
+        if (MusicLibraryItem::Type_Song==item->itemType() && item->parentItem() && MusicLibraryItem::Type_Podcast==item->parentItem()->itemType()) {
+            if (!static_cast<MusicLibraryItemPodcastEpisode *>(item)->localPath().isEmpty()) {
+                return Icons::self()->downloadedPodcastEpisodeIcon;
+            }
+        }
+        break;
+    case Qt::FontRole:
+        if ((MusicLibraryItem::Type_Song==item->itemType() && item->parentItem() && MusicLibraryItem::Type_Podcast==item->parentItem()->itemType() &&
+             !static_cast<MusicLibraryItemSong *>(item)->song().hasBeenPlayed()) ||
+            (MusicLibraryItem::Type_Podcast==item->itemType() && static_cast<MusicLibraryItemPodcast *>(item)->unplayedEpisodes()>0)) {
+            QFont f;
+            f.setBold(true);
+            return f;
+        }
+        break;
+    case Qt::DisplayRole:
+        if (MusicLibraryItem::Type_Podcast==item->itemType() && static_cast<MusicLibraryItemPodcast *>(item)->unplayedEpisodes()) {
+            return i18nc("podcast name (num unplayed episodes)", "%1 (%2)", item->data(), static_cast<MusicLibraryItemPodcast *>(item)->unplayedEpisodes());
+        }
     default:
         break;
     }
@@ -201,29 +268,14 @@ void OnlineServicesModel::setEnabled(bool e)
         return;
     }
 
-    bool wasEnabled=enabled;
     enabled=e;
-    if (enabled) {
-        connect(Covers::self(), SIGNAL(artistImage(const Song &, const QImage &, const QString &)),
-                this, SLOT(setArtistImage(const Song &, const QImage &)));
-        connect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)),
-                this, SLOT(setCover(const Song &, const QImage &, const QString &)));
-        load();
-    } else {
-        if (wasEnabled) {
-            stop();
-        }
-        clear();
+    if (!enabled) {
+        stop();
     }
 }
 
 void OnlineServicesModel::stop()
 {
-    disconnect(Covers::self(), SIGNAL(artistImage(const Song &, const QImage &, const QString &)),
-              this, SLOT(setArtistImage(const Song &, const QImage &)));
-    disconnect(Covers::self(), SIGNAL(cover(const Song &, const QImage &, const QString &)),
-              this, SLOT(setCover(const Song &, const QImage &, const QString &)));
-
     foreach (MusicLibraryItemRoot *col, collections) {
         static_cast<OnlineService *>(col)->stopLoader();
     }
@@ -232,56 +284,24 @@ void OnlineServicesModel::stop()
 OnlineService * OnlineServicesModel::service(const QString &name)
 {
     int idx=name.isEmpty() ? -1 : indexOf(name);
-    return idx<0 ? 0 : static_cast<OnlineService *>(collections.at(idx));
-}
-
-void OnlineServicesModel::setArtistImage(const Song &song, const QImage &img)
-{
-    if (img.isNull() || MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize() || !(song.file.startsWith("http:/") || song.name.startsWith("http:/"))) {
-        return;
+    if (idx>=0) {
+        return static_cast<OnlineService *>(collections.at(idx));
     }
-
-    for (int i=0; i<collections.count() ; ++i) {
-        OnlineService *srv=static_cast<OnlineService *>(collections.at(i));
-        if (srv->useArtistImages()) {
-            MusicLibraryItemArtist *artistItem = srv->artist(song, false);
-            if (artistItem && artistItem->setCover(img)) {
-                QModelIndex idx=index(artistItem->row(), 0, index(i, 0, QModelIndex()));
-                emit dataChanged(idx, idx);
-            }
-        }
+    foreach (OnlineService *srv, hiddenServices) {
+         if (srv->id()==name) {
+             return srv;
+         }
     }
+    return 0;
 }
 
-void OnlineServicesModel::setCover(const Song &song, const QImage &img, const QString &fileName)
-{
-    Q_UNUSED(fileName)
-    if (img.isNull() || MusicLibraryItemAlbum::CoverNone==MusicLibraryItemAlbum::currentCoverSize() || !(song.file.startsWith("http:/") || song.name.startsWith("http:/"))) {
-        return;
-    }
-
-    for (int i=0; i<collections.count() ; ++i) {
-        OnlineService *srv=static_cast<OnlineService *>(collections.at(i));
-        if (srv->useAlbumImages()) {
-            MusicLibraryItemArtist *artistItem = srv->artist(song, false);
-            if (artistItem) {
-                MusicLibraryItemAlbum *albumItem = artistItem->album(song, false);
-                if (albumItem && albumItem->setCover(img)) {
-                    QModelIndex idx=index(albumItem->row(), 0, index(artistItem->row(), 0, index(i, 0, QModelIndex())));
-                    emit dataChanged(idx, idx);
-                }
-            }
-        }
-    }
-}
-
-void OnlineServicesModel::setBusy(const QString &serviceName, bool b)
+void OnlineServicesModel::setBusy(const QString &id, bool b)
 {
     int before=busyServices.count();
     if (b) {
-        busyServices.insert(serviceName);
+        busyServices.insert(id);
     } else {
-        busyServices.remove(serviceName);
+        busyServices.remove(id);
     }
 
     if (before!=busyServices.count()) {
@@ -294,10 +314,10 @@ Qt::ItemFlags OnlineServicesModel::flags(const QModelIndex &index) const
     if (index.isValid()) {
         return Qt::ItemIsSelectable | Qt::ItemIsEnabled | Qt::ItemIsDragEnabled;
     }
-    return Qt::ItemIsEnabled;
+    return Qt::NoItemFlags;
 }
 
-OnlineService * OnlineServicesModel::addService(const QString &name)
+OnlineService * OnlineServicesModel::addService(const QString &name, const QSet<QString> &hidden)
 {
     OnlineService *srv=0;
 
@@ -308,14 +328,19 @@ OnlineService * OnlineServicesModel::addService(const QString &name)
             srv=new MagnatuneService(this);
         } else if (name==SoundCloudService::constName) {
             srv=new SoundCloudService(this);
+        } else if (name==PodcastService::constName) {
+            srv=podcast=new PodcastService(this);
         }
 
         if (srv) {
             srv->loadConfig();
-            beginInsertRows(QModelIndex(), collections.count(), collections.count());
-            srv->setRow(collections.count());
-            collections.append(srv);
-            endInsertRows();
+            if (hidden.contains(srv->id())) {
+                hiddenServices.append(srv);
+            } else {
+                beginInsertRows(QModelIndex(), collections.count(), collections.count());
+                collections.append(srv);
+                endInsertRows();
+            }
             connect(srv, SIGNAL(error(const QString &)), SIGNAL(error(const QString &)));
         }
     }
@@ -354,9 +379,11 @@ void OnlineServicesModel::stateChanged(const QString &name, bool state)
 
 void OnlineServicesModel::load()
 {
-    addService(JamendoService::constName);
-    addService(MagnatuneService::constName);
-    addService(SoundCloudService::constName);
+    QSet<QString> hidden=Settings::self()->hiddenOnlineProviders().toSet();
+    addService(JamendoService::constName, hidden);
+    addService(MagnatuneService::constName, hidden);
+    addService(SoundCloudService::constName, hidden);
+    addService(PodcastService::constName, hidden);
 }
 
 void OnlineServicesModel::setSearch(const QString &serviceName, const QString &text)
@@ -391,3 +418,269 @@ Device * OnlineServicesModel::device(const QString &udi)
 }
 #endif
 
+bool OnlineServicesModel::subscribePodcast(const QUrl &url)
+{
+    if (podcast && !podcast->subscribedToUrl(url)) {
+        podcast->addUrl(url);
+        return true;
+    }
+    return false;
+}
+
+void OnlineServicesModel::downloadPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes)
+{
+    podcast->downloadPodcasts(pod, episodes);
+}
+
+void OnlineServicesModel::deleteDownloadedPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes)
+{
+    podcast->deleteDownloadedPodcasts(pod, episodes);
+}
+
+bool OnlineServicesModel::isDownloading() const
+{
+    return podcast->isDownloading();
+}
+
+void OnlineServicesModel::cancelAll()
+{
+    podcast->cancelAllJobs();
+}
+
+static const char * constExtensions[]={".jpg", ".png", 0};
+static const char * constIdProperty="id";
+static const char * constArtistProperty="artist";
+static const char * constAlbumProperty="album";
+static const char * constCacheProperty="cacheName";
+static const char * constMaxSizeProperty="maxSize";
+
+#define DBUG if (Covers::debugEnabled()) qWarning() << "OnlineServicesModel" << __FUNCTION__
+
+static Covers::Image readCache(const QString &id, const QString &artist, const QString &album)
+{
+    DBUG << id << artist << album;
+    Covers::Image i;
+    QString baseName=Utils::cacheDir(id.toLower(), false)+Covers::encodeName(album.isEmpty() ? artist : (artist+" - "+album));
+    for (int e=0; constExtensions[e]; ++e) {
+        QString fileName=baseName+constExtensions[e];
+        if (QFile::exists(fileName)) {
+            QImage img(fileName);
+
+            if (!img.isNull()) {
+                DBUG << "Read from cache" << fileName;
+                i.img=img;
+                i.fileName=fileName;
+                break;
+            }
+        }
+    }
+    return i;
+}
+
+Covers::Image OnlineServicesModel::readImage(const Song &song)
+{
+    DBUG << song.file << song.albumArtist() << song.album;
+    QUrl u(song.file);
+    Covers::Image img;
+    QString id;
+    if (u.host().contains(JamendoService::constName, Qt::CaseInsensitive)) {
+        id=JamendoService::constName;
+    } else if (u.host().contains(MagnatuneService::constName, Qt::CaseInsensitive)) {
+        id=MagnatuneService::constName;
+    }
+
+    if (!id.isEmpty()) {
+        img=readCache(id, song.albumArtist(), song.album);
+    }
+
+    return img;
+}
+
+QImage OnlineServicesModel::requestImage(const QString &id, const QString &artist, const QString &album, const QString &url,
+                                         const QString cacheName, int maxSize)
+{
+    DBUG << id << artist << album << url << cacheName << maxSize;
+    if (cacheName.isEmpty()) {
+        Covers::Image i=readCache(id, artist, album);
+        if (!i.img.isNull()) {
+            return i.img;
+        }
+    } else if (QFile::exists(cacheName)) {
+        QImage img(cacheName);
+        if (!img.isNull()) {
+            DBUG << "Used cache filename";
+            return img;
+        }
+    }
+
+    QString imageUrl=url;
+    // Jamendo image URL is jsut the album ID!
+    if (!imageUrl.isEmpty() && !imageUrl.startsWith("http:/") && imageUrl.length()<15 && id==JamendoService::constName) {
+        imageUrl=JamendoService::imageUrl(imageUrl);
+        DBUG << "Built jamendo url" << imageUrl;
+    }
+
+    if (!imageUrl.isEmpty()) {
+        DBUG << "Download url";
+        // Need to download image...
+        NetworkJob *j=NetworkAccessManager::self()->get(QUrl(imageUrl));
+        j->setProperty(constIdProperty, id);
+        j->setProperty(constArtistProperty, artist);
+        j->setProperty(constAlbumProperty, album);
+        j->setProperty(constCacheProperty, cacheName);
+        j->setProperty(constMaxSizeProperty, maxSize);
+
+        connect(j, SIGNAL(finished()), this, SLOT(imageDownloaded()));
+    }
+
+    return QImage();
+}
+
+void OnlineServicesModel::imageDownloaded()
+{
+    NetworkJob *j=qobject_cast<NetworkJob *>(sender());
+
+    if (!j) {
+        return;
+    }
+
+    j->deleteLater();
+    QByteArray data=QNetworkReply::NoError==j->error() ? j->readAll() : QByteArray();
+    if (data.isEmpty()) {
+        DBUG << j->url().toString() << "empty!";
+        return;
+    }
+
+    QString url=j->url().toString();
+    bool png=url.endsWith(".png", Qt::CaseInsensitive);
+    QImage img=QImage::fromData(data, png ? "PNG" : "JPG");
+    if (img.isNull()) {
+        DBUG << url << "null image";
+        return;
+    }
+
+    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;
+    OnlineService *srv=service(id);
+    if (id==PodcastService::constName) {
+        MusicLibraryItem *podcast=srv->childItem(song.artist);
+        if (podcast && static_cast<MusicLibraryItemPodcast *>(podcast)->setCover(img)) {
+            QModelIndex idx=index(podcast->row(), 0, index(row(srv), 0, QModelIndex()));
+            emit dataChanged(idx, idx);
+
+        }
+    } else if (song.album.isEmpty()) {
+        if (srv->useArtistImages() && srv->id()==id) {
+            MusicLibraryItemArtist *artistItem = srv->artist(song, false);
+            if (artistItem && artistItem->setCover(img)) {
+                QModelIndex idx=index(artistItem->row(), 0, index(row(srv), 0, QModelIndex()));
+                emit dataChanged(idx, idx);
+            }
+        }
+    } else {
+        if (srv->useAlbumImages() && !srv->isPodcasts() && srv->id()==id) {
+            MusicLibraryItemArtist *artistItem = srv->artist(song, false);
+            if (artistItem) {
+                MusicLibraryItemAlbum *albumItem = artistItem->album(song, false);
+                if (albumItem && albumItem->setCover(img)) {
+                    QModelIndex idx=index(albumItem->row(), 0, index(artistItem->row(), 0, index(row(srv), 0, QModelIndex())));
+                    emit dataChanged(idx, idx);
+                }
+            }
+        }
+    }
+
+    int maxSize=j->property(constMaxSizeProperty).toInt();
+    QString cacheName=j->property(constCacheProperty).toString();
+    QString fileName=(cacheName.isEmpty()
+                        ? 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;
+        }
+    }
+    QFile f(fileName);
+    if (f.open(QIODevice::WriteOnly)) {
+        DBUG << "Saved image to" << fileName;
+        f.write(data);
+        if (!song.album.isEmpty()) {
+            song.track=1;
+            song.setKey();
+            Covers::self()->emitCoverUpdated(song, img, fileName);
+        }
+    }
+}
+
+void OnlineServicesModel::save()
+{
+    QStringList disabled;
+    foreach (OnlineService *i, hiddenServices) {
+        disabled.append(i->id());
+    }
+    disabled.sort();
+    Settings::self()->saveHiddenOnlineProviders(disabled);
+}
+
+QList<OnlineServicesModel::Provider> OnlineServicesModel::getProviders() const
+{
+    QList<Provider> providers;
+    foreach (OnlineService *i, hiddenServices) {
+        providers.append(Provider(i->data(), static_cast<OnlineService *>(i)->icon(), static_cast<OnlineService *>(i)->id(), true,
+                                  static_cast<OnlineService *>(i)->canConfigure()));
+    }
+    foreach (MusicLibraryItemRoot *i, collections) {
+        providers.append(Provider(i->data(), static_cast<OnlineService *>(i)->icon(), static_cast<OnlineService *>(i)->id(), false,
+                                  static_cast<OnlineService *>(i)->canConfigure()));
+    }
+    return providers;
+}
+
+void OnlineServicesModel::setHiddenProviders(const QSet<QString> &prov)
+{
+//    bool added=false;
+    bool changed=false;
+    foreach (OnlineService *i, hiddenServices) {
+        if (!prov.contains(i->id())) {
+            beginInsertRows(QModelIndex(), collections.count(), collections.count());
+            collections.append(i);
+            hiddenServices.removeAll(i);
+            endInsertRows();
+            /*added=*/changed=true;
+        }
+    }
+
+    foreach (MusicLibraryItemRoot *i, collections) {
+        if (prov.contains(static_cast<OnlineService *>(i)->id())) {
+            int r=row(i);
+            if (r>=0) {
+                beginRemoveRows(QModelIndex(), r, r);
+                hiddenServices.append(static_cast<OnlineService *>(collections.takeAt(r)));
+                endRemoveRows();
+                changed=true;
+            }
+        }
+    }
+//    if (added && collections.count()>1) {
+//        emit needToSort();
+//    }
+    updateGenres();
+    if (changed) {
+        emit providersChanged();
+    }
+}
diff --git a/models/onlineservicesmodel.h b/models/onlineservicesmodel.h
index 66a167e..713a81d 100644
--- a/models/onlineservicesmodel.h
+++ b/models/onlineservicesmodel.h
@@ -26,13 +26,17 @@
 #include <QSet>
 #include "song.h"
 #include "config.h"
+#include "covers.h"
 #include "multimusicmodel.h"
 #include "musiclibraryproxymodel.h"
 
 class Device;
 class OnlineService;
+class PodcastService;
 class OnlineDevice;
 class MusicLibraryItem;
+class MusicLibraryItemPodcast;
+class MusicLibraryItemPodcastEpisode;
 
 class OnlineServicesModel : public MultiMusicModel
 {
@@ -42,6 +46,17 @@ public:
     static QString constUdiPrefix;
     static OnlineServicesModel * self();
 
+    struct Provider
+    {
+        Provider(const QString &n, const QIcon &i, const QString &k, bool h, bool c)
+            : name(n), icon(i), key(k), hidden(h), configurable(c) { }
+        QString name;
+        QIcon icon;
+        QString key;
+        bool hidden;
+        bool configurable;
+    };
+
     OnlineServicesModel(QObject *parent = 0);
     ~OnlineServicesModel();
     QModelIndex serviceIndex(const OnlineService *srv) const;
@@ -54,6 +69,7 @@ public:
     OnlineService * service(const QString &name);
     bool isEnabled() const { return enabled; }
     void setEnabled(bool e);
+    bool serviceIsBusy(const QString &id) const { return busyServices.contains(id); }
     void stop();
     QMimeData * mimeData(const QModelIndexList &indexes) const;
     void setSearch(const QString &serviceName, const QString &text);
@@ -62,33 +78,56 @@ public:
     #endif
     Action * configureAct() const { return configureAction; }
     Action * refreshAct() const { return refreshAction; }
+    Action * subscribeAct() const { return subscribeAction; }
+    Action * unSubscribeAct() const { return unSubscribeAction; }
+    Action * refreshSubscriptionAct() const { return refreshSubscriptionAction; }
+    bool subscribePodcast(const QUrl &url);
+    void downloadPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes);
+    void deleteDownloadedPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes);
+    bool isDownloading() const;
+    void cancelAll();
+    bool isHidden(OnlineService *srv) { return hiddenServices.contains(srv); }
+
+    Covers::Image readImage(const Song &song);
+    QImage requestImage(const QString &id, const QString &artist, const QString &album, const QString &url,
+                        const QString cacheName=QString(), int maxSize=-1);
+
+    void save();
+    QList<Provider> getProviders() const;
+    void setHiddenProviders(const QSet<QString> &prov);
 
 public Q_SLOTS:
-    void setArtistImage(const Song &song, const QImage &img);
-    void setCover(const Song &song, const QImage &img, const QString &fileName);
     void stateChanged(const QString &name, bool state);
 
 private:
-    OnlineService * addService(const QString &name);
+    OnlineService * addService(const QString &name, const QSet<QString> &hidden);
     void removeService(const QString &name);
     void updateItemMenu();
     void load();
-    void setBusy(const QString &serviceName, bool b);
+    void setBusy(const QString &id, bool b);
+
+private Q_SLOTS:
+    void imageDownloaded();
 
 Q_SIGNALS:
     void error(const QString &text);
+    void podcastError(const QString &text);
     void updated(const QModelIndex &idx);
+//    void needToSort();
     void busy(bool);
+    void providersChanged();
 
 private:
     bool enabled;
     OnlineDevice *dev;
     Action *configureAction;
     Action *refreshAction;
-    Action *connectAction;
-    Action *disconnectAction;
+    Action *subscribeAction;
+    Action *unSubscribeAction;
+    Action *refreshSubscriptionAction;
     QSet<QString> busyServices;
-
+    PodcastService *podcast;
+    QList<OnlineService *> hiddenServices;
     friend class OnlineService;
 };
 
diff --git a/models/playlistsmodel.cpp b/models/playlistsmodel.cpp
index 7050373..eee4b18 100644
--- a/models/playlistsmodel.cpp
+++ b/models/playlistsmodel.cpp
@@ -27,6 +27,7 @@
 #include <QModelIndex>
 #include <QMimeData>
 #include <QMenu>
+#include "config.h"
 #include "playlistsmodel.h"
 #include "playlistsproxymodel.h"
 #include "itemview.h"
@@ -43,7 +44,10 @@ K_GLOBAL_STATIC(PlaylistsModel, instance)
 #include "mpdconnection.h"
 #include "playqueuemodel.h"
 #include "icons.h"
-#include "gtkstyle.h"
+
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
 
 PlaylistsModel * PlaylistsModel::self()
 {
@@ -53,6 +57,9 @@ PlaylistsModel * PlaylistsModel::self()
     static PlaylistsModel *instance=0;
     if(!instance) {
         instance=new PlaylistsModel;
+        #if defined ENABLE_MODEL_TEST
+        new ModelTest(instance, instance);
+        #endif
     }
     return instance;
     #endif
@@ -60,6 +67,7 @@ PlaylistsModel * PlaylistsModel::self()
 
 PlaylistsModel::PlaylistsModel(QObject *parent)
     : ActionModel(parent)
+    , enabled(true)
     , itemMenu(0)
     , dropAdjust(0)
 {
@@ -101,14 +109,30 @@ int PlaylistsModel::rowCount(const QModelIndex &index) const
     Item *item=static_cast<Item *>(index.internalPointer());
     if (item->isPlaylist()) {
         PlaylistItem *pl=static_cast<PlaylistItem *>(index.internalPointer());
-        if (!pl->loaded) {
-            pl->loaded=true;
-            emit playlistInfo(pl->name);
-        }
         return pl->songs.count();
     }
     return 0;
-    //return item->isPlaylist() ? static_cast<PlaylistItem *>(item)->songs.count() : 0;
+}
+
+bool PlaylistsModel::canFetchMore(const QModelIndex &index) const
+{
+    if (!index.isValid()) {
+        return false;
+    }
+    Item *item=static_cast<Item *>(index.internalPointer());
+    return item && item->isPlaylist() && !static_cast<PlaylistItem *>(item)->loaded;
+}
+
+void PlaylistsModel::fetchMore(const QModelIndex &index)
+{
+    if (!index.isValid()) {
+        return;
+    }
+    Item *item=static_cast<Item *>(index.internalPointer());
+    if (item->isPlaylist() && !static_cast<PlaylistItem *>(item)->loaded) {
+        static_cast<PlaylistItem *>(item)->loaded=true;
+        emit playlistInfo(static_cast<PlaylistItem *>(item)->name);
+    }
 }
 
 bool PlaylistsModel::hasChildren(const QModelIndex &parent) const
@@ -181,17 +205,21 @@ QVariant PlaylistsModel::data(const QModelIndex &index, int role) const
         case GroupedView::Role_AlbumDuration:
             return pl->totalTime();
         case GroupedView::Role_SongCount:
+            if (!pl->loaded) {
+                pl->loaded=true;
+                emit playlistInfo(pl->name);
+            }
             return pl->songs.count();
         case GroupedView::Role_CurrentStatus:
         case GroupedView::Role_Status:
             return (int)GroupedView::State_Default;
         case Qt::DisplayRole:
+            return pl->name;
+        case Qt::ToolTipRole:
             if (!pl->loaded) {
                 pl->loaded=true;
                 emit playlistInfo(pl->name);
             }
-            return pl->name;
-        case Qt::ToolTipRole:
             return 0==pl->songs.count()
                 ? pl->name
                 : pl->name+"\n"+
@@ -203,6 +231,10 @@ QVariant PlaylistsModel::data(const QModelIndex &index, int role) const
         case Qt::DecorationRole:
             return Icons::self()->playlistIcon;
         case ItemView::Role_SubText:
+            if (!pl->loaded) {
+                pl->loaded=true;
+                emit playlistInfo(pl->name);
+            }
             #ifdef ENABLE_KDE_SUPPORT
             return i18np("1 Track (%2)", "%1 Tracks (%2)", pl->songs.count(), Song::formattedTime(pl->totalTime()));
             #else
@@ -283,7 +315,7 @@ QVariant PlaylistsModel::data(const QModelIndex &index, int role) const
             return text;
         }
         case Qt::DecorationRole:
-            return s->title.isEmpty() ? Icons::self()->streamIcon : Icon("audio-x-generic");
+            return 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:
@@ -308,17 +340,10 @@ bool PlaylistsModel::setData(const QModelIndex &index, const QVariant &value, in
 
 Qt::ItemFlags PlaylistsModel::flags(const QModelIndex &index) const
 {
-    Q_UNUSED(index)
-    return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled;
-//     if (index.isValid()) {
-//         if (static_cast<Item *>(index.internalPointer())->isPlaylist()) {
-//             return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled;
-//         } else {
-//             return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled;
-//         }
-//     } else {
-//         return 0;
-//     }
+    if (index.isValid()) {
+        return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled;
+    }
+    return Qt::NoItemFlags;
 }
 
 Qt::DropActions PlaylistsModel::supportedDropActions() const
@@ -517,7 +542,9 @@ QStringList PlaylistsModel::mimeTypes() const
 
 void PlaylistsModel::getPlaylists()
 {
-    emit listPlaylists();
+    if (enabled) {
+        emit listPlaylists();
+    }
 }
 
 void PlaylistsModel::clear()
@@ -528,6 +555,20 @@ void PlaylistsModel::clear()
     endResetModel();
 }
 
+void PlaylistsModel::setEnabled(bool e)
+{
+    if (e==enabled) {
+        return;
+    }
+
+    enabled=e;
+    if (enabled) {
+        getPlaylists();
+    } else {
+        clear();
+    }
+}
+
 void PlaylistsModel::setPlaylists(const QList<Playlist> &playlists)
 {
     if (items.isEmpty()) {
@@ -651,6 +692,7 @@ void PlaylistsModel::playlistInfoRetrieved(const QString &name, const QList<Song
         }
         pl->updateGenres();
         emit updated(idx);
+        emit dataChanged(idx, idx);
     } else {
         emit listPlaylists();
     }
diff --git a/models/playlistsmodel.h b/models/playlistsmodel.h
index a3fcc95..266eb5d 100644
--- a/models/playlistsmodel.h
+++ b/models/playlistsmodel.h
@@ -82,6 +82,8 @@ public:
     ~PlaylistsModel();
     QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
     int rowCount(const QModelIndex &parent = QModelIndex()) const;
+    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;
@@ -97,6 +99,8 @@ public:
     QStringList mimeTypes() const;
     void getPlaylists();
     void clear();
+    bool isEnabled() const { return enabled; }
+    void setEnabled(bool e);
     bool exists(const QString &n) { return 0!=getPlaylist(n); }
     QMenu * menu() { return itemMenu; }
     const QSet<QString> & genres() { return plGenres; }
@@ -132,6 +136,7 @@ private:
     quint32 allocateKey();
 
 private:
+    bool enabled;
     QList<PlaylistItem *> items;
     QSet<quint32> usedKeys;
     QSet<QString> plGenres;
diff --git a/models/playqueuemodel.cpp b/models/playqueuemodel.cpp
index 984b00d..f875f1a 100644
--- a/models/playqueuemodel.cpp
+++ b/models/playqueuemodel.cpp
@@ -42,21 +42,23 @@
 #include "mpdstatus.h"
 #include "streamfetcher.h"
 #include "streamsmodel.h"
-#ifdef TAGLIB_FOUND
 #include "httpserver.h"
-#endif
 #include "settings.h"
 #include "icon.h"
+#include "utils.h"
 #include "config.h"
 #ifdef ENABLE_DEVICES_SUPPORT
 #include "devicesmodel.h"
 #endif
 
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
+
 const QLatin1String PlayQueueModel::constMoveMimeType("cantata/move");
 const QLatin1String PlayQueueModel::constFileNameMimeType("cantata/filename");
 const QLatin1String PlayQueueModel::constUriMimeType("text/uri-list");
 
-#ifdef TAGLIB_FOUND
 static bool checkExtension(const QString &file)
 {
     static QSet<QString> constExtensions=QSet<QString>()
@@ -69,7 +71,6 @@ static bool checkExtension(const QString &file)
     int pos=file.lastIndexOf('.');
     return pos>1 ? constExtensions.contains(file.mid(pos+1).toLower()) : false;
 }
-#endif
 
 void PlayQueueModel::encode(QMimeData &mimeData, const QString &mime, const QStringList &values)
 {
@@ -126,8 +127,8 @@ PlayQueueModel::PlayQueueModel(QObject *parent)
     connect(fetcher, SIGNAL(result(const QStringList &, int, bool, quint8)), SLOT(addFiles(const QStringList &, int, bool, quint8)));
     connect(fetcher, SIGNAL(result(const QStringList &, int, bool, quint8)), SIGNAL(streamsFetched()));
     connect(fetcher, SIGNAL(status(QString)), SIGNAL(streamFetchStatus(QString)));
-    connect(this, SIGNAL(filesAdded(const QStringList, quint32, quint32, bool, quint8)),
-            MPDConnection::self(), SLOT(add(const QStringList, quint32, quint32, bool, quint8)));
+    connect(this, SIGNAL(filesAdded(const QStringList, quint32, quint32, int, quint8)),
+            MPDConnection::self(), SLOT(add(const QStringList, quint32, quint32, int, 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)));
@@ -139,6 +140,9 @@ PlayQueueModel::PlayQueueModel(QObject *parent)
     connect(DevicesModel::self(), SIGNAL(invalid(QList<Song>)), SLOT(remove(QList<Song>)));
     connect(DevicesModel::self(), SIGNAL(updatedDetails(QList<Song>)), SLOT(updateDetails(QList<Song>)));
     #endif
+    #if defined ENABLE_MODEL_TEST
+    new ModelTest(this, this);
+    #endif
 }
 
 PlayQueueModel::~PlayQueueModel()
@@ -428,9 +432,8 @@ Qt::ItemFlags PlayQueueModel::flags(const QModelIndex &index) const
 {
     if (index.isValid()) {
         return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled;
-    } else {
-        return Qt::ItemIsDropEnabled;
     }
+    return Qt::ItemIsDropEnabled;
 }
 
 /**
@@ -441,11 +444,9 @@ QStringList PlayQueueModel::mimeTypes() const
     QStringList types;
     types << constMoveMimeType;
     types << constFileNameMimeType;
-    #ifdef TAGLIB_FOUND
     if (HttpServer::self()->isAlive()) {
         types << constUriMimeType;
     }
-    #endif
     return types;
 }
 
@@ -521,9 +522,7 @@ bool PlayQueueModel::dropMimeData(const QMimeData *data,
         //Act on moves from the music library and dir view
         addItems(decode(*data, constFileNameMimeType), row, false, 0);
         return true;
-    }
-    #ifdef TAGLIB_FOUND
-    else if(data->hasFormat(constUriMimeType)/* && MPDConnection::self()->getDetails().isLocal()*/) {
+    } else if(data->hasFormat(constUriMimeType)/* && MPDConnection::self()->getDetails().isLocal()*/) {
         QStringList orig=decode(*data, constUriMimeType);
         QStringList useable;
         bool haveHttp=HttpServer::self()->isAlive();
@@ -545,7 +544,6 @@ bool PlayQueueModel::dropMimeData(const QMimeData *data,
             return true;
         }
     }
-    #endif
     return false;
 }
 
@@ -572,15 +570,14 @@ void PlayQueueModel::addItems(const QStringList &items, int row, bool replace, q
 
 void PlayQueueModel::addFiles(const QStringList &filenames, int row, bool replace, quint8 priority)
 {
-    //Check for empty playlist
-    if (replace || songs.isEmpty()) {
-        emit filesAdded(filenames, 0, 0, replace, priority);
+    if (replace) {
+        emit filesAdded(filenames, 0, 0, MPDConnection::AddReplaceAndPlay, priority);
+    } else if (songs.isEmpty()) {
+         emit filesAdded(filenames, 0, 0, MPDConnection::AddToEnd, priority);
+    } else if (row < 0) {
+        emit filesAdded(filenames, songs.size(), songs.size(), MPDConnection::AddToEnd, priority);
     } else {
-        if (row < 0) {
-            emit filesAdded(filenames, songs.size(), songs.size(), false, priority);
-        } else {
-            emit filesAdded(filenames, row, songs.size(), false, priority);
-        }
+        emit filesAdded(filenames, row, songs.size(), MPDConnection::AddToEnd, priority);
     }
 }
 
@@ -794,6 +791,54 @@ void PlayQueueModel::setStopAfterTrack(qint32 track)
     }
 }
 
+void PlayQueueModel::removeCantataStreams()
+{
+    QList<qint32> ids;
+    foreach (const Song &s, songs) {
+        if (s.isCantataStream() || s.isCdda()) {
+            ids.append(s.id);
+        }
+    }
+
+    if (!ids.isEmpty()) {
+        emit removeSongs(ids);
+    }
+}
+
+void PlayQueueModel::remove(const QList<int> &rowsToRemove)
+{
+    QList<qint32> removeIds;
+    foreach (const int &r, rowsToRemove) {
+        if (r>-1 && r<songs.count()) {
+            removeIds.append(songs.at(r).id);
+        }
+    }
+
+    if (!removeIds.isEmpty()) {
+        emit removeSongs(removeIds);
+    }
+}
+
+void PlayQueueModel::crop(const QList<int> &rowsToKeep)
+{
+    QSet<qint32> allIds;
+    foreach(const Song &song, songs) {
+        allIds.insert(song.id);
+    }
+
+    QSet<qint32> keepIds;
+    foreach (const int &r, rowsToKeep) {
+        if (r>-1 && r<songs.count()) {
+            keepIds.insert(songs.at(r).id);
+        }
+    }
+
+    QSet<qint32> removeIds=allIds-keepIds;
+    if (!removeIds.isEmpty()) {
+        emit removeSongs(removeIds.toList());
+    }
+}
+
 void PlayQueueModel::stats()
 {
     quint32 time = 0;
@@ -811,6 +856,29 @@ void PlayQueueModel::cancelStreamFetch()
     fetcher->cancel();
 }
 
+void PlayQueueModel::shuffleAlbums()
+{
+    QMap<quint32, QStringList> albums;
+    foreach (const Song &s, songs) {
+        albums[s.key].append(s.file);
+    }
+
+    QList<quint32> keys=albums.keys();
+    if (keys.count()<2) {
+        return;
+    }
+
+    QStringList files;
+    while (!keys.isEmpty()) {
+        quint32 key=keys.takeAt(Utils::random(keys.count()));
+        foreach (const QString &file, albums[key]) {
+            files.append(file);
+        }
+    }
+
+    emit filesAdded(files, 0, 0, MPDState_Playing==MPDStatus::self()->state() ? MPDConnection::AddReplaceAndPlay : MPDConnection::AddAndReplace , 0);
+}
+
 void PlayQueueModel::stopAfterCurrentChanged(bool afterCurrent)
 {
     if (afterCurrent!=stopAfterCurrent) {
@@ -893,17 +961,6 @@ void PlayQueueModel::updateDetails(const QList<Song> &updated)
     }
 }
 
-QSet<qint32> PlayQueueModel::getSongIdSet()
-{
-    QSet<qint32> ids;
-
-    foreach(const Song &song, songs) {
-        ids << song.id;
-    }
-
-    return ids;
-}
-
 QStringList PlayQueueModel::filenames()
 {
     QStringList names;
diff --git a/models/playqueuemodel.h b/models/playqueuemodel.h
index 5ab916b..ad3e11b 100644
--- a/models/playqueuemodel.h
+++ b/models/playqueuemodel.h
@@ -88,7 +88,6 @@ public:
     QStringList mimeTypes() const;
     QMimeData *mimeData(const QModelIndexList &indexes) const;
     bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent);
-    QSet<qint32> getSongIdSet();
     QStringList filenames();
     void clear();
     qint32 currentSong() const { return currentSongId; }
@@ -97,6 +96,9 @@ public:
     void update(const QList<Song> &songList);
     void setStopAfterTrack(qint32 track);
     void clearStopAfterTrack() { setStopAfterTrack(-1); }
+    void removeCantataStreams();
+    void remove(const QList<int> &rowsToRemove);
+    void crop(const QList<int> &rowsToKeep);
 
 public Q_SLOTS:
     void addItems(const QStringList &items, int row, bool replace, quint8 priority);
@@ -105,6 +107,7 @@ public Q_SLOTS:
     void prioritySet(const QList<qint32> &ids, quint8 priority);
     void stats();
     void cancelStreamFetch();
+    void shuffleAlbums();
 
 private Q_SLOTS:
     void stopAfterCurrentChanged(bool afterCurrent);
@@ -114,7 +117,7 @@ private Q_SLOTS:
 Q_SIGNALS:
     void stop(bool afterCurrent);
     void clearStopAfter();
-    void filesAdded(const QStringList filenames, const quint32 row, const quint32 size, bool replace, quint8 priority);
+    void filesAdded(const QStringList filenames, const quint32 row, const quint32 size, int action, quint8 priority);
     void move(const QList<quint32> &items, const quint32 row, const quint32 size);
     void statsUpdated(int songs, quint32 time);
     void fetchingStreams();
diff --git a/models/proxymodel.cpp b/models/proxymodel.cpp
index 7376b22..5c047bb 100644
--- a/models/proxymodel.cpp
+++ b/models/proxymodel.cpp
@@ -65,9 +65,16 @@ bool ProxyModel::matchesFilter(const QStringList &strings) const
 
     return false;
 }
-
-bool ProxyModel::update(const QString &text, const QString &genre)
+//#include <QDebug>
+bool ProxyModel::update(const QString &txt, const QString &genre)
 {
+    QString text=txt.length()<2 ? QString() : txt;
+//    qWarning() << "UPDATE" << txt << genre << (void *)f;
+    if (text==origFilterText && genre==filterGenre) {
+//        qWarning() <<"NO CHANGE";
+        return false;
+    }
+
     bool wasEmpty=isEmpty();
     filterStrings = text.split(' ', QString::SkipEmptyParts, Qt::CaseInsensitive);
     unmatchedStrings = 0;
@@ -79,17 +86,21 @@ bool ProxyModel::update(const QString &text, const QString &genre)
     origFilterText=text;
     filterGenre=genre;
 
-    if (text.length()<2 && genre.isEmpty()) {
+    if (text.isEmpty() && genre.isEmpty()) {
         if (filterEnabled) {
             filterEnabled=false;
             if (!wasEmpty) {
-                invalidate();
+//                qWarning() << "INVALIDATE (empty from non)";
+                invalidateFilter();
+//                qWarning() << "DONE";
             }
             return true;
         }
     } else {
         filterEnabled=true;
-        invalidate();
+//        qWarning() << "INVALIDATE (changed)";
+        invalidateFilter();
+//        qWarning() << "DONE";
         return true;
     }
 
@@ -119,3 +130,12 @@ void ProxyModel::sort(int column, Qt::SortOrder order)
         isSorted=true;
     }
 }
+
+QList<int> ProxyModel::mapToSourceRows(const QModelIndexList &list) const
+{
+    QList<int> rows;
+    foreach (const QModelIndex &idx, list) {
+        rows.append(mapToSource(idx).row());
+    }
+    return rows;
+}
diff --git a/models/proxymodel.h b/models/proxymodel.h
index 261557d..52489f7 100644
--- a/models/proxymodel.h
+++ b/models/proxymodel.h
@@ -31,17 +31,20 @@
 class ProxyModel : public QSortFilterProxyModel
 {
 public:
-    ProxyModel(QObject *parent) : QSortFilterProxyModel(parent), isSorted(false), filterEnabled(false) { }
+    ProxyModel(QObject *parent) : QSortFilterProxyModel(parent), isSorted(false), filterEnabled(false), filter(0) { }
     virtual ~ProxyModel() { }
 
     bool update(const QString &text, const QString &genre=QString());
+    const void * filterItem() const { return filter; }
+    void setFilterItem(void *f) { filter=f; }
     void setRootIndex(const QModelIndex &idx) { rootIndex=idx.isValid() ? mapToSource(idx) : idx; }
     bool isChildOfRoot(const QModelIndex &idx) const;
-    bool isEmpty() const { return filterGenre.isEmpty() && filterStrings.isEmpty(); }
+    bool isEmpty() const { return filterGenre.isEmpty() && filterStrings.isEmpty() && 0==filter; }
     bool enabled() const { return filterEnabled; }
     const QString & filterText() const { return origFilterText; }
     void sort() { isSorted=false; sort(0); }
     void sort(int column, Qt::SortOrder order = Qt::AscendingOrder);
+    QList<int> mapToSourceRows(const QModelIndexList &list) const;
 
 protected:
     bool matchesFilter(const Song &s) const;
@@ -55,6 +58,7 @@ protected:
     QString origFilterText;
     QStringList filterStrings;
     uint unmatchedStrings;
+    const void *filter;
 };
 
 #endif
diff --git a/models/streamsearchmodel.cpp b/models/streamsearchmodel.cpp
index 9e13e63..d0fab4e 100644
--- a/models/streamsearchmodel.cpp
+++ b/models/streamsearchmodel.cpp
@@ -29,7 +29,6 @@
 #include "playqueuemodel.h"
 #include "networkaccessmanager.h"
 #include "stdactions.h"
-#include <QNetworkReply>
 #include <QString>
 #include <QVariant>
 #include <QXmlStreamReader>
@@ -41,16 +40,20 @@
 #endif
 
 static QString constRadioTimeSearchUrl=QLatin1String("http://opml.radiotime.com/Search.ashx");
+static QString constShoutCastSearchUrl=QLatin1String("http://api.shoutcast.com/legacy/genrelist");
 
 StreamSearchModel::StreamSearchModel(QObject *parent)
     : ActionModel(parent)
+    , category(TuneIn)
     , root(new StreamsModel::CategoryItem(QString(), "root"))
+    , filterRoot(0)
+    , unmatchedStrings(0)
 {
 }
 
 StreamSearchModel::~StreamSearchModel()
 {
-    cancelAll();
+    clear();
     delete root;
 }
 
@@ -188,7 +191,7 @@ void StreamSearchModel::fetchMore(const QModelIndex &index)
     StreamsModel::Item *item = toItem(index);
     if (item->isCategory() && !item->url.isEmpty()) {
         StreamsModel::CategoryItem *cat=static_cast<StreamsModel::CategoryItem *>(item);
-        QNetworkReply *job=NetworkAccessManager::self()->get(cat->url);
+        NetworkJob *job=NetworkAccessManager::self()->get(cat->url);
         if (jobs.isEmpty()) {
             emit loading();
         }
@@ -229,10 +232,37 @@ QStringList StreamSearchModel::mimeTypes() const
 void StreamSearchModel::clear()
 {
     cancelAll();
-    beginRemoveRows(QModelIndex(), 0, root->children.count()-1);
-    qDeleteAll(root->children);
-    root->children.clear();
-    endRemoveRows();
+    if (!root->children.isEmpty()) {
+        beginRemoveRows(QModelIndex(), 0, root->children.count()-1);
+        if (Filter!=category) {
+            qDeleteAll(root->children);
+        }
+        root->children.clear();
+        endRemoveRows();
+    }
+    currentSearch=QString();
+}
+
+static int getParam(const QString &key, QString &query)
+{
+    int index=query.indexOf(" "+key+"=");
+    int val=0;
+    if (-1!=index) {
+        int endPos=query.indexOf(" ", index+3);
+        int end=endPos;
+        if (-1==end) {
+            end=query.length()-1;
+        }
+        int start=index+key.length()+2;
+        val=query.mid(start, (end+1)-start).toInt();
+        if (endPos>start) {
+            query=query.left(index)+query.mid(endPos);
+            query=query.trimmed();
+        } else {
+            query=query.left(index);
+        }
+    }
+    return val;
 }
 
 void StreamSearchModel::search(const QString &searchTerm, bool stationsOnly)
@@ -240,29 +270,58 @@ void StreamSearchModel::search(const QString &searchTerm, bool stationsOnly)
     if (searchTerm==currentSearch) {
         return;
     }
-
     clear();
-    
-    QUrl searchUrl(constRadioTimeSearchUrl);
+    currentSearch=searchTerm;
+
+    if (Filter==category) {
+        unmatchedStrings=0;
+        filterStrings=searchTerm.split(" ", QString::SkipEmptyParts);
+        if (!filterStrings.isEmpty()) {
+            QList<StreamsModel::Item *> newItems=getStreams(filterRoot);
+            if (!newItems.isEmpty()) {
+                beginInsertRows(QModelIndex(), 0, newItems.count()-1);
+                root->children+=newItems;
+                endInsertRows();
+            }
+        }
+        emit loaded();
+        return;
+    }
+
+    QUrl searchUrl(TuneIn==category ? constRadioTimeSearchUrl : constShoutCastSearchUrl);
     #if QT_VERSION < 0x050000
     QUrl &query=searchUrl;
     #else
     QUrlQuery query;
     #endif
 
-    if (stationsOnly) {
-        query.addQueryItem("types", "station");
-    }
-    query.addQueryItem("query", searchTerm);
-    QString locale=QLocale::system().name();
-    if (!locale.isEmpty()) {
-        query.addQueryItem("locale", locale);
+    if (TuneIn==category) {
+        if (stationsOnly) {
+            query.addQueryItem("types", "station");
+        }
+        query.addQueryItem("query", searchTerm);
+        QString locale=QLocale::system().name();
+        if (!locale.isEmpty()) {
+            query.addQueryItem("locale", locale);
+        }
+    } else {
+        QString search=searchTerm;
+        int limit=getParam("limit", search);
+        int bitrate=getParam("br", search);
+        if (0==bitrate) {
+            bitrate=getParam("bitrate", search);
+        }
+        query.addQueryItem("k", StreamsModel::constShoutCastApiKey);
+        query.addQueryItem("search", search);
+        query.addQueryItem("limit", QString::number(limit<1 ? 100 : limit));
+        if (bitrate>=32 && bitrate<=512) {
+            query.addQueryItem("br", QString::number(bitrate));
+        }
     }
     #if QT_VERSION >= 0x050000
     searchUrl.setQuery(query);
     #endif
-
-    QNetworkReply *job=NetworkAccessManager::self()->get(searchUrl);
+    NetworkJob *job=NetworkAccessManager::self()->get(searchUrl);
     if (jobs.isEmpty()) {
         emit loading();
     }
@@ -273,8 +332,8 @@ void StreamSearchModel::search(const QString &searchTerm, bool stationsOnly)
 void StreamSearchModel::cancelAll()
 {
     if (!jobs.isEmpty()) {
-        QList<QNetworkReply *> jobList=jobs.keys();
-        foreach (QNetworkReply *j, jobList) {
+        QList<NetworkJob *> jobList=jobs.keys();
+        foreach (NetworkJob *j, jobList) {
             j->abort();
             j->deleteLater();
             disconnect(j, SIGNAL(finished()), this, SLOT(jobFinished()));
@@ -283,10 +342,19 @@ void StreamSearchModel::cancelAll()
         emit loaded();
     }
 }
-    
+
+void StreamSearchModel::setCat(Category c)
+{
+    clear();
+    category=c;
+    if (c!=Filter) {
+        filterRoot=0;
+    }
+}
+
 void StreamSearchModel::jobFinished()
 {
-    QNetworkReply *job=dynamic_cast<QNetworkReply *>(sender());
+    NetworkJob *job=dynamic_cast<NetworkJob *>(sender());
 
     if (!job) {
         return;
@@ -299,8 +367,10 @@ void StreamSearchModel::jobFinished()
         jobs.remove(job);
 
         QModelIndex index=cat==root ? QModelIndex() : createIndex(cat->parent->children.indexOf(cat), 0, (void *)cat);
-        if (QNetworkReply::NoError==job->error()) {
-            QList<StreamsModel::Item *> newItems=StreamsModel::parseRadioTimeResponse(job, cat, true);
+        if (job->ok()) {
+            QList<StreamsModel::Item *> newItems=TuneIn==category
+                                                    ? StreamsModel::parseRadioTimeResponse(job->actualJob(), cat, true)
+                                                    : StreamsModel::parseShoutCastSearchResponse(job->actualJob(), cat);
             if (!newItems.isEmpty()) {
                 beginInsertRows(index, cat->children.count(), (cat->children.count()+newItems.count())-1);
                 cat->children+=newItems;
@@ -313,3 +383,39 @@ void StreamSearchModel::jobFinished()
         }
     }
 }
+
+bool StreamSearchModel::matchesFilter(const QString &str) const
+{
+    if (filterStrings.isEmpty()) {
+        return true;
+    }
+
+    uint ums = unmatchedStrings;
+    int numStrings = filterStrings.count();
+
+    for (int i = 0; i < numStrings; ++i) {
+        if (str.contains(filterStrings.at(i), Qt::CaseInsensitive)) {
+            ums &= ~(1<<i);
+            if (0==ums) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+}
+
+QList<StreamsModel::Item *> StreamSearchModel::getStreams(StreamsModel::CategoryItem *cat)
+{
+    QList<StreamsModel::Item *> streams;
+    if (cat) {
+        foreach (StreamsModel::Item *i, cat->children) {
+            if (i->isCategory()) {
+                streams+=getStreams(static_cast<StreamsModel::CategoryItem *>(i));
+            } else if (matchesFilter(i->name)) {
+                streams.append(i);
+            }
+        }
+    }
+    return streams;
+}
diff --git a/models/streamsearchmodel.h b/models/streamsearchmodel.h
index 53e91ff..b445d97 100644
--- a/models/streamsearchmodel.h
+++ b/models/streamsearchmodel.h
@@ -30,7 +30,7 @@
 #include <QIcon>
 #include <QDateTime>
 
-class QNetworkReply;
+class NetworkJob;
 class QXmlStreamReader;
 class QIODevice;
 
@@ -39,6 +39,12 @@ class StreamSearchModel : public ActionModel
     Q_OBJECT
 
 public:
+    enum Category {
+        TuneIn,
+        ShoutCast,
+        Filter
+    };
+
     StreamSearchModel(QObject *parent = 0);
     ~StreamSearchModel();
     QModelIndex index(int, int, const QModelIndex & = QModelIndex()) const;
@@ -59,6 +65,9 @@ public:
     void clear();
     void search(const QString &searchTerm, bool stationsOnly);
     void cancelAll();
+    Category cat() const { return category; }
+    void setCat(Category c);
+    void setFilterRoot(StreamsModel::CategoryItem *fr) { filterRoot=fr; }
  
 Q_SIGNALS:
     void loading();
@@ -69,14 +78,21 @@ private Q_SLOTS:
     void jobFinished();
 
 private:
+    bool matchesFilter(const QString &str) const;
+    QList<StreamsModel::Item *> getStreams(StreamsModel::CategoryItem *cat);
     StreamsModel::Item * toItem(const QModelIndex &index) const { return index.isValid() ? static_cast<StreamsModel::Item*>(index.internalPointer()) : root; }
     QList<StreamsModel::Item *> parseRadioTimeResponse(QIODevice *dev, StreamsModel::CategoryItem *cat);
     StreamsModel::Item * parseRadioTimeEntry(QXmlStreamReader &doc, StreamsModel::CategoryItem *parent);
 
 private:
-    QMap<QNetworkReply *, StreamsModel::CategoryItem *> jobs;
+    Category category;
+    QMap<NetworkJob *, StreamsModel::CategoryItem *> jobs;
     StreamsModel::CategoryItem *root;
     QString currentSearch;
+
+    StreamsModel::CategoryItem *filterRoot;
+    QStringList filterStrings;
+    uint unmatchedStrings;
 };
 
 #endif
diff --git a/models/streamsmodel.cpp b/models/streamsmodel.cpp
index b80d459..26ecaac 100644
--- a/models/streamsmodel.cpp
+++ b/models/streamsmodel.cpp
@@ -38,15 +38,20 @@
 #include "digitallyimported.h"
 #include "qjson/parser.h"
 #include "qtiocompressor/qtiocompressor.h"
+#include "utils.h"
+#include "config.h"
 #include <QModelIndex>
 #include <QString>
+#include <QSet>
 #include <QVariant>
 #include <QMimeData>
 #include <QXmlStreamReader>
 #include <QFile>
+#include <QDir>
 #include <QFileInfo>
 #include <QTimer>
 #include <QLocale>
+#include <QFileSystemWatcher>
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
 #endif
@@ -54,6 +59,15 @@
 #include <KDE/KGlobal>
 K_GLOBAL_STATIC(StreamsModel, instance)
 #endif
+#if defined Q_OS_WIN
+#include <QDesktopServices>
+#endif
+#include <stdio.h>
+#include <time.h>
+
+#if defined ENABLE_MODEL_TEST
+#include "modeltest.h"
+#endif
 
 StreamsModel * StreamsModel::self()
 {
@@ -63,28 +77,42 @@ StreamsModel * StreamsModel::self()
     static StreamsModel *instance=0;
     if(!instance) {
         instance=new StreamsModel;
+        #if defined ENABLE_MODEL_TEST
+        new ModelTest(instance, instance);
+        #endif
     }
     return instance;
     #endif
 }
 
 const QString StreamsModel::constPrefix=QLatin1String("cantata-");
-const QString StreamsModel::constCacheDir=QLatin1String("streams");
+const QString StreamsModel::constSubDir=QLatin1String("streams");
 const QString StreamsModel::constCacheExt=QLatin1String(".xml.gz");
 
+const QString StreamsModel::constShoutCastApiKey=QLatin1String("fa1669MuiRPorUBw");
+const QString StreamsModel::constShoutCastHost=QLatin1String("api.shoutcast.com");
+
+const QString StreamsModel::constCompressedXmlFile=QLatin1String("streams.xml.gz");
+const QString StreamsModel::constXmlFile=QLatin1String("streams.xml");
+const QString StreamsModel::constPngIcon=QLatin1String("icon.png");
+const QString StreamsModel::constSvgIcon=QLatin1String("icon.svg");
+
 static const char * constOrigUrlProperty = "orig-url";
 
 static QString constRadioTimeHost=QLatin1String("opml.radiotime.com");
 static QString constRadioTimeUrl=QLatin1String("http://")+constRadioTimeHost+QLatin1String("/Browse.ashx");
 static QString constFavouritesUrl=QLatin1String("cantata://internal");
 static QString constIceCastUrl=QLatin1String("http://dir.xiph.org/yp.xml");
+
 static QString constSomaFMUrl=QLatin1String("http://somafm.com/channels.xml");
+static QString constRadioGFMUrl=QLatin1String("http://streams.radio-gfm.net/channels.xml");
+static QSet<QString> constSomaUrls=QSet<QString>() << constSomaFMUrl << constRadioGFMUrl;
 
 static QString constDigitallyImportedUrl=QLatin1String("http://www.di.fm");
 static QString constJazzRadioUrl=QLatin1String("http://www.jazzradio.com");
 static QString constRockRadioUrl=QLatin1String("http://www.rockradio.com");
 static QString constSkyFmUrl=QLatin1String("http://www.sky.fm");
-static QStringList constDiUrls=QStringList() << constDigitallyImportedUrl << constJazzRadioUrl << constSkyFmUrl << constRockRadioUrl;
+static QSet<QString> constDiUrls=QSet<QString>() << constDigitallyImportedUrl << constJazzRadioUrl << constSkyFmUrl << constRockRadioUrl;
 
 static const QString constDiChannelListHost=QLatin1String("api.v2.audioaddict.com");
 static const QString constDiChannelListUrl=QLatin1String("http://")+constDiChannelListHost+("/v1/%1/mobile/batch_update?asset_group_key=mobile_icons&stream_set_key=");
@@ -94,11 +122,12 @@ static QString constShoutCastApiKey=QLatin1String("fa1669MuiRPorUBw");
 static QString constShoutCastHost=QLatin1String("api.shoutcast.com");
 static QString constShoutCastUrl=QLatin1String("http://")+constShoutCastHost+QLatin1String("/genre/primary?f=xml&k=")+constShoutCastApiKey;
 
-static const QLatin1String constFavouritesFileName("streams.xml.gz");
+static const QLatin1String constFavouritesFileName=QLatin1String("streams.xml.gz");
+static const QLatin1String constBookmarksDir=QLatin1String("bookmarks");
 
 QString StreamsModel::favouritesDir()
 {
-    return Settings::self()->storeStreamsInMpdDir() ? MPDConnection::self()->getDetails().dir : Utils::configDir(QString(), false);
+    return Settings::self()->storeStreamsInMpdDir() ? MPDConnection::self()->getDetails().dir : Utils::dataDir(QString(), false);
 }
 
 static QString getInternalFile(bool createDir=false)
@@ -106,7 +135,19 @@ static QString getInternalFile(bool createDir=false)
     if (Settings::self()->storeStreamsInMpdDir()) {
         return MPDConnection::self()->getDetails().dir+constFavouritesFileName;
     }
-    return Utils::configDir(QString(), createDir)+constFavouritesFileName;
+    return Utils::dataDir(QString(), createDir)+constFavouritesFileName;
+}
+
+// Move files from previous ~/.config/cantata to ~/.local/share/cantata
+static void moveToNewLocation()
+{
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC // Not required for windows - as already stored in data location!
+    if (Settings::self()->version()<CANTATA_MAKE_VERSION(1, 51, 0)) {
+        Utils::moveFile(Utils::configDir(QString())+constFavouritesFileName, Utils::dataDir(QString(), true)+constFavouritesFileName);
+        Utils::moveDir(Utils::configDir(constBookmarksDir), Utils::dataDir(constBookmarksDir, true));
+        Utils::moveDir(Utils::configDir(StreamsModel::constSubDir), Utils::dataDir(StreamsModel::constSubDir, true));
+    }
+    #endif
 }
 
 static QIcon getIcon(const QString &name)
@@ -116,14 +157,49 @@ static QIcon getIcon(const QString &name)
     return icon.isNull() ? Icons::self()->streamCategoryIcon : icon;
 }
 
+static QIcon getExternalIcon(const QString &path, QStringList files=QStringList() << StreamsModel::constSvgIcon <<  StreamsModel::constPngIcon)
+{
+    foreach (const QString &file, files) {
+        QString iconFile=path+Utils::constDirSep+file;
+        if (QFile::exists(iconFile)) {
+            QIcon icon;
+            icon.addFile(iconFile);
+            return icon;
+        }
+    }
+
+    return QIcon();
+}
+
 static QString categoryCacheName(const QString &name, bool createDir=false)
 {
-    return Utils::cacheDir(StreamsModel::constCacheDir, createDir)+name+StreamsModel::constCacheExt;
+    return Utils::cacheDir(StreamsModel::constSubDir, createDir)+name+StreamsModel::constCacheExt;
 }
 
 static QString categoryBookmarksName(const QString &name, bool createDir=false)
 {
-    return Utils::configDir(QLatin1String("bookmarks"), createDir)+name+StreamsModel::constCacheExt;
+    return Utils::dataDir(constBookmarksDir, createDir)+name+StreamsModel::constCacheExt;
+}
+
+QString StreamsModel::Item::modifiedName() const
+{
+    if (isCategory()) {
+        return name;
+    }
+    const CategoryItem *cat=getTopLevelCategory();
+    if (!cat || !cat->addCatToModifiedName || name.startsWith(cat->name)) {
+        return name;
+    }
+    return cat->name+QLatin1String(" - ")+name;
+}
+
+StreamsModel::CategoryItem * StreamsModel::Item::getTopLevelCategory() const
+{
+    StreamsModel::Item *item=const_cast<StreamsModel::Item *>(this);
+    while (item->parent && item->parent->parent) {
+        item=item->parent;
+    }
+    return item && item->isCategory() ? static_cast<CategoryItem *>(item) : 0;
 }
 
 void StreamsModel::CategoryItem::removeBookmarks()
@@ -255,8 +331,6 @@ void StreamsModel::CategoryItem::saveCache() const
 
 QList<StreamsModel::Item *> StreamsModel::CategoryItem::loadCache()
 {
-    QList<Item *> newItems;
-
     if (!cacheName.isEmpty()) {
         QString cache=categoryCacheName(cacheName);
         if (!cache.isEmpty() && QFile::exists(cache)) {
@@ -264,6 +338,26 @@ QList<StreamsModel::Item *> StreamsModel::CategoryItem::loadCache()
         }
     }
 
+    return QList<Item *>();
+}
+
+QList<StreamsModel::Item *> StreamsModel::XmlCategoryItem::loadCache()
+{
+    QList<Item *> newItems;
+
+    if (QFile::exists(cacheName)) {
+        newItems=loadXml(cacheName);
+        QString dir=Utils::getDir(cacheName);
+        foreach (Item *i, newItems) {
+            if (i->isCategory()) {
+                StreamsModel::CategoryItem *cat=static_cast<StreamsModel::CategoryItem *>(i);
+                QString name=cat->name;
+                name=name.replace(Utils::constDirSep, "_");
+                cat->icon=getExternalIcon(dir, QStringList() << name+".svg" << name+".png");
+            }
+        }
+    }
+
     return newItems;
 }
 
@@ -373,7 +467,11 @@ QList<StreamsModel::Item *> StreamsModel::CategoryItem::loadXml(QIODevice *dev,
         doc.readNext();
 
         if (doc.isStartElement()) {
-            if (QLatin1String("stream")==doc.name()) {
+            if (QLatin1String("streams")==doc.name()) {
+                if (QLatin1String("true")==doc.attributes().value("addCategoryName").toString()) {
+                    addCatToModifiedName=true;
+                }
+            } else if (QLatin1String("stream")==doc.name()) {
                 QString name=doc.attributes().value("name").toString();
                 QString url=doc.attributes().value("url").toString();
                 if (currentCat==this) {
@@ -389,7 +487,7 @@ QList<StreamsModel::Item *> StreamsModel::CategoryItem::loadXml(QIODevice *dev,
                 currentCat->isAll=QLatin1String("true")==doc.attributes().value("isAll").toString();
                 newItems.append(currentCat);
             }
-        } if (doc.isEndElement() && QLatin1String("category")==doc.name()) {
+        } else if (doc.isEndElement() && QLatin1String("category")==doc.name()) {
             currentCat=prevCat;
         }
     }
@@ -439,6 +537,30 @@ QList<StreamsModel::Item *> StreamsModel::FavouritesCategoryItem::loadXml(QIODev
     return newItems;
 }
 
+void StreamsModel::IceCastCategoryItem::addHeaders(QNetworkRequest &req)
+{
+    req.setRawHeader("Accept-Encoding", "gzip");
+}
+
+void StreamsModel::ShoutCastCategoryItem::addHeaders(QNetworkRequest &req)
+{
+    req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
+}
+
+void StreamsModel::DiCategoryItem::addHeaders(QNetworkRequest &req)
+{
+    DigitallyImported::self()->addAuthHeader(req);
+}
+
+bool StreamsModel::XmlCategoryItem::isBuiltIn() const
+{
+    #ifdef Q_OS_WIN
+    return true;
+    #else
+    return cacheName.startsWith(INSTALL_PREFIX "/share/cantata/streams/");
+    #endif
+}
+
 StreamsModel::StreamsModel(QObject *parent)
     : ActionModel(parent)
     , root(new CategoryItem(QString(), "root"))
@@ -447,23 +569,42 @@ StreamsModel::StreamsModel(QObject *parent)
     , favouritesModified(false)
     , favouritesSaveTimer(0)
 {
+    moveToNewLocation();
+
     tuneIn=new CategoryItem(constRadioTimeUrl+QLatin1String("?locale=")+QLocale::system().name(), i18n("TuneIn"), root, getIcon("tunein"), QString(), "tunein");
     tuneIn->supportsBookmarks=true;
     root->children.append(tuneIn);
-    root->children.append(new CategoryItem(constIceCastUrl, i18n("IceCast"), root, getIcon("icecast"), "icecast"));
-    root->children.append(new CategoryItem(constShoutCastUrl, i18n("ShoutCast"), root, getIcon("shoutcast")));
-    root->children.append(new CategoryItem(constSomaFMUrl, i18n("SomaFM"), root, getIcon("somafm"), "somafm"));
+    root->children.append(new IceCastCategoryItem(constIceCastUrl, i18n("IceCast"), root, getIcon("icecast"), "icecast"));
+    shoutCast=new ShoutCastCategoryItem(constShoutCastUrl, i18n("ShoutCast"), root, getIcon("shoutcast"));
+    shoutCast->configName="shoutcast";
+    root->children.append(shoutCast);
+    root->children.append(new CategoryItem(constSomaFMUrl, i18n("SomaFM"), root, getIcon("somafm"), "somafm", QString(), true));
+    root->children.append(new CategoryItem(constRadioGFMUrl, i18n("Radio GFM"), root, getIcon("radiogfm"), "radiogfm", QString(), false));
     root->children.append(new DiCategoryItem(constDigitallyImportedUrl, i18n("Digitally Imported"), root, getIcon("digitallyimported"), "di"));
     root->children.append(new DiCategoryItem(constJazzRadioUrl, i18n("JazzRadio.com"), root, getIcon("jazzradio"), "jazzradio"));
     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->configName="listenlive";
+    root->children.append(listenLive);
     root->children.append(favourites);
-    buildListenLive();
+    buildXml();
     addBookmarkAction = ActionCollection::get()->createAction("bookmarkcategory", i18n("Bookmark Category"), Icon("bookmark-new"));
     addToFavouritesAction = ActionCollection::get()->createAction("addtofavourites", i18n("Add Stream To Favorites"), favouritesIcon());
     configureAction = ActionCollection::get()->createAction("configurestreams", i18n("Configure Streams"), Icons::self()->configureIcon);
     reloadAction = ActionCollection::get()->createAction("reloadstreams", i18n("Reload"), Icon("view-refresh"));
+
+    QSet<QString> hidden=Settings::self()->hiddenStreamCategories().toSet();
+    foreach (Item *c, root->children) {
+        if (c!=favourites) {
+            CategoryItem *cat=static_cast<CategoryItem *>(c);
+            if (hidden.contains(cat->configName)) {
+                hiddenCategories.append(c);
+                root->children.removeAll(c);
+            }
+        }
+    }
 }
 
 StreamsModel::~StreamsModel()
@@ -519,6 +660,10 @@ int StreamsModel::columnCount(const QModelIndex &) const
 
 QVariant StreamsModel::data(const QModelIndex &index, int role) const
 {
+    if (!index.isValid()) {
+        return QVariant();
+    }
+
     const Item *item = toItem(index);
 
     switch (role) {
@@ -556,16 +701,17 @@ QVariant StreamsModel::data(const QModelIndex &index, int role) const
     case ItemView::Role_Actions: {
         QList<Action *> actions;
         if (item->isCategory()){
-            if (static_cast<const CategoryItem *>(item)->canConfigure()) {
+            const CategoryItem *cat=static_cast<const CategoryItem *>(item);
+            if (cat->canConfigure()) {
                 actions << configureAction;
             }
-            if (static_cast<const CategoryItem *>(item)->canReload()) {
+            if (cat->canReload()) {
                 actions << reloadAction;
             }
-            if (tuneIn==item) {
+            if (tuneIn==item || shoutCast==item || (cat->isTopLevel() && !cat->children.isEmpty())) {
                 actions << StdActions::self()->searchAction;
             }
-            if (static_cast<const CategoryItem *>(item)->canBookmark) {
+            if (cat->canBookmark) {
                 actions << addBookmarkAction;
             }
         } else {
@@ -595,9 +741,8 @@ Qt::ItemFlags StreamsModel::flags(const QModelIndex &index) const
         } else {
             return Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled;
         }
-    } else {
-        return Qt::NoItemFlags;
     }
+    return Qt::NoItemFlags;
 }
 
 bool StreamsModel::hasChildren(const QModelIndex &index) const
@@ -629,19 +774,23 @@ void StreamsModel::fetchMore(const QModelIndex &index)
             emit dataChanged(index, index);
             loadFavourites(getInternalFile(false), index);
             cat->state=CategoryItem::Fetched;
+        } else if (cat==listenLive) {
+            if (listenLive->children.isEmpty()) {
+                cat->state=CategoryItem::Fetching;
+                emit dataChanged(index, index);
+                buildListenLive(index);
+                cat->state=CategoryItem::Fetched;
+            }
         } else if (!loadCache(cat)) {
             QNetworkRequest req;
             if (constDiUrls.contains(cat->url)) {
                 req=QNetworkRequest(constDiChannelListUrl.arg(cat->url.split(".").at(1)));
-                DigitallyImported::self()->addAuthHeader(req);
-            } else if (QUrl(item->url).host()==constShoutCastHost) {
-                req=QNetworkRequest(cat->url);
-                req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
             } else {
                 req=QNetworkRequest(cat->url);
             }
+            cat->addHeaders(req);
 
-            QNetworkReply *job=NetworkAccessManager::self()->get(req);
+            NetworkJob *job=NetworkAccessManager::self()->get(req);
             job->setProperty(constOrigUrlProperty, cat->url);
             if (jobs.isEmpty()) {
                 emit loading();
@@ -667,13 +816,6 @@ void StreamsModel::reload(const QModelIndex &index)
         qDeleteAll(cat->children);
         cat->children.clear();
         endRemoveRows();
-
-        if (listenLive==cat) {
-            QModelIndex index=createIndex(root->children.indexOf(listenLive), 0, (void *)listenLive);
-            buildListenLive();
-            beginInsertRows(index, 0, listenLive->children.count()-1);
-            endInsertRows();
-        }
     }
 
     fetchMore(index);
@@ -705,6 +847,13 @@ bool StreamsModel::exportFavourites(const QString &fileName)
     return favourites->saveXml(fileName, true);
 }
 
+void StreamsModel::reloadFavourites()
+{
+    if (favourites->lastFileName.isEmpty() || favourites->lastFileName!=getInternalFile() || favourites->lastFileName.startsWith("http://")) {
+        reload(favouritesIndex());
+    }
+}
+
 bool StreamsModel::checkFavouritesWritable()
 {
     bool wasWriteable=favouritesIsWriteable;
@@ -901,7 +1050,7 @@ static QString addDiHash(const StreamsModel::Item *item)
 //        if (i->isCategory()) {
 //            ::filenames(fn, addPrefix, static_cast<const StreamsModel::CategoryItem *>(i));
 //        } else if (StreamsModel::validProtocol(i->url)) {
-//            QString url=StreamsModel::modifyUrl(addDiHash(i), addPrefix, i->name);
+//            QString url=StreamsModel::modifyUrl(addDiHash(i), addPrefix, addPrefix ? i->modifiedName() : i->name);
 //            if (!fn.contains(i->url)) {
 //                fn << url;
 //            }
@@ -918,13 +1067,13 @@ QStringList StreamsModel::filenames(const QModelIndexList &indexes, bool addPref
 //        if (item->isCategory()) {
 //            ::filenames(fnames, addPrefix, static_cast<const StreamsModel::CategoryItem *>(item));
 //        } else if (validProtocol(item->url)) {
-//            QString url=modifyUrl(addDiHash(item), addPrefix, item->name);
+//            QString url=modifyUrl(addDiHash(item), addPrefix, addPrefix ? item->modifiedName() : item->name);
 //            if (!fnames.contains(url)) {
 //                fnames << url;
 //            }
 //        }
         if (!item->isCategory()) {
-            fnames << modifyUrl(addDiHash(item), addPrefix, item->name);
+            fnames << modifyUrl(addDiHash(item), addPrefix, addPrefix ? item->modifiedName() : item->name);
         }
     }
 
@@ -945,6 +1094,61 @@ QStringList StreamsModel::mimeTypes() const
     return types;
 }
 
+void StreamsModel::save()
+{
+    QStringList disabled;
+    foreach (Item *i, hiddenCategories) {
+        disabled.append(static_cast<CategoryItem *>(i)->configName);
+    }
+    disabled.sort();
+    Settings::self()->saveHiddenStreamCategories(disabled);
+}
+
+QList<StreamsModel::Category> StreamsModel::getCategories() const
+{
+    QList<StreamsModel::Category> categories;
+    foreach (Item *i, hiddenCategories) {
+        categories.append(Category(i->name, static_cast<CategoryItem *>(i)->icon, static_cast<CategoryItem *>(i)->configName,
+                                   static_cast<CategoryItem *>(i)->isBuiltIn(), true, static_cast<CategoryItem *>(i)->canConfigure()));
+    }
+    foreach (Item *i, root->children) {
+        if (i!=favourites) {
+            categories.append(Category(i->name, static_cast<CategoryItem *>(i)->icon, static_cast<CategoryItem *>(i)->configName,
+                                       static_cast<CategoryItem *>(i)->isBuiltIn(), false, static_cast<CategoryItem *>(i)->canConfigure()));
+        }
+    }
+    return categories;
+}
+
+void StreamsModel::setHiddenCategories(const QSet<QString> &cats)
+{
+    bool changed=false;
+    foreach (Item *i, hiddenCategories) {
+        if (!cats.contains(static_cast<CategoryItem *>(i)->configName)) {
+            beginInsertRows(QModelIndex(), root->children.count(), root->children.count());
+            root->children.append(i);
+            hiddenCategories.removeAll(i);
+            endInsertRows();
+            changed=true;
+        }
+    }
+
+    foreach (Item *i, root->children) {
+        if (cats.contains(static_cast<CategoryItem *>(i)->configName)) {
+            int row=root->children.indexOf(i);
+            if (row>0) {
+                beginRemoveRows(QModelIndex(), row, row);
+                hiddenCategories.append(root->children.takeAt(row));
+                endRemoveRows();
+                changed=true;
+            }
+        }
+    }
+    if (changed) {
+        emit categoriesChanged();
+    }
+}
+
 bool StreamsModel::loadCache(CategoryItem *cat)
 {
     QList<Item *> newItems=cat->loadCache();
@@ -963,7 +1167,7 @@ bool StreamsModel::loadCache(CategoryItem *cat)
 
 void StreamsModel::jobFinished()
 {
-    QNetworkReply *job=dynamic_cast<QNetworkReply *>(sender());
+    NetworkJob *job=dynamic_cast<NetworkJob *>(sender());
 
     if (!job) {
         return;
@@ -977,24 +1181,25 @@ void StreamsModel::jobFinished()
         jobs.remove(job);
 
         QModelIndex index=createIndex(cat->parent->children.indexOf(cat), 0, (void *)cat);
-        if (QNetworkReply::NoError==job->error()) {
+        if (job->ok()) {
             QList<Item *> newItems;
             if (cat==favourites) {
-                newItems=favourites->loadXml(job);
+                newItems=favourites->loadXml(job->actualJob());
+                favourites->lastFileName=QString();
             } else if (QLatin1String("http")==job->url().scheme()) {
-                QString url=job->url().toString();
-                if (constRadioTimeHost==job->url().host()) {
-                    newItems=parseRadioTimeResponse(job, cat);
+                QString url=job->origUrl().toString();
+                if (constRadioTimeHost==job->origUrl().host()) {
+                    newItems=parseRadioTimeResponse(job->actualJob(), cat);
                 } else if (constIceCastUrl==url) {
-                    newItems=parseIceCastResponse(job, cat);
-                } else if (constSomaFMUrl==url) {
-                    newItems=parseSomaFmResponse(job, cat);
-                } else if (constDiChannelListHost==job->url().host()) {
-                    newItems=parseDigitallyImportedResponse(job, cat);
-                } else if (constShoutCastHost==job->url().host()) {
-                    newItems=parseShoutCastResponse(job, cat, job->property(constOrigUrlProperty).toString());
+                    newItems=parseIceCastResponse(job->actualJob(), cat);
+                } else if (constSomaUrls.contains(url)) {
+                    newItems=parseSomaFmResponse(job->actualJob(), cat);
+                } else if (constDiChannelListHost==job->origUrl().host()) {
+                    newItems=parseDigitallyImportedResponse(job->actualJob(), cat);
+                } else if (constShoutCastHost==job->origUrl().host()) {
+                    newItems=parseShoutCastResponse(job->actualJob(), cat, job->property(constOrigUrlProperty).toString());
                 } else {
-                    newItems=parseListenLiveResponse(job, cat);
+                    newItems=parseListenLiveResponse(job->actualJob(), cat);
                 }
             }
 
@@ -1199,7 +1404,10 @@ static void trimGenres(QMap<QString, QList<StreamsModel::Item *> > &genres)
 QList<StreamsModel::Item *> StreamsModel::parseIceCastResponse(QIODevice *dev, CategoryItem *cat)
 {
     QList<Item *> newItems;
-    QXmlStreamReader doc(dev);
+    QtIOCompressor compressor(dev);
+    compressor.setStreamFormat(QtIOCompressor::GzipFormat);
+    compressor.open(QIODevice::ReadOnly);
+    QXmlStreamReader doc(&compressor);
     QSet<QString> names;
     QMap<QString, QList<Item *> > genres;
     while (!doc.atEnd()) {
@@ -1477,6 +1685,19 @@ QList<StreamsModel::Item *> StreamsModel::parseListenLiveResponse(QIODevice *dev
     return newItems;
 }
 
+QList<StreamsModel::Item *> StreamsModel::parseShoutCastSearchResponse(QIODevice *dev, CategoryItem *cat)
+{
+    QList<Item *> newItems;
+    QXmlStreamReader doc(dev);
+    while (!doc.atEnd()) {
+        doc.readNext();
+        if (doc.isStartElement() && QLatin1String("stationlist")==doc.name()) {
+            newItems+=parseShoutCastStations(doc, cat);
+        }
+    }
+    return newItems;
+}
+
 QList<StreamsModel::Item *> StreamsModel::parseShoutCastResponse(QIODevice *dev, CategoryItem *cat, const QString &origUrl)
 {
     bool isRoot=origUrl==constShoutCastUrl;
@@ -1508,8 +1729,8 @@ QList<StreamsModel::Item *> StreamsModel::parseShoutCastResponse(QIODevice *dev,
         #endif
 
         QNetworkRequest req(url);
-        req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
-        QNetworkReply *job=NetworkAccessManager::self()->get(req);
+        cat->addHeaders(req);
+        NetworkJob *job=NetworkAccessManager::self()->get(req);
         job->setProperty(constOrigUrlProperty, url.toString());
         if (jobs.isEmpty()) {
             emit loading();
@@ -1526,9 +1747,9 @@ QList<StreamsModel::Item *> StreamsModel::parseShoutCastLinks(QXmlStreamReader &
     while (!doc.atEnd()) {
         doc.readNext();
         if (doc.isStartElement() && QLatin1String("genre")==doc.name()) {
-            newItems.append(new CategoryItem(QLatin1String("http://")+constShoutCastHost+QLatin1String("/genre/secondary?parentid=")+
-                                             doc.attributes().value("id").toString()+QLatin1String("&f=xml&k=")+constShoutCastApiKey,
-                                             doc.attributes().value("name").toString(), cat));
+            newItems.append(new ShoutCastCategoryItem(QLatin1String("http://")+constShoutCastHost+QLatin1String("/genre/secondary?parentid=")+
+                                                      doc.attributes().value("id").toString()+QLatin1String("&f=xml&k=")+constShoutCastApiKey,
+                                                      doc.attributes().value("name").toString(), cat));
         } else if (doc.isEndElement() && QLatin1String("genrelist")==doc.name()) {
             return newItems;
         }
@@ -1624,7 +1845,10 @@ StreamsModel::Item * StreamsModel::parseSomaFmEntry(QXmlStreamReader &doc, Categ
 
 bool StreamsModel::loadFavourites(const QString &fileName, const QModelIndex &index, bool importing)
 {
-    QList<Item *> newItems=favourites->loadXml(fileName, importing);
+    QList<Item *> newItems=favourites->CategoryItem::loadXml(fileName, importing);
+    if (!importing) {
+        favourites->lastFileName=fileName;
+    }
 
     if (!newItems.isEmpty()) {
         beginInsertRows(index, favourites->children.count(), (favourites->children.count()+newItems.count())-1);
@@ -1635,17 +1859,13 @@ bool StreamsModel::loadFavourites(const QString &fileName, const QModelIndex &in
     return false;
 }
 
-void StreamsModel::buildListenLive()
+void StreamsModel::buildListenLive(const QModelIndex &index)
 {
     QFile f(":listenlive.xml");
     if (f.open(QIODevice::ReadOnly)) {
-        if (!listenLive) {
-            listenLive=new ListenLiveCategoryItem(i18n("Listen Live"), root, getIcon("listenlive"));
-            root->children.append(listenLive);
-            listenLive->state=CategoryItem::Fetched;
-        }
-        CategoryItem *region=listenLive;
-        CategoryItem *prevRegion=listenLive;
+        CategoryItem *top=new CategoryItem(QString());
+        CategoryItem *region=top;
+        CategoryItem *prevRegion=top;
         QXmlStreamReader doc(&f);
         while (!doc.atEnd()) {
             doc.readNext();
@@ -1654,7 +1874,7 @@ void StreamsModel::buildListenLive()
                     QString url=doc.attributes().value("url").toString();
                     QString cache=doc.attributes().value("cache").toString();
                     if (cache.isEmpty() && url.endsWith(".html")) {
-                        QStringList parts=url.split("/", QString::SkipEmptyParts);
+                        QStringList parts=url.split(Utils::constDirSep, QString::SkipEmptyParts);
                         if (!parts.isEmpty()) {
                             cache=parts.last().remove((".html"));
                         }
@@ -1675,5 +1895,88 @@ void StreamsModel::buildListenLive()
                 region=prevRegion;
             }
         }
+
+        if (top->children.count()) {
+            beginInsertRows(index, listenLive->children.count(), (listenLive->children.count()+top->children.count())-1);
+            foreach (Item *c, top->children) {
+                c->parent=listenLive;
+            }
+            listenLive->children+=top->children;
+            top->children.clear();
+            endInsertRows();
+        }
+        delete top;
+    }
+}
+
+void StreamsModel::buildXml()
+{
+    #ifdef Q_OS_WIN
+    QStringList dirs=QStringList() << Utils::dataDir(StreamsModel::constSubDir)
+                                   << QCoreApplication::applicationDirPath()+"/streams/";
+    #else
+    QStringList dirs=QStringList() << Utils::dataDir(StreamsModel::constSubDir)
+                                   << INSTALL_PREFIX "/share/cantata/streams/";
+    #endif
+    QSet<QString> added;
+    QStringList streamFiles=QStringList() << constCompressedXmlFile << constXmlFile;
+    foreach (const QString &dir, dirs) {
+        if (dir.isEmpty()) {
+            continue;
+        }
+        QDir d(dir);
+        QStringList subDirs=d.entryList(QStringList() << "*", QDir::Dirs|QDir::Readable|QDir::NoDot|QDir::NoDotDot);
+        foreach (const QString &sub, subDirs) {
+            if (!added.contains(sub)) {
+                foreach (const QString &streamFile, streamFiles) {
+                    if (QFile::exists(dir+sub+Utils::constDirSep+streamFile)) {
+                        addXmlCategory(sub, getExternalIcon(dir+sub), dir+sub+Utils::constDirSep+streamFile, false);
+                        added.insert(sub);
+                        break;
+                    }
+                }
+            }
+        }
+    }
+}
+
+StreamsModel::CategoryItem * StreamsModel::addXmlCategory(const QString &name, const QIcon &icon, const QString &xmlFileName, bool replace)
+{
+    CategoryItem *cat=new XmlCategoryItem(name, root, icon, xmlFileName);
+    cat->configName="x-"+name;
+
+    if (replace) {
+        // Remove any existing entry...
+        removeXmlCategory(cat->configName);
+    }
+
+    if (replace) {
+        beginInsertRows(QModelIndex(), root->children.count(), root->children.count());
+        root->children.append(cat);
+        endInsertRows();
+    } else {
+        root->children.append(cat);
+    }
+    return cat;
+}
+
+void StreamsModel::removeXmlCategory(const QString &key)
+{
+    foreach (Item *i, root->children) {
+        if (key==static_cast<CategoryItem *>(i)->configName) {
+            int row=root->children.indexOf(i);
+            if (row>=0) {
+                beginRemoveRows(QModelIndex(), row, row);
+                delete root->children.takeAt(row);
+                endRemoveRows();
+            }
+            break;
+        }
     }
 }
+
+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);
+}
diff --git a/models/streamsmodel.h b/models/streamsmodel.h
index 8f329f5..56fdda2 100644
--- a/models/streamsmodel.h
+++ b/models/streamsmodel.h
@@ -28,9 +28,11 @@
 #include <QIcon>
 #include <QList>
 #include <QMap>
+#include <QSet>
 #include <QDateTime>
 
-class QNetworkReply;
+class NetworkJob;
+class QNetworkRequest;
 class QXmlStreamReader;
 class QIODevice;
 class QTimer;
@@ -45,11 +47,13 @@ public:
     {
         Item(const QString &u, const QString &n=QString(), CategoryItem *p=0, const QString &sub=QString()) : url(u), name(n), subText(sub), parent(p) { }
         virtual ~Item() { }
+        QString modifiedName() const;
         QString url;
         QString name;
         QString subText;
         CategoryItem *parent;
         virtual bool isCategory() const { return false; }
+        CategoryItem *getTopLevelCategory() const;
     };
     
     struct CategoryItem : public Item
@@ -62,14 +66,16 @@ public:
         };
 
         CategoryItem(const QString &u, const QString &n=QString(), CategoryItem *p=0, const QIcon &i=QIcon(),
-                     const QString &cn=QString(), const QString &bn=QString())
+                     const QString &cn=QString(), const QString &bn=QString(), bool modName=false)
             : Item(u, n, p), state(Initial), isAll(false), isBookmarks(false), supportsBookmarks(false),
-              canBookmark(false), icon(i), cacheName(cn), bookmarksName(bn)  { }
+              canBookmark(false), addCatToModifiedName(modName), icon(i), cacheName(cn),
+              bookmarksName(bn), configName(cn.isEmpty() ? bn : cn) { }
 
         virtual ~CategoryItem() { qDeleteAll(children); }
         virtual bool isCategory() const { return true; }
         virtual bool canConfigure() const { return false; }
         virtual bool isFavourites() const { return false; }
+        virtual bool isBuiltIn() const { return true; }
         virtual void removeCache();
         bool isTopLevel() const { return parent && 0==parent->parent; }
         virtual bool canReload() const { return !cacheName.isEmpty() || isTopLevel() || !url.isEmpty(); }
@@ -79,21 +85,24 @@ public:
         CategoryItem * getBookmarksCategory();
         CategoryItem * createBookmarksCategory();
         void saveCache() const;
-        QList<Item *> loadCache();
+        virtual QList<Item *> loadCache();
         bool saveXml(const QString &fileName, bool format=false) const;
         bool saveXml(QIODevice *dev, bool format=false) const;
         QList<Item *> loadXml(const QString &fileName, bool importing=false);
         virtual QList<Item *> loadXml(QIODevice *dev, bool importing=false);
+        virtual void addHeaders(QNetworkRequest &) { }
 
         State state;
         bool isAll : 1;
         bool isBookmarks : 1; // 'Virtual' bookmarks category...
         bool supportsBookmarks : 1; // Intended for top-level items, indicates if bookmarks can be added
         bool canBookmark : 1; // Can this category be bookmark'ed in top-level parent? can have the cache
+        bool addCatToModifiedName : 1; // When adding to playqueue/favourites, should name contian category?
         QList<Item *> children;
         QIcon icon;
         QString cacheName;
         QString bookmarksName;
+        QString configName;
     };
 
     struct FavouritesCategoryItem : public CategoryItem
@@ -103,26 +112,74 @@ public:
         QList<Item *> loadXml(QIODevice *dev, bool importing=false);
         bool isFavourites() const { return true; }
         bool canReload() const { return false; }
+        QString lastFileName;
+    };
+
+    struct IceCastCategoryItem : public CategoryItem
+    {
+        IceCastCategoryItem(const QString &u, const QString &n=QString(), CategoryItem *p=0, const QIcon &i=QIcon(),
+                            const QString &cn=QString(), const QString &bn=QString())
+            : CategoryItem(u, n, p, i, cn, bn) { }
+        void addHeaders(QNetworkRequest &req);
+    };
+
+    struct ShoutCastCategoryItem : public CategoryItem
+    {
+        ShoutCastCategoryItem(const QString &u, const QString &n=QString(), CategoryItem *p=0, const QIcon &i=QIcon(),
+                              const QString &cn=QString(), const QString &bn=QString())
+            : CategoryItem(u, n, p, i, cn, bn) { }
+        void addHeaders(QNetworkRequest &req);
     };
 
     struct ListenLiveCategoryItem : public CategoryItem
     {
         ListenLiveCategoryItem(const QString &n, CategoryItem *p, const QIcon &i=QIcon())
-            : CategoryItem(QString(), n, p, i) { }
+            : CategoryItem(QLatin1String("-"), n, p, i) { }
         void removeCache();
     };
 
     struct DiCategoryItem : public CategoryItem
     {
         DiCategoryItem(const QString &u, const QString &n, CategoryItem *p, const QIcon &i, const QString &cn)
-            : CategoryItem(u, n, p, i, cn) { }
+            : CategoryItem(u, n, p, i, cn, QString(), true) { }
         bool canConfigure() const { return true; }
+        void addHeaders(QNetworkRequest &req);
+    };
+
+    struct XmlCategoryItem : public CategoryItem
+    {
+        XmlCategoryItem(const QString &n, CategoryItem *p, const QIcon &i, const QString &cn)
+            : CategoryItem(QLatin1String("-"), n, p, i, cn, QString(), true) { }
+        QList<Item *> loadCache();
+        bool canReload() const { return false; }
+        void removeCache() { }
+        bool isBuiltIn() const;
+    };
+
+    struct Category
+    {
+        Category(const QString &n, const QIcon &i, const QString &k, bool b, bool h, bool c)
+            : name(n), icon(i), key(k), builtin(b), hidden(h), configurable(c) { }
+        QString name;
+        QIcon icon;
+        QString key;
+        bool builtin;
+        bool hidden;
+        bool configurable;
     };
 
     static const QString constPrefix;
-    static const QString constCacheDir;
+    static const QString constSubDir;
     static const QString constCacheExt;
 
+    static const QString constShoutCastApiKey;
+    static const QString constShoutCastHost;
+
+    static const QString constCompressedXmlFile;
+    static const QString constXmlFile;
+    static const QString constPngIcon;
+    static const QString constSvgIcon;
+
     static StreamsModel * self();
     static QString favouritesDir();
     static QString modifyUrl(const QString &u,  bool addPrefix=true, const QString &name=QString());
@@ -148,7 +205,7 @@ public:
     bool haveFavourites() const { return !favourites->children.isEmpty(); }
     bool isFavoritesWritable() { return favouritesIsWriteable; }
     bool checkFavouritesWritable();
-    void reloadFavourites() { reload(favouritesIndex()); }
+    void reloadFavourites();
     void removeFromFavourites(const QModelIndex &index);
     bool addToFavourites(const QString &url, const QString &name);
     QString favouritesNameForUrl(const QString &u);
@@ -161,7 +218,9 @@ public:
     
     QModelIndex favouritesIndex() const;
     const QIcon & favouritesIcon() const { return favourites->icon; }
-    const QIcon & tuneInIcon() const { return tuneIn->icon; }
+    bool isTuneIn(const CategoryItem *cat) const { return tuneIn==cat; }
+    bool isShoutCast(const CategoryItem *cat) const { return shoutCast==cat; }
+    CategoryItem * tuneInCat() const { return tuneIn; }
 
     QStringList filenames(const QModelIndexList &indexes, bool addPrefix) const;
     QMimeData * mimeData(const QModelIndexList &indexes) const;
@@ -172,10 +231,19 @@ public:
     Action *configureAct() { return configureAction; }
     Action *reloadAct() { return reloadAction; }
 
+    void save();
+    QList<Category> getCategories() const;
+    void setHiddenCategories(const QSet<QString> &cats);
+    CategoryItem * addXmlCategory(const QString &name, const QIcon &icon, const QString &xmlFileName, bool replace);
+    void removeXmlCategory(const QString &key);
+
+    QModelIndex categoryIndex(const CategoryItem *cat) const;
+
 Q_SIGNALS:
     void loading();
     void loaded();
     void error(const QString &msg);
+    void categoriesChanged();
 
 public:
     static QList<Item *> parseRadioTimeResponse(QIODevice *dev, CategoryItem *cat, bool parseSubText=false);
@@ -183,9 +251,10 @@ public:
     static QList<Item *> parseSomaFmResponse(QIODevice *dev, CategoryItem *cat);
     static QList<Item *> parseDigitallyImportedResponse(QIODevice *dev, CategoryItem *cat);
     static QList<Item *> parseListenLiveResponse(QIODevice *dev, CategoryItem *cat);
+    static QList<Item *> parseShoutCastSearchResponse(QIODevice *dev, CategoryItem *cat);
     QList<Item *> parseShoutCastResponse(QIODevice *dev, CategoryItem *cat, const QString &origUrl);
-    QList<Item *> parseShoutCastLinks(QXmlStreamReader &doc, CategoryItem *cat);
-    QList<Item *> parseShoutCastStations(QXmlStreamReader &doc, CategoryItem *cat);
+    static QList<Item *> parseShoutCastLinks(QXmlStreamReader &doc, CategoryItem *cat);
+    static QList<Item *> parseShoutCastStations(QXmlStreamReader &doc, CategoryItem *cat);
     static Item * parseRadioTimeEntry(QXmlStreamReader &doc, CategoryItem *parent, bool parseSubText=false);
     static Item * parseSomaFmEntry(QXmlStreamReader &doc, CategoryItem *parent);
 
@@ -197,13 +266,15 @@ private:
     bool loadCache(CategoryItem *cat);
     Item * toItem(const QModelIndex &index) const { return index.isValid() ? static_cast<Item*>(index.internalPointer()) : root; }
     bool loadFavourites(const QString &fileName, const QModelIndex &index, bool importing=false);
-    void buildListenLive();
+    void buildListenLive(const QModelIndex &index);
+    void buildXml();
 
 private:
-    QMap<QNetworkReply *, CategoryItem *> jobs;
+    QMap<NetworkJob *, CategoryItem *> jobs;
     CategoryItem *root;
-    CategoryItem *favourites;
+    FavouritesCategoryItem *favourites;
     CategoryItem *tuneIn;
+    CategoryItem *shoutCast;
     CategoryItem *listenLive;
     bool favouritesIsWriteable;
     bool favouritesModified;
@@ -212,6 +283,7 @@ private:
     Action *addToFavouritesAction;
     Action *configureAction;
     Action *reloadAction;
+    QList<Item *> hiddenCategories;
 };
 
 #endif
diff --git a/models/streamsproxymodel.cpp b/models/streamsproxymodel.cpp
index 23f8db0..464b849 100644
--- a/models/streamsproxymodel.cpp
+++ b/models/streamsproxymodel.cpp
@@ -67,6 +67,13 @@ bool StreamsProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourc
     QModelIndex idx=index.parent();
     QStringList strings;
 
+    if (filter && item==filter) { // Accept top-level item!
+        return true;
+    }
+    if (filter && !idx.isValid() && item!=filter) { // Accept all items that are not children of top-level item!
+        return true;
+    }
+
     // Traverse back up tree, so we get parent strings...
     while (idx.isValid()) {
         StreamsModel::Item *i = static_cast<StreamsModel::Item *>(idx.internalPointer());
@@ -75,6 +82,9 @@ bool StreamsProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex &sourc
         }
         strings << i->name;
         idx=idx.parent();
+        if (filter && !idx.isValid() && i!=filter) { // Accept all items that are not children of top-level item!
+            return true;
+        }
     }
 
     if (item->isCategory()) {
diff --git a/mpd/cuefile.cpp b/mpd/cuefile.cpp
index aae8f8e..8eb72db 100644
--- a/mpd/cuefile.cpp
+++ b/mpd/cuefile.cpp
@@ -24,6 +24,7 @@
 #include "cuefile.h"
 #include "mpdconnection.h"
 #include "utils.h"
+#include "settings.h"
 #include <QBuffer>
 #include <QDateTime>
 #include <QFile>
@@ -43,7 +44,7 @@ static const QString constFileLineRegExp = QLatin1String("(\\S+)\\s+(?:\"([^\"]+
 static const QString constIndexRegExp = QLatin1String("(\\d{2,3}):(\\d{2}):(\\d{2})");
 static const QString constPerformer = QLatin1String("performer");
 static const QString constTitle = QLatin1String("title");
-//static const QString constSongWriter = QLatin1String("songwriter");
+static const QString constSongWriter = QLatin1String("songwriter");
 static const QString constFile = QLatin1String("file");
 static const QString constTrack = QLatin1String("track");
 static const QString constIndex = QLatin1String("index");
@@ -87,13 +88,13 @@ struct CueEntry {
     QString artist;
     QString albumArtist;
     QString album;
-//    QString composer;
-//    QString albumComposer;
+    QString composer;
+    QString albumComposer;
     QString genre;
     QString date;
 
     CueEntry(QString &file, QString &index, int trackNo, QString &title, QString &artist, QString &albumArtist,
-             QString &album, /*QString &composer, QString &albumComposer,*/ QString &genre, QString &date) {
+             QString &album, QString &composer, QString &albumComposer, QString &genre, QString &date) {
         this->file = file;
         this->index = index;
         this->trackNo = trackNo;
@@ -101,8 +102,8 @@ struct CueEntry {
         this->artist = artist;
         this->albumArtist = albumArtist;
         this->album = album;
-//        this->composer = composer;
-//        this->albumComposer = albumComposer;
+        this->composer = composer;
+        this->albumComposer = albumComposer;
         this->genre = genre;
         this->date = date;
     }
@@ -153,6 +154,7 @@ static bool updateSong(const CueEntry &entry, const QString &nextIndex, Song &so
     song.genre=entry.genre;
     song.year=entry.date.toInt();
     song.time=(end-beginning)/constMsecPerSec;
+    song.composer=entry.composer.isEmpty() ? entry.albumComposer : entry.composer;
     return true;
 }
 
@@ -173,29 +175,77 @@ static bool updateLastSong(const CueEntry &entry, Song &song)
     song.albumartist=entry.albumArtist;
     song.genre=entry.genre;
     song.year=entry.date.toInt();
+    song.composer=entry.composer.isEmpty() ? entry.albumComposer : entry.composer;
     return true;
 }
 
-bool CueFile::parse(const QString &fileName, const QString &dir, QList<Song> &songList, QSet<QString> &files)
+// Get list of text codecs used to decode CUE files...
+static const QList<QTextCodec *> & codecList()
 {
-    QFile f(dir+fileName);
-    if (!f.open(QIODevice::ReadOnly|QIODevice::Text)) {
-        return false;
+    static QList<QTextCodec *> codecs;
+    if (codecs.isEmpty()) {
+        codecs.append(QTextCodec::codecForName("UTF-8"));
+        QTextCodec *codec=QTextCodec::codecForLocale();
+        if (codec && !codecs.contains(codec)) {
+            codecs.append(codec);
+        }
+        codec=QTextCodec::codecForName("System");
+        if (codec && !codecs.contains(codec)) {
+            codecs.append(codec);
+        }
+
+        QStringList configCodecs=Settings::self()->cueFileCodecs();
+        foreach (const QString &cfg, configCodecs) {
+            codec=QTextCodec::codecForName(cfg.toLatin1());
+            if (codec && !codecs.contains(codec)) {
+                codecs.append(codec);
+            }
+        }
     }
+    return codecs;
+}
 
-    QTextStream textStream(&f);
-    textStream.setCodec(QTextCodec::codecForUtfText(f.peek(1024), QTextCodec::codecForName("UTF-8")));
+bool CueFile::parse(const QString &fileName, const QString &dir, QList<Song> &songList, QSet<QString> &files)
+{
+     QScopedPointer<QTextStream> textStream;
+     QString decoded;
+     QFile f(dir+fileName);
+     if (f.open(QIODevice::ReadOnly)) {
+         // First attempt to use QTextDecoder to decode cue file contents into a QString
+         QByteArray contents=f.readAll();
+         foreach (QTextCodec *codec, codecList()) {
+             QTextDecoder decoder(codec);
+             decoded=decoder.toUnicode(contents);
+             if (!decoder.hasFailure()) {
+                 textStream.reset(new QTextStream(&decoded, QIODevice::ReadOnly));
+                 break;
+             }
+         }
+         f.close();
+
+         if (!textStream) {
+             decoded.clear();
+             // Failed to use text decoders, fall back to old method...
+             f.open(QIODevice::ReadOnly|QIODevice::Text);
+             textStream.reset(new QTextStream(&f));
+             textStream->setCodec(QTextCodec::codecForUtfText(f.peek(1024), QTextCodec::codecForName("UTF-8")));
+         }
+     }
+
+     if (!textStream) {
+         return false;
+     }
 
     // read the first line already
-    QString line = textStream.readLine();
+    QString line = textStream->readLine();
     QList<CueEntry> entries;
     QString fileDir=fileName.contains("/") ? Utils::getDir(fileName) : QString();
 
     // -- whole file
-    while (!textStream.atEnd()) {
+    while (!textStream->atEnd()) {
         QString albumArtist;
         QString album;
-//        QString albumComposer;
+        QString albumComposer;
         QString file;
         QString fileType;
         QString genre;
@@ -217,9 +267,9 @@ bool CueFile::parse(const QString &fileName, const QString &dir, QList<Song> &so
                 albumArtist = lineValue;
             } else if (lineName == constTitle) {
                 album = lineValue;
-            } /*else if (lineName == constSongWriter) {
+            } else if (lineName == constSongWriter) {
                 albumComposer = lineValue;
-            }*/ else if (lineName == constFile) {
+            } else if (lineName == constFile) {
                 file = lineValue;
                 if (splitted.size() > 2) {
                     fileType = splitted[2];
@@ -240,7 +290,7 @@ bool CueFile::parse(const QString &fileName, const QString &dir, QList<Song> &so
             }
 
             // just ignore the rest of possible field types for now...
-        } while (!(line = textStream.readLine()).isNull());
+        } while (!(line = textStream->readLine()).isNull());
 
         if (line.isNull()) {
             return false;
@@ -251,7 +301,7 @@ bool CueFile::parse(const QString &fileName, const QString &dir, QList<Song> &so
         QString trackType;
         QString index;
         QString artist;
-//        QString composer;
+        QString composer;
         QString title;
         int trackNo=0;
 
@@ -273,7 +323,7 @@ bool CueFile::parse(const QString &fileName, const QString &dir, QList<Song> &so
                 // for later (if it's valid of course)
                 // please note that the same code is repeated just after this 'do-while' loop
                 if (validFile && !index.isEmpty() && (trackType.isEmpty() || trackType == constAudioTrackType)) {
-                    entries.append(CueEntry(file, index, trackNo, title, artist, albumArtist, album, /*composer, albumComposer,*/ genre, date));
+                    entries.append(CueEntry(file, index, trackNo, title, artist, albumArtist, album, composer, albumComposer, genre, date));
                 }
 
                 // clear the state
@@ -297,18 +347,18 @@ bool CueFile::parse(const QString &fileName, const QString &dir, QList<Song> &so
                 artist = lineValue;
             } else if (lineName == constTitle) {
                 title = lineValue;
-            } /*else if (lineName == constSongWriter) {
+            } else if (lineName == constSongWriter) {
                 composer = lineValue;
                 // end of track's for the current file -> parse next one
-            }*/ else if (lineName == constFile) {
+            } else if (lineName == constFile) {
                 break;
             }
             // just ignore the rest of possible field types for now...
-        } while (!(line = textStream.readLine()).isNull());
+        } while (!(line = textStream->readLine()).isNull());
 
         // we didn't add the last song yet...
         if (validFile && !index.isEmpty() && (trackType.isEmpty() || trackType == constAudioTrackType)) {
-            entries.append(CueEntry(file, index, trackNo, title, artist, albumArtist, album, /*composer, albumComposer,*/ genre, date));
+            entries.append(CueEntry(file, index, trackNo, title, artist, albumArtist, album, composer, albumComposer, genre, date));
         }
     }
 
diff --git a/mpd/mpd.conf.template b/mpd/mpd.conf.template
index 7faa418..55a5e98 100644
--- a/mpd/mpd.conf.template
+++ b/mpd/mpd.conf.template
@@ -1,12 +1,12 @@
 music_directory	"${HOME}/Music"
-playlist_directory "${CONFIG_DIR}/playlists"
-sticker_file "${CONFIG_DIR}/sticker.sql"
-bind_to_address "${CONFIG_DIR}/socket"
+playlist_directory "${DATA_DIR}/playlists"
+sticker_file "${DATA_DIR}/sticker.sql"
+bind_to_address "${DATA_DIR}/socket"
 db_file "${CACHE_DIR}/tag_cache"
 pid_file "${CACHE_DIR}/pid"
 state_file "${CACHE_DIR}/state"
 log_file "/dev/null"
-metadata_to_use	"artist,album,title,track,name,genre,date,disc,albumartist"
+metadata_to_use	"artist,album,title,track,name,genre,date,disc,albumartist,composer"
 audio_output { 
   type "alsa"
   name "Output"
diff --git a/mpd/mpdconnection.cpp b/mpd/mpdconnection.cpp
index b756659..0d60907 100644
--- a/mpd/mpdconnection.cpp
+++ b/mpd/mpdconnection.cpp
@@ -35,10 +35,13 @@
 #include <QApplication>
 #include <QStringList>
 #include <QTimer>
+#include <QDir>
 #include "thread.h"
 #include "settings.h"
 #include "cuefile.h"
-
+#ifdef QT_QTDBUS_FOUND
+#include "powermanagement.h"
+#endif
 #include <QDebug>
 static bool debugEnabled=false;
 #define DBUG if (debugEnabled) qWarning() << "MPDConnection" << QThread::currentThreadId()
@@ -105,7 +108,7 @@ static QByteArray readFromSocket(MpdSocket &socket)
     return data;
 }
 
-MPDConnection::Response readReply(MpdSocket &socket)
+static MPDConnection::Response readReply(MpdSocket &socket)
 {
     QByteArray data = readFromSocket(socket);
     return MPDConnection::Response(data.endsWith("OK\n"), data);
@@ -117,7 +120,7 @@ MPDConnection::Response::Response(bool o, const QByteArray &d)
 {
 }
 
-QString MPDConnection::Response::getError()
+QString MPDConnection::Response::getError(const QByteArray &command)
 {
     if (ok || data.isEmpty()) {
         return QString();
@@ -125,9 +128,16 @@ QString MPDConnection::Response::getError()
 
     if (!ok && data.size()>0) {
         int cmdEnd=data.indexOf("} ");
-        if (-1!=cmdEnd) {
+        if (-1==cmdEnd) {
+            return i18n("Uknown")+QLatin1String(" (")+command+QLatin1Char(')');
+        } else {
             cmdEnd+=2;
-            data=data.mid(cmdEnd, data.length()-(data.endsWith('\n') ? cmdEnd+1 : cmdEnd));
+            QString rv=data.mid(cmdEnd, data.length()-(data.endsWith('\n') ? cmdEnd+1 : cmdEnd));
+            if (data.contains("{listplaylists}")) {
+                // NOT: NOT transalted, as refers to config item
+                return QLatin1String("playlist_directory - ")+rv;
+            }
+            return rv;
         }
     }
     return data;
@@ -154,6 +164,11 @@ QString MPDConnectionDetails::description() const
     }
 }
 
+void MPDConnectionDetails::setDirReadable()
+{
+    dirReadable=Utils::isDirReadable(dir);
+}
+
 MPDConnection::MPDConnection()
     : thread(0)
     , ver(0)
@@ -177,10 +192,14 @@ MPDConnection::MPDConnection()
     qRegisterMetaType<QList<Playlist> >("QList<Playlist>");
     qRegisterMetaType<QList<quint32> >("QList<quint32>");
     qRegisterMetaType<QList<qint32> >("QList<qint32>");
+    qRegisterMetaType<QSet<qint32> >("QSet<qint32>");
     qRegisterMetaType<QAbstractSocket::SocketState >("QAbstractSocket::SocketState");
     qRegisterMetaType<MPDStatsValues>("MPDStatsValues");
     qRegisterMetaType<MPDStatusValues>("MPDStatusValues");
     qRegisterMetaType<MPDConnectionDetails>("MPDConnectionDetails");
+    #ifdef QT_QTDBUS_FOUND
+    connect(PowerManagement::self(), SIGNAL(resuming()), this, SLOT(reconnect()));
+    #endif
 }
 
 MPDConnection::~MPDConnection()
@@ -238,6 +257,7 @@ MPDConnection::ConnectionReturn MPDConnection::connectToMPD(MpdSocket &socket, b
 
             lastUpdatePlayQueueVersion=lastStatusPlayQueueVersion=0;
             playQueueIds.clear();
+            emit cantataStreams(QList<Song>(), false);
             int min, maj, patch;
             if (3==sscanf(&(recvdata.constData()[7]), "%d.%d.%d", &maj, &min, &patch)) {
                 long v=((maj&0xFF)<<16)+((min&0xFF)<<8)+(patch&0xFF);
@@ -286,6 +306,7 @@ MPDConnection::ConnectionReturn MPDConnection::connectToMPD()
     ConnectionReturn status=Failed;
     if (Success==(status=connectToMPD(sock)) && Success==(status=connectToMPD(idleSocket, true))) {
         state=State_Connected;
+        emit socketAddress(sock.address());
     } else {
         disconnectFromMPD();
         state=State_Disconnected;
@@ -309,6 +330,7 @@ void MPDConnection::disconnectFromMPD()
     idleSocket.close();
     state=State_Disconnected;
     ver=0;
+    emit socketAddress(QString());
 }
 
 // This function is mainly intended to be called after the computer (laptop) has been 'resumed'
@@ -337,6 +359,7 @@ void MPDConnection::reconnect()
         getStatus();
         getStats(false);
         getUrlHandlers();
+        getTagTypes();
         playListInfo();
         outputs();
         reconnectStart=0;
@@ -378,6 +401,9 @@ void MPDConnection::setDetails(const MPDConnectionDetails &d)
     bool diffName=det.name!=details.name;
     bool diffDetails=det!=details;
     bool diffDynamicPort=det.dynamizerPort!=details.dynamizerPort;
+    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+    bool diffStreamUrl=det.streamUrl!=details.streamUrl;
+    #endif
 
     details=det;
     if (diffDetails || State_Connected!=state) {
@@ -394,6 +420,7 @@ void MPDConnection::setDetails(const MPDConnectionDetails &d)
             getStatus();
             getStats(false);
             getUrlHandlers();
+            getTagTypes();
             emit stateChanged(true);
             break;
         case Failed:
@@ -415,6 +442,11 @@ void MPDConnection::setDetails(const MPDConnectionDetails &d)
             emit dynamicUrl("http://"+(details.isLocal() ? "127.0.0.1" : details.hostname)+":"+QString::number(details.dynamizerPort));
         }
     }
+    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+    if (diffStreamUrl) {
+        emit streamUrl(details.streamUrl);
+    }
+    #endif
     if (changedDir) {
         emit dirChanged();
     }
@@ -468,19 +500,19 @@ MPDConnection::Response MPDConnection::sendCommand(const QByteArray &command, bo
         }
         if (emitErrors) {
             if ((command.startsWith("add ") || command.startsWith("command_list_begin\nadd ")) && -1!=command.indexOf("\"file:///")) {
-                if (details.isLocal() && response.data=="Permission denied") {
+                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() && response.data=="Access denied") {
+                } 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().isEmpty()) {
-                    emit error(response.getError());
+                } 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().isEmpty()) {
-                emit error(response.getError());
+            } else if (!response.getError(command).isEmpty()) {
+                emit error(i18n("MPD reported the following error: %1", response.getError(command)));
             } else {
                 disconnectFromMPD();
                 emit stateChanged(false);
@@ -497,20 +529,20 @@ MPDConnection::Response MPDConnection::sendCommand(const QByteArray &command, bo
  */
 bool MPDConnection::isPlaylist(const QString &file)
 {
-    return file.endsWith("asx", Qt::CaseInsensitive) || file.endsWith("cue", Qt::CaseInsensitive) ||
-           file.endsWith("m3u", Qt::CaseInsensitive) || file.endsWith("pls", Qt::CaseInsensitive) ||
-           file.endsWith("xspf", Qt::CaseInsensitive);
+    return file.endsWith(QLatin1String(".asx"), Qt::CaseInsensitive) || file.endsWith(QLatin1String(".cue"), Qt::CaseInsensitive) ||
+           file.endsWith(QLatin1String(".m3u"), Qt::CaseInsensitive) || file.endsWith(QLatin1String(".pls"), Qt::CaseInsensitive) ||
+           file.endsWith(QLatin1String(".xspf"), Qt::CaseInsensitive);
 }
 
 void MPDConnection::add(const QStringList &files, bool replace, quint8 priority)
 {
-    add(files, 0, 0, replace, priority);
+    add(files, 0, 0, replace ? AddReplaceAndPlay : AddToEnd, priority);
 }
 
-void MPDConnection::add(const QStringList &files, quint32 pos, quint32 size, bool replace, quint8 priority)
+void MPDConnection::add(const QStringList &files, quint32 pos, quint32 size, int action, quint8 priority)
 {
     toggleStopAfterCurrent(false);
-    if (replace) {
+    if (AddToEnd!=action) {
         clear();
         getStatus();
     }
@@ -521,18 +553,24 @@ void MPDConnection::add(const QStringList &files, quint32 pos, quint32 size, boo
 //    bool addedFile=false;
     bool havePlaylist=false;
     bool usePrio=priority>0 && canUsePriority();
+    QStringList cStreamFiles;
+
     for (int i = 0; i < files.size(); i++) {
-        if (CueFile::isCue(files.at(i))) {
-            send += "load "+CueFile::getLoadLine(files.at(i))+"\n";
+        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(files.at(i))) {
+            if (isPlaylist(fileName)) {
                 send+="load ";
                 havePlaylist=true;
             } else {
 //                addedFile=true;
                 send += "add ";
             }
-            send += encodeName(files.at(i))+"\n";
+            send += encodeName(fileName)+"\n";
         }
         if (!havePlaylist) {
             if (0!=size) {
@@ -549,7 +587,11 @@ void MPDConnection::add(const QStringList &files, quint32 pos, quint32 size, boo
     send += "command_list_end";
 
     if (sendCommand(send).ok) {
-        if (replace /*&& addedFile */&& !files.isEmpty()) {
+        if (!cStreamFiles.isEmpty()) {
+            emit cantataStreams(cStreamFiles);
+        }
+
+        if (AddReplaceAndPlay==action /*&& addedFile */&& !files.isEmpty()) {
             // Dont emit error if fail plays, might be that playlist was not loaded...
             sendCommand("play "+QByteArray::number(0), false);
         }
@@ -577,6 +619,7 @@ void MPDConnection::clear()
     if (sendCommand("clear").ok) {
         lastUpdatePlayQueueVersion=0;
         playQueueIds.clear();
+        emit cantataStreams(QList<Song>(), false);
     }
 }
 
@@ -686,6 +729,7 @@ void MPDConnection::playListChanges()
             bool first=true;
             quint32 firstPos=0;
             QList<Song> songs;
+            QList<Song> newCantataStreams;
             QList<qint32> ids;
             QSet<qint32> prevIds=playQueueIds.toSet();
             QSet<qint32> strmIds;
@@ -725,8 +769,15 @@ void MPDConnection::playListChanges()
                     s.id=idp.id;
 //                     s.pos=idp.pos;
                     songs.append(s);
-                    if (s.isStream() && !s.isCantataStream()) {
-                        strmIds.insert(s.id);
+
+                    if (s.isCdda()) {
+                        newCantataStreams.append(s);
+                    } else if (s.isStream()) {
+                        if (s.isCantataStream()) {
+                            newCantataStreams.append(s);
+                        } else {
+                            strmIds.insert(s.id);
+                        }
                     }
                 }
                 ids.append(idp.id);
@@ -748,6 +799,13 @@ void MPDConnection::playListChanges()
 
             playQueueIds=ids;
             streamIds=strmIds;
+            if (!newCantataStreams.isEmpty()) {
+                emit cantataStreams(newCantataStreams, true);
+            }
+            QSet<qint32> removed=prevIds-playQueueIds.toSet();
+            if (!removed.isEmpty()) {
+                emit removedIds(removed);
+            }
             emit playlistUpdated(songs);
             return;
         }
@@ -764,12 +822,21 @@ void MPDConnection::playListInfo()
         QList<Song> songs=MPDParseUtils::parseSongs(response.data);
         playQueueIds.clear();
         streamIds.clear();
+
+        QList<Song> cStreams;
         foreach (const Song &s, songs) {
             playQueueIds.append(s.id);
-            if (s.isStream() && !s.isCantataStream()) {
-                streamIds.insert(s.id);
+            if (s.isCdda()) {
+                cStreams.append(s);
+            } else if (s.isStream()) {
+                if (s.isCantataStream()) {
+                    cStreams.append(s);
+                } else {
+                    streamIds.insert(s.id);
+                }
             }
         }
+        emit cantataStreams(cStreams, false);
         emit playlistUpdated(songs);
     }
 }
@@ -815,6 +882,12 @@ void MPDConnection::setPause(bool toggle)
     sendCommand("pause "+value(toggle));
 }
 
+void MPDConnection::play()
+{
+    toggleStopAfterCurrent(false);
+    sendCommand("play");
+}
+
 void MPDConnection::startPlayingSong(quint32 song)
 {
     toggleStopAfterCurrent(false);
@@ -946,10 +1019,19 @@ void MPDConnection::getUrlHandlers()
 {
     Response response=sendCommand("urlhandlers");
     if (response.ok) {
-        handlers=MPDParseUtils::parseUrlHandlers(response.data).toSet();
+        handlers=MPDParseUtils::parseList(response.data, QLatin1String("handler: ")).toSet();
+    }
+}
+
+void MPDConnection::getTagTypes()
+{
+    Response response=sendCommand("tagtypes");
+    if (response.ok) {
+        tagTypes=MPDParseUtils::parseList(response.data, QLatin1String("tagtype: ")).toSet();
     }
 }
 
+
 /*
  * Data is written during idle.
  * Retrieve it and parse it
@@ -1168,10 +1250,10 @@ void MPDConnection::addToPlaylist(const QString &name, const QStringList &songs,
     if (!name.isEmpty()) {
         foreach (const QString &song, songs) {
             if (CueFile::isCue(song)) {
-                emit error(i18n("You cannot add parts of a cue sheet to a playlist!"));
+                emit error(i18n("You cannot add parts of a cue sheet to a playlist!")+QLatin1String(" (")+song+QLatin1Char(')'));
                 return;
             } else if (isPlaylist(song)) {
-                emit error(i18n("You cannot add a playlist to another playlist!"));
+                emit error(i18n("You cannot add a playlist to another playlist!")+QLatin1String(" (")+song+QLatin1Char(')'));
                 return;
             }
         }
diff --git a/mpd/mpdconnection.h b/mpd/mpdconnection.h
index c073658..a6252eb 100644
--- a/mpd/mpdconnection.h
+++ b/mpd/mpdconnection.h
@@ -29,6 +29,7 @@
 
 #include <QTcpSocket>
 #include <QLocalSocket>
+#include <QHostAddress>
 #include <QDateTime>
 #include <QStringList>
 #include "mpdstats.h"
@@ -36,6 +37,7 @@
 #include "song.h"
 #include "output.h"
 #include "playlist.h"
+#include "config.h"
 #include <time.h>
 
 class MusicLibraryItemArtist;
@@ -113,6 +115,7 @@ public:
     }
 
     bool isLocal() const { return 0!=local; }
+    QString address() const { return tcp ? tcp->peerAddress().toString() : QString(); }
 
 Q_SIGNALS:
     void stateChanged(QAbstractSocket::SocketState state);
@@ -140,6 +143,7 @@ struct MPDConnectionDetails {
     bool operator!=(const MPDConnectionDetails &o) const { return !(*this==o); }
     bool operator<(const MPDConnectionDetails &o) const { return name.localeAwareCompare(o.name)<0; }
     static QString configGroupName(const QString &n=QString()) { return n.isEmpty() ? "Connection" : ("Connection-"+n); }
+    void setDirReadable();
 
     QString name;
     QString hostname;
@@ -149,6 +153,9 @@ struct MPDConnectionDetails {
     quint16 dynamizerPort;
     bool dirReadable;
     QString coverName;
+    #ifdef ENABLE_HTTP_STREAM_PLAYBACK
+    QString streamUrl;
+    #endif
 };
 
 #define MPD_MAKE_VERSION(a, b, c) (((a) << 16) | ((b) << 8) | (c))
@@ -158,12 +165,19 @@ class MPDConnection : public QObject
     Q_OBJECT
 
 public:
+    enum AddAction
+    {
+        AddToEnd=0,
+        AddAndReplace=1,
+        AddReplaceAndPlay=2
+    };
+
     static MPDConnection * self();
     static QByteArray encodeName(const QString &name);
 
     struct Response {
         Response(bool o=true, const QByteArray &d=QByteArray());
-        QString getError();
+        QString getError(const QByteArray &command);
         bool ok;
         QByteArray data;
     };
@@ -176,10 +190,13 @@ public:
     void start();
     void stop();
     const MPDConnectionDetails & getDetails() const { return details; }
-    void setDirReadable(bool r) { details.dirReadable=r; }
+    void setDirReadable() { details.setDirReadable(); }
     bool isConnected() const { return State_Connected==state; }
     bool canUsePriority() const { return ver>=MPD_MAKE_VERSION(0, 17, 0); }
     const QSet<QString> & urlHandlers() const { return handlers; }
+    const QSet<QString> & tags() const { return tagTypes; }
+    bool composerTagSupported() const { return tagTypes.contains(QLatin1String("Composer")); }
+
     long version() const { return ver; }
     static bool isPlaylist(const QString &file);
     int unmuteVolume() { return unmuteVol; }
@@ -191,7 +208,7 @@ public Q_SLOTS:
     void disconnectMpd();
     // Current Playlist
     void add(const QStringList &files, bool replace, quint8 priority);
-    void add(const QStringList &files, quint32 pos, quint32 size, bool replace, quint8 priority);
+    void add(const QStringList &files, quint32 pos, quint32 size, int action, quint8 priority);
     void addAndPlay(const QString &file);
     void currentSong();
     void playListChanges();
@@ -209,6 +226,7 @@ public Q_SLOTS:
     void getReplayGain();
     void goToNext();
     void setPause(bool toggle);
+    void play();
     void startPlayingSong(quint32 song = 0);
     void startPlayingSongId(qint32 songId = 0);
     void goToPrevious();
@@ -231,6 +249,7 @@ public Q_SLOTS:
     void getStats(bool andUpdate=false);
     void getStatus();
     void getUrlHandlers();
+    void getTagTypes();
 
     // Database
     void loadLibrary();
@@ -285,6 +304,12 @@ Q_SIGNALS:
 
     void dynamicUrl(const QString &url);
     void stopAfterCurrentChanged(bool afterCurrent);
+    void streamUrl(const QString &url);
+
+    void socketAddress(const QString &addr);
+    void cantataStreams(const QStringList &files);
+    void cantataStreams(const QList<Song> &songs, bool isUpdate);
+    void removedIds(const QSet<qint32> &ids);
 
 private Q_SLOTS:
     void idleDataReady();
@@ -311,6 +336,7 @@ private:
     Thread *thread;
     long ver;
     QSet<QString> handlers;
+    QSet<QString> tagTypes;
     MPDConnectionDetails details;
     QDateTime dbUpdate;
     // Use 2 sockets, 1 for commands and 1 to receive MPD idle events.
diff --git a/mpd/mpdparseutils.cpp b/mpd/mpdparseutils.cpp
index 996e30b..4da45b2 100644
--- a/mpd/mpdparseutils.cpp
+++ b/mpd/mpdparseutils.cpp
@@ -166,7 +166,24 @@ MPDStatusValues MPDParseUtils::parseStatus(const QByteArray &data)
         } else if (tokens.at(0) == "updating_db") {
             v.updatingDb=tokens.at(1).toInt();
         } else if (tokens.at(0) == "error") {
-            v.error=tokens.at(1);
+            // For errors, we dont really want to split by ':' !!!
+            QString line=lines.at(i);
+            int pos=line.indexOf(": ");
+            if (pos>0) {
+                v.error=line.mid(pos+2);
+            } else {
+                v.error=tokens.at(1);
+            }
+
+            // If we are reporting a stream error, remove any stream name added by Cantata...
+            int start=v.error.indexOf(QLatin1String("\"http://"));
+            if (start>0) {
+                int end=v.error.indexOf(QChar('\"'), start+6);
+                pos=v.error.indexOf(QChar('#'), start+6);
+                if (pos>start && pos<end) {
+                    v.error=v.error.left(pos)+v.error.mid(end);
+                }
+            }
         }
     }
     return v;
@@ -197,6 +214,8 @@ Song MPDParseUtils::parseSong(const QByteArray &data, bool isPlayQueue)
             song.artist = value;
         } else if (element == QLatin1String("AlbumArtist")) {
             song.albumartist = value;
+        } else if (element == QLatin1String("Composer")) {
+            song.composer = value;
         } else if (element == QLatin1String("Title")) {
             song.title = value;
         } else if (element == QLatin1String("Track")) {
@@ -248,7 +267,15 @@ Song MPDParseUtils::parseSong(const QByteArray &data, bool isPlayQueue)
 
     if (!song.file.isEmpty()) {
         if (song.isStream()) {
-            if (!song.isCantataStream()) {
+            if (song.isCantataStream()) {
+                if (song.title.isEmpty()) {
+                    QStringList parts=QUrl(song.file).path().split('/');
+                    if (!parts.isEmpty()) {
+                        song.title=parts.last();
+                        song.fillEmptyFields();
+                    }
+                }
+            } else {
                 if (!OnlineService::decode(song)) {
                     QString name=getAndRemoveStreamName(song.file);
                     if (!name.isEmpty()) {
@@ -333,25 +360,25 @@ QList<MPDParseUtils::IdPos> MPDParseUtils::parseChanges(const QByteArray &data)
     return changes;
 }
 
-QStringList MPDParseUtils::parseUrlHandlers(const QByteArray &data)
+QStringList MPDParseUtils::parseList(const QByteArray &data, const QLatin1String &key)
 {
-    QStringList urls;
-    QByteArray song;
+    QStringList items;
     QList<QByteArray> lines = data.split('\n');
     int amountOfLines = lines.size();
+    int keyLen=QString(key).length();
 
     for (int i = 0; i < amountOfLines; i++) {
-        QString url(lines.at(i));
-        // Skip the "OK" line, this is NOT a url handler!!!
-        if (QLatin1String("OK")==url) {
+        QString item(lines.at(i));
+        // Skip the "OK" line, this is NOT a valid item!!!
+        if (QLatin1String("OK")==item) {
             continue;
         }
-        if (url.startsWith(QLatin1String("handler: "))) {
-            urls.append(url.mid(9).replace("://", ""));
+        if (item.startsWith(key)) {
+            items.append(item.mid(keyLen).replace("://", ""));
         }
     }
 
-    return urls;
+    return items;
 }
 
 static bool groupSingleTracks=false;
@@ -406,10 +433,19 @@ MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data,
                 QSet<QString> cueFiles; // List of source (flac, mp3, etc) files referenced in cue file
 
                 DBUG << "Got playlist item" << currentSong.file << "prevFile:" << prevSongFile;
-                if (canSplitCue && currentSong.file.endsWith(".cue", Qt::CaseInsensitive) && !mpdDir.startsWith("http://") &&
-                        CueFile::parse(currentSong.file, mpdDir, cueSongs, cueFiles) &&
-                        (cueFiles.count()<cueSongs.count() || (albumItem && albumItem->data()==unknown && albumItem->parentItem()->data()==unknown))) {
-                    DBUG << "Parsed file, songs:" << cueSongs.count() << "files:" << cueFiles;
+
+                bool parseCue=canSplitCue && currentSong.isCueFile() && !mpdDir.startsWith("http://") && QFile::exists(mpdDir+currentSong.file);
+                bool cueParseStatus=false;
+                if (parseCue) {
+                    DBUG << "Parsing cue file:" << currentSong.file << "mpdDir:" << mpdDir;
+                    cueParseStatus=CueFile::parse(currentSong.file, mpdDir, cueSongs, cueFiles);
+                    if (!cueParseStatus) {
+                        DBUG << "Failed to parse cue file!";
+                        continue;
+                    } else DBUG << "Parsed cue file, songs:" << cueSongs.count() << "files:" << cueFiles;
+                }
+                if (cueParseStatus &&
+                    (cueFiles.count()<cueSongs.count() || (albumItem && albumItem->data()==unknown && albumItem->parentItem()->data()==unknown))) {
 
                     bool canUseThisCueFile=true;
                     foreach (const Song &s, cueSongs) {
@@ -440,19 +476,23 @@ MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data,
                                 Song s=orig;
                                 Song albumSong=origFiles[s.name];
                                 s.name=QString(); // CueFile has placed source file name here!
-                                if (s.artist.isEmpty()) {
+                                if (s.artist.isEmpty() && !albumSong.artist.isEmpty()) {
                                     s.artist=albumSong.artist;
                                     DBUG << "Get artist from album" << albumSong.artist;
                                 }
-                                if (s.album.isEmpty()) {
+                                if (s.composer.isEmpty() && !albumSong.composer.isEmpty()) {
+                                    s.composer=albumSong.composer;
+                                    DBUG << "Get composer from album" << albumSong.composer;
+                                }
+                                if (s.album.isEmpty() && !albumSong.album.isEmpty()) {
                                     s.album=albumSong.album;
                                     DBUG << "Get album from album" << albumSong.album;
                                 }
-                                if (s.albumartist.isEmpty()) {
+                                if (s.albumartist.isEmpty() && !albumSong.albumartist.isEmpty()) {
                                     s.albumartist=albumSong.albumartist;
-                                    DBUG << "Get albumartist from album" << albumSong.album;
+                                    DBUG << "Get albumartist from album" << albumSong.albumartist;
                                 }
-                                if (0==s.year) {
+                                if (0==s.year && 0!=albumSong.year) {
                                     s.year=albumSong.year;
                                     DBUG << "Get year from album" << albumSong.year;
                                 }
@@ -547,10 +587,10 @@ MusicLibraryItemRoot * MPDParseUtils::parseLibraryItems(const QByteArray &data,
 //            }
 
             currentSong.fillEmptyFields();
-            if (!artistItem || currentSong.albumArtist()!=artistItem->data()) {
+            if (!artistItem || currentSong.artistOrComposer()!=artistItem->data()) {
                 artistItem = rootItem->artist(currentSong);
             }
-            if (!albumItem || currentSong.year!=albumItem->year() || albumItem->parentItem()!=artistItem || currentSong.album!=albumItem->data()) {
+            if (!albumItem || currentSong.year!=albumItem->year() || albumItem->parentItem()!=artistItem || currentSong.albumName()!=albumItem->data()) {
                 albumItem = artistItem->album(currentSong);
             }
             songItem = new MusicLibraryItemSong(currentSong, albumItem);
@@ -630,30 +670,6 @@ QList<Output> MPDParseUtils::parseOuputs(const QByteArray &data)
     return outputs;
 }
 
-QString MPDParseUtils::formatDuration(const quint32 totalseconds)
-{
-    //Get the days,hours,minutes and seconds out of the total seconds
-    quint32 days = totalseconds / 86400;
-    quint32 rest = totalseconds - (days * 86400);
-    quint32 hours = rest / 3600;
-    rest = rest - (hours * 3600);
-    quint32 minutes = rest / 60;
-    quint32 seconds = rest - (minutes * 60);
-
-    //Convert hour,minutes and seconds to a QTime for easier parsing
-    QTime time(hours, minutes, seconds);
-
-    #ifdef ENABLE_KDE_SUPPORT
-    return 0==days
-            ? time.toString("h:mm:ss")
-            : i18np("1 day %2", "%1 days %2", days, time.toString("h:mm:ss"));
-    #else
-    return 0==days
-            ? time.toString("h:mm:ss")
-            : QString("%1:%2").arg(days).arg(time.toString("hh:mm:ss"));
-    #endif
-}
-
 static const QString constHashReplacement=QLatin1String("${hash}");
 
 QString MPDParseUtils::addStreamName(const QString &url, const QString &name)
diff --git a/mpd/mpdparseutils.h b/mpd/mpdparseutils.h
index af5d561..445d059 100644
--- a/mpd/mpdparseutils.h
+++ b/mpd/mpdparseutils.h
@@ -55,7 +55,7 @@ namespace MPDParseUtils
     extern Song parseSong(const QByteArray &data, bool isPlayQueue);
     extern QList<Song> parseSongs(const QByteArray &data);
     extern QList<IdPos> parseChanges(const QByteArray &data);
-    extern QStringList parseUrlHandlers(const QByteArray &data);
+    extern QStringList parseList(const QByteArray &data, const QLatin1String &key);
     extern bool groupSingle();
     extern void setGroupSingle(bool g);
     extern bool groupMultiple();
@@ -63,7 +63,6 @@ namespace MPDParseUtils
     extern MusicLibraryItemRoot * parseLibraryItems(const QByteArray &data, const QString &mpdDir, long mpdVersion);
     extern DirViewItemRoot * parseDirViewItems(const QByteArray &data);
     extern QList<Output> parseOuputs(const QByteArray &data);
-    extern QString formatDuration(const quint32 totalseconds);
     extern QString addStreamName(const QString &url, const QString &name);
     extern QString getStreamName(const QString &url);
     extern QString getAndRemoveStreamName(QString &url);
diff --git a/mpd/mpduser.cpp b/mpd/mpduser.cpp
index 1c4ebbb..dbaebdd 100644
--- a/mpd/mpduser.cpp
+++ b/mpd/mpduser.cpp
@@ -160,7 +160,7 @@ void MPDUser::setMusicFolder(const QString &folder)
         }
     }
     det.dir=folder;
-    det.dirReadable=QDir(det.dir).isReadable();
+    det.setDirReadable();
     if (0!=getPid()) {
         controlMpd(true); // Stop
         controlMpd(false); // Start
@@ -242,6 +242,7 @@ void MPDUser::cleanup()
             removeDir(d);
         }
         removeDir(Utils::configDir(constDir, false));
+        removeDir(Utils::dataDir(constDir, false));
         removeDir(Utils::cacheDir(constDir, false));
     }
 }
@@ -270,11 +271,13 @@ void MPDUser::init(bool create)
                 if (cfgFile.open(QIODevice::WriteOnly|QIODevice::Text)) {
                     QString homeDir=QDir::homePath();
                     QString cacheDir=Utils::cacheDir(constDir, create);
+                    QString dataDir=Utils::dataDir(constDir, create);
                     QTextStream out(&cfgFile);
                     while (!cfgTemplate.atEnd()) {
                         QString line = cfgTemplate.readLine();
                         line=line.replace(QLatin1String("${HOME}"), homeDir);
                         line=line.replace(QLatin1String("${CONFIG_DIR}"), cfgDir);
+                        line=line.replace(QLatin1String("${DATA_DIR}"), dataDir);
                         line=line.replace(QLatin1String("${CACHE_DIR}"), cacheDir);
                         line=line.replace("//", "/");
                         out << line;
@@ -292,7 +295,7 @@ void MPDUser::init(bool create)
                         if (playlists.isEmpty()) {
                             playlists=readValue(line, constPlaylistsKey);
                             if (!playlists.isEmpty()) {
-                                Utils::createDir(playlists, QString());
+                                Utils::createWorldReadableDir(playlists, QString());
                             }
                         }
                     }
@@ -316,7 +319,7 @@ void MPDUser::init(bool create)
                     }
                 }
             }
-            det.dirReadable=QDir(det.dir).isReadable();
+            det.setDirReadable();
         }
         det.name=constName;
     }
diff --git a/mpd/song.cpp b/mpd/song.cpp
index d1991d9..ad3de6c 100644
--- a/mpd/song.cpp
+++ b/mpd/song.cpp
@@ -27,11 +27,12 @@
 #include <cmath>
 #include "config.h"
 #include "song.h"
-#include "mpdparseutils.h"
 #include "musiclibraryitemalbum.h"
 #include "localize.h"
+#ifndef CANTATA_NO_SONG_TIME_FUNCTION
+#include "utils.h"
+#endif
 #include <QMap>
-#include <QFileInfo>
 #include <QStringList>
 #include <QSet>
 #include <QChar>
@@ -55,6 +56,18 @@ int Song::albumYear(const Song &s)
     return it==albumYears.end() ? s.year : it.value();
 }
 
+static bool useComposerIfSet=false;
+
+bool Song::useComposer()
+{
+    return useComposerIfSet;
+}
+
+void Song::setUseComposer(bool u)
+{
+    useComposerIfSet=u;
+}
+
 const quint16 Song::constNullKey(0xFFFF);
 
 Song::Song()
@@ -80,6 +93,7 @@ Song & Song::operator=(const Song &s)
     album = s.album;
     artist = s.artist;
     albumartist = s.albumartist;
+    composer = s.composer;
     title = s.title;
     track = s.track;
 //     pos = s.pos;
@@ -117,7 +131,7 @@ int Song::compareTo(const Song &o) const
         }
     }
 
-    int compare=albumArtist().localeAwareCompare(o.albumArtist());
+    int compare=artistOrComposer().localeAwareCompare(o.artistOrComposer());
 
     if (0!=compare) {
         return compare;
@@ -278,6 +292,7 @@ void Song::clear()
     type = Standard;
 }
 
+#ifndef CANTATA_NO_SONG_TIME_FUNCTION
 QString Song::formattedTime(quint32 seconds, bool zeroIsUnknown)
 {
     if (0==seconds && zeroIsUnknown) {
@@ -286,7 +301,7 @@ QString Song::formattedTime(quint32 seconds, bool zeroIsUnknown)
 
     static const quint32 constHour=60*60;
     if (seconds>constHour) {
-        return MPDParseUtils::formatDuration(seconds);
+        return Utils::formatDuration(seconds);
     }
 
     QString result(QString::number(floor(seconds / 60.0))+QChar(':'));
@@ -295,6 +310,7 @@ QString Song::formattedTime(quint32 seconds, bool zeroIsUnknown)
     }
     return result+QString::number(seconds % 60);
 }
+#endif
 
 /*
  * Genarate a string with song info.
@@ -327,22 +343,28 @@ QString Song::entryName() const
     return i18nc("Song\nArtist\nAlbum", "%1\n%2\n%3", title, artist, album);
 }
 
-QString Song::artistSong() const
+QString Song::artistOrComposer() const
 {
-    return artist+QLatin1String(" - ")+title;
+    return useComposerIfSet && !composer.isEmpty() ? composer : albumArtist();
 }
 
-QString Song::trackAndTitleStr(bool addArtist) const
+QString Song::albumName() const
 {
-    return (track>9 ? QString::number(track) : (QChar('0')+QString::number(track)))
-           +QChar(' ')+(addArtist ? artistSong() : title);
+    return useComposerIfSet && !composer.isEmpty() && composer!=albumArtist()
+            ? album+QLatin1String(" (")+albumArtist()+QLatin1Char(')')
+            : album;
 }
 
-void Song::updateSize(const QString &dir) const
+QString Song::artistSong() const
 {
-    if (size<=0) {
-        size=QFileInfo(dir+file).size();
-    }
+    return artist+QLatin1String(" - ")+title;
+}
+
+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);
 }
 
 bool Song::isVariousArtists(const QString &str)
@@ -424,7 +446,7 @@ QString Song::basicArtist() const
         return albumartist;
     }
 
-    QStringList toStrip=QStringList() << QLatin1String("ft. ") << QLatin1String("feat. ") << QLatin1String("featuring ");
+    QStringList toStrip=QStringList() << QLatin1String("ft. ") << QLatin1String("feat. ") << QLatin1String("featuring ") << QLatin1String("f. ");
     QStringList prefixes=QStringList() << QLatin1String(" ") << QLatin1String(" (") << QLatin1String(" [");
 
     foreach (const QString s, toStrip) {
@@ -442,7 +464,7 @@ static const quint8 constOnlineDiscId=0xEE;
 
 bool Song::isFromOnlineService() const
 {
-    return constOnlineDiscId==disc && file.startsWith("http://") && albumartist==album;
+    return constOnlineDiscId==disc && (isCantataStream() || file.startsWith("http://")) && albumartist==album;
 }
 
 void Song::setIsFromOnlineService(const QString &service)
@@ -451,3 +473,27 @@ void Song::setIsFromOnlineService(const QString &service)
     album=service;
     albumartist=service;
 }
+
+#ifdef ENABLE_EXTERNAL_TAGS
+QDataStream & operator<<(QDataStream &stream, const Song &song)
+{
+    stream << song.id << song.file << song.album << song.artist << song.albumartist << song.composer << song.title
+           << song.genre << song.name << song.disc << song.priority << song.time << song.track << (quint16)song.year
+           << (quint16)song.type << (bool)song.guessed << song.size;
+    return stream;
+}
+
+QDataStream & operator>>(QDataStream &stream, Song &song)
+{
+    quint16 type;
+    quint16 year;
+    bool guessed;
+    stream >> song.id >> song.file >> song.album >> song.artist >> song.albumartist >> song.composer >> song.title
+           >> song.genre >> song.name >> song.disc >> song.priority >> song.time >> song.track >> year
+           >> type >> guessed >> song.size;
+    song.type=(Song::Type)type;
+    song.year=year;
+    song.guessed=guessed;
+    return stream;
+}
+#endif
diff --git a/mpd/song.h b/mpd/song.h
index 0a673de..fddda69 100644
--- a/mpd/song.h
+++ b/mpd/song.h
@@ -31,11 +31,15 @@
 #include <QString>
 #include <QSet>
 #include <QMetaType>
+#include "config.h"
 
 struct Song
 {
     static const quint16 constNullKey;
 
+    static bool useComposer();
+    static void setUseComposer(bool u);
+
     enum Type {
         Standard        = 0,
         MultipleArtists = 1,
@@ -43,7 +47,8 @@ struct Song
         Playlist        = 3,
         Stream          = 4,
         CantataStream   = 5,
-        Cdda            = 6
+        Cdda            = 6,
+        OnlineSvrTrack  = 7
     };
 
     qint32 id;
@@ -51,6 +56,7 @@ struct Song
     QString album;
     QString artist;
     QString albumartist;
+    QString composer;
     QString title;
     QString genre;
     QString name;
@@ -62,7 +68,7 @@ struct Song
     quint16 year : 12;
     mutable Type type : 3;
     mutable bool guessed : 1;
-    mutable qint32 size;
+    qint32 size;
 
     // Only used in PlayQueue/PlayLists...
     quint16 key;
@@ -85,14 +91,17 @@ struct Song
     void fillEmptyFields();
     void setKey();
     virtual void clear();
+    #ifndef CANTATA_NO_SONG_TIME_FUNCTION
     static QString formattedTime(quint32 seconds, bool zeroIsUnknown=false);
+    #endif
     QString format();
     QString entryName() const;
+    QString artistOrComposer() const;
+    QString albumName() const;
     QString artistSong() const;
     const QString & albumArtist() const { return albumartist.isEmpty() ? artist : albumartist; }
     QString displayTitle() const { return !albumartist.isEmpty() && albumartist!=artist ? artistSong() : title; }
     QString trackAndTitleStr(bool addArtist=false) const;
-    void updateSize(const QString &dir) const;
     static bool isVariousArtists(const QString &str);
     bool isVariousArtists() const { return isVariousArtists(albumArtist()); }
     bool isUnknown() const;
@@ -104,7 +113,8 @@ struct Song
     bool isStream() const { return Stream==type || CantataStream==type; }
     bool isCantataStream() const { return CantataStream==type; }
     bool isCdda() const { return Cdda==type; }
-    QString albumKey() const { return albumArtist()+QChar(':')+album; }
+    QString albumKey() const { return albumArtist()+QLatin1Char(':')+album; }
+    bool isCueFile() const { return Playlist==type && file.endsWith(QLatin1String(".cue"), Qt::CaseInsensitive); }
 
     // 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!
@@ -119,10 +129,14 @@ struct Song
     QString basicArtist() const;
 
     // podcast functions...
-    bool hasbeenPlayed() const { return 0!=id; }
+    bool hasBeenPlayed() const { return 0!=id; }
     void setPlayed(bool p) { id=p ? 1 : 0; }
     void setPodcastImage(const QString &i) { genre=i; }
     const QString & podcastImage() const { return genre; }
+    void setPodcastPublishedDate(const QString &pd) { composer=pd; }
+    const QString & podcastPublishedDate() const { return composer; }
+    const QString & podcastLocalPath() const { return name; }
+    void setPodcastLocalPath(const QString &l) { name=l; }
 
     // podcast/soundcloud functions...
     void setIsFromOnlineService(const QString &service);
@@ -132,6 +146,11 @@ struct Song
 
 Q_DECLARE_METATYPE(Song)
 
+#ifdef ENABLE_EXTERNAL_TAGS
+QDataStream & operator<<(QDataStream &stream, const Song &song);
+QDataStream & operator>>(QDataStream &stream, Song &song);
+#endif
+
 inline uint qHash(const Song &key)
 {
     return qHash(key.albumArtist()+key.album+key.title+key.file);
diff --git a/network/networkaccessmanager.cpp b/network/networkaccessmanager.cpp
index 76803e8..324edfc 100644
--- a/network/networkaccessmanager.cpp
+++ b/network/networkaccessmanager.cpp
@@ -1,6 +1,3 @@
-#include "networkaccessmanager.h"
-#include <QTimerEvent>
-
 /*
  * Cantata
  *
@@ -24,18 +21,123 @@
  * Boston, MA 02110-1301, USA.
  */
 
+#include "networkaccessmanager.h"
+#include "networkproxyfactory.h"
+#include "settings.h"
+#include "config.h"
+#include <QTimerEvent>
+#include <QTimer>
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KGlobal>
 K_GLOBAL_STATIC(NetworkAccessManager, instance)
 #endif
 
+#include <QDebug>
+static bool debugEnabled=false;
+#define DBUG if (debugEnabled) qWarning() << metaObject()->className() << __FUNCTION__
+void NetworkAccessManager::enableDebug()
+{
+    debugEnabled=true;
+}
+
+static const int constMaxRedirects=5;
+
+NetworkJob::NetworkJob(NetworkAccessManager *p, const QUrl &u)
+    : QObject(p)
+    , numRedirects(0)
+    , lastDownloadPc(0)
+    , job(0)
+    , origU(u)
+{
+    QTimer::singleShot(0, this, SLOT(jobFinished()));
+}
+
+NetworkJob::NetworkJob(QNetworkReply *j)
+    : QObject(j->parent())
+    , numRedirects(0)
+    , lastDownloadPc(0)
+    , job(j)
+{
+    origU=j->url();
+    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)));
+    connect(job, SIGNAL(uploadProgress(qint64, qint64)), this, SIGNAL(uploadProgress(qint64, qint64)));
+    connect(job, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProg(qint64, qint64)));
+    connect(job, SIGNAL(destroyed(QObject *)), this, SLOT(jobDestroyed(QObject *)));
+}
+
+NetworkJob::~NetworkJob()
+{
+    if (job) {
+        disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+        disconnect(job, SIGNAL(destroyed(QObject *)), this, SLOT(jobDestroyed(QObject *)));
+        job->abort();
+        job->deleteLater();
+        job=0;
+    }
+}
+
+void NetworkJob::jobFinished()
+{
+    if (!job) {
+        emit finished();
+    }
+
+    QNetworkReply *j=qobject_cast<QNetworkReply *>(sender());
+    if (!j || j!=job) {
+        return;
+    }
+
+    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();
+        return;
+    }
+
+    DBUG << job->url().toString() << job->error() << (0==job->error() ? QLatin1String("OK") : job->errorString());
+    emit finished();
+}
+
+void NetworkJob::jobDestroyed(QObject *o)
+{
+    if (o==job) {
+        job=0;
+    }
+}
+
+void NetworkJob::downloadProg(qint64 bytesReceived, qint64 bytesTotal)
+{
+    int pc=((bytesReceived*1.0)/(bytesTotal*1.0)*100.0)+0.5;
+    pc=pc<0 ? 0 : (pc>100 ? 100 : pc);
+    if (pc!=lastDownloadPc) {
+        emit downloadPercent(pc);
+    }
+    emit downloadProgress(bytesReceived, bytesTotal);
+}
+
+void NetworkJob::handleReadyRead()
+{
+    QNetworkReply *j=dynamic_cast<QNetworkReply *>(sender());
+    if (!j || j!=job) {
+        return;
+    }
+    if (j->attribute(QNetworkRequest::RedirectionTargetAttribute).isValid()) {
+        return;
+    }
+    emit readyRead();
+}
+
 NetworkAccessManager * NetworkAccessManager::self()
 {
     #ifdef ENABLE_KDE_SUPPORT
     return instance;
     #else
     static NetworkAccessManager *instance=0;
-    if(!instance) {
+    if (!instance) {
         instance=new NetworkAccessManager;
     }
     return instance;
@@ -45,11 +147,39 @@ NetworkAccessManager * NetworkAccessManager::self()
 NetworkAccessManager::NetworkAccessManager(QObject *parent)
     : BASE_NETWORK_ACCESS_MANAGER(parent)
 {
+    enabled=Settings::self()->networkAccessEnabled();
+    //#ifdef ENABLE_KDE_SUPPORT
+    // TODO: Not sure if NetworkProxyFactory is required if building KDE support
+    // with KIO::Integration::AccessManager. But, as we dont use that anyway...
+    if (enabled) {
+        NetworkProxyFactory::self();
+    }
+    //#endif
 }
 
-QNetworkReply * NetworkAccessManager::get(const QNetworkRequest &req, int timeout)
+NetworkJob * NetworkAccessManager::get(const QNetworkRequest &req, int timeout)
 {
-    QNetworkReply *reply=BASE_NETWORK_ACCESS_MANAGER::get(req);
+    DBUG << req.url().toString() << enabled;
+    if (!enabled) {
+        return new NetworkJob(this, req.url());
+    }
+
+    #ifndef ENABLE_HTTPS_SUPPORT
+    // Windows builds do not support HTTPS - unless QtNetwork is recompiled...
+    NetworkJob *reply=0;
+    if (QLatin1String("https")==req.url().scheme()) {
+        QUrl httpUrl=req.url();
+        httpUrl.setScheme(QLatin1String("http"));
+        QNetworkRequest httpReq=req;
+        httpReq.setUrl(httpUrl);
+        reply = new NetworkJob(BASE_NETWORK_ACCESS_MANAGER::get(httpReq));
+        reply->setOrigUrl(req.url());
+    } else {
+        reply = new NetworkJob(BASE_NETWORK_ACCESS_MANAGER::get(req));
+    }
+    #else
+    NetworkJob *reply = new NetworkJob(BASE_NETWORK_ACCESS_MANAGER::get(req));
+    #endif
 
     if (0!=timeout) {
         connect(reply, SIGNAL(destroyed()), SLOT(replyFinished()));
@@ -61,16 +191,16 @@ QNetworkReply * NetworkAccessManager::get(const QNetworkRequest &req, int timeou
 
 void NetworkAccessManager::replyFinished()
 {
-    QNetworkReply *reply = reinterpret_cast<QNetworkReply*>(sender());
-    if (timers.contains(reply)) {
-        killTimer(timers.take(reply));
+    NetworkJob *job = qobject_cast<NetworkJob*>(sender());
+    if (timers.contains(job)) {
+        killTimer(timers.take(job));
     }
 }
 
 void NetworkAccessManager::timerEvent(QTimerEvent *e)
 {
-    QNetworkReply *reply = timers.key(e->timerId());
-    if (reply) {
-        reply->abort();
+    NetworkJob *job = timers.key(e->timerId());
+    if (job) {
+        job->abort();
     }
 }
diff --git a/network/networkaccessmanager.h b/network/networkaccessmanager.h
index 5614e18..bb83c7f 100644
--- a/network/networkaccessmanager.h
+++ b/network/networkaccessmanager.h
@@ -37,19 +37,71 @@
 #include <QMap>
 
 class QTimerEvent;
+class NetworkAccessManager;
+
+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(); }
+    bool open(QIODevice::OpenMode mode) { return job && job->open(mode); }
+    void close() { if (job) job->close(); }
+
+    QUrl url() const { return job ? job->url() : origU; }
+    QUrl origUrl() const { return origU; }
+    void setOrigUrl(const QUrl &u) { origU=u; }
+    QNetworkReply::NetworkError error() const { return job ? job->error() : QNetworkReply::UnknownNetworkError; }
+    QString errorString() const { return job ? job->errorString() : QString(); }
+    QByteArray readAll() { return job ? job->readAll() : QByteArray(); }
+    bool ok() const { return job && QNetworkReply::NoError==job->error(); }
+    QVariant attribute(QNetworkRequest::Attribute code) const { return job ? job->attribute(code) : QVariant(); }
+    qint64 bytesAvailable() const { return job ? job->bytesAvailable() : -1; }
+    QByteArray read(qint64 maxlen) { return job ? job->read(maxlen) : QByteArray(); }
+
+Q_SIGNALS:
+    void finished();
+    void error(QNetworkReply::NetworkError);
+    void uploadProgress(qint64 bytesSent, qint64 bytesTotal);
+    void downloadProgress(qint64 bytesReceived, qint64 bytesTotal);
+    void downloadPercent(int pc);
+    void readyRead();
+
+private Q_SLOTS:
+    void jobFinished();
+    void jobDestroyed(QObject *o);
+    void downloadProg(qint64 bytesReceived, qint64 bytesTotal);
+    void handleReadyRead();
+
+private:
+    int numRedirects;
+    int lastDownloadPc;
+    QNetworkReply *job;
+    QUrl origU;
+};
 
 class NetworkAccessManager : public BASE_NETWORK_ACCESS_MANAGER
 {
     Q_OBJECT
 
 public:
+    static void enableDebug();
     static NetworkAccessManager * self();
 
     NetworkAccessManager(QObject *parent=0);
     virtual ~NetworkAccessManager() { }
 
-    QNetworkReply * get(const QNetworkRequest &req, int timeout=0);
-    QNetworkReply * get(const QUrl &url, int timeout=0) { return get(QNetworkRequest(url), timeout); }
+    NetworkJob * get(const QNetworkRequest &req, int timeout=0);
+    NetworkJob * get(const QUrl &url, int timeout=0) { return get(QNetworkRequest(url), timeout); }
+
+    void setEnabled(bool e) { enabled=e; }
+    bool isEnabled() const { return enabled; }
 
 protected:
     void timerEvent(QTimerEvent *e);
@@ -58,7 +110,9 @@ private Q_SLOTS:
     void replyFinished();
 
 private:
-    QMap<QNetworkReply *, int> timers;
+    bool enabled;
+    QMap<NetworkJob *, int> timers;
+    friend class NetworkJob;
 };
 
 #endif // NETWORK_ACCESS_MANAGER_H
diff --git a/network/networkproxyfactory.cpp b/network/networkproxyfactory.cpp
index 0119345..376228f 100644
--- a/network/networkproxyfactory.cpp
+++ b/network/networkproxyfactory.cpp
@@ -27,7 +27,6 @@
 #include <QStringList>
 #include <stdlib.h>
 
-
 const char * NetworkProxyFactory::constSettingsGroup = "Proxy";
 
 #if defined Q_OS_LINUX && QT_VERSION < 0x050000
@@ -129,11 +128,13 @@ NetworkProxyFactory::NetworkProxyFactory()
     , type(QNetworkProxy::HttpProxy)
     , port(8080)
 {
+    QNetworkProxyFactory::setApplicationProxyFactory(this);
     reloadSettings();
 }
 #else
 NetworkProxyFactory::NetworkProxyFactory()
 {
+    QNetworkProxyFactory::setApplicationProxyFactory(this);
 }
 #endif
 
@@ -172,22 +173,7 @@ QList<QNetworkProxy> NetworkProxyFactory::queryProxy(const QNetworkProxyQuery& q
 
     switch (mode) {
     case Mode_System:
-        #if defined Q_OS_LINUX && QT_VERSION < 0x050000
-        Q_UNUSED(query);
-
-        if (envUrl.isEmpty()) {
-            ret.setType(QNetworkProxy::NoProxy);
-        } else {
-            ret.setHostName(envUrl.host());
-            ret.setPort(envUrl.port());
-            ret.setUser(envUrl.userName());
-            ret.setPassword(envUrl.password());
-            ret.setType(envUrl.scheme().startsWith("http") ? QNetworkProxy::HttpProxy : QNetworkProxy::Socks5Proxy);
-        }
-        break;
-        #else
-        return systemProxyForQuery(query);
-        #endif
+        return ::systemProxyForQuery(query);
     case Mode_Direct:
         ret.setType(QNetworkProxy::NoProxy);
         break;
diff --git a/online/icons/CMakeLists.txt b/online/icons/CMakeLists.txt
new file mode 100644
index 0000000..b9f25da
--- /dev/null
+++ b/online/icons/CMakeLists.txt
@@ -0,0 +1,5 @@
+if (WIN32)
+    install(FILES podcasts.png soundcloud.png DESTINATION ${CMAKE_INSTALL_PREFIX}/icons/)
+else (WIN32)
+    install(FILES podcasts.png soundcloud.png DESTINATION ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/icons/)
+endif (WIN32)
diff --git a/online/icons/bbc.svg b/online/icons/bbc.svg
new file mode 100644
index 0000000..14a88c3
--- /dev/null
+++ b/online/icons/bbc.svg
@@ -0,0 +1,9 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
+<g transform="matrix(.37699 0 0 -.40472 70.193 70.616)">
+<path d="m0 0c0-11.25-14-10.583-14-10.583h-14v20.333h14c14.417 0.083 14-9.75 14-9.75m-28 40.75h10.667c11.083-0.584 10.666-8.833 10.666-8.833 0-10.25-12.25-10.417-12.25-10.417h-9.083v19.25zm25.417-23.25s9.583 4.083 9.5 14.917 1.457 17.749-22.063 19.916h-26.104v-74.416h29.917s25-0.084 25 21 0.583 14.333-16.25 18.583m-67.545 49.416h109.88v-103.54h-109.88v103.54z"/>
+</g>
+<g transform="matrix(.38001 0 0 -.40472 26.925 70.783)">
+<path d="m0 0c0-11.25-14-10.583-14-10.583h-14v20.333h14c14.417 0.083 14-9.75 14-9.75m-28 40.75h10.667c11.083-0.584 10.666-8.833 10.666-8.833 0-10.25-12.25-10.417-12.25-10.417h-9.083v19.25zm25.417-23.25s9.583 4.083 9.5 14.917 1.457 17.749-22.063 19.916h-26.104v-74.416h29.917s25-0.084 25 21 0.583 14.333-16.25 18.583m-67.545 49.416h109.88v-103.54h-109.88v103.54z"/>
+</g>
+<path d="m119.52 51.762v5.5648s-4.9768-3.3389-10.479-3.4065-10.262-0.2185-10.726 10.734-0.3709 10.075 10.602 10.649c0 0 4.6059 0.6071 10.85-3.7436v5.7672s-8.3768 5.4297-18.083 1.2477-8.1606-3.2539-8.4699-13.92-0.3401-10.97 10.541-14.612c0 0 2.9059-1.2141 8.1298-0.6747 0 0 3.1218 0.3375 7.635 2.3947m-32.442 33.845h40.758v-41.906h-40.758v41.906z"/>
+</svg>
diff --git a/online/icons/cbc.svg b/online/icons/cbc.svg
new file mode 100644
index 0000000..600898a
--- /dev/null
+++ b/online/icons/cbc.svg
@@ -0,0 +1 @@
+<svg xml:space="preserve" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 192 192" enable-background="new 0 0 192 235"><g transform="matrix(1.0702 0 0 1.0816 -6.7229 1.6715)" fill="#df0031"><path d="m95.829 117.62c16.817 0 30.438-13.664 30.438-30.52 0-16.851-13.62-30.523-30.438-30.523-16.81 0-30.429 13.672-30.429 30.523 0 16.856 13.619 30.52 30.429 30.52"/><path d="m60.69 117.61c-16.81 0-30.437-13.658-30.437-30.514 0-16.851 13.627-30.53 30.437-30.53v61.044"/><path d="m130.98 151.29 0.006-28.957 28.888 0.013c0.005 16.014-12.927 28.944-28.894 28.944"/><path d="m60.69 22.884v28.999l-28.924 0.007c0-16.019 12.95-29.006 28.924-29.006"/><path d="m60.685 151.29 0.005-28.957-28.919 0.013c0 16.014 12.945 28.944 28.914 28.944"/><path d="m166.14 113.34-0.013-52.463c8.904 5.326 14.872 15.068 14.872 26.222s-5.959 20.905-14.859 26.241"/><path d="m69.68 16.608 52.313 0.013c-5.313-8.935-15.032-14.932-26.164-14.932-11.109 0-20.846 5.99-26.149 14.919"/><path d="m121.6 157.6-52.313-0.011c5.316 8.933 15.034 14.915 26.157 14.915s20.845-5.982 26.156-14.904"/><path d="m126.26 122.34c0 16.856-13.614 30.518-30.432 30.518-16.81 0-30.437-13.663-30.437-30.518h60.869"/><path d="m130.99 117.61c16.805 0 30.431-13.658 30.431-30.514 0-16.851-13.626-30.53-30.431-30.53v61.044"/><path d="m126.26 51.922c0-16.864-13.614-30.534-30.432-30.534-16.81 0-30.437 13.67-30.437 30.534h60.869"/><path d="m25.538 113.34 0.008-52.463c-8.912 5.326-14.879 15.068-14.879 26.222s5.96 20.905 14.871 26.241"/><path d="m159.88 51.896-28.894-0.013-0.006-28.979c15.968 0 28.9 12.974 28.9 28.992"/></g></svg>
diff --git a/online/icons/gpodder.svg b/online/icons/gpodder.svg
new file mode 100644
index 0000000..ec9fc73
--- /dev/null
+++ b/online/icons/gpodder.svg
@@ -0,0 +1,42 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 48 48">
+<defs>
+<filter id="filter3973" y="-.45755" width="1.127" x="-.06352" height="1.9151">
+<feGaussianBlur stdDeviation="1.078"/>
+</filter>
+<linearGradient id="linearGradient5209">
+<stop stop-color="#fff" offset="0"/>
+<stop stop-color="#fff" stop-opacity="0" offset="1"/>
+</linearGradient>
+<linearGradient id="linearGradient5461" y2="30.906" xlink:href="#linearGradient5209" gradientUnits="userSpaceOnUse" x2="29.894" y1="12.174" x1="16.723"/>
+<linearGradient id="linearGradient5463" y2="30.175" xlink:href="#linearGradient5209" gradientUnits="userSpaceOnUse" x2="16.17" y1="13.955" x1="37.877"/>
+<linearGradient id="linearGradient5465" y2="29.448" xlink:href="#linearGradient5209" gradientUnits="userSpaceOnUse" x2="33.036" y1="9.9248" x1="14.228"/>
+<linearGradient id="linearGradient3940" y2="69.288" xlink:href="#linearGradient5209" gradientUnits="userSpaceOnUse" x2="-60.338" y1="49.155" x1="-61.314"/>
+<linearGradient id="linearGradient3942" y2="68.126" xlink:href="#linearGradient5209" gradientUnits="userSpaceOnUse" x2="-61.213" y1="49.863" x1="-59.302"/>
+<radialGradient id="radialGradient3934" gradientUnits="userSpaceOnUse" cy="23.565" cx="7.0836" gradientTransform="matrix(-3.4427 -.96424 .53940 -1.9259 19.349 75.835)" r=".81757">
+<stop offset="0"/>
+<stop stop-color="#6e6e6e" offset="1"/>
+</radialGradient>
+<radialGradient id="radialGradient3932" gradientUnits="userSpaceOnUse" cy="72.838" cx="-60.649" gradientTransform="matrix(5.8676 -1.914e-7 4.8851e-8 1.9652 295.22 -70.303)" r="13.861">
+<stop stop-color="#fff" offset="0"/>
+<stop stop-color="#e5e5e5" offset="1"/>
+</radialGradient>
+</defs>
+<path filter="url(#filter3973)" opacity=".766" transform="matrix(1.0035 0 0 .76710 11.955 11.354)" d="m32.704 42.255a20.374 2.8284 0 1 1 -40.747 0 20.374 2.8284 0 1 1 40.747 0z" fill="#2e3436"/>
+<path opacity=".7" d="m36.593 23.074a11.314 11.314 0 1 1 -22.627 0 11.314 11.314 0 1 1 22.627 0z" transform="matrix(1.812 0 0 1.812 -21.805 -18.81)" stroke="#cfa2ee" stroke-width=".55189" fill="#e0c4f4"/>
+<path opacity=".7" d="m36.593 23.074a11.314 11.314 0 1 1 -22.627 0 11.314 11.314 0 1 1 22.627 0z" transform="matrix(1.4496 0 0 1.4496 -12.644 -11.146)" stroke="#a34ede" stroke-width=".68986" fill="#bd80e8"/>
+<path opacity=".7" d="m36.593 23.074a11.314 11.314 0 1 1 -22.627 0 11.314 11.314 0 1 1 22.627 0z" transform="matrix(.98694 0 0 .98694 -.94894 -2.3029)" stroke="#431266" stroke-width="1.0132" fill="#a34ede"/>
+<path opacity=".4" d="m25.281 12.469c-5.8678 0-10.594 4.726-10.594 10.594s4.726 10.594 10.594 10.594 10.594-4.726 10.594-10.594-4.726-10.594-10.594-10.594z" transform="matrix(1.812 0 0 1.812 -21.713 -18.974)" stroke="url(#linearGradient5461)" stroke-width=".55189" fill="none"/>
+<path opacity=".4" d="m25.281 12.688c-5.7363 0-10.375 4.6387-10.375 10.375s4.6387 10.375 10.375 10.375 10.375-4.6387 10.375-10.375-4.6387-10.375-10.375-10.375z" transform="matrix(1.4496 0 0 1.4496 -12.552 -11.309)" stroke="url(#linearGradient5463)" stroke-width=".68986" fill="none"/>
+<path opacity=".4" d="m25.281 13.031c-5.5496 0-10.031 4.4817-10.031 10.031s4.4817 10.031 10.031 10.031 10.031-4.4817 10.031-10.031-4.4817-10.031-10.031-10.031z" transform="matrix(.98694 0 0 .98694 -.85758 -2.4664)" stroke="url(#linearGradient5465)" stroke-width="1.0132" fill="none"/>
+<path stroke="#3d2a3f" d="m19.21 29.948c-0.39129-3.1435-1.1851-20.272 3.439-20.446s5.8564 15.634 6.3053 19.81-1.0347 7.9228 8.9115 5.6316c4.4182-1.0178 6.9137-3.4618 6.6088 2.6307s-11.317 6.2708-16.52 6.6914c-13.971 0.79435-24.593-0.41429-24.454-3.8667s0.31774-4.8977 2.8847-4.4288c17.161 3.135 13.204-2.9661 12.824-6.0222z" fill="#75507b"/>
+<path opacity=".4" stroke="#fff" d="m22.688 10.625c-0.22804 0.0086-0.37974 0.08304-0.65625 0.40625s-0.58773 0.90174-0.84375 1.6562c-0.51204 1.509-0.83854 3.7049-1 6-0.32293 4.5901-0.01985 9.7103 0.15625 11.125 0.07119 0.57191 0.38794 1.5472 0.5625 2.625s0.19625 2.3805-0.625 3.5-2.2901 1.7739-4.5 1.9688-5.2781-0.01842-9.625-0.8125c-0.53759-0.09821-0.82984-0.06657-0.9375-0.03125s-0.10087 0.01979-0.1875 0.1875c-0.17327 0.33543-0.33686 1.4733-0.40625 3.1875-0.00565 0.13955 0.02728 0.24759 0.1875 0.4375s0.49597 0.44127 1 0.6875c1.0081 0.49246 2.6526 0.94504 4.7812 1.25 4.2504 0.60893 10.358 0.70468 17.281 0.3125h0.03125c2.6528-0.21337 6.6225-0.37569 9.875-1.1875 1.6316-0.40725 3.0699-0.98637 4.0312-1.7188s1.472-1.5353 1.5312-2.7188c0.07257-1.4502-0.06009-2.324-0.1875-2.625s0.0171-0.15109-0.25-0.15625c-0.53419-0.01032-2.4234 0.76933-4.7812 1.3125-2.5463 0.58657-4.3839 0.82673-5.8438 0.71875s-2.6236-0.63024-3.3125-1.5-0.85144-1.8917-0.9375-2.875-0.08432-1.9775-0.1875-2.9375c-0.22886-2.1292-0.63999-7.0859-1.5625-11.438-0.46126-2.1758-1.0586-4.2013-1.75-5.5625-0.34568-0.68062-0.74314-1.1852-1.0625-1.4688s-0.52685-0.35337-0.78125-0.34375z" fill="none"/>
+<path opacity=".2" fill-rule="evenodd" d="m41.972 35.434c-9.8358 5.3149-21.309 2.9911-36.783 5.5561 0.04297 0.02008 0.06087-0.13529 0.10662-0.11545 1.0028 0.43482 2.6734 0.99245 4.7981 1.2638 4.2493 0.54269 10.697 0.83632 17.632 0.4879 6.021-0.29951 11.994-1.0993 13.722-2.8814 2.9232-2.487 0.14985-5.4788 0.52356-4.3109z" fill="#fff"/>
+<path stroke="#000" stroke-width="2.4773" d="m-49.351 72.838a11.297 24.676 0 1 1 -22.595 0 11.297 24.676 0 1 1 22.595 0z" transform="matrix(.43405 .020585 -.0182 .37453 45.353 -2.726)" fill="url(#radialGradient3932)"/>
+<path d="m8.1757 23.622a0.81757 1.6351 0 1 1 -1.6351 0 0.81757 1.6351 0 1 1 1.6351 0z" transform="matrix(2.0792 .098603 -.099866 2.0552 4.3999 -22.949)" fill="url(#radialGradient3934)"/>
+<path stroke="#000" stroke-width="2.4773" d="m-49.351 72.838a11.297 24.676 0 1 1 -22.595 0 11.297 24.676 0 1 1 22.595 0z" transform="matrix(.43237 -.043096 .038016 .37306 53.265 -7.0158)" fill="url(#radialGradient3932)"/>
+<path d="m8.1757 23.622a0.81757 1.6351 0 1 1 -1.6351 0 0.81757 1.6351 0 1 1 1.6351 0z" transform="matrix(2.0627 .27685 -.28047 2.0387 21.992 -24.267)" fill="url(#radialGradient3934)"/>
+<path opacity=".5" d="m-49.351 72.838a11.297 24.676 0 1 1 -22.595 0 11.297 24.676 0 1 1 22.595 0z" transform="matrix(.43405 .020585 -.0182 .37453 45.353 -2.726)" stroke="url(#linearGradient3940)" stroke-width="2.4773" fill="none"/>
+<path opacity=".5" d="m-49.351 72.838a11.297 24.676 0 1 1 -22.595 0 11.297 24.676 0 1 1 22.595 0z" transform="matrix(.43237 -.043096 .038016 .37306 53.265 -7.0158)" stroke="url(#linearGradient3942)" stroke-width="2.4773" fill="none"/>
+<path opacity=".95" d="m-0.125 19.875a1 1 0 1 1 -2 0 1 1 0 1 1 2 0z" transform="matrix(1.0446 .15384 -.15570 1.0326 21.548 7.5969)" fill-rule="evenodd"/>
+<path opacity=".95" d="m-0.125 19.875a1 1 0 1 1 -2 0 1 1 0 1 1 2 0z" transform="matrix(.87398 .58605 -.59311 .86388 43.204 10.578)" fill-rule="evenodd"/>
+</svg>
diff --git a/online/icons/itunes.svg b/online/icons/itunes.svg
new file mode 100644
index 0000000..3643e45
--- /dev/null
+++ b/online/icons/itunes.svg
@@ -0,0 +1,59 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 453.5433 453.5433">
+<defs>
+<linearGradient id="linearGradient3984">
+<stop stop-color="#fff" offset="0"/>
+<stop stop-color="#fff" stop-opacity="0" offset="1"/>
+</linearGradient>
+<linearGradient id="linearGradient4424" y2="525.17" gradientUnits="userSpaceOnUse" y1="311.96" x2="190.81" x1="486.79">
+<stop stop-color="#fff" stop-opacity=".18" offset="0"/>
+<stop stop-color="#fff" offset=".515"/>
+<stop stop-color="#fff" stop-opacity="0" offset="1"/>
+</linearGradient>
+<linearGradient id="linearGradient4426" y2="455.45" gradientUnits="userSpaceOnUse" y1="403.93" x2="405.63" x1="353.63">
+<stop stop-color="#fff" stop-opacity=".64" offset="0"/>
+<stop stop-color="#fff" stop-opacity="0" offset="1"/>
+</linearGradient>
+<radialGradient id="radialGradient4422" gradientUnits="userSpaceOnUse" cy="455.36" cx="382.84" gradientTransform="matrix(.54861 -.3949 .46551 .60234 -196.17 697.58)" r="291.94">
+<stop stop-color="#555753" stop-opacity=".011" offset="0"/>
+<stop stop-color="#555753" stop-opacity=".226" offset=".002"/>
+<stop stop-color="#555753" stop-opacity=".012" offset=".004"/>
+<stop stop-color="#555753" stop-opacity=".012" offset=".008"/>
+<stop stop-color="#555753" stop-opacity=".073" offset=".016"/>
+<stop stop-color="#555753" stop-opacity=".016" offset=".031"/>
+<stop stop-color="#555753" stop-opacity=".011" offset=".062"/>
+<stop stop-color="#555753" stop-opacity=".367" offset=".125"/>
+<stop stop-color="#555753" stop-opacity=".006" offset=".25"/>
+<stop stop-color="#555753" stop-opacity=".023" offset=".5"/>
+<stop stop-color="#555753" stop-opacity=".198" offset=".75"/>
+<stop stop-color="#555753" stop-opacity=".181" offset=".875"/>
+<stop stop-color="#555753" stop-opacity=".288" offset=".938"/>
+<stop stop-color="#555753" stop-opacity=".073" offset="1"/>
+</radialGradient>
+<radialGradient id="radialGradient4428" xlink:href="#linearGradient3984" gradientUnits="userSpaceOnUse" cy="838.99" cx="880.14" gradientTransform="matrix(.15837 .01401 -.01162 .12231 46.054 805.05)" r="365.08"/>
+<radialGradient id="radialGradient4430" xlink:href="#linearGradient3984" gradientUnits="userSpaceOnUse" cy="503.58" cx="1989.9" gradientTransform="matrix(.15837 .01401 -.01162 .12231 46.054 805.05)" r="365.08"/>
+</defs>
+<title>itunes</title>
+<g transform="translate(0 -598.82)">
+<g transform="matrix(1 0 0 1.013 0 -7.8464)">
+<path d="m190.84 782.74c-20.495 15.183-21.238 50.667-0.5725 71.199 16.411 17.313 44.237 23.43 62.312 11.535 17.309-10.435 25.244-33.594 16.874-54.474-6.7478-18.727-24.803-34.252-44.288-36.634-12.523-1.8756-25.125 0.9343-34.326 8.3732zm4.2181 2.7457c15.596-11.745 40.758-8.9022 56.662 6.2927 16.266 14.627 21.308 39.43 11.424 56.222-9.0065 16.664-31.005 23.707-50.359 16.056-20.465-7.3208-35.405-29.906-33.24-50.452 0.8863-11.42 6.5745-21.754 15.512-28.119z" fill="#babdb6"/>
+<path fill-rule="evenodd" stroke="#888a85" stroke-width="12.373" d="m87.747 644.26c-89.771 64.62-100.79 196.91-24.614 295.48s210.69 126.07 300.47 61.452 100.81-196.89 24.629-295.46-210.71-126.09-300.48-61.471zm99.789 129.4c6.3363-4.6904 13.909-7.7585 21.922-9.0903 17.449-2.8732 37.067 3.0221 51.588 15.701 15.413 13.342 24.692 33.729 23.53 52.696-0.8237 16.087-8.7408 30.815-21.322 39.58-13.064 9.1458-30.99 11.555-47.638 6.5799-19.556-5.4938-36.863-21.773-44.32-40.913-9.7787-23.751-2.7624-51.206 16.238-64.553z" fill="#eeeeec"/>
+<path d="m167.08 748.63c-34.304 24.096-40.486 78.501-13.985 117.28 23.732 35.482 71.051 54.811 108.13 42.711 36.22-11.094 59.752-49.418 52.637-89.075-5.6932-35.591-33.755-69.929-69.046-80.984-27.019-9.1323-56.986-5.9351-77.733 10.066zm116.82 32.158c27.308 35.335 23.357 82.758-8.8236 105.92s-80.406 13.299-107.71-22.036-23.357-82.758 8.8236-105.92 80.406-13.299 107.71 22.036z" fill="#888a85"/>
+<path d="m175.81 759.63c-31.968 22.246-34.831 75.168-5.7412 108.13 25.021 29.425 70.109 40.51 99.604 22.034 28.594-16.593 40.821-55.958 25.279-89.469-13.133-31.117-46.779-54.782-79.061-53.514-14.705 0.0438-28.981 4.2721-40.081 12.819zm7.4309 8.7286c24.534-18.702 66.211-12.053 88.728 14.606 20.723 23.153 25.206 58.962 8.505 81.369-14.964 21.748-46.345 30.17-73.111 18.249-26.057-10.613-46.547-38.093-46.738-65.354-0.6673-19.506 7.4756-38.186 22.616-48.87z" fill="#babdb6"/>
+<path d="m86.125 650.85c-67.594 50.57-87.412 152.69-49.528 237.73 24.817 57.053 75.691 103.33 132.74 126.2 54.287 22.269 115.16 23.677 163.38-0.291 64.191-31.1 106.15-100.17 102.39-175.59-3.9235-82.373-60.873-167.03-139.12-203.38-70.425-33.036-153.79-28.33-209.36 14.941l-0.513 0.3841zm10.683 5.1053c58.218-43.02 146.77-43.443 215.69-0.9252 63.312 38.011 108.94 109.37 112.08 179.68 4.3589 65.906-25.983 129.29-79.821 161.28-50.319 31.051-118.65 34.974-178.45 8.0954-58.693-25.393-108.35-77.952-128.17-138.44-20.658-60.176-12.986-126.26 21.707-172.75 10.322-14.172 22.753-26.628 36.962-36.93z" fill="#fff"/>
+<path fill-rule="evenodd" d="m88.848 647.54c-42.481 31.058-68.777 81.928-71.318 136.98-3.1976 55.739 18.088 115.29 57.436 160.68 39.661 46.762 97.736 77.634 155.34 83.214 56.395 6.1189 111.77-12.199 149.68-49.086 40.737-38.79 60.43-98.178 52.951-158.12-6.8401-60.846-42.203-121.1-93.155-160.16-50.852-39.404-115.89-56.627-173.97-46.27-28.332 4.9455-54.638 16.2-76.954 32.767zm97.606 124.19c18.366-14.47 47.186-13.787 68.639 1.0781 23.1 15.327 35.629 45.869 28.313 70.097-5.5031 20.799-24.083 36.045-46.153 37.164-22.168 1.9089-46.244-10.552-59.381-30.562-13.513-19.386-14.985-44.935-4.3182-63.109 3.2624-5.7201 7.6075-10.751 12.9-14.668z" fill="url(#radialGradient4422)"/>
+<g transform="matrix(.55679 -.40079 .47247 .61135 -202.64 697.78)">
+<path d="m381.59 341.31c-64.92-1.226-121.74 62.878-112.62 127.19 6.5531 55.156 57.518 102.6 113.81 101.16 55.385 0.2976 108.27-44.675 113.42-100.42 6.4528-51.299-25.898-105.74-75.702-121.49-12.451-4.4076-25.657-6.8377-38.906-6.4375zm2 34.594c44.885-0.4668 85.35 44.534 77.781 89.344-4.6236 42.037-47.734 76.501-89.992 68.47-36.449-4.9234-67.805-37.979-67.789-75.501-1.4903-33.549 20.537-66.977 52.688-77.5 8.7297-3.1749 18.019-4.7156 27.312-4.8125z" fill="#babdb6"/>
+<path d="m381.59 341.31c-64.92-1.226-121.74 62.878-112.62 127.19 6.5531 55.156 57.518 102.6 113.81 101.16 55.385 0.2976 108.27-44.675 113.42-100.42 6.4528-51.299-25.898-105.74-75.702-121.49-12.451-4.4076-25.657-6.8377-38.906-6.4375zm2 34.594c44.885-0.4668 85.35 44.534 77.781 89.344-4.6236 42.037-47.734 76.501-89.992 68.47-36.449-4.9234-67.805-37.979-67.789-75.501-1.4903-33.549 20.537-66.977 52.688-77.5 8.7297-3.1749 18.019-4.7156 27.312-4.8125z" fill="url(#linearGradient4424)"/>
+</g>
+<g transform="matrix(.50483 -.36339 .42839 .55431 -162.68 709.45)">
+<path d="m381.81 369.03c-50.174-0.2905-93.32 50.382-84.642 99.926 7.3623 46.032 56.807 81.616 102.87 71.068 44.982-9.0088 78.536-58.169 66.892-103.35-8.7952-38.17-45.311-68.805-85.125-67.642zm0.6477 17.391c43.773-1.7819 80.389 47.592 66.422 88.736-11.297 40.086-63.83 62.01-99.617 40.579-36.879-19.31-47.639-75.888-17.795-105.86 12.865-14.445 31.736-23.241 50.99-23.457z" fill="#eeeeec"/>
+<path d="m381.81 369.03c-50.174-0.2905-93.32 50.382-84.642 99.926 7.3623 46.032 56.807 81.616 102.87 71.068 44.982-9.0088 78.536-58.169 66.892-103.35-8.7952-38.17-45.311-68.805-85.125-67.642zm0.6477 17.391c43.773-1.7819 80.389 47.592 66.422 88.736-11.297 40.086-63.83 62.01-99.617 40.579-36.879-19.31-47.639-75.888-17.795-105.86 12.865-14.445 31.736-23.241 50.99-23.457z" fill="url(#linearGradient4426)"/>
+</g>
+<path d="m167.08 748.63c-34.304 24.096-40.486 78.501-13.985 117.28 23.732 35.482 71.051 54.811 108.13 42.711 36.22-11.094 59.752-49.418 52.637-89.075-5.6932-35.591-33.755-69.929-69.046-80.984-27.019-9.1323-56.986-5.9351-77.733 10.066zm116.82 32.158c27.308 35.335 23.357 82.758-8.8236 105.92s-80.406 13.299-107.71-22.036-23.357-82.758 8.8236-105.92 80.406-13.299 107.71 22.036z" fill="#888a85"/>
+<path fill-rule="evenodd" stroke="#204a87" stroke-width="7.0385" d="m432.77 657.35-202.89 28.472v0.394h-0.4083v205.35c-11.728-8.573-27.993-13.893-45.978-13.893-35.739 0-64.719 20.97-64.719 46.838s28.98 46.838 64.719 46.838 64.706-20.97 64.706-46.838c0-2.5851-0.2995-5.1169-0.856-7.5882v-165.28l167.57-26.412v140.3c-11.728-8.573-27.993-13.893-45.978-13.893-35.739 0-64.719 20.97-64.719 46.838s28.98 46.838 64.719 46.838 64.706-20.97 64.706-46.838c0-2.5851-0.2995-5.1169-0.856-7.5882v-230.71h-0.0131v-2.8344z" fill="#3465a4"/>
+<path opacity=".475" stroke="#fff" stroke-width="4.5543" d="m235.49 690.75c-0.2593 71.039-0.0483 142.08-0.1185 213.12-24.202-24.623-67.956-27.406-95.735-6.7876-9.9621 7.7551-17.149 20.348-14.436 32.863 2.7574 13.865 14.736 24.344 27.791 29.648 22.902 9.7712 51.162 7.8415 71.923-5.9231 10.484-7.169 18.766-19.263 17.161-32.145-1.2915-11.129-0.3726-22.324-0.6322-33.492v-141.19c59.787-9.4393 119.57-18.88 179.37-28.281 0 53.092-0.00004 106.18 0 159.28-24.242-24.665-68.085-27.407-95.866-6.6985-9.7213 7.6663-16.877 19.997-14.382 32.374 2.5239 13.507 13.805 23.989 26.446 29.4 23.112 10.519 52.16 8.7623 73.345-5.2749 10.484-7.169 18.766-19.263 17.161-32.145-1.2915-11.129-0.3726-22.324-0.6322-33.492-0.004-66.023 0.009-132.05-0.0131-198.07l-191.38 26.819z" fill="none"/>
+<path opacity=".613" d="m235.49 690.75c-0.2593 71.039-0.0483 142.08-0.1185 213.12-24.202-24.623-67.956-27.406-95.735-6.7876-9.9621 7.7551-17.149 20.348-14.436 32.863 2.7574 13.865 14.736 24.344 27.791 29.648 22.902 9.7712 51.162 7.8415 71.923-5.9231 10.484-7.169 18.766-19.263 17.161-32.145-1.2915-11.129-0.3726-22.324-0.6322-33.492v-141.19c59.787-9.4393 119.57-18.88 179.37-28.281 0 53.092-0.00004 106.18 0 159.28-24.242-24.665-68.085-27.407-95.866-6.6985-9.7213 7.6663-16.877 19.997-14.382 32.374 2.5239 13.507 13.805 23.989 26.446 29.4 23.112 10.519 52.16 8.7623 73.345-5.2749 10.484-7.169 18.766-19.263 17.161-32.145-1.2915-11.129-0.3726-22.324-0.6322-33.492-0.004-66.023 0.009-132.05-0.0131-198.07l-191.38 26.819z" fill="url(#radialGradient4428)"/>
+<path opacity=".613" d="m235.49 690.75c-0.2593 71.039-0.0483 142.08-0.1185 213.12-24.202-24.623-67.956-27.406-95.735-6.7876-9.9621 7.7551-17.149 20.348-14.436 32.863 2.7574 13.865 14.736 24.344 27.791 29.648 22.902 9.7712 51.162 7.8415 71.923-5.9231 10.484-7.169 18.766-19.263 17.161-32.145-1.2915-11.129-0.3726-22.324-0.6322-33.492v-141.19c59.787-9.4393 119.57-18.88 179.37-28.281 0 53.092-0.00004 106.18 0 159.28-24.242-24.665-68.085-27.407-95.866-6.6985-9.7213 7.6663-16.877 19.997-14.382 32.374 2.5239 13.507 13.805 23.989 26.446 29.4 23.112 10.519 52.16 8.7623 73.345-5.2749 10.484-7.169 18.766-19.263 17.161-32.145-1.2915-11.129-0.3726-22.324-0.6322-33.492-0.004-66.023 0.009-132.05-0.0131-198.07l-191.38 26.819z" fill="url(#radialGradient4430)"/>
+</g>
+</g>
+</svg>
diff --git a/online/icons/jamendo.svg b/online/icons/jamendo.svg
index 98b2631..7d92f7a 100644
--- a/online/icons/jamendo.svg
+++ b/online/icons/jamendo.svg
@@ -10,29 +10,29 @@
 </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"/>
+<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"/>
 </clipPath>
 <clipPath id="clipPath3389">
-<path d="m764.16,224.24,0.033-22.514c-0.24-5.775,4.557-3.618,4.557-3.618l16.135,11.328c3.603,2.562,0.033,4.779,0.033,4.779l-14.563,12.769c-1.139,0.687-2.075,0.957-2.841,0.957-2.835,0-3.354-3.701-3.354-3.701"/>
+<path d="m764.16 224.24 0.033-22.514c-0.24-5.775 4.557-3.618 4.557-3.618l16.135 11.328c3.603 2.562 0.033 4.779 0.033 4.779l-14.563 12.769c-1.139 0.687-2.075 0.957-2.841 0.957-2.835 0-3.354-3.701-3.354-3.701"/>
 </clipPath>
 <linearGradient id="linearGradient3104" gradientUnits="userSpaceOnUse" x2="788.49" x1="766.04">
 <stop stop-color="#79368f" offset="0"/>
 <stop stop-color="#482654" offset="1"/>
 </linearGradient>
-<linearGradient id="linearGradient3102" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0,-46.38623,-46.38623,0,772.60352,216.43311)">
+<linearGradient id="linearGradient3102" gradientUnits="userSpaceOnUse" gradientTransform="matrix(0 -46.386 -46.386 0 772.6 216.43)">
 <stop stop-color="#e8a222" offset="0"/>
-<stop stop-color="#e72" offset="0.612"/>
+<stop stop-color="#e72" offset=".612"/>
 <stop stop-color="#e72" offset="1"/>
 </linearGradient>
 </defs>
-<g transform="matrix(3.01551,0,0,-3.03792,-2202.653,775.41256)">
+<g transform="matrix(3.0155 0 0 -3.0379 -2202.7 775.41)">
 <g clip-path="url(#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" fill="url(#linearGradient3102)"/>
+<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" fill="url(#linearGradient3102)"/>
 </g>
 </g>
-<g transform="matrix(3.01551,0,0,-3.03792,-2202.653,775.41256)">
+<g transform="matrix(3.0155 0 0 -3.0379 -2202.7 775.41)">
 <g clip-path="url(#clipPath3389)">
-<path d="m764.16,224.24,0.033-22.514c-0.24-5.775,4.557-3.618,4.557-3.618l16.135,11.328c3.603,2.562,0.033,4.779,0.033,4.779l-14.563,12.769c-1.139,0.687-2.075,0.957-2.841,0.957-2.835,0-3.354-3.701-3.354-3.701" fill="url(#linearGradient3104)"/>
+<path d="m764.16 224.24 0.033-22.514c-0.24-5.775 4.557-3.618 4.557-3.618l16.135 11.328c3.603 2.562 0.033 4.779 0.033 4.779l-14.563 12.769c-1.139 0.687-2.075 0.957-2.841 0.957-2.835 0-3.354-3.701-3.354-3.701" fill="url(#linearGradient3104)"/>
 </g>
 </g>
 </svg>
diff --git a/online/icons/magnatune.svg b/online/icons/magnatune.svg
index 3885baf..5014d3a 100644
--- a/online/icons/magnatune.svg
+++ b/online/icons/magnatune.svg
@@ -1,8 +1,8 @@
-<svg viewBox="0 0 256 256" xmlns="http://www.w3.org/2000/svg">
-<g transform="matrix(7.66317,0,0,7.47975,-602.60194,-6016.62938)">
-<path d="m79.8829,821.5403c0,8.59 6.988,15.578 15.576,15.578s15.577-6.988 15.577-15.578-6.988-15.574-15.577-15.574-15.576,6.988-15.576,15.574zm3.151,0c0-6.852 5.574-12.424 12.425-12.424s12.428,5.572 12.428,12.424c0,6.855-5.577,12.428-12.428,12.428s-12.425-5.573-12.425-12.428z" fill="#006da5"/>
-<path d="m97.2079,827.9483c0,1.008-.817,1.824-1.825,1.824-1.005,0-1.822-.816-1.822-1.824v-14.588c0-1.008.816-1.824 1.822-1.824s1.825.816 1.825,1.824v14.588z" fill="#006da5"/>
-<path d="m91.2059,827.9483c0,1.008-.818,1.824-1.826,1.824-1.005,0-1.822-.816-1.822-1.824v-7.752c0-1.004.817-1.822 1.822-1.822s1.826.818 1.826,1.822v7.752z" fill="#006da5"/>
-<path d="m103.2099,827.9483c0,1.008-.816,1.824-1.824,1.824-1.005,0-1.822-.816-1.822-1.824v-7.752c0-1.004.817-1.822 1.822-1.822s1.824.818 1.824,1.822v7.752z" fill="#006da5"/>
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
+<g transform="matrix(7.6632 0 0 7.4798 -602.6 -6016.6)" fill="#006da5">
+<path d="m79.883 821.54c0 8.59 6.988 15.578 15.576 15.578s15.577-6.988 15.577-15.578-6.988-15.574-15.577-15.574-15.576 6.988-15.576 15.574zm3.151 0c0-6.852 5.574-12.424 12.425-12.424s12.428 5.572 12.428 12.424c0 6.855-5.577 12.428-12.428 12.428s-12.425-5.573-12.425-12.428z"/>
+<path d="m97.208 827.95c0 1.008-0.817 1.824-1.825 1.824-1.005 0-1.822-0.816-1.822-1.824v-14.588c0-1.008 0.816-1.824 1.822-1.824s1.825 0.816 1.825 1.824v14.588z"/>
+<path d="m91.206 827.95c0 1.008-0.818 1.824-1.826 1.824-1.005 0-1.822-0.816-1.822-1.824v-7.752c0-1.004 0.817-1.822 1.822-1.822s1.826 0.818 1.826 1.822v7.752z"/>
+<path d="m103.21 827.95c0 1.008-0.816 1.824-1.824 1.824-1.005 0-1.822-0.816-1.822-1.824v-7.752c0-1.004 0.817-1.822 1.822-1.822s1.824 0.818 1.824 1.822v7.752z"/>
 </g>
 </svg>
diff --git a/online/icons/npr.svg b/online/icons/npr.svg
new file mode 100644
index 0000000..9e237f0
--- /dev/null
+++ b/online/icons/npr.svg
@@ -0,0 +1,23 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
+<g fill-rule="evenodd" transform="matrix(.78676 0 0 .93186 .10189 35.303)" fill="#fff">
+<path d="m0 56.639h162.59v-56.639h-162.59v56.639z"/>
+</g>
+<g fill-rule="evenodd" transform="matrix(.78676 0 0 .93186 1.5333 37.015)" fill="#ff330d">
+<path d="m0 52.99h52.989v-52.99h-52.989v52.99z" fill="#ff330d"/>
+</g>
+<g transform="matrix(.78676 0 0 .93186 43.224 37.015)" fill-rule="evenodd">
+<path d="m0 52.99h52.99v-52.99h-52.99v52.99z"/>
+</g>
+<g fill-rule="evenodd" transform="matrix(.78676 0 0 .93186 84.915 37.015)" fill="#36c">
+<path d="m0 52.99h52.99v-52.99h-52.99v52.99z" fill="#36c"/>
+</g>
+<g fill-rule="evenodd" transform="matrix(.78676 0 0 .93186 12.682 48.561)" fill="#fff">
+<path d="m17.474 27.622v-15.638c0-2.3057-0.4443-3.9893-1.333-5.0518s-2.3379-1.5918-4.3516-1.5918c-0.9306 0-1.9238 0.2617-2.9824 0.7842s-1.8818 1.1709-2.4726 1.9443v19.553h-6.334v-27.165h4.5634l1.1661 2.5352c1.7255-1.9932 4.2675-2.9922 7.6337-2.9922 3.2266 0 5.7735 0.9668 7.6417 2.8994s2.8027 4.6289 2.8027 8.0879v16.635h-6.334z" fill="#fff"/>
+</g>
+<g fill-rule="evenodd" transform="matrix(.78676 0 0 .93186 54.402 48.561)" fill="#fff">
+<path d="m10.378 5.417c2.914 0 5.0039 0.6533 6.2675 1.9609s1.8956 3.5606 1.8956 6.7637c0 3.0005-0.6358 5.1965-1.9083 6.5855s-3.3662 2.087-6.2812 2.087c-1.5332 0-2.873-0.464-4.0186-1.392v-14.234c1.1788-1.1797 2.5284-1.7715 4.045-1.7715zm1.4072 22.738c4.1435 0 7.4121-1.199 9.8046-3.597s3.59-5.821 3.59-10.263c0-9.5283-4.329-14.295-12.986-14.295-2.3174 0-4.2705 0.7617-5.8604 2.2832v-1.8262h-6.333v37.77h6.333v-11.263c1.6407 0.795 3.4571 1.191 5.4522 1.191z" fill="#fff"/>
+</g>
+<g fill-rule="evenodd" transform="matrix(.78676 0 0 .93186 98.972 48.561)" fill="#fff">
+<path d="m15.64 6.4101c-1.129-0.7128-2.363-1.0693-3.708-1.0693-1.464 0-2.761 0.666-3.896 1.9961-1.136 1.3301-1.702 2.9561-1.702 4.876v15.409h-6.334v-27.165h6.334v2.5947c1.764-2.0332 4.11-3.0517 7.035-3.0517 2.152 0 3.801 0.3301 4.944 0.9883l-2.673 5.4218z" fill="#fff"/>
+</g>
+</svg>
diff --git a/online/icons/podcasts.png b/online/icons/podcasts.png
new file mode 100644
index 0000000..02dcec9
Binary files /dev/null and b/online/icons/podcasts.png differ
diff --git a/online/icons/podcasts.svg b/online/icons/podcasts.svg
new file mode 100644
index 0000000..cb32758
--- /dev/null
+++ b/online/icons/podcasts.svg
@@ -0,0 +1,15 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
+<defs>
+<linearGradient id="linearGradient2449" y2="425.4" gradientUnits="userSpaceOnUse" y1="274.71" gradientTransform="matrix(-.59146 0 0 .59146 210.02 142.23)" x2="-395.85" x1="-344.15">
+<stop stop-color="#fff" offset="0"/>
+<stop stop-color="#fff" stop-opacity="0" offset="1"/>
+</linearGradient>
+</defs>
+<g transform="translate(-373.64 -318.34)">
+<path d="m-583.66 328.85h164.03a35.488 35.488 0 0 1 35.488 35.488v164.01a35.488 35.488 0 0 1 -35.488 35.488h-164.03a35.488 35.488 0 0 1 -35.488 -35.488v-164.01a35.488 35.488 0 0 1 35.488 -35.488" fill-rule="evenodd" transform="scale(-1,1)" fill="#e15a00"/>
+<path opacity=".607" fill-rule="evenodd" d="m557.06 338.9h-110.83c-29.337 0-52.955 23.81-52.955 53.385v108.13c0.9496 23.086 4.6023 8.4915 11.555-17.075 8.0806-29.713 34.396-55.683 66.445-75.146 24.461-14.855 51.841-24.341 101.68-25.244 28.265-0.5118 25.77-36.683-15.895-44.048z" fill="url(#linearGradient2449)"/>
+<path d="m385 200.64c0 13.215-11.033 23.929-24.643 23.929s-24.643-10.713-24.643-23.929 11.033-23.929 24.643-23.929 24.643 10.713 24.643 23.929z" transform="matrix(.86996 0 0 .86996 135.16 330.53)" fill="#fff"/>
+<path fill-rule="evenodd" d="m427.83 455.06-0.0728-30.273c64.706 3.3755 100.62 49.673 101.5 101.94h-30.318c-0.503-45.941-31.741-69.995-71.109-71.666z" fill="#fff"/>
+<path fill-rule="evenodd" d="m428.2 404.57-0.8788-30.758c99.428 4.6163 152.68 76.768 153.35 152.91l-31.197-0.4394c1.3649-48.704-34.666-120.27-121.27-121.71z" fill="#fff"/>
+</g>
+</svg>
diff --git a/online/icons/soundcloud.png b/online/icons/soundcloud.png
new file mode 100644
index 0000000..ad4053b
Binary files /dev/null and b/online/icons/soundcloud.png differ
diff --git a/online/icons/soundcloud.svg b/online/icons/soundcloud.svg
index dbfc179..befe05f 100644
--- a/online/icons/soundcloud.svg
+++ b/online/icons/soundcloud.svg
@@ -1 +1 @@
-<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" version="1.1" xml:space="preserve" height="100%" width="100%" enable-background="new 0 0 256 256" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 256 256"><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><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x2="0" y2="138.8" y1="11.167"><stop stop-color="#fff" stop-opacity=".85" offset="0"/><stop stop-color="#fff" stop-opacity="0" offset="0.66"/></linearGradient><linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x2="0" y2="245.51" y1="138"><stop stop-opacity=".15" offset="0"/><stop stop-opacity="0" offset="0.663"/></linearGradient></defs><path d="m209.02,10.505h-164.04c-19.599,0-35.487,15.888-35.487,35.487v164.02c0,19.599,15.888,35.486,35.487,35.486h164.03c19.604,0,35.487-15.888,37.487-34.819v-164.01c-1.999-20.266-17.888-36.155-37.485-36.155z" fill="#fc5427"/><path d="m209.02,10.505h-164.04c-19.599,0-35.487,15.889-35.487,35.487v69.409c36.33,14.751,76.046,22.896,117.67,22.896,42.263,0,82.558-8.395,119.34-23.576v-68.061c-1.999-20.266-17.888-36.155-37.485-36.155z" fill="url(#SVGID_1_)"/><path d="m246.5,114.72v-68.061c-1.999-20.266-17.888-36.155-37.485-36.155h-164.04c-19.599,0-35.486,15.889-35.486,35.487v69.409" stroke="#fc5427" stroke-miterlimit="10" stroke-width="2" fill="none"/><path d="m26.791,154.72c-0.067,0.478-0.411,0.81-0.833,0.81-0.436,0-0.781-0.334-0.837-0.814l-1.527-11.399,1.527-11.598c0.056-0.482,0.401-0.817,0.837-0.817,0.42,0,0.768,0.335,0.833,0.814l1.811,11.601-1.811,11.403zm12.337,6.938c-0.071,0.496-0.429,0.843-0.866,0.843-0.445,0-0.812-0.355-0.869-0.848l-2.053-18.338,2.053-18.754c0.061-0.488,0.428-0.842,0.869-0.842s0.797,0.343,0.87,0.842l2.333,18.754-2.337,18.343zm12.25,3.782c-0.057,0.687-0.584,1.202-1.225,1.202-0.646,0-1.177-0.516-1.227-1.202l-1.841-22.117,1.841-22.859c0.052-0.69,0.579-1.207,1.227-1.207,0.64,0,1.168,0.517,1.225,1.201l2.093,22.865-2.093,22.117zm11.995,0.184c-0.054,0.785-0.657,1.379-1.4,1.379-0.754,0-1.354-0.594-1.404-1.383l-1.735-22.299,1.735-21.206c0.048-0.788,0.649-1.384,1.404-1.384s1.349,0.591,1.4,1.374l1.973,21.216-1.973,22.303zm12.001,0.007v-0.007c-0.05,0.872-0.743,1.562-1.582,1.562s-1.536-0.687-1.579-1.558l-1.636-22.298,1.636-34.501c0.041-0.876,0.736-1.566,1.579-1.566s1.532,0.69,1.582,1.566l1.848,34.501-1.848,22.301zm11.998-0.144c-0.044,0.977-0.819,1.743-1.758,1.743-0.947,0-1.719-0.767-1.757-1.734l-1.529-22.158s1.526-42.393,1.526-42.396c0.042-0.976,0.814-1.741,1.761-1.741,0.939,0,1.712,0.764,1.758,1.741l1.726,42.396-1.727,22.149zm12.245-0.359v0.003c-0.038,1.174-0.964,2.097-2.114,2.097s-2.08-0.923-2.112-2.091l-1.318-21.794,1.315-47.481c0.031-1.181,0.962-2.104,2.115-2.104s2.079,0.926,2.114,2.104l1.481,47.482-1.481,21.784zm12.252-0.324v-0.017c-0.032,1.384-1.114,2.462-2.471,2.462s-2.448-1.082-2.475-2.446l-1.104-21.45,1.104-44.58c0.027-1.383,1.116-2.463,2.475-2.463s2.438,1.081,2.471,2.459l1.239,44.585-1.239,21.45zm12.514-0.44v-0.025c-0.022,1.558-1.289,2.822-2.827,2.822s-2.809-1.265-2.829-2.799l-1.161-21,1.159-57.859c0.023-1.557,1.29-2.822,2.832-2.822s2.806,1.266,2.827,2.817l1.26,57.864-1.261,21.002zm82.34,2.985-71.194-0.044c-1.534-0.154-2.753-1.464-2.773-3.035v-81.518c0.019-1.498,0.535-2.271,2.474-3.021,4.986-1.928,10.635-3.069,16.43-3.069,23.678,0,43.09,18.16,45.133,41.306,3.057-1.282,6.415-1.994,9.936-1.994,14.183,0,25.681,11.502,25.681,25.688s-11.504,25.687-25.687,25.687z" fill="#fff"/><path d="m9.496,115.4v94.605c0,19.6,15.888,35.486,35.487,35.486h164.03c19.604,0,35.488-15.889,37.488-34.819v-95.952c-36.779,15.181-77.074,23.576-119.34,23.576-41.625,0.001-81.342-8.145-117.67-22.896z" fill="url(#SVGID_2_)"/><path d="m9.496,115.4v94.605c0,19.6,15.888,35.486,35.486,35.486h164.03c19.604,0,35.487-15.889,37.487-34.819v-95.952" stroke="#cc4420" stroke-miterlimit="10" stroke-width="2" fill="none"/></svg>
+<svg xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns="http://www.w3.org/2000/svg" xml:space="preserve" height="100%" width="100%" version="1.1" xmlns:cc="http://creativecommons.org/ns#" enable-background="new 0 0 256 256" 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><linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x2="0" y2="138.8" y1="11.167"><stop stop-color="#fff" stop-opacity=".85" offset="0"/><stop stop-color="#fff" stop-opacity="0" offset=".66"/></linearGradient><linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x2="0" y2="245.51" y1="138"><stop stop-opacity=".15" offset="0"/><stop stop-opacity="0" offset=".663"/></linearGradient></defs><path d="m209.02 10.505h-164.04c-19.599 0-35.487 15.888-35.487 35.487v164.02c0 19.599 15.888 35.486 35.487 35.486h164.03c19.604 0 35.487-15.888 37.487-34.819v-164.01c-1.999-20.266-17.888-36.155-37.485-36.155z" fill="#fc5427"/><path d="m209.02 10.505h-164.04c-19.599 0-35.487 15.889-35.487 35.487v69.409c36.33 14.751 76.046 22.896 117.67 22.896 42.263 0 82.558-8.395 119.34-23.576v-68.061c-1.999-20.266-17.888-36.155-37.485-36.155z" fill="url(#SVGID_1_)"/><path stroke="#fc5427" stroke-width="2" stroke-miterlimit="10" d="m246.5 114.72v-68.061c-1.999-20.266-17.888-36.155-37.485-36.155h-164.04c-19.599 0-35.486 15.889-35.486 35.487v69.409" fill="none"/><path d="m26.791 154.72c-0.067 0.478-0.411 0.81-0.833 0.81-0.436 0-0.781-0.334-0.837-0.814l-1.527-11.399 1.527-11.598c0.056-0.482 0.401-0.817 0.837-0.817 0.42 0 0.768 0.335 0.833 0.814l1.811 11.601-1.811 11.403zm12.337 6.938c-0.071 0.496-0.429 0.843-0.866 0.843-0.445 0-0.812-0.355-0.869-0.848l-2.053-18.338 2.053-18.754c0.061-0.488 0.428-0.842 0.869-0.842s0.797 0.343 0.87 0.842l2.333 18.754-2.337 18.343zm12.25 3.782c-0.057 0.687-0.584 1.202-1.225 1.202-0.646 0-1.177-0.516-1.227-1.202l-1.841-22.117 1.841-22.859c0.052-0.69 0.579-1.207 1.227-1.207 0.64 0 1.168 0.517 1.225 1.201l2.093 22.865-2.093 22.117zm11.995 0.184c-0.054 0.785-0.657 1.379-1.4 1.379-0.754 0-1.354-0.594-1.404-1.383l-1.735-22.299 1.735-21.206c0.048-0.788 0.649-1.384 1.404-1.384s1.349 0.591 1.4 1.374l1.973 21.216-1.973 22.303zm12.001 0.007v-0.007c-0.05 0.872-0.743 1.562-1.582 1.562s-1.536-0.687-1.579-1.558l-1.636-22.298 1.636-34.501c0.041-0.876 0.736-1.566 1.579-1.566s1.532 0.69 1.582 1.566l1.848 34.501-1.848 22.301zm11.998-0.144c-0.044 0.977-0.819 1.743-1.758 1.743-0.947 0-1.719-0.767-1.757-1.734l-1.529-22.158s1.526-42.393 1.526-42.396c0.042-0.976 0.814-1.741 1.761-1.741 0.939 0 1.712 0.764 1.758 1.741l1.726 42.396-1.727 22.149zm12.245-0.359v0.003c-0.038 1.174-0.964 2.097-2.114 2.097s-2.08-0.923-2.112-2.091l-1.318-21.794 1.315-47.481c0.031-1.181 0.962-2.104 2.115-2.104s2.079 0.926 2.114 2.104l1.481 47.482-1.481 21.784zm12.252-0.324v-0.017c-0.032 1.384-1.114 2.462-2.471 2.462s-2.448-1.082-2.475-2.446l-1.104-21.45 1.104-44.58c0.027-1.383 1.116-2.463 2.475-2.463s2.438 1.081 2.471 2.459l1.239 44.585-1.239 21.45zm12.514-0.44v-0.025c-0.022 1.558-1.289 2.822-2.827 2.822s-2.809-1.265-2.829-2.799l-1.161-21 1.159-57.859c0.023-1.557 1.29-2.822 2.832-2.822s2.806 1.266 2.827 2.817l1.26 57.864-1.261 21.002zm82.34 2.985-71.194-0.044c-1.534-0.154-2.753-1.464-2.773-3.035v-81.518c0.019-1.498 0.535-2.271 2.474-3.021 4.986-1.928 10.635-3.069 16.43-3.069 23.678 0 43.09 18.16 45.133 41.306 3.057-1.282 6.415-1.994 9.936-1.994 14.183 0 25.681 11.502 25.681 25.688s-11.504 25.687-25.687 25.687z" fill="#fff"/><path d="m9.496 115.4v94.605c0 19.6 15.888 35.486 35.487 35.486h164.03c19.604 0 35.488-15.889 37.488-34.819v-95.952c-36.779 15.181-77.074 23.576-119.34 23.576-41.625 0.001-81.342-8.145-117.67-22.896z" fill="url(#SVGID_2_)"/><path stroke="#cc4420" stroke-width="2" stroke-miterlimit="10" d="m9.496 115.4v94.605c0 19.6 15.888 35.486 35.486 35.486h164.03c19.604 0 35.487-15.889 37.487-34.819v-95.952" fill="none"/></svg>
diff --git a/online/jamendoservice.cpp b/online/jamendoservice.cpp
index ef1f9ed..fb9aa05 100644
--- a/online/jamendoservice.cpp
+++ b/online/jamendoservice.cpp
@@ -28,10 +28,20 @@
 #include "musiclibraryitemsong.h"
 #include "song.h"
 #include "settings.h"
+#include "config.h"
 #include <QXmlStreamReader>
 
+#ifdef TAGLIB_FOUND
+#include "tags.h"
+using namespace Tags;
+#else
 static QString id3Genre(int id)
 {
+    // Clementine: In theory, genre 0 is "blues"; in practice it's invalid.
+    if (0==id) {
+        return QString();
+    }
+
     static QMap<int, QString> idMap;
 
     if (idMap.isEmpty()) {
@@ -165,6 +175,7 @@ static QString id3Genre(int id)
 
     return idMap[id];
 }
+#endif
 
 JamendoMusicLoader::JamendoMusicLoader(const QUrl &src)
     : OnlineMusicLoader(src)
@@ -218,6 +229,8 @@ void JamendoMusicLoader::parseArtist(QXmlStreamReader &xml)
 void JamendoMusicLoader::parseAlbum(MusicLibraryItemArtist *artist, QXmlStreamReader &xml)
 {
     MusicLibraryItemAlbum *album=0;
+    QString id;
+    int genre=0;
 
     while (!xml.atEnd()) {
         if (wasStopped()) {
@@ -234,17 +247,22 @@ void JamendoMusicLoader::parseAlbum(MusicLibraryItemArtist *artist, QXmlStreamRe
                 s.album=xml.readElementText().trimmed();
                 album=artist->album(s, true);
             } else if (album && QLatin1String("track")==name) {
-                parseSong(artist, album, xml);
-            }  else if (album && QLatin1String("image")==name) {
-                album->setImageUrl(xml.readElementText().trimmed());
+                parseSong(artist, album, genre, xml);
+            } else if (QLatin1String("id")==name) {
+                id=xml.readElementText().trimmed();
+            } else if (QLatin1String("id3genre")==name) {
+                genre=xml.readElementText().toInt();
             }
         } else if (xml.isEndElement() && QLatin1String("album")==xml.name()) {
             break;
         }
     }
+    if (album && !id.isEmpty()) {
+        album->setImageUrl(id);
+    }
 }
 
-void JamendoMusicLoader::parseSong(MusicLibraryItemArtist *artist, MusicLibraryItemAlbum *album, QXmlStreamReader &xml)
+void JamendoMusicLoader::parseSong(MusicLibraryItemArtist *artist, MusicLibraryItemAlbum *album, int genre, QXmlStreamReader &xml)
 {
     Song s;
     s.artist=album->parentItem()->data();
@@ -264,7 +282,7 @@ void JamendoMusicLoader::parseSong(MusicLibraryItemArtist *artist, MusicLibraryI
             } else if (QLatin1String("duration")==name) {
                 s.time=xml.readElementText().toFloat();
             } else if (QLatin1String("id3genre")==name) {
-                s.genre=id3Genre(xml.readElementText().toInt());
+                genre=xml.readElementText().toInt();
             } else if (QLatin1String("id")==name) {
                 s.file=xml.readElementText().trimmed();
             }
@@ -274,6 +292,7 @@ void JamendoMusicLoader::parseSong(MusicLibraryItemArtist *artist, MusicLibraryI
     }
 
     if (!s.title.isEmpty()) {
+        s.genre=id3Genre(genre);
         s.fillEmptyFields();
         s.track=album->childItems().count()+1;
         MusicLibraryItemSong *song=new MusicLibraryItemSong(s, album);
@@ -286,6 +305,12 @@ void JamendoMusicLoader::parseSong(MusicLibraryItemArtist *artist, MusicLibraryI
 
 const QLatin1String JamendoService::constName("Jamendo");
 static const QLatin1String constStreamUrl("http://api.jamendo.com/get2/stream/track/redirect/?id=%1&streamencoding=");
+
+QString JamendoService::imageUrl(const QString &id)
+{
+    return QString("http://api.jamendo.com/get2/image/album/redirect/?id=%1&imagesize=300").arg(id);
+}
+
 void JamendoService::createLoader()
 {
     loader=new JamendoMusicLoader(QUrl("http://img.jamendo.com/data/dbdump_artistalbumtrack.xml.gz"));
@@ -298,6 +323,7 @@ Song JamendoService::fixPath(const Song &orig, bool) const
     s.file.replace("id=%1", "id="+orig.file);
     s.file+=FMT_MP3==format ? QLatin1String("mp31") : QLatin1String("ogg2");
     s.genre=FMT_MP3==format ? QLatin1String("mp3") : QLatin1String("ogg");
+    s.type=Song::OnlineSvrTrack;
     return encode(s);
 }
 
diff --git a/online/jamendoservice.h b/online/jamendoservice.h
index f917bff..89f8cf2 100644
--- a/online/jamendoservice.h
+++ b/online/jamendoservice.h
@@ -39,7 +39,7 @@ public:
 private:
     void parseArtist(QXmlStreamReader &xml);
     void parseAlbum(MusicLibraryItemArtist *artist, QXmlStreamReader &xml);
-    void parseSong(MusicLibraryItemArtist *artist, MusicLibraryItemAlbum *album, QXmlStreamReader &xml);
+    void parseSong(MusicLibraryItemArtist *artist, MusicLibraryItemAlbum *album, int genre, QXmlStreamReader &xml);
 };
 
 class JamendoService : public OnlineService
@@ -53,6 +53,8 @@ public:
     };
 
     static const QLatin1String constName;
+    static QString imageUrl(const QString &id);
+
     JamendoService(MusicModel *m) : OnlineService(m, constName), format(FMT_MP3) { }
 
     Song fixPath(const Song &orig, bool) const;
diff --git a/online/magnatuneservice.cpp b/online/magnatuneservice.cpp
index 17b7d44..4a3afb2 100644
--- a/online/magnatuneservice.cpp
+++ b/online/magnatuneservice.cpp
@@ -125,31 +125,30 @@ void MagnatuneService::createLoader()
 
 Song MagnatuneService::fixPath(const Song &orig, bool) const
 {
-    if (MB_None==membership) {
-        return encode(orig);
-    }
-
     Song s=orig;
-    QUrl url;
-    #if QT_VERSION < 0x050000
-    url.setEncodedUrl(orig.file.toLocal8Bit());
-    #else
-    url=QUrl(orig.file);
-    #endif
-    url.setScheme("http");
-    url.setHost(MB_Streaming==membership ? constStreamingHostname : constDownloadHostname);
-    url.setUserName(username);
-    url.setPassword(password);
-
-    // And remove the commercial
-    QString path = url.path();
-    path.insert(path.lastIndexOf('.'), "_nospeech");
-    url.setPath(path);
-    s.file=url.toString();
-// TODO: Magnatune downloads!
-//    if (MB_Download==membership) {
-//        s.genre=downloadTypeStr(download);
-//    }
+    s.type=Song::OnlineSvrTrack;
+    if (MB_None!=membership) {
+        QUrl url;
+        #if QT_VERSION < 0x050000
+        url.setEncodedUrl(orig.file.toLocal8Bit());
+        #else
+        url=QUrl(orig.file);
+        #endif
+        url.setScheme("http");
+        url.setHost(MB_Streaming==membership ? constStreamingHostname : constDownloadHostname);
+        url.setUserName(username);
+        url.setPassword(password);
+
+        // And remove the commercial
+        QString path = url.path();
+        path.insert(path.lastIndexOf('.'), "_nospeech");
+        url.setPath(path);
+        s.file=url.toString();
+    // TODO: Magnatune downloads!
+    //    if (MB_Download==membership) {
+    //        s.genre=downloadTypeStr(download);
+    //    }
+    }
     return encode(s);
 }
 
diff --git a/online/onlinedevice.cpp b/online/onlinedevice.cpp
index c8abe97..a6cbed3 100644
--- a/online/onlinedevice.cpp
+++ b/online/onlinedevice.cpp
@@ -27,8 +27,6 @@
 #include "networkaccessmanager.h"
 #include <QDir>
 
-static const int constMaxRedirects=5;
-
 void OnlineDevice::copySongTo(const Song &s, const QString &baseDir, const QString &musicPath, bool overwrite, bool copyCover)
 {
     Q_UNUSED(copyCover)
@@ -42,12 +40,11 @@ void OnlineDevice::copySongTo(const Song &s, const QString &baseDir, const QStri
 
     overWrite=overWrite;
     lastProg=-1;
-    redirects=0;
     currentMpdDir=baseDir;
     currentDestFile=baseDir+musicPath;
 
     QDir dir(Utils::getDir(dest));
-    if (!dir.exists() && !Utils::createDir(dir.absolutePath(), baseDir)) {
+    if (!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), baseDir)) {
         emit actionStatus(DirCreationFaild);
         return;
     }
@@ -59,7 +56,7 @@ void OnlineDevice::copySongTo(const Song &s, const QString &baseDir, const QStri
 
 void OnlineDevice::downloadFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (!reply) {
         return;
     }
@@ -70,29 +67,17 @@ void OnlineDevice::downloadFinished()
         return;
     }
 
-    if (QNetworkReply::NoError==reply->error()) {
-        QVariant redirect = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
+    if (reply->ok()) {
+        if (overWrite && QFile::exists(currentDestFile)) {
+            QFile::remove(currentDestFile);
+        }
 
-        if (redirect.isValid()) {
-            if (++redirects >= constMaxRedirects) {
-                emit actionStatus(TooManyRedirects);
-            } else {
-                job=NetworkAccessManager::self()->get(QUrl(redirect.toUrl()));
-                connect(job, SIGNAL(finished()), SLOT(downloadFinished()));
-                connect(job, SIGNAL(downloadProgress(qint64,qint64)), SLOT(downloadProgress(qint64,qint64)));
-            }
+        QFile f(currentDestFile);
+        if (f.open(QIODevice::WriteOnly)) {
+            f.write(reply->readAll());
+            emit actionStatus(Ok);
         } else {
-            if (overWrite && QFile::exists(currentDestFile)) {
-                QFile::remove(currentDestFile);
-            }
-
-            QFile f(currentDestFile);
-            if (f.open(QIODevice::WriteOnly)) {
-                f.write(reply->readAll());
-                emit actionStatus(Ok);
-            } else {
-                emit actionStatus(WriteFailed);
-            }
+            emit actionStatus(WriteFailed);
         }
     } else {
         emit actionStatus(DownloadFailed);
diff --git a/online/onlinedevice.h b/online/onlinedevice.h
index 73b3fb5..e84abe9 100644
--- a/online/onlinedevice.h
+++ b/online/onlinedevice.h
@@ -27,13 +27,13 @@
 #include "device.h"
 #include "song.h"
 
-class QNetworkReply;
+class NetworkJob;
 class OnlineDevice : public Device
 {
     Q_OBJECT
 
 public:
-    OnlineDevice() : Device(0, QString(), QString()), lastProg(-1), redirects(0), job(0) { }
+    OnlineDevice() : Device(0, QString(), QString()), lastProg(-1), job(0) { }
     virtual ~OnlineDevice() { }
 
     bool isConnected() const { return true; }
@@ -57,9 +57,8 @@ private Q_SLOTS:
 
 private:
     int lastProg;
-    int redirects;
     bool overWrite;
-    QNetworkReply *job;
+    NetworkJob *job;
 };
 
 #endif
diff --git a/online/onlineservice.cpp b/online/onlineservice.cpp
index ad52b2f..e8351c2 100644
--- a/online/onlineservice.cpp
+++ b/online/onlineservice.cpp
@@ -63,7 +63,7 @@ void OnlineMusicLoader::doLoad()
     if (library) {
         delete library;
     }
-    library = new MusicLibraryItemRoot;
+    library = new OnlineServiceMusicRoot;
     if (!readFromCache()) {
         emit status(i18n("Dowloading"), 0);
         if (!network) {
@@ -81,9 +81,9 @@ void OnlineMusicLoader::stop()
     thread->stop();
 }
 
-MusicLibraryItemRoot * OnlineMusicLoader::takeLibrary()
+OnlineServiceMusicRoot * OnlineMusicLoader::takeLibrary()
 {
-    MusicLibraryItemRoot *lib=library;
+    OnlineServiceMusicRoot *lib=library;
     library=0;
     return lib;
 }
@@ -117,7 +117,7 @@ void OnlineMusicLoader::fixLibrary()
 
 void OnlineMusicLoader::downloadFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (!reply) {
         return;
     }
@@ -128,9 +128,9 @@ void OnlineMusicLoader::downloadFinished()
         return;
     }
 
-    if(QNetworkReply::NoError==reply->error()) {
+    if (reply->ok()) {
         emit status(i18n("Parsing response"), -100);
-        QtIOCompressor comp(reply);
+        QtIOCompressor comp(reply->actualJob());
         comp.setStreamFormat(QtIOCompressor::GzipFormat);
         if (comp.open(QIODevice::ReadOnly)) {
             QXmlStreamReader reader;
@@ -226,7 +226,7 @@ bool OnlineService::decode(Song &song)
 }
 
 OnlineService::OnlineService(MusicModel *m, const QString &name)
-    : MusicLibraryItemRoot(name, false)
+    : OnlineServiceMusicRoot(name)
     , configured(false)
     , update(0)
     , lProgress(0.0)
@@ -393,12 +393,58 @@ QModelIndex OnlineService::index() const
     return m_model->createIndex(m_model->row((void *)this), 0, (void *)this);
 }
 
+QModelIndex OnlineService::createIndex(MusicLibraryItem *child) const
+{
+    return m_model->createIndex(child->row(), 0, (void *)child);
+}
+
 void OnlineService::emitUpdated()
 {
     emit static_cast<OnlineServicesModel *>(m_model)->updated(index());
 }
 
+void OnlineService::emitError(const QString &msg, bool isPodcastError)
+{
+    OnlineServicesModel *om=static_cast<OnlineServicesModel *>(m_model);
+
+    if (isPodcastError && om->receivers(SIGNAL(podcastError(QString)))>0) {
+        emit om->podcastError(msg);
+    } else {
+        emit om->error(msg);
+    }
+}
+
+void OnlineService::emitDataChanged(const QModelIndex &idx)
+{
+    emit static_cast<OnlineServicesModel *>(m_model)->dataChanged(idx, idx);
+}
+
+//void OnlineService::emitNeedToSort()
+//{
+//    emit static_cast<OnlineServicesModel *>(m_model)->needToSort();
+//}
+
 void OnlineService::setBusy(bool b)
 {
     static_cast<OnlineServicesModel *>(m_model)->setBusy(id(), b);
 }
+
+void OnlineService::beginInsertRows(const QModelIndex &idx, int from, int to)
+{
+    m_model->beginInsertRows(idx, from, to);
+}
+
+void OnlineService::endInsertRows()
+{
+    m_model->endInsertRows();
+}
+
+void OnlineService::beginRemoveRows(const QModelIndex &idx, int from, int to)
+{
+    m_model->beginRemoveRows(idx, from , to);
+}
+
+void OnlineService::endRemoveRows()
+{
+    m_model->endRemoveRows();
+}
diff --git a/online/onlineservice.h b/online/onlineservice.h
index e9559da..ffbabd3 100644
--- a/online/onlineservice.h
+++ b/online/onlineservice.h
@@ -34,9 +34,17 @@
 class Thread;
 class NetworkAccessManager;
 class MusicModel;
-class QNetworkReply;
+class NetworkJob;
 class QXmlStreamReader;
 
+class OnlineServiceMusicRoot : public MusicLibraryItemRoot
+{
+public:
+    OnlineServiceMusicRoot(const QString &name=QString()) : MusicLibraryItemRoot(name, false) { }
+    virtual ~OnlineServiceMusicRoot() { }
+    virtual bool isOnlineService() const { return true; }
+};
+
 class OnlineMusicLoader : public QObject, public MusicLibraryProgressMonitor
 {
     Q_OBJECT
@@ -47,7 +55,7 @@ public:
     void start();
     void stop();
     bool wasStopped() const { return stopRequested; }
-    MusicLibraryItemRoot * takeLibrary();
+    OnlineServiceMusicRoot * takeLibrary();
     virtual bool parse(QXmlStreamReader &xml)=0;
     void setCacheFileName(const QString &c) { cache=c; }
 
@@ -76,9 +84,9 @@ protected:
     Thread *thread;
     QUrl source;
     QString cache;
-    MusicLibraryItemRoot *library;
+    OnlineServiceMusicRoot *library;
     NetworkAccessManager *network;
-    QNetworkReply *downloadJob;
+    NetworkJob *downloadJob;
     bool stopRequested;
     int lastProg;
 };
@@ -86,9 +94,9 @@ protected:
 // MOC requires the QObject class to be first. But due to models storing void pointers, and
 // needing to cast these - the model prefers MusicLibraryItemRoot to be first!
 #ifdef Q_MOC_RUN
-class OnlineService : public QObject, public MusicLibraryItemRoot
+class OnlineService : public QObject, public OnlineServiceMusicRoot
 #else
-class OnlineService : public MusicLibraryItemRoot, public QObject
+class OnlineService : public OnlineServiceMusicRoot, public QObject
 #endif
 {
     Q_OBJECT
@@ -108,8 +116,10 @@ public:
     virtual void configure(QWidget *) { }
     virtual bool canDownload() const { return false; }
     virtual bool canConfigure() const { return true; }
+    virtual bool canSubscribe() const { return false; }
     virtual bool canLoad() const { return true; }
     virtual bool isSearchBased() const { return false; }
+    virtual bool isPodcasts() const { return false; }
     virtual QString currentSearchString() const { return QString(); }
     virtual void setSearch(const QString &) { }
     virtual void cancelSearch() { }
@@ -130,11 +140,19 @@ public:
     const MusicLibraryItem * findSong(const Song &s) const;
     bool songExists(const Song &s) const;
     bool isConfigured() { return configured; }
+    QModelIndex index() const;
 
 protected:
-    QModelIndex index() const;
+    QModelIndex createIndex(MusicLibraryItem *child) const;
     void emitUpdated();
+    void emitError(const QString &msg, bool isPodcastError=false);
+    void emitDataChanged(const QModelIndex &idx);
+//    void emitNeedToSort();
     void setBusy(bool b);
+    void beginInsertRows(const QModelIndex &idx, int from, int to);
+    void endInsertRows();
+    void beginRemoveRows(const QModelIndex &idx, int from, int to);
+    void endRemoveRows();
 
 private Q_SLOTS:
     void loaderError(const QString &msg);
@@ -151,7 +169,7 @@ Q_SIGNALS:
 protected:
     Icon icn;
     bool configured;
-    MusicLibraryItemRoot *update;
+    OnlineServiceMusicRoot *update;
     QString statusMsg;
     double lProgress;
     bool loaded;
diff --git a/online/onlineservicespage.cpp b/online/onlineservicespage.cpp
index 349da5a..9f24b93 100644
--- a/online/onlineservicespage.cpp
+++ b/online/onlineservicespage.cpp
@@ -26,10 +26,12 @@
 #include "musiclibraryitemartist.h"
 #include "musiclibraryitemalbum.h"
 #include "musiclibraryitemsong.h"
+#include "musiclibraryitempodcast.h"
 #include "onlineservicesmodel.h"
 #include "jamendoservice.h"
 #include "magnatuneservice.h"
 #include "soundcloudservice.h"
+#include "podcastservice.h"
 #include "settings.h"
 #include "messagebox.h"
 #include "localize.h"
@@ -37,6 +39,8 @@
 #include "mainwindow.h"
 #include "stdactions.h"
 #include "actioncollection.h"
+#include "inputdialog.h"
+#include "podcastsearchdialog.h"
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KGlobalSettings>
 #endif
@@ -45,9 +49,8 @@ OnlineServicesPage::OnlineServicesPage(QWidget *p)
     : QWidget(p)
     , onlineSearchRequest(false)
     , searchable(true)
+    , expanded(false)
 {
-    QAction *sep=new QAction(this);
-    sep->setSeparator(true);
     setupUi(this);
     addToPlayQueue->setDefaultAction(StdActions::self()->addToPlayQueueAction);
     replacePlayQueue->setDefaultAction(StdActions::self()->replacePlayQueueAction);
@@ -56,13 +59,17 @@ 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)));
     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(OnlineServicesModel::self(), SIGNAL(updateGenres(const QSet<QString> &)), genreCombo, SLOT(update(const QSet<QString> &)));
     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(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)));
@@ -71,15 +78,42 @@ OnlineServicesPage::OnlineServicesPage(QWidget *p)
     connect(view, SIGNAL(rootIndexSet(QModelIndex)), this, SLOT(setSearchable(QModelIndex)));
     connect(OnlineServicesModel::self()->configureAct(), SIGNAL(triggered()), this, SLOT(configureService()));
     connect(OnlineServicesModel::self()->refreshAct(), SIGNAL(triggered()), this, SLOT(refreshService()));
+    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()));
 
     QMenu *menu=new QMenu(this);
     menu->addAction(OnlineServicesModel::self()->configureAct());
     menu->addAction(OnlineServicesModel::self()->refreshAct());
+    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());
+    menu->addAction(downloadPodcastAction);
+    menu->addAction(deleteDownloadedPodcastAction);
+    menu->addSeparator();
+    QAction *configAction=new QAction(Icons::self()->configureIcon, i18n("Configure..."), this);
+    menu->addAction(configAction);
+    connect(configAction, SIGNAL(triggered(bool)), this, SLOT(showPreferencesPage()));
+
     view->addAction(downloadAction);
+    view->addAction(sep);
+    view->addAction(podcastSearchAction);
+    view->addAction(OnlineServicesModel::self()->subscribeAct());
+    view->addAction(OnlineServicesModel::self()->unSubscribeAct());
+    view->addAction(OnlineServicesModel::self()->refreshSubscriptionAct());
+    view->addAction(downloadPodcastAction);
+    view->addAction(deleteDownloadedPodcastAction);
     menuButton->setMenu(menu);
     proxy.setSourceModel(OnlineServicesModel::self());
-    proxy.setDynamicSortFilter(false);
+//    proxy.setDynamicSortFilter(false);
     view->setModel(&proxy);
     view->setRootIsDecorated(true);
 }
@@ -92,6 +126,19 @@ void OnlineServicesPage::setEnabled(bool e)
 {
     OnlineServicesModel::self()->setEnabled(e);
     controlActions();
+//    if (e) {
+//        proxy.sort();
+//    }
+}
+
+void OnlineServicesPage::showEvent(QShowEvent *e)
+{
+    view->focusView();
+    if (!expanded && OnlineServicesModel::self()->isEnabled()) {
+        expanded=true;
+        expandPodcasts();
+    }
+    QWidget::showEvent(e);
 }
 
 void OnlineServicesPage::clear()
@@ -210,7 +257,7 @@ void OnlineServicesPage::itemDoubleClicked(const QModelIndex &)
 
 void OnlineServicesPage::controlSearch(bool on)
 {
-    // Can onyl search when we are at top level...
+    // Can only search when we are at top level...
     if (on && !searchable) {
         view->setSearchVisible(false);
         return;
@@ -260,13 +307,13 @@ void OnlineServicesPage::controlSearch(bool on)
         searchService=SoundCloudService::constName;
     }
 
-    // Handle the case where search was visible, and user selected other search.
-    // In this case we recieve on=false (which is for the previous), so we fake this
-    // into an on=true for the new service...
-    if (!on && !prevSearchService.isEmpty() && searchService!=prevSearchService) {
-        on=true;
-        view->focusSearch();
-    }
+//    // Handle the case where search was visible, and user selected other search.
+//    // In this case we recieve on=false (which is for the previous), so we fake this
+//    // into an on=true for the new service...
+//    if (!on && !prevSearchService.isEmpty() && searchService!=prevSearchService) {
+//        on=true;
+//        view->focusSearch();
+//    }
 
     if (on) {
         genreCombo->setEnabled(true);
@@ -284,8 +331,9 @@ void OnlineServicesPage::controlSearch(bool on)
         }
         QModelIndex filterIndex=srv ? OnlineServicesModel::self()->serviceIndex(srv) : QModelIndex();
         proxy.setFilterItem(srv);
+        proxy.update(QString(), QString());
         if (filterIndex.isValid()) {
-            view->showIndex(proxy.mapFromSource(filterIndex), true);
+            view->expand(proxy.mapFromSource(filterIndex), true);
         }
     } else {
         OnlineService *srv=OnlineServicesModel::self()->service(prevSearchService);
@@ -309,9 +357,12 @@ void OnlineServicesPage::searchItems()
             OnlineServicesModel::self()->setSearch(searchService, text);
         }
     } else {
-        proxy.update(text, genreCombo->currentIndex()<=0 ? QString() : genreCombo->currentText());
-        if (proxy.enabled() && !text.isEmpty()) {
-            view->expandAll(proxy.filterItem()
+        if (!view->isSearchActive()) {
+            proxy.setFilterItem(0);
+        }
+        proxy.update(view->isSearchActive() ? text : QString(), genreCombo->currentIndex()<=0 ? QString() : genreCombo->currentText());
+        if (proxy.enabled() && !proxy.filterText().isEmpty()) {
+            view->expandAll(proxy.filterItem() && view->isSearchActive()
                                 ? proxy.mapFromSource(OnlineServicesModel::self()->serviceIndex(static_cast<const OnlineService *>(proxy.filterItem())))
                                 : QModelIndex());
         }
@@ -324,6 +375,8 @@ void OnlineServicesPage::controlActions()
     bool srvSelected=false;
     bool canDownload=false;
     bool canConfigure=false;
+    bool canSubscribe=false;
+    bool canUnSubscribe=false;
     bool canRefresh=false;
     QSet<QString> services;
 
@@ -336,6 +389,7 @@ void OnlineServicesPage::controlActions()
                 services.insert(item->data());
                 canConfigure=static_cast<OnlineService *>(item)->canConfigure();
                 canRefresh=static_cast<OnlineService *>(item)->canLoad();
+                canSubscribe=static_cast<OnlineService *>(item)->canSubscribe();
             } else {
                 while (item->parentItem()) {
                     item=item->parentItem();
@@ -345,17 +399,33 @@ void OnlineServicesPage::controlActions()
                     if (static_cast<OnlineService *>(item)->canDownload()) {
                         canDownload=true;
                     }
+                    if (static_cast<OnlineService *>(item)->canSubscribe()) {
+                        canUnSubscribe=true;
+                    }
                 }
             }
 
-            if (srvSelected && canDownload && services.count()>1) {
+            if (srvSelected && canDownload && canUnSubscribe && services.count()>1) {
                 break;
             }
         }
     }
 
     OnlineServicesModel::self()->configureAct()->setEnabled(canConfigure && 1==selected.count());
+    OnlineServicesModel::self()->subscribeAct()->setVisible(canSubscribe || canUnSubscribe);
+    OnlineServicesModel::self()->unSubscribeAct()->setVisible(canSubscribe || canUnSubscribe);
+    OnlineServicesModel::self()->refreshSubscriptionAct()->setVisible(canSubscribe || canUnSubscribe);
+    downloadPodcastAction->setEnabled(canUnSubscribe);
+    downloadPodcastAction->setVisible(canUnSubscribe);
+    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());
     StdActions::self()->addWithPriorityAction->setEnabled(!srvSelected && !selected.isEmpty());
@@ -367,7 +437,6 @@ void OnlineServicesPage::controlActions()
 void OnlineServicesPage::configureService()
 {
     const QModelIndexList selected = view->selectedIndexes(false); // Dont need sorted selection here...
-
     if (1!=selected.size()) {
         return;
     }
@@ -382,7 +451,6 @@ void OnlineServicesPage::configureService()
 void OnlineServicesPage::refreshService()
 {
     const QModelIndexList selected = view->selectedIndexes(false); // Dont need sorted selection here...
-
     if (1!=selected.size()) {
         return;
     }
@@ -450,12 +518,294 @@ 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);
+    }
+}
+
+void OnlineServicesPage::unSubscribe()
+{
+    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_Podcast!=item->itemType()) {
+        return;
+    }
+
+    MusicLibraryItem *p=item->parentItem();
+    if (!p || MusicLibraryItem::Type_Root!=p->itemType()) {
+        return;
+    }
+
+    PodcastService *srv=static_cast<PodcastService *>(p);
+    if (!srv->canSubscribe()) {
+        return;
+    }
+
+    if (MessageBox::No==MessageBox::warningYesNo(this, i18n("Unsubscribe from <b>%1</b>?", item->data()))) {
+        return;
+    }
+
+    srv->unSubscribe(item);
+}
+
+void OnlineServicesPage::refreshSubscription()
+{
+    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 *srv=static_cast<PodcastService *>(item);
+        if (!srv->canSubscribe()) {
+            return;
+        }
+        if (MessageBox::No==MessageBox::questionYesNo(this, i18n("Refresh all podcast listings?"))) {
+            return;
+        }
+        srv->refreshSubscription(0);
+        return;
+    }
+
+    if (MusicLibraryItem::Type_Podcast!=item->itemType()) {
+        return;
+    }
+
+    MusicLibraryItem *p=item->parentItem();
+    if (!p || MusicLibraryItem::Type_Root!=p->itemType()) {
+        return;
+    }
+
+    PodcastService *srv=static_cast<PodcastService *>(p);
+    if (!srv->canSubscribe()) {
+        return;
+    }
+
+    if (MessageBox::No==MessageBox::questionYesNo(this, i18n("Refresh episode listing from <b>%1</b>?", item->data()))) {
+        return;
+    }
+
+    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;
+    QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> >::ConstIterator it(urls.constBegin());
+    QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> >::ConstIterator end(urls.constEnd());
+
+    if (1==urls.keys().count()) {
+        for (; it!=end; ++it) {
+            foreach (MusicLibraryItemPodcastEpisode *ep, it.value()) {
+                rv+=QLatin1String("<li>")+ep->data()+QLatin1String("</li>");
+            }
+        }
+    } else {
+        for (; it!=end; ++it) {
+            rv+=QLatin1String("<li>")+it.key()->data()+QLatin1String("<ul>");
+            foreach (MusicLibraryItemPodcastEpisode *ep, it.value()) {
+                rv+=QLatin1String("<li>")+ep->data()+QLatin1String("</li>");
+            }
+            rv+="</ul></li>";
+        }
+    }
+    return rv;
+}
+
+void OnlineServicesPage::downloadPodcast()
+{
+    const QModelIndexList selected = view->selectedIndexes(true);
+    if (selected.isEmpty()) {
+        return;
+    }
+
+    QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> > urls;
+    int count=0;
+    foreach (const QModelIndex &idx, selected) {
+        MusicLibraryItem *item=static_cast<MusicLibraryItem *>(proxy.mapToSource(idx).internalPointer());
+        switch (item->itemType()) {
+        case MusicLibraryItem::Type_Podcast:
+            foreach (MusicLibraryItem *c, static_cast<MusicLibraryItemPodcast *>(item)->childItems()) {
+                MusicLibraryItemPodcastEpisode *episode=static_cast<MusicLibraryItemPodcastEpisode *>(c);
+                if (episode->localPath().isEmpty() && !urls[static_cast<MusicLibraryItemPodcast *>(item)].contains(episode)) {
+                    urls[static_cast<MusicLibraryItemPodcast *>(item)].append(episode);
+                    count++;
+                }
+            }
+            break;
+        case MusicLibraryItem::Type_Song:
+            if (MusicLibraryItem::Type_Podcast==item->parentItem()->itemType()) {
+                MusicLibraryItemPodcastEpisode *episode=static_cast<MusicLibraryItemPodcastEpisode *>(item);
+                if (episode->localPath().isEmpty() && !urls[static_cast<MusicLibraryItemPodcast *>(item->parentItem())].contains(episode)) {
+                    urls[static_cast<MusicLibraryItemPodcast *>(item->parentItem())].append(episode);
+                    count++;
+                }
+            }
+        default:
+            break;
+        }
+    }
+
+    if (urls.isEmpty()) {
+        MessageBox::information(this, i18n("All selected podcasts have already been downloaded!"));
+    } else {
+        QString question;
+        if (1==count) {
+            question=QLatin1String("<p>")+i18n("Do you wish to download the following podcast episode?")+
+                     QLatin1String("<ul>")+format(urls)+QLatin1String("</ul></p>");
+        } else if (count<15) {
+            question=QLatin1String("<p>")+i18n("Do you wish to download the following podcast episodes?")+
+                     QLatin1String("<ul>")+format(urls)+QLatin1String("</ul></p>");
+        } else {
+            question=i18n("Do you wish to download the selected podcast episodes?");
+        }
+        if (MessageBox::No==MessageBox::questionYesNo(this, question)) {
+            return;
+        }
+        QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> >::ConstIterator it(urls.constBegin());
+        QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> >::ConstIterator end(urls.constEnd());
+        for (; it!=end; ++it) {
+            OnlineServicesModel::self()->downloadPodcasts(it.key(), it.value());
+        }
+    }
+}
+
+void OnlineServicesPage::deleteDownloadedPodcast()
+{
+    const QModelIndexList selected = view->selectedIndexes(false); // Dont need sorted selection here...
+    if (selected.isEmpty()) {
+        return;
+    }
+
+    QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> > urls;
+    int count=0;
+    foreach (const QModelIndex &idx, selected) {
+        MusicLibraryItem *item=static_cast<MusicLibraryItem *>(proxy.mapToSource(idx).internalPointer());
+        switch (item->itemType()) {
+        case MusicLibraryItem::Type_Podcast:
+            foreach (MusicLibraryItem *c, static_cast<MusicLibraryItemPodcast *>(item)->childItems()) {
+                MusicLibraryItemPodcastEpisode *episode=static_cast<MusicLibraryItemPodcastEpisode *>(c);
+                if (!episode->localPath().isEmpty() && !urls[static_cast<MusicLibraryItemPodcast *>(item)].contains(episode)) {
+                    urls[static_cast<MusicLibraryItemPodcast *>(item)].append(episode);
+                    count++;
+                }
+            }
+            break;
+        case MusicLibraryItem::Type_Song:
+            if (MusicLibraryItem::Type_Podcast==item->parentItem()->itemType()) {
+                MusicLibraryItemPodcastEpisode *episode=static_cast<MusicLibraryItemPodcastEpisode *>(item);
+                if (!episode->localPath().isEmpty() && !urls[static_cast<MusicLibraryItemPodcast *>(item->parentItem())].contains(episode)) {
+                    urls[static_cast<MusicLibraryItemPodcast *>(item->parentItem())].append(episode);
+                    count++;
+                }
+            }
+        default:
+            break;
+        }
+    }
+
+    if (urls.isEmpty()) {
+        MessageBox::information(this, i18n("All selected downloaded podcast episodes have already been deleted!"));
+    } else {
+        QString question;
+        if (1==count) {
+            question=QLatin1String("<p>")+i18n("Do you wish to delete the downloaded file of the following podcast episode?")+
+                     QLatin1String("<ul>")+format(urls)+QLatin1String("</ul></p>");
+        } else if (count<15) {
+            question=QLatin1String("<p>")+i18n("Do you wish to the delete downloaded files of the following podcast episodes?")+
+                     QLatin1String("<ul>")+format(urls)+QLatin1String("</ul></p>");
+        } else {
+            question=i18n("Do you wish to the delete downloaded files of the selected podcast episodes?");
+        }
+        if (MessageBox::No==MessageBox::questionYesNo(this, question)) {
+            return;
+        }
+        QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> >::ConstIterator it(urls.constBegin());
+        QMap<MusicLibraryItemPodcast *, QList<MusicLibraryItemPodcastEpisode *> >::ConstIterator end(urls.constEnd());
+        for (; it!=end; ++it) {
+            OnlineServicesModel::self()->deleteDownloadedPodcasts(it.key(), it.value());
+        }
+    }
+}
+
+void OnlineServicesPage::showPreferencesPage()
+{
+    emit showPreferencesPage(QLatin1String("online"));
+}
+
 void OnlineServicesPage::updated(const QModelIndex &idx)
 {
-    MusicLibraryItem *item=static_cast<MusicLibraryItem *>(idx.internalPointer());
-    if (MusicLibraryItem::Type_Root==item->itemType() && !static_cast<OnlineService *>(item)->isSearchBased()) {
-        proxy.sort();
+//    MusicLibraryItem *item=static_cast<MusicLibraryItem *>(idx.internalPointer());
+//    if (MusicLibraryItem::Type_Root==item->itemType() && !static_cast<OnlineService *>(item)->isSearchBased()) {
+//        proxy.sort();
+//    }
+
+    if (isVisible() || !idx.isValid() || PodcastService::constName!=static_cast<OnlineService *>(idx.internalPointer())->id()) {
+        view->setExpanded(proxy.mapFromSource(idx));
     }
+}
+
+//void OnlineServicesPage::sortList()
+//{
+//    proxy.sort();
+//}
 
-    view->setExpanded(proxy.mapFromSource(idx));
+void OnlineServicesPage::expandPodcasts()
+{
+    OnlineService *pod=OnlineServicesModel::self()->service(PodcastService::constName);
+    if (!OnlineServicesModel::self()->isHidden(pod)) {
+        bool wasAnimated=view->isAnimated();
+        if (wasAnimated) {
+            view->setAnimated(false);
+        }
+        view->expand(proxy.mapFromSource(pod->index()), true);
+        if (wasAnimated) {
+            view->setAnimated(true);
+        }
+    }
 }
diff --git a/online/onlineservicespage.h b/online/onlineservicespage.h
index 151da7c..10dd933 100644
--- a/online/onlineservicespage.h
+++ b/online/onlineservicespage.h
@@ -49,6 +49,7 @@ public:
     void focusSearch() { view->focusSearch(); }
     void goBack() { view->backActivated(); }
     void refresh();
+    void showEvent(QShowEvent *e);
 
 public Q_SLOTS:
     void itemDoubleClicked(const QModelIndex &);
@@ -60,7 +61,15 @@ public Q_SLOTS:
     void updateGenres(const QModelIndex &idx);
     void setSearchable(const QModelIndex &idx);
     void updated(const QModelIndex &idx);
+//    void sortList();
     void download();
+    void subscribe();
+    void unSubscribe();
+    void refreshSubscription();
+    void searchForPodcasts();
+    void downloadPodcast();
+    void deleteDownloadedPodcast();
+    void showPreferencesPage();
 
 Q_SIGNALS:
     // These are for communicating with MPD object (which is in its own thread, so need to talk via signal/slots)
@@ -68,17 +77,23 @@ Q_SIGNALS:
     void addSongsToPlaylist(const QString &name, const QStringList &files);
 
     void addToDevice(const QString &from, const QString &to, const QList<Song> &songs);
+    void showPreferencesPage(const QString &page);
 
 private:
     OnlineService * activeSrv() const;
+    void expandPodcasts();
 
 private:
     MusicLibraryProxyModel proxy;
     Action *downloadAction;
+    Action *podcastSearchAction;
+    Action *downloadPodcastAction;
+    Action *deleteDownloadedPodcastAction;
     QSet<QString> genres;
     bool onlineSearchRequest;
     QString searchService;
     bool searchable;
+    bool expanded;
 };
 
 #endif
diff --git a/online/onlineservicespage.ui b/online/onlineservicespage.ui
index bb9734d..726ed29 100644
--- a/online/onlineservicespage.ui
+++ b/online/onlineservicespage.ui
@@ -11,6 +11,9 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="vlayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <property name="leftMargin">
     <number>0</number>
    </property>
@@ -29,7 +32,7 @@
    <item>
     <layout class="QHBoxLayout" name="hlayout">
      <property name="spacing">
-      <number>0</number>
+      <number>1</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
@@ -44,14 +47,10 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="GenreCombo" name="genreCombo">
-       <property name="sizePolicy">
-        <sizepolicy hsizetype="MinimumExpanding" vsizetype="Fixed">
-         <horstretch>0</horstretch>
-         <verstretch>0</verstretch>
-        </sizepolicy>
-       </property>
-      </widget>
+      <widget class="GenreCombo" name="genreCombo"/>
+     </item>
+     <item>
+      <widget class="SizeWidget" name="sizeWidget"/>
      </item>
      <item>
       <widget class="MenuButton" name="menuButton"/>
@@ -87,6 +86,11 @@
    <extends>QToolButton</extends>
    <header>menubutton.h</header>
   </customwidget>
+  <customwidget>
+   <class>SizeWidget</class>
+   <extends>QWidget</extends>
+   <header>sizewidget.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/online/onlinesettings.cpp b/online/onlinesettings.cpp
new file mode 100644
index 0000000..d8ac40e
--- /dev/null
+++ b/online/onlinesettings.cpp
@@ -0,0 +1,106 @@
+/*
+ * 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 "onlinesettings.h"
+#include "onlineservicesmodel.h"
+#include "onlineservice.h"
+#include "basicitemdelegate.h"
+#include "icon.h"
+#include "localize.h"
+#include <QListWidget>
+
+enum Roles {
+    KeyRole = Qt::UserRole,
+    ConfigurableRole
+};
+
+OnlineSettings::OnlineSettings(QWidget *p)
+    : QWidget(p)
+{
+    setupUi(this);
+    providers->setItemDelegate(new BasicItemDelegate(providers));
+    providers->setSortingEnabled(true);
+    int iSize=Icon::stdSize(QApplication::fontMetrics().height()*1.25);
+    providers->setIconSize(QSize(iSize, iSize));    
+    connect(providers, SIGNAL(currentRowChanged(int)), SLOT(currentProviderChanged(int)));
+    connect(configureButton, SIGNAL(clicked()), this, SLOT(configure()));
+    configureButton->setEnabled(false);
+}
+
+void OnlineSettings::load()
+{
+    QList<OnlineServicesModel::Provider> provs=OnlineServicesModel::self()->getProviders();
+    foreach (const OnlineServicesModel::Provider &prov, provs) {
+        QListWidgetItem *item=new QListWidgetItem(prov.name, providers);
+        item->setCheckState(prov.hidden ? Qt::Unchecked : Qt::Checked);
+        item->setData(KeyRole, prov.key);
+        item->setData(ConfigurableRole, prov.configurable);
+        item->setIcon(prov.icon);
+    }
+}
+
+void OnlineSettings::save()
+{
+    QSet<QString> disabled;
+    for (int i=0; i<providers->count(); ++i) {
+        QListWidgetItem *item=providers->item(i);
+        if (Qt::Unchecked==item->checkState()) {
+            QString id=item->data(KeyRole).toString();
+            if (OnlineServicesModel::self()->serviceIsBusy(id)) {
+                item->setCheckState(Qt::Checked);
+            } else {
+                disabled.insert(id);
+            }
+        }
+    }
+    OnlineServicesModel::self()->setHiddenProviders(disabled);
+}
+
+void OnlineSettings::currentProviderChanged(int row)
+{
+    bool enableConfigure=false;
+
+    if (row>=0) {
+        QListWidgetItem *item=providers->item(row);
+        enableConfigure=item->data(ConfigurableRole).toBool();
+    }
+    configureButton->setEnabled(enableConfigure);
+}
+
+void OnlineSettings::configure()
+{
+    int row=providers->currentRow();
+    if (row<0) {
+        return;
+    }
+
+    QListWidgetItem *item=providers->item(row);
+    if (!item->data(ConfigurableRole).toBool()) {
+        return;
+    }
+
+    OnlineService *srv=OnlineServicesModel::self()->service(item->data(KeyRole).toString());
+    if (srv && srv->canConfigure()) {
+        srv->configure(this);
+    }
+}
diff --git a/gui/filesettings.h b/online/onlinesettings.h
similarity index 75%
copy from gui/filesettings.h
copy to online/onlinesettings.h
index d125562..0d7c659 100644
--- a/gui/filesettings.h
+++ b/online/onlinesettings.h
@@ -21,27 +21,26 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef FILESETTINGS_H
-#define FILESETTINGS_H
+#ifndef ONLINE_SETTINGS_H
+#define ONLINE_SETTINGS_H
 
-#include "ui_filesettings.h"
+#include "ui_onlinesettings.h"
 
-class FileSettings : public QWidget, private Ui::FileSettings
+class QListWidgetItem;
+
+class OnlineSettings : public QWidget, private Ui::OnlineSettings
 {
     Q_OBJECT
-
 public:
-    FileSettings(QWidget *p);
-    virtual ~FileSettings() { }
+    OnlineSettings(QWidget *p);
+    virtual ~OnlineSettings() { }
 
     void load();
     void save();
 
-Q_SIGNALS:
-    void reloadStreams();
-
 private Q_SLOTS:
-    void streamLocationChanged();
+    void currentProviderChanged(int row);
+    void configure();
 };
 
 #endif
diff --git a/online/onlinesettings.ui b/online/onlinesettings.ui
new file mode 100644
index 0000000..9480868
--- /dev/null
+++ b/online/onlinesettings.ui
@@ -0,0 +1,55 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>OnlineSettings</class>
+ <widget class="QWidget" name="Form">
+  <layout class="QGridLayout" name="layout">
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <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>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" colspan="2">
+    <widget class="QListWidget" name="providers"/>
+   </item>
+   <item row="2" column="0">
+    <spacer name="spacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::MinimumExpanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="2" column="1">
+    <widget class="QPushButton" name="configureButton">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Configure Service</string>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/online/opmlparser.cpp b/online/opmlparser.cpp
new file mode 100644
index 0000000..d865fe5
--- /dev/null
+++ b/online/opmlparser.cpp
@@ -0,0 +1,140 @@
+/*
+ * 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 "opmlparser.h"
+#include <QXmlStreamReader>
+#include <QStringList>
+
+using namespace OpmlParser;
+
+static bool parseUntil(QXmlStreamReader &reader, const QString &elem)
+{
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (reader.isStartElement() && reader.name() == elem) {
+            return true;
+        }
+    }
+    return false;
+}
+
+static void consumeCurrentElement(QXmlStreamReader &reader)
+{
+    int level = 1;
+    while (0!=level && !reader.atEnd()) {
+        switch (reader.readNext()) {
+            case QXmlStreamReader::StartElement: ++level; break;
+            case QXmlStreamReader::EndElement:   --level; break;
+            default: break;
+        }
+    }
+}
+
+static void parseOutline(QXmlStreamReader &reader, Category &cat)
+{
+    while (!reader.atEnd()) {
+        QXmlStreamReader::TokenType type = reader.readNext();
+        switch (type) {
+        case QXmlStreamReader::StartElement: {
+            const QStringRef name = reader.name();
+            if (name != QLatin1String("outline")) {
+                consumeCurrentElement(reader);
+                continue;
+            }
+
+            QXmlStreamAttributes attributes = reader.attributes();
+
+            if (QLatin1String("rss")==attributes.value(QLatin1String("type")).toString() ||
+                QLatin1String("link")==attributes.value(QLatin1String("type")).toString()) {
+                // Parse the feed and add it to this container
+                Podcast podcast;
+                podcast.name=attributes.value("title").toString().trimmed();
+                if (podcast.name.isEmpty()) {
+                    podcast.name=attributes.value(QLatin1String("text")).toString();
+                }
+                podcast.description=attributes.value("description").toString().trimmed();
+                if (podcast.description.isEmpty()) {
+                    podcast.description=attributes.value(QLatin1String("text")).toString();
+                }
+                podcast.htmlUrl=attributes.value("htmlUrl").toString().trimmed();
+                podcast.url=QUrl::fromEncoded(attributes.value(QLatin1String("xmlUrl")).toString().toLatin1());
+                if (podcast.url.isEmpty()) {
+                    podcast.url=QUrl::fromEncoded(attributes.value(QLatin1String("url")).toString().toLatin1());
+                }
+                podcast.image=QUrl::fromEncoded(attributes.value(QLatin1String("imageUrl")).toString().toLatin1());
+                if (podcast.image.isEmpty()) {
+                    podcast.image=QUrl::fromEncoded(attributes.value(QLatin1String("imageHref")).toString().toLatin1());
+                }
+                cat.podcasts.append(podcast);
+
+                // Consume any children and the EndElement.
+                consumeCurrentElement(reader);
+            } else {
+                // Create a new child container
+                Category child;
+
+                // Take the name from the fullname attribute first if it exists.
+                child.name = attributes.value(QLatin1String("fullname")).toString().trimmed();
+                if (child.name.isEmpty()) {
+                    child.name = attributes.value(QLatin1String("title")).toString().trimmed();
+                }
+                if (child.name.isEmpty()) {
+                    child.name = attributes.value(QLatin1String("text")).toString().trimmed();
+                }
+
+                // Parse its contents and add it to this container
+                parseOutline(reader, child);
+                cat.categories.append(child);
+            }
+
+            break;
+        }
+        case QXmlStreamReader::EndElement:
+            return;
+        default:
+            break;
+        }
+    }
+}
+
+Category OpmlParser::parse(QIODevice *dev)
+{
+    Category cat;
+    QXmlStreamReader reader(dev);
+    if (parseUntil(reader, QLatin1String("body"))) {
+        parseOutline(reader, cat);
+    }
+
+    return cat;
+}
+
+Category OpmlParser::parse(const QByteArray &data)
+{
+    Category cat;
+    QXmlStreamReader reader(data);
+    if (parseUntil(reader, QLatin1String("body"))) {
+        parseOutline(reader, cat);
+    }
+
+    return cat;
+}
diff --git a/devices/cdalbum.h b/online/opmlparser.h
similarity index 67%
copy from devices/cdalbum.h
copy to online/opmlparser.h
index 2c99f09..8414706 100644
--- a/devices/cdalbum.h
+++ b/online/opmlparser.h
@@ -21,23 +21,39 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef CDALBUM_H
-#define CDALBUM_H
+#ifndef OPMLPARSER_H
+#define OPMLPARSER_H
 
+#include <QUrl>
 #include <QString>
 #include <QList>
-#include "song.h"
 
-struct CdAlbum {
-    CdAlbum() : isDefault(false), year(0), disc(0)  { }
-    bool isNull() const { return 0==year && 0==disc && tracks.isEmpty() && name.isEmpty() && artist.isEmpty() && genre.isEmpty(); }
-    bool isDefault;
+class QIODevice;
+
+namespace OpmlParser
+{
+
+struct Podcast
+{
+    Podcast() { }
     QString name;
-    QString artist;
-    QString genre;
-    int year;
-    int disc;
-    QList<Song> tracks;
+    QString description;
+    QString htmlUrl;
+    QUrl url;
+    QUrl image;
 };
 
+struct Category
+{
+    QString name;
+    QList<Podcast> podcasts;
+    QList<Category> categories;
+    bool isValid() const { return !name.isEmpty(); }
+};
+
+Category parse(QIODevice *dev);
+Category parse(const QByteArray &data);
+
+}
+
 #endif
diff --git a/online/podcast_directories.xml b/online/podcast_directories.xml
new file mode 100644
index 0000000..8e86e97
--- /dev/null
+++ b/online/podcast_directories.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<directories>
+<directory name="DigitalPodcast" url="http://www.digitalpodcast.com/opml/digitalpodcastnoadult.opml" icon="podcasts"/>
+<directory name="BBC" url="http://www.bbc.co.uk/radio/opml/bbc_podcast_opml.opml" icon="bbc"/>
+<directory name="NPR" url="http://www.npr.org/podcasts.opml" icon="npr"/>
+<directory name="CBC" url="http://www.cbc.ca/podcasts.opml" icon="cbc"/>
+</directories>
diff --git a/online/podcastsearchdialog.cpp b/online/podcastsearchdialog.cpp
new file mode 100644
index 0000000..73a077d
--- /dev/null
+++ b/online/podcastsearchdialog.cpp
@@ -0,0 +1,616 @@
+/*
+ * 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 "podcastsearchdialog.h"
+#include "pagewidget.h"
+#include "lineedit.h"
+#include "networkaccessmanager.h"
+#include "opmlparser.h"
+#include "icons.h"
+#include "spinner.h"
+#include "qjson/parser.h"
+#include "basicitemdelegate.h"
+#include "onlineservicesmodel.h"
+#include "podcastservice.h"
+#include "utils.h"
+#include "action.h"
+#include "textbrowser.h"
+#include "messagewidget.h"
+#include <QPushButton>
+#include <QTreeWidget>
+#include <QGridLayout>
+#include <QBoxLayout>
+#include <QHeaderView>
+#include <QStringList>
+#include <QFile>
+#include <QXmlStreamReader>
+#include <QCryptographicHash>
+#include <QProcess>
+#include <QCache>
+#include <QImage>
+#include <QBuffer>
+#if QT_VERSION >= 0x050000
+#include <QUrlQuery>
+#endif
+
+static int iCount=0;
+
+static QCache<QUrl, QImage> imageCache(200*1024);
+static int maxImageSize=-1;
+
+enum Roles {
+    IsPodcastRole = Qt::UserRole,
+    UrlRole,
+    ImageUrlRole,
+    DescriptionRole,
+    WebPageUrlRole
+};
+
+QString PodcastSearchDialog::constCacheDir=QLatin1String("podcast-directories");
+QString PodcastSearchDialog::constExt=QLatin1String(".opml");
+
+static QString generateCacheFileName(const QUrl &url, bool create)
+{
+    QString hash=QCryptographicHash::hash(url.toString().toUtf8(), QCryptographicHash::Md5).toHex();
+    QString dir=Utils::cacheDir(PodcastSearchDialog::constCacheDir, create);
+    return dir.isEmpty() ? QString() : (dir+hash+PodcastSearchDialog::constExt);
+}
+
+class ITunesSearchPage : public PodcastSearchPage
+{
+public:
+    ITunesSearchPage(QWidget *p)
+        : PodcastSearchPage(p,
+                            QLatin1String("iTunes"),
+                            QLatin1String("itunes"),
+                            QUrl(QLatin1String("http://ax.phobos.apple.com.edgesuite.net/WebObjects/MZStoreServices.woa/wa/wsSearch")),
+                            QLatin1String("term"),
+                            QStringList() << QLatin1String("country") << QLatin1String("US") << QLatin1String("media") << QLatin1String("podcast"))
+    {
+    }
+
+    void parse(const QVariant &data)
+    {
+        foreach (const QVariant &resultVariant, data.toMap()[QLatin1String("results")].toList()) {
+            QVariantMap result(resultVariant.toMap());
+            if (result[QLatin1String("kind")].toString() != QLatin1String("podcast")) {
+                continue;
+            }
+
+            addPodcast(result[QLatin1String("trackName")].toString(),
+                       result[QLatin1String("feedUrl")].toUrl(),
+                       result[QLatin1String("artworkUrl100")].toUrl(),
+                       QString(),
+                       result[QLatin1String("collectionViewUrl")].toString(),
+                       0);
+        }
+    }
+};
+
+class GPodderSearchPage : public PodcastSearchPage
+{
+public:
+    GPodderSearchPage(QWidget *p)
+        : PodcastSearchPage(p,
+                            QLatin1String("GPodder"),
+                            QLatin1String("gpodder"),
+                            QUrl(QLatin1String("http://gpodder.net/search.json")),
+                            QLatin1String("q"))
+    {
+    }
+
+    void parse(const QVariant &data)
+    {
+        QVariantList list=data.toList();
+        foreach (const QVariant &var, list) {
+            QVariantMap map=var.toMap();
+            addPodcast(map[QLatin1String("title")].toString(),
+                       map[QLatin1String("url")].toUrl(),
+                       map[QLatin1String("logo_url")].toUrl(),
+                       map[QLatin1String("description")].toString(),
+                       map[QLatin1String("website")].toString(),
+                       0);
+        }
+    }
+};
+
+PodcastPage::PodcastPage(QWidget *p, const QString &n)
+    : QWidget(p)
+    , pageName(n)
+    , job(0)
+    , imageJob(0)
+{
+    tree = new QTreeWidget(this);
+    tree->setItemDelegate(new BasicItemDelegate(tree));
+    tree->header()->setVisible(false);
+    text=new TextBrowser(this);
+    spinner=new Spinner(this);
+    spinner->setWidget(tree->viewport());
+    imageSpinner=new Spinner(this);
+    imageSpinner->setWidget(text->viewport());
+    connect(tree, SIGNAL(itemSelectionChanged()), SLOT(selectionChanged()));
+    tree->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
+    text->setOpenLinks(false);
+    connect(text, SIGNAL(anchorClicked(QUrl)), SLOT(openLink(QUrl)));
+    updateText();
+}
+
+void PodcastPage::fetch(const QUrl &url)
+{
+    cancel();
+    tree->clear();
+    spinner->start();
+    job=NetworkAccessManager::self()->get(url);
+    connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+}
+
+void PodcastPage::fetchImage(const QUrl &url)
+{
+    cancelImage();
+    imageSpinner->start();
+    imageJob=NetworkAccessManager::self()->get(url);
+    connect(imageJob, SIGNAL(finished()), this, SLOT(imageJobFinished()));
+}
+
+void PodcastPage::cancel()
+{
+    spinner->stop();
+    if (job) {
+        disconnect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
+        job->deleteLater();
+        job=0;
+    }
+}
+
+void PodcastPage::cancelImage()
+{
+    imageSpinner->stop();
+    if (imageJob) {
+        disconnect(imageJob, SIGNAL(finished()), this, SLOT(imageJobFinished()));
+        imageJob->deleteLater();
+        imageJob=0;
+    }
+}
+
+void PodcastPage::addPodcast(const QString &title, const QUrl &url, const QUrl &image, const QString &description, const QString &webPage, QTreeWidgetItem *p)
+{
+    if (title.isEmpty() || url.isEmpty()) {
+        return;
+    }
+
+    QTreeWidgetItem *podItem=p ? new QTreeWidgetItem(p, QStringList() << title)
+                               : new QTreeWidgetItem(tree, QStringList() << title);
+
+    podItem->setData(0, IsPodcastRole, true);
+    podItem->setData(0, UrlRole, url);
+    podItem->setData(0, ImageUrlRole, image);
+    podItem->setData(0, DescriptionRole, description);
+    podItem->setData(0, WebPageUrlRole, webPage);
+    podItem->setIcon(0, Icons::self()->audioFileIcon);
+}
+
+static QString encode(const QImage &img)
+{
+    QByteArray bytes;
+    QBuffer buffer(&bytes);
+    buffer.open(QIODevice::WriteOnly);
+    img.save(&buffer, "PNG");
+    return QString("<br/><img src=\"data:image/png;base64,%1\"><br/>").arg(QString(buffer.data().toBase64()));
+}
+
+void PodcastPage::updateText()
+{
+    QList<QTreeWidgetItem *> selection=tree->selectedItems();
+    if (!selection.isEmpty()) {
+        QTreeWidgetItem *item=selection.at(0);
+        if (item->data(0, IsPodcastRole).toBool()) {
+            QUrl url=item->data(0, UrlRole).toUrl();
+            QUrl imageUrl=item->data(0, ImageUrlRole).toUrl();
+            QString descr=item->data(0, DescriptionRole).toString();
+            QString web=item->data(0, WebPageUrlRole).toString();
+            QString str="<b>"+item->text(0)+"</b><br/>";
+            if (!imageUrl.isEmpty()) {
+                QImage *img=imageCache.object(imageUrl);
+                if (img) {
+                    str+=encode(*img);
+                } else {
+                    fetchImage(imageUrl);
+                }
+            }
+            if (!descr.isEmpty()) {
+                str+="<p>"+descr+"</p><br/>";
+            }
+            str+="<table><tr><td><b>"+i18n("RSS:")+"</b></td><td><a href=\""+url.toString()+"\">"+url.toString()+"</a></td></tr>";
+            if (!web.isEmpty()) {
+                str+="<tr><td><b>"+i18n("Website:")+"</b></td><td><a href=\""+web+"\">"+web+"</a></td></tr>";
+            }
+            str+="</table>";
+            text->setHtml(str);
+            return;
+        }
+    }
+    text->setHtml("<b>"+i18n("Podcast details")+"</b><p><i>"+i18n("Select a podcast to display its details")+"</i></p>");
+}
+
+void PodcastPage::selectionChanged()
+{
+    cancelImage();
+    updateText();
+    QList<QTreeWidgetItem *> selection=tree->selectedItems();
+    emit rssSelected(selection.isEmpty() ? QUrl() : selection.at(0)->data(0, UrlRole).toUrl());
+}
+
+void PodcastPage::imageJobFinished()
+{
+    NetworkJob *j=qobject_cast<NetworkJob *>(sender());
+    if (!j) {
+        return;
+    }
+    j->deleteLater();
+    if (j!=imageJob) {
+        return;
+    }
+    if (imageSpinner) {
+        imageSpinner->stop();
+    }
+    QImage img=QImage::fromData(imageJob->readAll());
+    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());
+        updateText();
+    }
+    imageJob=0;
+}
+
+void PodcastPage::jobFinished()
+{
+    NetworkJob *j=qobject_cast<NetworkJob *>(sender());
+    if (!j) {
+        return;
+    }
+    j->deleteLater();
+    if (j!=job) {
+        return;
+    }
+    if (spinner) {
+        spinner->stop();
+    }
+    parseResonse(j->ok() ? j->actualJob() : 0);
+    job=0;
+}
+
+void PodcastPage::openLink(const QUrl &url)
+{
+    QProcess::startDetached(QLatin1String("xdg-open"), QStringList() << url.toString());
+}
+
+PodcastSearchPage::PodcastSearchPage(QWidget *p, const QString &n, const QString &i, const QUrl &qu, const QString &qk, const QStringList &other)
+    : PodcastPage(p, n)
+    , queryUrl(qu)
+    , queryKey(qk)
+    , otherArgs(other)
+{
+    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);
+    search=new LineEdit(p);
+    search->setPlaceholderText(i18n("Enter search term..."));
+    searchButton=new QPushButton(i18n("Search"), p);
+    QWidget::setTabOrder(search, searchButton);
+    QWidget::setTabOrder(searchButton, tree);
+    searchLayout->addWidget(search);
+    searchLayout->addWidget(searchButton);
+    viewLayout->addWidget(tree, 1);
+    viewLayout->addWidget(text, 0);
+    mainLayout->addLayout(searchLayout);
+    mainLayout->addLayout(viewLayout);
+    connect(search, SIGNAL(returnPressed()), SLOT(doSearch()));
+    connect(searchButton, SIGNAL(clicked()), SLOT(doSearch()));
+    icn.addFile(":"+i);
+}
+
+void PodcastSearchPage::showEvent(QShowEvent *e)
+{
+    search->setFocus();
+    QWidget::showEvent(e);
+}
+
+void PodcastSearchPage::doSearch()
+{
+    QString text=search->text().trimmed();
+    if (text.isEmpty() || text==currentSearch) {
+        return;
+    }
+
+    currentSearch=text;
+    QUrl url=queryUrl;
+    #if QT_VERSION < 0x050000
+    QUrl &query=url;
+    #else
+    QUrlQuery query;
+    #endif
+    query.addQueryItem(queryKey, text);
+    if (otherArgs.size()>1) {
+        for (int i=0; i<otherArgs.size()-1; i+=2) {
+            query.addQueryItem(otherArgs.at(i), otherArgs.at(i+1));
+        }
+    }
+    #if QT_VERSION >= 0x050000
+    url.setQuery(query);
+    #endif
+    fetch(url);
+}
+
+void PodcastSearchPage::parseResonse(QIODevice *dev)
+{
+    if (!dev) {
+        emit error(i18n("Failed to fetch podcasts from %1", name()));
+        return;
+    }
+    QJson::Parser parser;
+    QVariant data = parser.parse(dev);
+    if (data.isNull()) {
+        emit error(i18n("There was a problem parsing the response from %1", name()));
+        return;
+    }
+    parse(data);
+}
+
+OpmlBrowsePage::OpmlBrowsePage(QWidget *p, const QString &n, const QString &i, const QUrl &u)
+    : PodcastPage(p, n)
+    , loaded(false)
+    , url(u)
+{
+    QBoxLayout *mainLayout=new QBoxLayout(QBoxLayout::LeftToRight, this);
+    mainLayout->setMargin(0);
+    mainLayout->addWidget(tree, 1);
+    mainLayout->addWidget(text, 0);
+    Action *act=new Action(i18n("Reload"), this);
+    tree->addAction(act);
+    connect(act, SIGNAL(triggered(bool)), this, SLOT(reload()));
+    tree->setContextMenuPolicy(Qt::ActionsContextMenu);
+    if (i.isEmpty()) {
+        icn=Icon("folder");
+    } else {
+        icn.addFile(":"+i);
+    }
+}
+
+void OpmlBrowsePage::showEvent(QShowEvent *e)
+{
+    if (!loaded) {
+        QString cacheFile=generateCacheFileName(url, false);
+        if (!cacheFile.isEmpty() && QFile::exists(cacheFile)) {
+            QFile f(cacheFile);
+            if (f.open(QIODevice::ReadOnly)) {
+                parseResonse(&f);
+                if (tree->topLevelItemCount()>0) {
+                    Utils::touchFile(cacheFile);
+                    return;
+                }
+            }
+        }
+        fetch(url);
+        loaded=true;
+    }
+    QWidget::showEvent(e);
+}
+
+void OpmlBrowsePage::reload()
+{
+    QString cacheFile=generateCacheFileName(url, false);
+    if (!cacheFile.isEmpty() && QFile::exists(cacheFile)) {
+        QFile::remove(cacheFile);
+    }
+    fetch(url);
+}
+
+void OpmlBrowsePage::parseResonse(QIODevice *dev)
+{
+    bool isLoadingFromCache=dynamic_cast<QFile *>(dev) ? true : false;
+
+    if (!dev) {
+        if (!isLoadingFromCache) {
+            emit error(i18n("Failed to download directory listing"));
+        }
+        return;
+    }
+    QByteArray data=dev->readAll();
+    OpmlParser::Category parsed=OpmlParser::parse(data);
+    if (parsed.categories.isEmpty() && parsed.podcasts.isEmpty()) {
+        if (!isLoadingFromCache) {
+            emit error(i18n("Failed to parse directory listing"));
+        }
+        return;
+    }
+
+    if (1==parsed.categories.count() && parsed.podcasts.isEmpty()) {
+        parsed=parsed.categories.at(0);
+    }
+    foreach (const OpmlParser::Category &cat, parsed.categories) {
+        addCategory(cat, 0);
+    }
+    foreach (const OpmlParser::Podcast &pod, parsed.podcasts) {
+        addPodcast(pod, 0);
+    }
+    if (!isLoadingFromCache && tree->topLevelItemCount()>0) {
+        QString cacheFile=generateCacheFileName(url, true);
+        if (!cacheFile.isEmpty()) {
+            QFile f(cacheFile);
+            if (f.open(QIODevice::WriteOnly)) {
+                f.write(data);
+            }
+        }
+    }
+}
+
+void OpmlBrowsePage::addCategory(const OpmlParser::Category &cat, QTreeWidgetItem *p)
+{
+    if (cat.categories.isEmpty() && cat.podcasts.isEmpty()) {
+        return;
+    }
+
+    QTreeWidgetItem *catItem=p ? new QTreeWidgetItem(p, QStringList() << cat.name)
+                               : new QTreeWidgetItem(tree, QStringList() << cat.name);
+
+    catItem->setData(0, IsPodcastRole, false);
+    catItem->setIcon(0, Icons::self()->folderIcon);
+    foreach (const OpmlParser::Podcast &pod, cat.podcasts) {
+        addPodcast(pod, catItem);
+    }
+    foreach (const OpmlParser::Category &cat, cat.categories) {
+        addCategory(cat, catItem);
+    }
+}
+
+void OpmlBrowsePage::addPodcast(const OpmlParser::Podcast &pod, QTreeWidgetItem *p)
+{
+    PodcastPage::addPodcast(pod.name, pod.url, pod.image, pod.description, pod.htmlUrl, p);
+}
+
+int PodcastSearchDialog::instanceCount()
+{
+    return iCount;
+}
+
+PodcastSearchDialog::PodcastSearchDialog(QWidget *parent)
+    : Dialog(parent, "PodcastSearchDialog", QSize(800, 600))
+{
+    Utils::clearOldCache(constCacheDir, 2);
+
+    iCount++;
+    setButtons(User1|Close);
+    setButtonText(User1, i18n("Subscribe"));
+
+    QWidget *mainWidget = new QWidget(this);
+    messageWidget = new MessageWidget(mainWidget);
+    spacer = new QWidget(this);
+    spacer->setFixedSize(Utils::layoutSpacing(this), 0);
+    QBoxLayout *layout = new QBoxLayout(QBoxLayout::TopToBottom, mainWidget);
+    layout->setMargin(0);
+    layout->setSpacing(0);
+
+    PageWidget *pageWidget = new PageWidget(mainWidget);
+    QList<PodcastPage *> pages;
+
+    layout->addWidget(messageWidget);
+    layout->addWidget(spacer);
+    layout->addWidget(pageWidget);
+
+    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;
+
+    GPodderSearchPage *gpodder=new GPodderSearchPage(pageWidget);
+    pageWidget->addPage(gpodder, i18n("Search %1", gpodder->name()), gpodder->icon(), i18n("Search for podcasts on %1", gpodder->name()));
+    pages << gpodder;
+
+    QFile file(":podcast_directories.xml");
+    if (file.open(QIODevice::ReadOnly)) {
+        QXmlStreamReader reader(&file);
+        while (!reader.atEnd()) {
+            reader.readNext();
+            if (reader.isStartElement() && QLatin1String("directory")==reader.name()) {
+                OpmlBrowsePage *page=new OpmlBrowsePage(pageWidget,
+                                                        reader.attributes().value(QLatin1String("name")).toString(),
+                                                        reader.attributes().value(QLatin1String("icon")).toString(),
+                                                        QUrl(reader.attributes().value(QLatin1String("url")).toString()));
+                pageWidget->addPage(page, i18n("Browse %1", page->name()), page->icon(), i18n("Browse %1 podcasts", page->name()));
+                pages << page;
+            }
+        }
+    }
+
+    foreach (PodcastPage *p, pages) {
+        connect(p, SIGNAL(rssSelected(QUrl)), SLOT(rssSelected(QUrl)));
+        connect(p, SIGNAL(error(QString)), SLOT(showError(QString)));
+    }
+
+    setCaption(i18n("Search For Podcasts"));
+    setMainWidget(mainWidget);
+    setAttribute(Qt::WA_DeleteOnClose);
+    enableButton(User1, false);
+    setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
+
+    if (-1==maxImageSize) {
+        maxImageSize=fontMetrics().height()*8;
+    }
+    connect(OnlineServicesModel::self(), SIGNAL(podcastError(QString)), this, SLOT(showError(QString)));
+    connect(messageWidget, SIGNAL(visible(bool)), SLOT(msgWidgetVisible(bool)));
+    messageWidget->hide();
+}
+
+PodcastSearchDialog::~PodcastSearchDialog()
+{
+    disconnect(OnlineServicesModel::self(), SIGNAL(podcastError(QString)), this, SLOT(showError(QString)));
+    iCount--;
+    imageCache.clear();
+}
+
+void PodcastSearchDialog::rssSelected(const QUrl &url)
+{
+    currentUrl=url;
+    enableButton(User1, currentUrl.isValid());
+}
+
+void PodcastSearchDialog::showError(const QString &msg)
+{
+    messageWidget->setError(msg);
+}
+
+void PodcastSearchDialog::showInfo(const QString &msg)
+{
+    messageWidget->setInformation(msg);
+}
+
+void PodcastSearchDialog::msgWidgetVisible(bool v)
+{
+    spacer->setFixedSize(spacer->width(), v ? spacer->width() : 0);
+}
+
+void PodcastSearchDialog::slotButtonClicked(int button)
+{
+    switch (button) {
+    case User1: {
+        QUrl fixed=PodcastService::fixUrl(currentUrl);
+        if (OnlineServicesModel::self()->subscribePodcast(fixed)) {
+            showInfo(i18n("Subscription added"));
+        } else {
+            showError(i18n("You are already subscribed to this podcast!"));
+        }
+        break;
+    }
+    case Close:
+        reject();
+        // Need to call this - if not, when dialog is closed by window X control, it is not deleted!!!!
+        Dialog::slotButtonClicked(button);
+        break;
+    default:
+        break;
+    }
+}
diff --git a/online/podcastsearchdialog.h b/online/podcastsearchdialog.h
new file mode 100644
index 0000000..7da7ac9
--- /dev/null
+++ b/online/podcastsearchdialog.h
@@ -0,0 +1,164 @@
+/*
+ * 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 PODCAST_SEARCH_DIALOG_H
+#define PODCAST_SEARCH_DIALOG_H
+
+#include "dialog.h"
+#include "icon.h"
+#include <QList>
+#include <QUrl>
+
+class QPushButton;
+class LineEdit;
+class QTreeWidget;
+class NetworkJob;
+class QIODevice;
+class Spinner;
+class QTreeWidgetItem;
+class TextBrowser;
+class MessageWidget;
+
+namespace OpmlParser
+{
+struct Category;
+struct Podcast;
+}
+
+class PodcastPage : public QWidget
+{
+    Q_OBJECT
+public:
+    PodcastPage(QWidget *p, const QString &n);
+    virtual ~PodcastPage() { cancel(); cancelImage(); }
+    
+    const Icon & icon() const { return icn; }
+    const QString & name() const { return pageName; }
+
+Q_SIGNALS:
+    void rssSelected(const QUrl &url);
+    void error(const QString &msg);
+
+protected:
+    void fetch(const QUrl &url);
+    void fetchImage(const QUrl &url);
+    void cancel();
+    void cancelImage();
+    void addPodcast(const QString &title, const QUrl &url, const QUrl &image, const QString &description, const QString &webPage, QTreeWidgetItem *p);
+
+private Q_SLOTS:
+    void selectionChanged();
+    void jobFinished();
+    void imageJobFinished();
+    void openLink(const QUrl &url);
+
+private:
+    void updateText();
+    virtual void parseResonse(QIODevice *dev) = 0;
+
+protected:
+    QString pageName;
+    Spinner *spinner;
+    Spinner *imageSpinner;
+    QTreeWidget *tree;
+    TextBrowser *text;
+    NetworkJob *job;
+    NetworkJob *imageJob;
+    Icon icn;
+};
+
+class PodcastSearchPage : public PodcastPage
+{
+    Q_OBJECT
+public:
+    PodcastSearchPage(QWidget *p, const QString &n, const QString &i, const QUrl &qu, const QString &qk, const QStringList &other=QStringList());
+    virtual ~PodcastSearchPage() { }
+    
+    void showEvent(QShowEvent *e);
+
+private:
+    void parseResonse(QIODevice *dev);
+
+private Q_SLOTS:
+    virtual void doSearch();
+    virtual void parse(const QVariant &data)=0;
+
+protected:
+    LineEdit *search;
+    QPushButton *searchButton;
+    QString currentSearch;
+    QUrl queryUrl;
+    QString queryKey;
+    QStringList otherArgs;
+};
+
+class OpmlBrowsePage : public PodcastPage
+{
+    Q_OBJECT
+public:
+    OpmlBrowsePage(QWidget *p, const QString &n, const QString &i, const QUrl &u);
+    virtual ~OpmlBrowsePage() { }
+
+    void showEvent(QShowEvent *e);
+
+private Q_SLOTS:
+    void reload();
+
+private:
+    void parseResonse(QIODevice *dev);
+    void addCategory(const OpmlParser::Category &cat, QTreeWidgetItem *p);
+    void addPodcast(const OpmlParser::Podcast &pod, QTreeWidgetItem *p);
+
+private:
+    bool loaded;
+    QUrl url;
+};
+
+class PodcastSearchDialog : public Dialog
+{
+    Q_OBJECT
+public:
+    static int instanceCount();
+    static QString constCacheDir;
+    static QString constExt;
+
+    PodcastSearchDialog(QWidget *parent);
+    virtual ~PodcastSearchDialog();
+
+private Q_SLOTS:
+    void rssSelected(const QUrl &url);
+    void showError(const QString &msg);
+    void showInfo(const QString &msg);
+    void msgWidgetVisible(bool v);
+
+private:
+    void slotButtonClicked(int button);
+
+private:
+    QUrl currentUrl;
+    MessageWidget *messageWidget;
+    QWidget *spacer;
+};
+
+#endif
+
diff --git a/online/podcastservice.cpp b/online/podcastservice.cpp
new file mode 100644
index 0000000..e0153da
--- /dev/null
+++ b/online/podcastservice.cpp
@@ -0,0 +1,651 @@
+/*
+ * 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 "podcastservice.h"
+#include "podcastsettingsdialog.h"
+#include "networkaccessmanager.h"
+#include "onlineservicesmodel.h"
+#include "musiclibraryitempodcast.h"
+#include "musiclibraryitemsong.h"
+#include "utils.h"
+#include "settings.h"
+#include "mpdconnection.h"
+#include "config.h"
+#include "httpserver.h"
+#include <QCoreApplication>
+#include <QDir>
+#include <QUrl>
+#include <QSet>
+#include <QTimer>
+#if QT_VERSION >= 0x050000
+#include <QUrlQuery>
+#endif
+#include <stdio.h>
+
+const QString PodcastService::constName=QLatin1String("Podcasts");
+QString PodcastService::iconFile;
+
+static const char * constNewFeedProperty="new-feed";
+static const char * constRssUrlProperty="rss-url";
+static const char * constDestProperty="dest";
+static const QLatin1String constPartialExt(".partial");
+
+// Move files from previous ~/.config/cantata to ~/.local/share/cantata
+static void moveToNewLocation()
+{
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC // Not required for windows - as already stored in data location!
+    if (Settings::self()->version()<CANTATA_MAKE_VERSION(1, 51, 0)) {
+        Utils::moveDir(Utils::configDir(MusicLibraryItemPodcast::constDir), Utils::dataDir(MusicLibraryItemPodcast::constDir, true));
+    }
+    #endif
+}
+
+QUrl PodcastService::fixUrl(const QString &url)
+{
+    QString trimmed(url.trimmed());
+
+    // Thanks gpodder!
+    static QMap<QString, QString> prefixMap;
+    if (prefixMap.isEmpty()) {
+        prefixMap.insert(QLatin1String("fb:"),    QLatin1String("http://feeds.feedburner.com/%1"));
+        prefixMap.insert(QLatin1String("yt:"),    QLatin1String("http://www.youtube.com/rss/user/%1/videos.rss"));
+        prefixMap.insert(QLatin1String("sc:"),    QLatin1String("http://soundcloud.com/%1"));
+        prefixMap.insert(QLatin1String("fm4od:"), QLatin1String("http://onapp1.orf.at/webcam/fm4/fod/%1.xspf"));
+        prefixMap.insert(QLatin1String("ytpl:"),  QLatin1String("http://gdata.youtube.com/feeds/api/playlists/%1"));
+    }
+
+    QMap<QString, QString>::ConstIterator it(prefixMap.constBegin());
+    QMap<QString, QString>::ConstIterator end(prefixMap.constEnd());
+    for (; it!=end; ++it) {
+        if (trimmed.startsWith(it.key())) {
+            trimmed=it.value().arg(trimmed.mid(it.key().length()));
+        }
+    }
+
+    if (!trimmed.contains(QLatin1String("://"))) {
+        trimmed.prepend(QLatin1String("http://"));
+    }
+
+    return fixUrl(QUrl(trimmed));
+}
+
+QUrl PodcastService::fixUrl(const QUrl &orig)
+{
+    QUrl u=orig;
+    if (u.scheme().isEmpty() || QLatin1String("itpc")==u.scheme() || QLatin1String("pcast")==u.scheme() ||
+        QLatin1String("feed")==u.scheme() || QLatin1String("itms")==u.scheme()) {
+        u.setScheme(QLatin1String("http"));
+    }
+    return u;
+}
+
+PodcastService::PodcastService(MusicModel *m)
+    : OnlineService(m, i18n("Podcasts"))
+    , rssUpdateTimer(0)
+{
+    moveToNewLocation();
+
+    loaded=true;
+    setUseArtistImages(false);
+    setUseAlbumImages(false);
+    QMetaObject::invokeMethod(this, "loadAll", Qt::QueuedConnection);
+    connect(MPDConnection::self(), SIGNAL(currentSongUpdated(const Song &)), this, SLOT(currentMpdSong(const Song &)));
+    if (iconFile.isEmpty()) {
+        #ifdef Q_OS_WIN
+        iconFile=QCoreApplication::applicationDirPath()+"/icons/podcasts.png";
+        #else
+        iconFile=QString(INSTALL_PREFIX"/share/")+QCoreApplication::applicationName()+"/icons/podcasts.png";
+        #endif
+    }
+}
+
+Song PodcastService::fixPath(const Song &orig, bool) const
+{
+    Song song=orig;
+    song.setPodcastLocalPath(QString());
+    song.setIsFromOnlineService(constName);
+    if (!orig.podcastLocalPath().isEmpty() && QFile::exists(orig.podcastLocalPath())) {
+        song.file=orig.podcastLocalPath();
+        song.file=HttpServer::self()->encodeUrl(song);
+        return song;
+    }
+    return encode(song);
+}
+
+void PodcastService::clear()
+{
+    cancelAllJobs();
+    ::OnlineService::clear();
+}
+
+void PodcastService::loadAll()
+{
+    QString dir=Utils::dataDir(MusicLibraryItemPodcast::constDir);
+
+    if (!dir.isEmpty()) {
+        QDir d(dir);
+        QStringList entries=d.entryList(QStringList() << "*"+MusicLibraryItemPodcast::constExt, QDir::Files|QDir::Readable|QDir::NoDot|QDir::NoDotDot);
+        foreach (const QString &e, entries) {
+            if (!update) {
+                update=new OnlineServiceMusicRoot();
+            }
+
+            MusicLibraryItemPodcast *podcast=new MusicLibraryItemPodcast(dir+e, update);
+            if (podcast->load()) {
+                update->append(podcast);
+            } else {
+                delete podcast;
+            }
+        }
+
+        if (update) {
+            if (update->childItems().isEmpty()) {
+                delete update;
+            } else {
+                applyUpdate();
+            }
+        }
+        startRssUpdateTimer();
+    }
+}
+
+void PodcastService::cancelAll()
+{
+    foreach (NetworkJob *j, rssJobs) {
+        disconnect(j, SIGNAL(finished()), this, SLOT(rssJobFinished()));
+        j->abort();
+        j->deleteLater();
+    }
+    rssJobs.clear();
+    setBusy(!rssJobs.isEmpty() || !downloadJobs.isEmpty());
+}
+
+void PodcastService::rssJobFinished()
+{
+    NetworkJob *j=dynamic_cast<NetworkJob *>(sender());
+    if (!j || !rssJobs.contains(j)) {
+        return;
+    }
+
+    j->deleteLater();
+    rssJobs.removeAll(j);
+    bool isNew=j->property(constNewFeedProperty).toBool();
+
+    if (j->ok()) {
+        if (updateUrls.contains(j->url())){
+            updateUrls.remove(j->url());
+            if (updateUrls.isEmpty()) {
+                lastRssUpdate=QDateTime::currentDateTime();
+                Settings::self()->saveLastRssUpdate(lastRssUpdate);
+                startRssUpdateTimer();
+            }
+        }
+
+
+        MusicLibraryItemPodcast *podcast=new MusicLibraryItemPodcast(QString(), this);
+        MusicLibraryItemPodcast::RssStatus loadStatus=podcast->loadRss(j->actualJob());
+        if (MusicLibraryItemPodcast::Loaded==loadStatus) {
+            bool autoDownload=Settings::self()->podcastAutoDownload();
+
+            if (isNew) {
+                podcast->save();
+                beginInsertRows(index(), childCount(), childCount());
+                m_childItems.append(podcast);
+                if (autoDownload) {
+                    foreach (MusicLibraryItem *i, podcast->childItems()) {
+                        MusicLibraryItemSong *song=static_cast<MusicLibraryItemSong *>(i);
+                        downloadEpisode(podcast, QUrl(song->file()));
+                    }
+                }
+                endInsertRows();
+//                emitNeedToSort();
+            } else {
+                MusicLibraryItemPodcast *orig = getPodcast(j->url());
+                if (!orig) {
+                    delete podcast;
+                    return;
+                }
+                QSet<QString> origSongs;
+                QSet<QString> newSongs;
+                foreach (MusicLibraryItem *i, orig->childItems()) {
+                    MusicLibraryItemPodcastEpisode *episode=static_cast<MusicLibraryItemPodcastEpisode *>(i);
+                    origSongs.insert(episode->file());
+                }
+                foreach (MusicLibraryItem *i, podcast->childItems()) {
+                    MusicLibraryItemSong *song=static_cast<MusicLibraryItemSong *>(i);
+                    newSongs.insert(song->file());
+                }
+
+                QSet<QString> added=newSongs-origSongs;
+                QSet<QString> removed=origSongs-newSongs;
+                if (added.count() || removed.count()) {
+                    QModelIndex origIndex=createIndex(orig);
+                    if (removed.count()) {
+                        foreach (const QString &s, removed) {
+                            MusicLibraryItemPodcastEpisode *episode=orig->getEpisode(s);
+                            if (episode->localPath().isEmpty() || !QFile::exists(episode->localPath())) {
+                                int idx=orig->indexOf(episode);
+                                if (-1!=idx) {
+                                    beginRemoveRows(origIndex, idx, idx);
+                                    orig->remove(idx);
+                                    endRemoveRows();
+                                }
+                            }
+                        }
+                    }
+                    if (added.count()) {
+                        QList<MusicLibraryItemPodcastEpisode *> newSongs;
+                        foreach (const QString &s, added) {
+                            MusicLibraryItemPodcastEpisode *episode=podcast->getEpisode(s);
+                            if (episode) {
+                                newSongs.append(episode);
+                                if (autoDownload) {
+                                    downloadEpisode(orig, QUrl(episode->file()));
+                                }
+                            }
+                        }
+
+                        beginInsertRows(origIndex, orig->childCount(), (orig->childCount()+newSongs.count())-1);
+                        orig->addAll(newSongs);
+                        endInsertRows();
+                    }
+
+                    orig->setUnplayedCount();
+                    orig->save();
+//                    emitNeedToSort();
+                }
+
+                delete podcast;
+            }
+
+        } else if (isNew) {
+            delete podcast;
+            if (MusicLibraryItemPodcast::VideoPodcast==loadStatus) {
+                emitError(i18n("Cantata only supports audio podcasts! %1 contains only video podcasts.", j->url().toString()), isNew);
+            } else {
+                emitError(i18n("Failed to parse %1", j->url().toString()), isNew);
+            }
+        }
+    } else {
+        emitError(i18n("Failed to download %1", j->url().toString()), isNew);
+    }
+    setBusy(!rssJobs.isEmpty() || !downloadJobs.isEmpty());
+}
+
+void PodcastService::configure(QWidget *p)
+{
+    PodcastSettingsDialog dlg(p);
+    if (QDialog::Accepted==dlg.exec()) {
+        int changes=dlg.changes();
+        if (changes&PodcastSettingsDialog::RssUpdate) {
+            startRssUpdateTimer();
+        }
+    }
+}
+
+MusicLibraryItemPodcast * PodcastService::getPodcast(const QUrl &url) const
+{
+    foreach (MusicLibraryItem *i, m_childItems) {
+        if (static_cast<MusicLibraryItemPodcast *>(i)->rssUrl()==url) {
+            return static_cast<MusicLibraryItemPodcast *>(i);
+        }
+    }
+    return 0;
+}
+
+MusicLibraryItemPodcastEpisode * PodcastService::getEpisode(const MusicLibraryItemPodcast *podcast, const QUrl &episode)
+{
+    if (podcast) {
+        foreach (MusicLibraryItem *i, podcast->childItems()) {
+            MusicLibraryItemPodcastEpisode *song=static_cast<MusicLibraryItemPodcastEpisode *>(i);
+            if (QUrl(song->file())==episode) {
+                return song;
+            }
+        }
+    }
+
+    return 0;
+}
+
+void PodcastService::unSubscribe(MusicLibraryItem *item)
+{
+    int row=m_childItems.indexOf(item);
+    if (row>=0) {
+        beginRemoveRows(index(), row, row);
+        static_cast<MusicLibraryItemPodcast *>(item)->removeFiles();
+        delete m_childItems.takeAt(row);
+        resetRows();
+        endRemoveRows();
+        if (m_childItems.isEmpty()) {
+            stopRssUpdateTimer();
+        }
+    }
+}
+
+void PodcastService::refreshSubscription(MusicLibraryItem *item)
+{
+    if (item) {
+        QUrl url=static_cast<MusicLibraryItemPodcast *>(item)->rssUrl();
+        if (processingUrl(url)) {
+            return;
+        }
+        addUrl(url, false);
+    } else {
+        updateRss();
+    }
+}
+
+bool PodcastService::processingUrl(const QUrl &url) const
+{
+    foreach (NetworkJob *j, rssJobs) {
+        if (j->url()==url) {
+            return true;
+        }
+    }
+    return false;
+}
+
+void PodcastService::addUrl(const QUrl &url, bool isNew)
+{
+    setBusy(true);
+    NetworkJob *job=NetworkAccessManager::self()->get(QUrl(url));
+    connect(job, SIGNAL(finished()), this, SLOT(rssJobFinished()));
+    job->setProperty(constNewFeedProperty, isNew);
+    rssJobs.append(job);
+}
+
+bool PodcastService::downloadingEpisode(const QUrl &url) const
+{
+    foreach (NetworkJob *j, downloadJobs) {
+        if (j->url()==url) {
+            return true;
+        }
+    }
+    return false;
+}
+
+void PodcastService::cancelAllDownloads()
+{
+    foreach (NetworkJob *j, downloadJobs) {
+        cancelDownload(j);
+    }
+    downloadJobs.clear();
+    setBusy(!rssJobs.isEmpty() || !downloadJobs.isEmpty());
+}
+
+void PodcastService::downloadPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes)
+{
+    foreach (MusicLibraryItemPodcastEpisode *ep, episodes) {
+        QUrl url(ep->file());
+        if (!downloadingEpisode(url)) {
+            downloadEpisode(pod, url);
+        }
+    }
+}
+
+void PodcastService::deleteDownloadedPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes)
+{
+    foreach (MusicLibraryItemPodcastEpisode *ep, episodes) {
+        QUrl url(ep->file());
+        if (downloadingEpisode(url)) {
+            cancelDownload(url);
+        }
+        QString fileName=ep->localPath();
+        if (!fileName.isEmpty()) {
+            if (QFile::exists(fileName)) {
+                QFile::remove(fileName);
+            }
+            QString dirName=fileName.isEmpty() ? QString() : Utils::getDir(fileName);
+            if (!dirName.isEmpty()) {
+                QDir dir(dirName);
+                if (dir.exists()) {
+                    dir.rmdir(dirName);
+                }
+            }
+            ep->setLocalPath(QString());
+            ep->setDownloadProgress(-1);
+            emitDataChanged(createIndex(ep));
+        }
+    }
+    pod->save();
+}
+
+static QString encodeName(const QString &name)
+{
+    QString n=name;
+    n=n.replace("/", "_");
+    n=n.replace("\\", "_");
+    n=n.replace(":", "_");
+    return n;
+}
+
+void PodcastService::downloadEpisode(const MusicLibraryItemPodcast *podcast, const QUrl &episode)
+{
+    QString dest=Settings::self()->podcastDownloadPath();
+    if (dest.isEmpty()) {
+        return;
+    }
+    if (downloadingEpisode(episode)) {
+        return;
+    }
+
+    dest=Utils::fixPath(dest)+Utils::fixPath(encodeName(podcast->data()))+Utils::getFile(episode.toString());
+    setBusy(true);
+    NetworkJob *job=NetworkAccessManager::self()->get(QUrl(episode));
+    connect(job, SIGNAL(finished()), this, SLOT(downloadJobFinished()));
+    connect(job, SIGNAL(readyRead()), this, SLOT(downloadReadyRead()));
+    connect(job, SIGNAL(downloadPercent(int)), this, SLOT(downloadPercent(int)));
+    job->setProperty(constRssUrlProperty, podcast->rssUrl());
+    job->setProperty(constDestProperty, dest);
+    downloadJobs.append(job);
+
+    QString partial=dest+constPartialExt;
+    if (QFile::exists(partial)) {
+        QFile::remove(partial);
+    }
+}
+
+void PodcastService::cancelDownload(const QUrl &url)
+{
+    foreach (NetworkJob *j, downloadJobs) {
+        if (j->url()==url) {
+            cancelDownload(j);
+            downloadJobs.removeAll(j);
+            break;
+        }
+    }
+    setBusy(!rssJobs.isEmpty() || !downloadJobs.isEmpty());
+}
+
+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();
+
+    QString dest=job->property(constDestProperty).toString();
+    QString partial=dest.isEmpty() ? QString() : QString(dest+constPartialExt);
+    if (!partial.isEmpty() && QFile::exists(partial)) {
+        QFile::remove(partial);
+    }
+}
+
+void PodcastService::downloadJobFinished()
+{
+    NetworkJob *job=dynamic_cast<NetworkJob *>(sender());
+    if (!job || !downloadJobs.contains(job)) {
+        return;
+    }
+    job->deleteLater();
+
+    QString dest=job->property(constDestProperty).toString();
+    QString partial=dest.isEmpty() ? QString() : QString(dest+constPartialExt);
+
+    if (job->ok()) {
+        QString dest=job->property(constDestProperty).toString();
+        if (dest.isEmpty()) {
+            return;
+        }
+
+        QString partial=dest+constPartialExt;
+        if (QFile::exists(partial)) {
+            if (QFile::exists(dest)) {
+                QFile::remove(dest);
+            }
+            if (QFile::rename(partial, dest)) {
+                MusicLibraryItemPodcast *pod=getPodcast(job->property(constRssUrlProperty).toUrl());
+                if (pod) {
+                    MusicLibraryItemPodcastEpisode *song=getEpisode(pod, job->url());
+                    if (song) {
+                        song->setLocalPath(dest);
+                        song->setDownloadProgress(-1);
+                        pod->save();
+                        emitDataChanged(createIndex(song));
+                    }
+                }
+            }
+        }
+    } else if (!partial.isEmpty() && QFile::exists(partial)) {
+        QFile::remove(partial);
+    }
+
+    downloadJobs.removeAll(job);
+    setBusy(!rssJobs.isEmpty() || !downloadJobs.isEmpty());
+}
+
+void PodcastService::downloadReadyRead()
+{
+    NetworkJob *job=dynamic_cast<NetworkJob *>(sender());
+    if (!job || !downloadJobs.contains(job)) {
+        return;
+    }
+    QString dest=job->property(constDestProperty).toString();
+    QString partial=dest.isEmpty() ? QString() : QString(dest+constPartialExt);
+    if (!partial.isEmpty()) {
+        QString dir=Utils::getDir(partial);
+        if (!QDir(dir).exists()) {
+            QDir(dir).mkpath(dir);
+        }
+        if (!QDir(dir).exists()) {
+            return;
+        }
+        QFile f(partial);
+        while (true) {
+            const qint64 bytes = job->bytesAvailable();
+            if (bytes <= 0) {
+                break;
+            }
+            if (!f.isOpen()) {
+                if (!f.open(QIODevice::Append)) {
+                    return;
+                }
+            }
+            f.write(job->read(bytes));
+        }
+    }
+}
+
+void PodcastService::downloadPercent(int pc)
+{
+    NetworkJob *job=dynamic_cast<NetworkJob *>(sender());
+    if (!job || !downloadJobs.contains(job)) {
+        return;
+    }
+    MusicLibraryItemPodcast *pod=getPodcast(job->property(constRssUrlProperty).toUrl());
+    if (pod) {
+        MusicLibraryItemPodcastEpisode *song=getEpisode(pod, job->url());
+        if (song) {
+            song->setDownloadProgress(pc);
+            emitDataChanged(createIndex(song));
+        }
+    }
+}
+
+void PodcastService::startRssUpdateTimer()
+{
+    if (0==Settings::self()->rssUpdate() || m_childItems.isEmpty()) {
+        stopRssUpdateTimer();
+        return;
+    }
+    if (!rssUpdateTimer) {
+        rssUpdateTimer=new QTimer(this);
+        rssUpdateTimer->setSingleShot(true);
+        connect(rssUpdateTimer, SIGNAL(timeout()), this, SLOT(updateRss()));
+    }
+    if (!lastRssUpdate.isValid()) {
+        lastRssUpdate=Settings::self()->lastRssUpdate();
+    }
+    if (!lastRssUpdate.isValid()) {
+        updateRss();
+    } else {
+        QDateTime nextUpdate = lastRssUpdate.addSecs(Settings::self()->rssUpdate()*60);
+        int secsUntilNextUpdate = QDateTime::currentDateTime().secsTo(nextUpdate);
+        if (secsUntilNextUpdate<0) {
+            // Oops, missed update time!!!
+            updateRss();
+        } else {
+            rssUpdateTimer->start(secsUntilNextUpdate*1000ll);
+        }
+    }
+}
+
+void PodcastService::stopRssUpdateTimer()
+{
+    if (rssUpdateTimer) {
+        rssUpdateTimer->stop();
+    }
+}
+
+void PodcastService::updateRss()
+{
+    foreach (MusicLibraryItem *i, m_childItems) {
+        QUrl url=static_cast<MusicLibraryItemPodcast *>(i)->rssUrl();
+        updateUrls.insert(url);
+        if (!processingUrl(url)) {
+            addUrl(url, false);
+        }
+    }
+}
+
+void PodcastService::currentMpdSong(const Song &s)
+{
+    if (s.isFromOnlineService() && s.album==constName) {
+        foreach (MusicLibraryItem *p, m_childItems) {
+            MusicLibraryItemPodcast *podcast=static_cast<MusicLibraryItemPodcast *>(p);
+            foreach (MusicLibraryItem *i, podcast->childItems()) {
+                MusicLibraryItemSong *song=static_cast<MusicLibraryItemSong *>(i);
+                if (song->file()==s.file || song->song().podcastLocalPath()==s.file) {
+                    if (!song->song().hasBeenPlayed()) {
+                        podcast->setPlayed(song);
+                        emitDataChanged(createIndex(song));
+                        emitDataChanged(createIndex(podcast));
+                        podcast->save();
+                    }
+                    return;
+                }
+            }
+        }
+    }
+}
diff --git a/online/podcastservice.h b/online/podcastservice.h
new file mode 100644
index 0000000..bfc3fc4
--- /dev/null
+++ b/online/podcastservice.h
@@ -0,0 +1,109 @@
+/*
+ * 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 PODCAST_SERVICE_H
+#define PODCAST_SERVICE_H
+
+#include "onlineservice.h"
+#include "networkaccessmanager.h"
+#include <QLatin1String>
+#include <QList>
+#include <QDateTime>
+#include <QSet>
+#include <QUrl>
+
+class QTimer;
+class MusicLibraryItemPodcast;
+class MusicLibraryItemPodcastEpisode;
+
+class PodcastService : public OnlineService
+{
+    Q_OBJECT
+
+public:
+    static const QString constName;
+
+    PodcastService(MusicModel *m);
+    ~PodcastService() { cancelAll(); }
+
+    Song fixPath(const Song &orig, bool) const;
+    void loadConfig() { }
+    void saveConfig() { }
+    void createLoader() { }
+    bool canConfigure() const { return true; }
+    bool canSubscribe() const { return true; }
+    bool canLoad() const { return false; }
+    bool isPodcasts() const { return true; }
+    void clear();
+    const QString & id() const { return constName; }
+    void configure(QWidget *p);
+    bool subscribedToUrl(const QUrl &url) { return 0!=getPodcast(url); }
+    void unSubscribe(MusicLibraryItem *item);
+    void refreshSubscription(MusicLibraryItem *item);
+    bool processingUrl(const QUrl &url) const;
+    void addUrl(const QUrl &url, bool isNew=true);
+    static const QString & iconPath() { return iconFile; }
+    static QUrl fixUrl(const QString &url);
+    static QUrl fixUrl(const QUrl &orig);
+    static bool isUrlOk(const QUrl &u) { return QLatin1String("http")==u.scheme() || QLatin1String("https")==u.scheme(); }
+
+    bool isDownloading() const { return !downloadJobs.isEmpty(); }
+    void cancelAllDownloads();
+    void downloadPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes);
+    void deleteDownloadedPodcasts(MusicLibraryItemPodcast *pod, const QList<MusicLibraryItemPodcastEpisode *> &episodes);
+
+    void cancelAllJobs() { cancelAll(); cancelAllDownloads(); }
+
+private:
+    void cancelAll();
+    MusicLibraryItemPodcast * getPodcast(const QUrl &url) const;
+    MusicLibraryItemPodcastEpisode * getEpisode(const MusicLibraryItemPodcast *podcast, const QUrl &episode);
+    void startRssUpdateTimer();
+    void stopRssUpdateTimer();
+    bool downloadingEpisode(const QUrl &url) const;
+    void downloadEpisode(const MusicLibraryItemPodcast *podcast, const QUrl &episode);
+    void cancelDownload(const QUrl &url);
+    void cancelDownload(NetworkJob *job);
+
+private Q_SLOTS:
+    void loadAll();
+    void rssJobFinished();
+    void updateRss();
+    void currentMpdSong(const Song &s);
+    void downloadJobFinished();
+    void downloadReadyRead();
+    void downloadPercent(int pc);
+
+private:
+    QList<NetworkJob *> rssJobs;
+    QList<NetworkJob *> downloadJobs;
+    QTimer *rssUpdateTimer;
+    QDateTime lastRssUpdate;
+    QTimer *deleteTimer;
+    QDateTime lastDelete;
+    QSet<QUrl> updateUrls;
+    static QString iconFile;
+};
+
+#endif
+
diff --git a/online/podcastsettingsdialog.cpp b/online/podcastsettingsdialog.cpp
new file mode 100644
index 0000000..d14b749
--- /dev/null
+++ b/online/podcastsettingsdialog.cpp
@@ -0,0 +1,140 @@
+/*
+ * 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 "podcastsettingsdialog.h"
+#include "buddylabel.h"
+#include "pathrequester.h"
+#include "settings.h"
+#include "localize.h"
+#include "utils.h"
+#include <QComboBox>
+#include <QFormLayout>
+
+static void setIndex(QComboBox *combo, int val)
+{
+    int possible=0;
+    for (int i=0; i<combo->count(); ++i) {
+        int cval=combo->itemData(i).toInt();
+        if (cval==val) {
+            combo->setCurrentIndex(i);
+            possible=-1;
+            break;
+        }
+        if (cval<val) {
+            possible=i;
+        }
+    }
+
+    if (possible>=0) {
+        combo->setCurrentIndex(possible);
+    }
+}
+
+PodcastSettingsDialog::PodcastSettingsDialog(QWidget *p)
+    : Dialog(p, "PodcastSettingsDialog", QSize(550, 160))
+{
+    QWidget *mw=new QWidget(this);
+    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);
+
+    int row=0;
+    lay->setWidget(row, QFormLayout::LabelRole, updateLabel);
+    lay->setWidget(row++, QFormLayout::FieldRole, updateCombo);
+    lay->setWidget(row, QFormLayout::LabelRole, downloadLabel);
+    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);
+
+    setButtons(Ok|Cancel);
+    setMainWidget(mw);
+    setCaption(i18n("Podcast Settings"));
+
+    updateCombo->addItem(i18n("Manually"), 0);
+    updateCombo->addItem(i18n("Every 15 minutes"), 15);
+    updateCombo->addItem(i18n("Every 30 minutes"), 30);
+    updateCombo->addItem(i18n("Every hour"), 60);
+    updateCombo->addItem(i18n("Every 2 hours"), 2*60);
+    updateCombo->addItem(i18n("Every 6 hours"), 6*60);
+    updateCombo->addItem(i18n("Every 12 hours"), 12*60);
+    updateCombo->addItem(i18n("Every day"), 24*60);
+    updateCombo->addItem(i18n("Every week"), 7*24*60);
+
+    origRssUpdate=Settings::self()->rssUpdate();
+    setIndex(updateCombo, origRssUpdate);
+    connect(updateCombo, SIGNAL(currentIndexChanged(int)), SLOT(checkSaveable()));
+    origPodcastDownloadPath=Utils::convertDirForDisplay(Settings::self()->podcastDownloadPath());
+    origPodcastAutoDownload=Settings::self()->podcastAutoDownload();
+    downloadPath->setText(origPodcastDownloadPath);
+    autoDownload->setChecked(origPodcastAutoDownload);
+    connect(downloadPath, SIGNAL(textChanged(QString)), SLOT(checkSaveable()));
+    connect(autoDownload, SIGNAL(toggled(bool)), SLOT(checkSaveable()));
+    enableButton(Ok, false);
+    changed=0;
+}
+
+void PodcastSettingsDialog::checkSaveable()
+{
+    enableButton(Ok, origPodcastAutoDownload!=autoDownload->isChecked() ||
+                     updateCombo->itemData(updateCombo->currentIndex()).toInt()!=origRssUpdate ||
+                     downloadPath->text().trimmed()!=origPodcastDownloadPath);
+}
+
+void PodcastSettingsDialog::slotButtonClicked(int button)
+{
+    switch (button) {
+    case Ok:
+        if (updateCombo->itemData(updateCombo->currentIndex()).toInt()!=origRssUpdate) {
+            changed|=RssUpdate;
+            Settings::self()->saveRssUpdate(updateCombo->itemData(updateCombo->currentIndex()).toInt());
+        }
+        if (downloadPath->text().trimmed()!=origPodcastDownloadPath) {
+            changed|=DownloadPath;
+            Settings::self()->savePodcastDownloadPath(Utils::convertDirFromDisplay(downloadPath->text().trimmed()));
+        }
+        if (origPodcastAutoDownload!=autoDownload->isChecked()) {
+            changed|=AutoDownload;
+            Settings::self()->savePodcastAutoDownload(autoDownload->isChecked());
+        }
+        accept();
+    case Close:
+    case Cancel:
+        reject();
+        // Need to call this - if not, when dialog is closed by window X control, it is not deleted!!!!
+        Dialog::slotButtonClicked(button);
+        break;
+    default:
+        break;
+    }
+}
diff --git a/devices/devicepropertiesdialog.h b/online/podcastsettingsdialog.h
similarity index 60%
copy from devices/devicepropertiesdialog.h
copy to online/podcastsettingsdialog.h
index ba7885b..03b8de9 100644
--- a/devices/devicepropertiesdialog.h
+++ b/online/podcastsettingsdialog.h
@@ -21,36 +21,45 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef DEVICEPROPERTIESDIALOG_H
-#define DEVICEPROPERTIESDIALOG_H
+#ifndef PODCAST_SETTINGS_DIALOG_H
+#define PODCAST_SETTINGS_DIALOG_H
 
 #include "dialog.h"
-#include "device.h"
+#include "onoffbutton.h"
 
-class FilenameSchemeDialog;
-class DevicePropertiesWidget;
+class QComboBox;
+class PathRequester;
 
-class DevicePropertiesDialog : public Dialog
+class PodcastSettingsDialog : public Dialog
 {
     Q_OBJECT
-
 public:
-    DevicePropertiesDialog(QWidget *parent);
-    void show(const QString &path, const DeviceOptions &opts, int props) { show(path, opts, QList<DeviceStorage>(), props); }
-    void show(const QString &path, const DeviceOptions &opts, const QList<DeviceStorage> &storage, int props);
+    enum Changes {
+        RssUpdate    = 0x01,
+        DownloadPath = 0x02,
+        AutoDownload = 0x04
+    };
+
+    PodcastSettingsDialog(QWidget *p);
+    virtual ~PodcastSettingsDialog() { }
 
-Q_SIGNALS:
-    void updatedSettings(const QString &path, const DeviceOptions &opts);
-    void cancelled();
+    int changes() const { return changed; }
 
 private Q_SLOTS:
-    void enableOkButton();
+    void checkSaveable();
 
 private:
     void slotButtonClicked(int button);
 
 private:
-    DevicePropertiesWidget *devProp;
+    QComboBox *updateCombo;
+    int origRssUpdate;
+    PathRequester *downloadPath;
+    OnOffButton *autoDownload;
+    QString origPodcastDownloadPath;
+    bool origPodcastAutoDownload;
+    int changed;
 };
 
+
 #endif
diff --git a/online/rssparser.cpp b/online/rssparser.cpp
new file mode 100644
index 0000000..f832698
--- /dev/null
+++ b/online/rssparser.cpp
@@ -0,0 +1,176 @@
+/*
+ * 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 "rssparser.h"
+#include <QXmlStreamReader>
+#include <QStringList>
+#include <QSet>
+
+static const char * constITunesNameSpace = "http://www.itunes.com/dtds/podcast-1.0.dtd";
+static const char * constMediaNameSpace = "http://search.yahoo.com/mrss/";
+
+using namespace RssParser;
+
+static bool parseUntil(QXmlStreamReader &reader, const QString &elem)
+{
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (reader.isStartElement() && reader.name() == elem) {
+            return true;
+        }
+    }
+    return false;
+}
+
+static void consumeCurrentElement(QXmlStreamReader &reader)
+{
+    int level = 1;
+    while (0!=level && !reader.atEnd()) {
+        switch (reader.readNext()) {
+            case QXmlStreamReader::StartElement: ++level; break;
+            case QXmlStreamReader::EndElement:   --level; break;
+            default: break;
+        }
+    }
+}
+
+static QDateTime parseRfc822DateTime(const QString& text)
+{
+    // This sucks but we need it because some podcasts don't quite follow the
+    // spec properly - they might have 1-digit hour numbers for example.
+
+    QRegExp re("([a-zA-Z]{3}),? (\\d{1,2}) ([a-zA-Z]{3}) (\\d{4}) (\\d{1,2}):(\\d{1,2}):(\\d{1,2})");
+    if (-1==re.indexIn(text)) {
+        return QDateTime();
+    }
+
+    return QDateTime(QDate::fromString(QString("%1 %2 %3 %4").arg(re.cap(1), re.cap(3), re.cap(2), re.cap(4)), Qt::TextDate),
+                     QTime(re.cap(5).toInt(), re.cap(6).toInt(), re.cap(7).toInt()));
+}
+
+static QUrl parseImage(QXmlStreamReader &reader)
+{
+    QUrl url;
+    while (!reader.atEnd()) {
+        reader.readNext();
+        if (reader.isStartElement()) {
+            if (QLatin1String("url")==reader.name()) {
+                url=QUrl::fromEncoded(reader.readElementText().toLatin1());
+            } else {
+                consumeCurrentElement(reader);
+            }
+        } else if (reader.isEndElement()) {
+            break;
+        }
+    }
+    return url;
+}
+
+static Episode parseEpisode(QXmlStreamReader &reader)
+{
+    Episode ep;
+
+    while (!reader.atEnd()) {
+        reader.readNext();
+        const QStringRef name = reader.name();
+
+        if (reader.isStartElement()) {
+            if (QLatin1String("title")==name) {
+                ep.name=reader.readElementText();
+            } else if (QLatin1String("duration")==name && constITunesNameSpace==reader.namespaceUri()) {
+                QStringList parts = reader.readElementText().split(':');
+                if (2==parts.count()) {
+                    ep.duration=(parts[0].toInt() * 60) + parts[1].toInt();
+                } else if (parts.count()>=3) {
+                    ep.duration=(parts[0].toInt() * 60*60) + (parts[1].toInt() * 60) + parts[2].toInt();
+                }
+            } else if (0==ep.duration && QLatin1String("content")==name && constMediaNameSpace==reader.namespaceUri()) {
+                ep.duration=reader.attributes().value(QLatin1String("duration")).toString().toUInt();
+            } else if (QLatin1String("enclosure")==name) {
+                static QSet<QString> audioFormats;
+                if (audioFormats.isEmpty()) {
+                    audioFormats.insert(QLatin1String("mp3")); audioFormats.insert(QLatin1String("MP3"));
+                    audioFormats.insert(QLatin1String("ogg")); audioFormats.insert(QLatin1String("OGG"));
+                    audioFormats.insert(QLatin1String("wma")); audioFormats.insert(QLatin1String("WMA"));
+                }
+                QString type=reader.attributes().value(QLatin1String("type")).toString();
+                if (type.startsWith(QLatin1String("audio/")) || audioFormats.contains(type)) {
+                    ep.url=QUrl::fromEncoded(reader.attributes().value(QLatin1String("url")).toString().toLatin1());
+                } else if (type.startsWith(QLatin1String("video/")) ) {
+                    ep.video=true;
+                }
+                consumeCurrentElement(reader);
+            } else if (QLatin1String("pubDate")==name) {
+                 ep.publicationDate=parseRfc822DateTime(reader.readElementText());
+            } else {
+                consumeCurrentElement(reader);
+            }
+        } else if (reader.isEndElement()) {
+            break;
+        }
+    }
+
+    return ep;
+}
+
+Channel RssParser::parse(QIODevice *dev)
+{
+    Channel ch;
+    QXmlStreamReader reader(dev);
+    if (parseUntil(reader, QLatin1String("rss")) && parseUntil(reader, QLatin1String("channel"))) {
+        while (!reader.atEnd()) {
+            reader.readNext();
+
+            if (reader.isStartElement()) {
+                const QStringRef name = reader.name();
+                if (ch.name.isEmpty() && QLatin1String("title")==name) {
+                    ch.name=reader.readElementText();
+                } else if (QLatin1String("image")==name && ch.image.isEmpty()) {
+                    if (constITunesNameSpace==reader.namespaceUri()) {
+                        ch.image=reader.attributes().value(QLatin1String("href")).toString();
+                        consumeCurrentElement(reader);
+                    } else {
+                        ch.image=parseImage(reader);
+                    }
+                } else if (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 {
+                    consumeCurrentElement(reader);
+                }
+            } else if (reader.isEndElement()) {
+                break;
+            }
+        }
+    }
+
+    if (ch.video && !ch.episodes.isEmpty()) {
+        ch.video=false;
+    }
+
+    return ch;
+}
diff --git a/devices/cdalbum.h b/online/rssparser.h
similarity index 64%
copy from devices/cdalbum.h
copy to online/rssparser.h
index 2c99f09..99251d6 100644
--- a/devices/cdalbum.h
+++ b/online/rssparser.h
@@ -21,23 +21,42 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef CDALBUM_H
-#define CDALBUM_H
+#ifndef RSSPARSER_H
+#define RSSPARSER_H
 
+#include <QUrl>
 #include <QString>
 #include <QList>
-#include "song.h"
+#include <QList>
+#include <QDateTime>
+
+class QIODevice;
+
+namespace RssParser
+{
+
+struct Episode
+{
+    Episode() : duration(0), video(false) { }
+    QString name;
+    QDateTime publicationDate;
+    unsigned int duration;
+    QUrl url;
+    bool video;
+};
 
-struct CdAlbum {
-    CdAlbum() : isDefault(false), year(0), disc(0)  { }
-    bool isNull() const { return 0==year && 0==disc && tracks.isEmpty() && name.isEmpty() && artist.isEmpty() && genre.isEmpty(); }
-    bool isDefault;
+struct Channel
+{
+    Channel() : video(false) { }
     QString name;
-    QString artist;
-    QString genre;
-    int year;
-    int disc;
-    QList<Song> tracks;
+    QUrl image;
+    QList<Episode> episodes;
+    bool video;
+    bool isValid() const { return !name.isEmpty(); }
 };
 
+Channel parse(QIODevice *dev);
+
+}
+
 #endif
diff --git a/online/soundcloudservice.cpp b/online/soundcloudservice.cpp
index d7444df..f6809a6 100644
--- a/online/soundcloudservice.cpp
+++ b/online/soundcloudservice.cpp
@@ -26,20 +26,30 @@
 #include "qjson/parser.h"
 #include "onlineservicesmodel.h"
 #include "musiclibraryitemsong.h"
+#include "config.h"
+#include <QCoreApplication>
 #include <QUrl>
 #if QT_VERSION >= 0x050000
 #include <QUrlQuery>
 #endif
 
 const QLatin1String SoundCloudService::constName("SoundCloud");
+QString SoundCloudService::iconFile;
 static const QString constApiKey=QLatin1String("0cb23dce473528973ce74815bd36a334");
 static const QString constHost=QLatin1String("api.soundcloud.com");
-static const QString constUrl=QLatin1String("http://")+constHost+QLatin1Char('/');
+static const QString constUrl=QLatin1String("https://")+constHost+QLatin1Char('/');
 
 SoundCloudService::SoundCloudService(MusicModel *m)
     : OnlineService(m, constName)
     , job(0)
 {
+    if (iconFile.isEmpty()) {
+        #ifdef Q_OS_WIN
+        iconFile=QCoreApplication::applicationDirPath()+"/icons/soundcloud.png";
+        #else
+        iconFile=QString(INSTALL_PREFIX"/share/")+QCoreApplication::applicationName()+"/icons/soundcloud.png";
+        #endif
+    }
     setUseArtistImages(false);
     setUseAlbumImages(false);
 }
@@ -103,54 +113,56 @@ void SoundCloudService::cancelAll()
 
 void SoundCloudService::jobFinished()
 {
-    QNetworkReply *j=dynamic_cast<QNetworkReply *>(sender());
+    NetworkJob *j=dynamic_cast<NetworkJob *>(sender());
     if (!j || j!=job) {
         return;
     }
 
     j->deleteLater();
 
-    QJson::Parser parser;
-    #ifdef Q_OS_WIN
-    QVariant result = parser.parse(j->readAll());
-    #else
-    QVariant result = parser.parse(j);
-    #endif
-    if (result.isValid()) {
-        QVariantList list = result.toList();
-        foreach(const QVariant &item, list) {
-            QVariantMap details=item.toMap();
-            if (details["title"].toString().isEmpty()) {
-                continue;
-            }
-            Song song;
-            QUrl url = details["stream_url"].toUrl();
-            #if QT_VERSION < 0x050000
-            QUrl &query=url;
-            #else
-            QUrlQuery query;
-            #endif
-            query.addQueryItem("client_id", constApiKey);
-            #if QT_VERSION >= 0x050000
-            url.setQuery(query);
-            #endif
-            // MPD does not seem to support https :-(
-            if (QLatin1String("https")==url.scheme()) {
-                url.setScheme(QLatin1String("http"));
-            }
-            song.file=url.toString();
-            // We don't have a real artist name, but username is the most similar thing we have
-            song.artist=details["user"].toMap()["username"].toString();
-            song.title=details["title"].toString();
-            song.genre=details["genre"].toString();
-            song.year=details["release_year"].toInt();
-            song.time=details["duration"].toUInt()/1000;
-            song.setIsFromOnlineService(constName);
-            if (!update) {
-                update=new MusicLibraryItemRoot();
+    if (j->ok()) {
+        QJson::Parser parser;
+        #ifdef Q_OS_WIN
+        QVariant result = parser.parse(j->readAll());
+        #else
+        QVariant result = parser.parse(j->actualJob());
+        #endif
+        if (result.isValid()) {
+            QVariantList list = result.toList();
+            foreach(const QVariant &item, list) {
+                QVariantMap details=item.toMap();
+                if (details["title"].toString().isEmpty()) {
+                    continue;
+                }
+                Song song;
+                QUrl url = details["stream_url"].toUrl();
+                #if QT_VERSION < 0x050000
+                QUrl &query=url;
+                #else
+                QUrlQuery query;
+                #endif
+                query.addQueryItem("client_id", constApiKey);
+                #if QT_VERSION >= 0x050000
+                url.setQuery(query);
+                #endif
+                // MPD does not seem to support https :-(
+                if (QLatin1String("https")==url.scheme()) {
+                    url.setScheme(QLatin1String("http"));
+                }
+                song.file=url.toString();
+                // We don't have a real artist name, but username is the most similar thing we have
+                song.artist=details["user"].toMap()["username"].toString();
+                song.title=details["title"].toString();
+                song.genre=details["genre"].toString();
+                song.year=details["release_year"].toInt();
+                song.time=details["duration"].toUInt()/1000;
+                song.setIsFromOnlineService(constName);
+                if (!update) {
+                    update=new OnlineServiceMusicRoot();
+                }
+                song.fillEmptyFields();
+                update->append(new MusicLibraryItemSong(song, update));
             }
-            song.fillEmptyFields();
-            update->append(new MusicLibraryItemSong(song, update));
         }
     }
 
diff --git a/online/soundcloudservice.h b/online/soundcloudservice.h
index 46ac9ae..dae9c19 100644
--- a/online/soundcloudservice.h
+++ b/online/soundcloudservice.h
@@ -27,6 +27,7 @@
 #include "onlineservice.h"
 #include <QLatin1String>
 
+class NetworkJob;
 class SoundCloudService : public OnlineService
 {
     Q_OBJECT
@@ -50,6 +51,7 @@ public:
     void clear();
     bool isSearching() const { return 0!=job; }
     bool isFlat() const { return true; }
+    static const QString iconPath() { return iconFile; }
 
 private:
     void cancelAll();
@@ -58,8 +60,9 @@ private Q_SLOTS:
     void jobFinished();
 
 private:
-    QNetworkReply *job;
+    NetworkJob *job;
     QString currentSearch;
+    static QString iconFile;
 };
 
 #endif
diff --git a/po/README b/po/README
index 5baeabf..7225a44 100644
--- a/po/README
+++ b/po/README
@@ -1,5 +1,5 @@
 Please refer to the 'Translations' and 'Creating a new translation' sections of
 the main README file.
 
-Please DO NOT use any tools to manully generate the translations from Cantata's
+Please DO NOT use any tools to manually generate the translations from Cantata's
 source code, as this will probably not work.
diff --git a/po/cantata.pot b/po/cantata.pot
index 5212936..db27442 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-07-20 19:42+0100\n"
+"POT-Creation-Date: 2013-11-14 20:26+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,37 +22,37 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr ""
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
 msgid "Album Information"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:143
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
 msgid "Tracks"
 msgstr ""
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 msgid "Refresh Artist Information"
 msgstr ""
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 context/contextwidget.cpp:306
+#: gui/cachesettings.cpp:260
 msgid "Artist Information"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:137
 #. 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:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
 msgid "Albums"
 msgstr ""
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:333
 msgid "Web Links"
 msgstr ""
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:419
 msgid "Similar Artists"
 msgstr ""
 
@@ -64,8 +64,8 @@ msgstr ""
 msgid "Wikipedia Languages"
 msgstr ""
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
-#: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
 msgid "Other"
 msgstr ""
 
@@ -73,12 +73,12 @@ msgstr ""
 msgid "Reset Spacing"
 msgstr ""
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
 msgid "Lyrics"
 msgstr ""
 
-#: context/lastfmengine.cpp:65
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr ""
 
@@ -93,20 +93,20 @@ msgid ""
 "original song title and artist as displayed in Cantata."
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:47
+#. i18n: file: devices/albumdetails.ui:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
+#: rc.cpp:61 rc.cpp:304 rc.cpp:789
 msgid "Title:"
 msgstr ""
 
@@ -114,16 +114,16 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
+#: rc.cpp:55 rc.cpp:292 rc.cpp:792
 msgid "Artist:"
 msgstr ""
 
@@ -131,111 +131,112 @@ msgstr ""
 msgid "Search For Lyrics"
 msgstr ""
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr ""
 
-#: context/lyricsettings.cpp:46
+#: context/lyricsettings.cpp:66
 msgid "(Polish Translations)"
 msgstr ""
 
-#: context/lyricsettings.cpp:47
+#: context/lyricsettings.cpp:67
 msgid "(Portuguese Translations)"
 msgstr ""
 
-#: context/songview.cpp:74
+#: context/songview.cpp:89
 msgid "Refresh Lyrics"
 msgstr ""
 
-#: context/songview.cpp:75
+#: context/songview.cpp:90
 msgid "Edit Lyrics"
 msgstr ""
 
-#: context/songview.cpp:76
+#: context/songview.cpp:91
 msgid "Save Lyrics"
 msgstr ""
 
-#: context/songview.cpp:77
+#: context/songview.cpp:92
 msgid "Cancel Editing Lyrics"
 msgstr ""
 
-#: context/songview.cpp:78
+#: context/songview.cpp:93
 msgid "Delete Lyrics File"
 msgstr ""
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort editing of lyrics?"
 msgstr ""
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort Editing"
 msgstr ""
 
-#: 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: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
 msgid "Abort"
 msgstr ""
 
-#: context/songview.cpp:106
+#: context/songview.cpp:121
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr ""
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:121 context/songview.cpp:122
+#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
 msgid "Re-download"
 msgstr ""
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Current playing song has changed, still perform search?"
 msgstr ""
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Song Changed"
 msgstr ""
 
-#: context/songview.cpp:133
+#: context/songview.cpp:148
 msgid "Perform Search"
 msgstr ""
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save updated lyrics?"
 msgstr ""
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save"
 msgstr ""
 
-#: context/songview.cpp:170
+#: context/songview.cpp:185
 msgid "Failed to save lyrics."
 msgstr ""
 
-#: context/songview.cpp:192
+#: context/songview.cpp:207
 msgid "Delete lyrics file?"
 msgstr ""
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
+#: context/songview.cpp:207 gui/mainwindow.cpp:292
+#: widgets/messageoverlay.cpp:43
 msgid "Cancel"
 msgstr ""
 
-#: context/songview.cpp:416
+#: context/songview.cpp:431
 msgid "Fetching lyrics via %1"
 msgstr ""
 
-#: context/wikipediaengine.cpp:250
+#: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr ""
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr ""
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr ""
 
-#: 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 ""
@@ -245,47 +246,52 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr ""
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:99
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr ""
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
+#: online/podcastsearchdialog.cpp:393
 msgid "Reload"
 msgstr ""
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr ""
+
+#: devices/actiondialog.cpp:76
 msgid "Songs To Be Copied"
 msgstr ""
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:146
 msgid "<b>INVALID</b>"
 msgstr ""
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
 msgid "<i>(When different)</i>"
 msgstr ""
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr ""
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
+#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
 #: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
 msgid "%1 free"
 msgstr ""
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
 msgid "Local Music Library"
 msgstr ""
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
+#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
 msgid "Audio CD"
 msgstr ""
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:293
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -293,261 +299,259 @@ msgid ""
 "successfully copied."
 msgstr ""
 
-#: devices/actiondialog.cpp:285
+#: devices/actiondialog.cpp:300
 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:334
+#: devices/actiondialog.cpp:349
 msgid "Copy Songs"
 msgstr ""
 
-#: 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:349 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr ""
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:380
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr ""
 
-#: devices/actiondialog.cpp:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
 msgid "Not Configured"
 msgstr ""
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
 msgid "Use Defaults"
 msgstr ""
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:384
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr ""
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:446
 msgid "Are you sure you wish to stop?"
 msgstr ""
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr ""
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
+#: tags/trackorganiser.cpp:446
 msgid "Device has been removed!"
 msgstr ""
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:491
 msgid "Device is not connected!"
 msgstr ""
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
+#: tags/trackorganiser.cpp:456
 msgid "Device is busy?"
 msgstr ""
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr ""
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:562
 msgid "Clearing unused folders"
 msgstr ""
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr ""
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "ReplyGain"
 msgstr ""
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:578
 msgid "Calculate"
 msgstr ""
 
-#: devices/actiondialog.cpp:618
+#: devices/actiondialog.cpp:634
 msgid "The destination filename already exists!<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:621
+#: devices/actiondialog.cpp:637
 msgid "Song already exists!<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:624
+#: devices/actiondialog.cpp:640
 msgid "Song does not exist!<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:643
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
 "permissions.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:630
+#: devices/actiondialog.cpp:646
 msgid "Source file no longer exists?<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:633
+#: devices/actiondialog.cpp:649
 msgid "Failed to copy.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:634
+#: devices/actiondialog.cpp:650
 msgid "Failed to delete.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:637
+#: devices/actiondialog.cpp:653
 msgid "Not connected to device.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:640
+#: devices/actiondialog.cpp:656
 msgid "Selected codec is not available.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:659
 msgid "Transcoding failed.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:646
+#: devices/actiondialog.cpp:662
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
 "devices.)<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:649
+#: devices/actiondialog.cpp:665
 msgid "Failed to read source file.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:652
+#: devices/actiondialog.cpp:668
 msgid "Failed to write to destination file.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:655
+#: devices/actiondialog.cpp:671
 msgid "No space left on device.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:658
+#: devices/actiondialog.cpp:674
 msgid "Failed to update metadata.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr ""
-
-#: devices/actiondialog.cpp:664
+#: devices/actiondialog.cpp:677
 msgid "Failed to download track.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:667
+#: devices/actiondialog.cpp:680
 msgid "Failed to lock device.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:709
 msgid "Local Music Library Properties"
 msgstr ""
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
+#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
 msgid "<b>Error</b><br/>"
 msgstr ""
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Skip"
 msgstr ""
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Auto Skip"
 msgstr ""
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:759
 msgid "Retry"
 msgstr ""
 
-#: devices/actiondialog.cpp:761
+#: 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 ""
 
-#: devices/actiondialog.cpp:768
+#: 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 ""
 
-#: devices/actiondialog.cpp:773
+#: devices/actiondialog.cpp:786
 msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
 msgstr ""
 
-#: devices/actiondialog.cpp:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
 msgid "Calculating..."
 msgstr ""
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:799
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr ""
 
-#: devices/actiondialog.cpp:789
+#: devices/actiondialog.cpp:802
 msgid ""
 "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
 "i></tr>"
 msgstr ""
 
-#: devices/actiondialog.cpp:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
+#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
 msgid "Apply \"Various Artists\" Workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
+#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
 msgid "Revert \"Various Artists\" Workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
+#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
 msgid "Capitalize"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
 msgid "Adjust Track Numbers"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
 msgid "Tools"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
 msgid "Apply \"Various Artists\" workaround?"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
 msgid "Revert \"Various Artists\" workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
 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' "
@@ -556,36 +560,36 @@ msgid ""
 "will be set to \"Wobble\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
 msgid "Revert"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
 msgid "Adjust track number by:"
 msgstr ""
 
-#: 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
+#: 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:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr ""
 
-#: 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:353 gui/mainwindow.cpp:2199
+#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
+#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] ""
@@ -603,24 +607,24 @@ msgstr ""
 msgid "Data Track"
 msgstr ""
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr ""
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
 #: devices/musicbrainz.cpp:217
 msgid "Track %1"
 msgstr ""
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr ""
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr ""
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr ""
 
@@ -628,19 +632,19 @@ msgstr ""
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:157
+#. i18n: file: devices/albumdetails.ui:170
 #. 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:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
+#: rc.cpp:82
 msgid "Artist"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:175
 #. 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:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
+#: rc.cpp:85
 msgid "Title"
 msgstr ""
 
@@ -658,10 +662,14 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr ""
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr ""
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr ""
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -750,70 +758,70 @@ msgstr ""
 msgid "Add Device"
 msgstr ""
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
 msgstr ""
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455
 msgid "Refresh"
 msgstr ""
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr ""
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr ""
 
-#: 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 ""
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr ""
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr ""
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
 msgstr ""
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr ""
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr ""
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr ""
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr ""
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr ""
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
 msgid "Please close other dialogs first."
 msgstr ""
 
-#: devices/encoders.cpp:78
+#: devices/encoders.cpp:77
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -824,7 +832,7 @@ msgid ""
 "a reasonable choice for the iPod and some other portable music players."
 msgstr ""
 
-#: devices/encoders.cpp:83
+#: devices/encoders.cpp:82
 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 "
@@ -842,21 +850,21 @@ msgid ""
 "s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:101 devices/encoders.cpp:141
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr ""
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
+#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
 msgid "Smaller file"
 msgstr ""
 
-#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:329
 msgid "Better sound quality"
 msgstr ""
 
-#: devices/encoders.cpp:120
+#: devices/encoders.cpp:119
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -867,7 +875,7 @@ msgid ""
 "and is widely supported on portable music players."
 msgstr ""
 
-#: devices/encoders.cpp:124
+#: devices/encoders.cpp:123
 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 "
@@ -883,11 +891,11 @@ msgid ""
 "anything above <b>205kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:156 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr ""
 
-#: devices/encoders.cpp:159
+#: devices/encoders.cpp:158
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -898,7 +906,7 @@ msgid ""
 "excellent choice, especially for portable music players that support it."
 msgstr ""
 
-#: devices/encoders.cpp:164
+#: devices/encoders.cpp:163
 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 "
@@ -917,15 +925,48 @@ msgid ""
 "anything above <b>8</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:184
+#: devices/encoders.cpp:183
 msgid "Quality rating"
 msgstr ""
 
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr ""
+
+#: devices/encoders.cpp:203
+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:205
+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 ""
+
+#: devices/encoders.cpp:222 devices/encoders.cpp:319
+msgid "Bitrate"
+msgstr ""
+
+#: devices/encoders.cpp:241
 msgid "Apple Lossless"
 msgstr ""
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:244
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -936,11 +977,11 @@ msgid ""
 "FLAC."
 msgstr ""
 
-#: devices/encoders.cpp:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr ""
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:262
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -951,7 +992,7 @@ msgid ""
 "compromising on audio quality, FLAC is an excellent choice."
 msgstr ""
 
-#: devices/encoders.cpp:230
+#: devices/encoders.cpp:266
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -966,19 +1007,19 @@ msgid ""
 "file, and are not recommended."
 msgstr ""
 
-#: devices/encoders.cpp:245
+#: devices/encoders.cpp:281
 msgid "Compression level"
 msgstr ""
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:291
 msgid "Faster compression"
 msgstr ""
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:298
 msgid "Windows Media Audio"
 msgstr ""
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:301
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -989,7 +1030,7 @@ msgid ""
 "not support Ogg Vorbis."
 msgstr ""
 
-#: devices/encoders.cpp:268
+#: devices/encoders.cpp:305
 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> "
@@ -1003,69 +1044,112 @@ msgid ""
 "probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:282
-msgid "Bitrate"
-msgstr ""
-
 #: devices/filenameschemedialog.cpp:33
 msgid "Filename Scheme"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:52
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:53
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr ""
+
+#: devices/filenameschemedialog.cpp:55
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:56
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:57
 msgctxt "Example genre"
 msgid "Dance"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:99
+#: devices/filenameschemedialog.cpp:101
 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 ""
-
-#: devices/fsdevice.cpp:678
+"for each track name.</p>"
+msgstr ""
+
+#: devices/filenameschemedialog.cpp:103
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</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
 msgid "Updating..."
 msgstr ""
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr ""
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr ""
@@ -1099,16 +1183,15 @@ msgstr ""
 msgid "Updating tracks..."
 msgstr ""
 
-#: 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
+#: 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:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
+#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
+#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
 #: models/devicesmodel.cpp:140
 msgid "Not Connected"
 msgstr ""
@@ -1125,7 +1208,7 @@ msgstr ""
 msgid "Connection"
 msgstr ""
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
 msgid "Music Library"
 msgstr ""
 
@@ -1210,8 +1293,8 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:30
 #. 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:53 gui/stdactions.cpp:92
+#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
 msgid "Search"
 msgstr ""
 
@@ -1255,91 +1338,91 @@ msgstr ""
 msgid " (recommended)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:208
 msgid "Start Dynamic Playlist"
 msgstr ""
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:209
 msgid "Stop Dynamic Mode"
 msgstr ""
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:257
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] ""
 msgstr[1] ""
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:396
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr ""
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:403
 msgid "Failed to locate rules file - %1"
 msgstr ""
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:411
 msgid "Failed to remove previous rules file - %1"
 msgstr ""
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:416
 msgid "Failed to install rules file - %1 -> %2"
 msgstr ""
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:729
 msgid "Dynamizer has been terminated."
 msgstr ""
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:816
 msgid "Uknown"
 msgstr ""
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:818
 msgid "Loading list of rules"
 msgstr ""
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:819
 msgid "Saving rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:820
 msgid "Deleting rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:821
 msgid "Setting active rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:822
 msgid "Stopping dynamizer"
 msgstr ""
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:823
 msgid "Requesting ID details"
 msgstr ""
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:826
 msgid "Awaiting response for previous command. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:981
 msgid "Dynamizer is not active"
 msgstr ""
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:989
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1020
 msgid "Failed to delete rules file. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to control dynamizer state. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1036
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr ""
 
@@ -1371,15 +1454,15 @@ msgstr ""
 
 #. 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:136 po/rc.cpp:280 rc.cpp:280
 msgid "Add"
 msgstr ""
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:202
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr ""
 
-#: dynamic/dynamicruledialog.cpp:194
+#: dynamic/dynamicruledialog.cpp:205
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1393,45 +1476,51 @@ msgstr ""
 msgid "AlbumArtist"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr ""
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
 msgid "Album"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. 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:106
+#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
 msgid "Genre"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
 "of <i>Include</i> rules will be used to build a set of songs that can be "
@@ -1447,41 +1536,45 @@ msgid ""
 "to keep the play queue filled with 10 entries.</p>"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 msgid "Overwrite Rules"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr ""
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:168
 msgid "Deleting..."
 msgstr ""
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Name"
 msgstr ""
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Item Count"
 msgstr ""
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Space Used"
 msgstr ""
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr ""
+
+#: gui/cachesettings.cpp:245
 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 "
@@ -1490,48 +1583,53 @@ msgid ""
 "there). Below is a summary of Cantata's cache usage."
 msgstr ""
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:257
 msgid "Covers"
 msgstr ""
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:258
 msgid "Backdrops"
 msgstr ""
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
+#: 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:246
+#: gui/cachesettings.cpp:264
 msgid "Jamendo"
 msgstr ""
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:265
 msgid "Magnatune"
 msgstr ""
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr ""
+
+#: gui/cachesettings.cpp:273
 msgid "Delete All"
 msgstr ""
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:312
 msgid "Delete all '%1' items?"
 msgstr ""
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
 msgid "Delete Cache Items"
 msgstr ""
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:322
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr ""
 
-#: gui/coverdialog.cpp:150 gui/main.cpp:169
+#: gui/coverdialog.cpp:151 gui/main.cpp:231
 msgid "Last.fm"
 msgstr ""
 
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:165
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1540,7 +1638,7 @@ msgid ""
 "%2 x %3 (%4)"
 msgstr ""
 
-#: gui/coverdialog.cpp:183
+#: gui/coverdialog.cpp:184
 msgctxt ""
 "Google\n"
 "width x height (file size)"
@@ -1549,7 +1647,7 @@ msgid ""
 "%1 x %2 (%3)"
 msgstr ""
 
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:204
 msgctxt ""
 "Discogs\n"
 "width x height"
@@ -1558,7 +1656,7 @@ msgid ""
 "%1 x %2"
 msgstr ""
 
-#: gui/coverdialog.cpp:237
+#: gui/coverdialog.cpp:238
 msgctxt ""
 "Current Cover\n"
 "width x height"
@@ -1567,86 +1665,93 @@ msgid ""
 "%1 x %2"
 msgstr ""
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:256
 msgid "Image"
 msgstr ""
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:259
 msgid "Downloading..."
 msgstr ""
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr ""
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:432
 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:432
+#: gui/coverdialog.cpp:433
 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:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
+#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
+#: models/musicmodel.cpp:234
 msgctxt "Album by Artist"
 msgid "%1 by %2"
 msgstr ""
 
-#: gui/coverdialog.cpp:613
+#: gui/coverdialog.cpp:579
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
 msgstr ""
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:607
 msgid "Failed to download image!"
 msgstr ""
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
 msgid "Load Local Cover"
 msgstr ""
 
-#: gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:795
 msgid "Images (*.png *.jpg)"
 msgstr ""
 
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:800
 msgid "File is already in list!"
 msgstr ""
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:804
 msgid "Failed to read image!"
 msgstr ""
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:817
 msgid "Display"
 msgstr ""
 
 #. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
 msgid "Remove"
 msgstr ""
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1181
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
 msgstr ""
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1190
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
 msgstr ""
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1239
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1656,375 +1761,390 @@ msgstr ""
 msgid "Open In File Manager"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Established"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Failed"
 msgstr ""
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. 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
+#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
+#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
 msgid "None"
 msgstr ""
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:40
 msgid "Small"
 msgstr ""
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:41
 msgid "Medium"
 msgstr ""
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:42
 msgid "Large"
 msgstr ""
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:43
 msgid "Extra Large"
 msgstr ""
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:48
 msgid "Simple Tree"
 msgstr ""
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:49
 msgid "Detailed Tree"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:329
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
 msgid "Grouped Albums"
 msgstr ""
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:53
 msgid "List"
 msgstr ""
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:55
 msgid "Icon/List"
 msgstr ""
 
-#: gui/interfacesettings.cpp:85
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+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)
+#: 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
+msgid "Style:"
+msgstr ""
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr ""
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr ""
+
+#: gui/interfacesettings.cpp:178
 msgid "Grouped by 'Album Artist'"
 msgstr ""
 
-#: gui/interfacesettings.cpp:86
+#: gui/interfacesettings.cpp:179
 msgid "Grouped under 'Various Artists'"
 msgstr ""
 
-#: 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/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
 msgid "Cantata"
 msgstr ""
 
-#: gui/main.cpp:152
+#: gui/main.cpp:214
 msgid "A KDE client for MPD"
 msgstr ""
 
-#: gui/main.cpp:154
-msgid "Copyright (C) 2011-2013 Craig Drummond"
+#: gui/main.cpp:216
+msgid "Copyright (c) 2011–2013 Craig Drummond"
 msgstr ""
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Craig Drummond"
 msgstr ""
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Maintainer"
 msgstr ""
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "Piotr Wicijowski"
 msgstr ""
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "UI Improvements"
 msgstr ""
 
-#: gui/main.cpp:160
+#: gui/main.cpp:222
 msgid "Sander Knopper"
 msgstr ""
 
-#: gui/main.cpp:160 gui/main.cpp:161 gui/main.cpp:162 gui/main.cpp:163
+#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
 msgid "QtMPC author"
 msgstr ""
 
-#: gui/main.cpp:161
+#: gui/main.cpp:223
 msgid "Roeland Douma"
 msgstr ""
 
-#: gui/main.cpp:162
+#: gui/main.cpp:224
 msgid "Daniel Selinger"
 msgstr ""
 
-#: gui/main.cpp:163
+#: gui/main.cpp:225
 msgid "Armin Walland"
 msgstr ""
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid "FanArt.tv"
 msgstr ""
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
 
-#: gui/main.cpp:168
+#: gui/main.cpp:230
 msgid "Wikipedia"
 msgstr ""
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:230 gui/main.cpp:231
 msgid "Context view metadata"
 msgstr ""
 
-#: gui/main.cpp:173
+#: gui/main.cpp:235
 msgid "URL to open"
 msgstr ""
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:238
 msgid "Quit"
 msgstr ""
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:242
 msgid "Show Window"
 msgstr ""
 
-#. 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:245 po/rc.cpp:418 rc.cpp:418
 msgid "Connect"
 msgstr ""
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
 msgid "Collection"
 msgstr ""
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:247
 msgid "Outputs"
 msgstr ""
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr ""
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr ""
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr ""
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr ""
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr ""
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr ""
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr ""
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr ""
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:249
 msgid "Add To Stored Playlist"
 msgstr ""
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:250
 msgid "Remove From Play Queue"
 msgstr ""
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:251
 msgid "Copy Track Info"
 msgstr ""
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:252
 msgid "Crop"
 msgstr ""
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
+#: gui/mainwindow.cpp:253
+msgid "Shuffle Tracks"
+msgstr ""
+
+#: gui/mainwindow.cpp:254
+msgid "Shuffle Albums"
 msgstr ""
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:255
 msgid "Add Stream URL"
 msgstr ""
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:256
 msgid "Clear"
 msgstr ""
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:257
 msgid "Expanded Interface"
 msgstr ""
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:258
 msgid "Show Current Song Information"
 msgstr ""
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:261
 msgid "Full Screen"
 msgstr ""
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:263
 msgid "Random"
 msgstr ""
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:264
 msgid "Repeat"
 msgstr ""
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid "Single"
 msgstr ""
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
 msgstr ""
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid "Consume"
 msgstr ""
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr ""
 
-#: gui/mainwindow.cpp:291
+#: gui/mainwindow.cpp:267
 msgid "Search Play Queue"
 msgstr ""
 
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:269
 msgid "Set Priority"
 msgstr ""
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:271
 msgid "Play Stream"
 msgstr ""
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:273
 msgid "Locate In Library"
 msgstr ""
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:275
 msgid "Edit Song Tags"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:304
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
 msgid "Play Queue"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:27
 #. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:302 po/rc.cpp:455 rc.cpp:455
+#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
 msgid "Artists"
 msgstr ""
 
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr ""
-
 #. 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
+#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
 msgid "Playlists"
 msgstr ""
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:282
 msgid "Dynamic"
 msgstr ""
 
-#: gui/mainwindow.cpp:308
-msgid "Online"
-msgstr ""
-
-#: gui/mainwindow.cpp:310
-msgid "Devices"
-msgstr ""
-
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:288
 msgid "Expand All"
 msgstr ""
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:289
 msgid "Collapse All"
 msgstr ""
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:290
+msgid "Remove All Songs"
+msgstr ""
+
+#: gui/mainwindow.cpp:398
 msgid "Info"
 msgstr ""
 
-#: gui/mainwindow.cpp:435
+#: gui/mainwindow.cpp:405
 msgid "Auto Hide"
 msgstr ""
 
-#: gui/mainwindow.cpp:441
+#: gui/mainwindow.cpp:411
 msgid "Monochrome Icons"
 msgstr ""
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:541
 msgid "Server information..."
 msgstr ""
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:552
 msgid "Configure Cantata..."
 msgstr ""
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:559
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr ""
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:571
 msgid "&File"
 msgstr ""
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:574
 msgid "&Settings"
 msgstr ""
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
 msgid "&Help"
 msgstr ""
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:948
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 
-#: gui/mainwindow.cpp:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
 msgid "Connecting to %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr ""
+
+#: gui/mainwindow.cpp:1447
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1448
 msgctxt "Qt-only"
 msgid ""
 "<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
@@ -2032,40 +2152,40 @@ msgid ""
 "\">GPLv3</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1450
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
 "QtMPC Authors<br/>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1451
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1452
 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:1468
+#: gui/mainwindow.cpp:1453
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1479
+#: gui/mainwindow.cpp:1464
 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>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1487
+#: gui/mainwindow.cpp:1472
 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</"
@@ -2075,81 +2195,77 @@ msgid ""
 "%6</td></tr></table></p>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1496
+#: gui/mainwindow.cpp:1481
 msgid "Server Information"
 msgstr ""
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
 msgid "Cantata (%1)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1728
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1730
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1773
 msgid "(Stream)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1775
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr ""
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr ""
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr ""
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1% (Muted)"
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
+#: gui/mainwindow.cpp:1990
+msgid "Remove all songs from play queue?"
 msgstr ""
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
 msgid "Priority"
 msgstr ""
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2080
 msgid "Enter priority (0..255):"
 msgstr ""
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Playlist Name"
 msgstr ""
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Enter a name for the playlist:"
 msgstr ""
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2106
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr ""
 
-#: gui/mainwindow.cpp:2146
+#: gui/mainwindow.cpp:2107
 msgid "Existing Playlist"
 msgstr ""
 
@@ -2161,10 +2277,10 @@ msgstr ""
 msgid " ms"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:152
+#. i18n: file: devices/albumdetails.ui:165
 #. 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:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
 msgid "Track"
 msgstr ""
 
@@ -2172,7 +2288,7 @@ msgstr ""
 msgid "Auto"
 msgstr ""
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:164
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2180,13 +2296,13 @@ msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:26
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
 msgstr ""
 
-#: gui/playbacksettings.cpp:153
+#: gui/playbacksettings.cpp:174
 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 "
@@ -2196,126 +2312,136 @@ 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 ""
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:759 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
 msgid "Rename"
 msgstr ""
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:190
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
 msgstr ""
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:191
 msgid "Remove Playlists"
 msgstr ""
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr ""
 
-#: gui/playlistspage.cpp:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
 msgid "Overwrite Playlist"
 msgstr ""
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Rename Playlist"
 msgstr ""
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Enter new name for playlist:"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:77
+#: gui/preferencesdialog.cpp:80
 msgid "Collection Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
 msgid "Playback"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:81
 msgid "Playback Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "Files"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "File Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:85
+msgid "Streams Settings"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:89
+msgid "Online Providers"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:92
 msgid "Context"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:92
 msgid "Context View Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:103
 msgid "Audio CD Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgid "Proxy"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cache"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cached Items"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:118
+#: gui/preferencesdialog.cpp:116
 msgid "Configure"
 msgstr ""
 
-#: gui/serversettings.cpp:75
+#: 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:88
+#: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr ""
 
@@ -2331,12 +2457,12 @@ msgstr ""
 #. 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:208 po/rc.cpp:247 po/rc.cpp:705
+#: rc.cpp:208 rc.cpp:247 rc.cpp:705
 msgid "Host:"
 msgstr ""
 
-#: 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 "
@@ -2346,7 +2472,7 @@ msgid ""
 "service.</i>"
 msgstr ""
 
-#: 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 "
@@ -2357,7 +2483,7 @@ msgid ""
 "dynamic playlists.</i>"
 msgstr ""
 
-#: gui/serversettings.cpp:109
+#: 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 "
@@ -2365,7 +2491,7 @@ msgid ""
 "</i></p>"
 msgstr ""
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:252
 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</"
@@ -2373,127 +2499,194 @@ msgid ""
 "configure and control the MPD instance</li></ul>"
 msgstr ""
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Add Collection"
 msgstr ""
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Standard"
 msgstr ""
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Basic"
 msgstr ""
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:297
 msgid "Delete <b>%1</b>?"
 msgstr ""
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:298
 msgid "Delete"
 msgstr ""
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:336
 msgid "New Collection %1"
 msgstr ""
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
 msgid "Default"
 msgstr ""
 
-#: gui/stdactions.cpp:55
-msgid "Save As"
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
 msgstr ""
 
-#: gui/stdactions.cpp:56
-msgid "Add To Play Queue"
+#: gui/shortcutssettingspage.cpp:80
+msgid "Do not use media keys to control Cantata"
 msgstr ""
 
-#: gui/stdactions.cpp:57
-msgid "Replace Play Queue"
+#: gui/shortcutssettingspage.cpp:81
+msgid "Use media keys to control Cantata"
 msgstr ""
 
-#: gui/stdactions.cpp:58
-msgid "Add With Priority"
+#: gui/shortcutssettingspage.cpp:84
+msgid "Use media keys, as configured in desktop settings, to control Cantata"
 msgstr ""
 
-#: gui/stdactions.cpp:59
-msgid "Highest Priority (255)"
+#: gui/shortcutssettingspage.cpp:85
+msgid ""
+"Use media keys, as configured in GNOME/Unity settings, to control Cantata"
 msgstr ""
 
-#: gui/stdactions.cpp:60
-msgid "High Priority (200)"
+#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
+#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+msgid "Configure..."
 msgstr ""
 
-#: gui/stdactions.cpp:61
-msgid "Medium Priority (125)"
+#: gui/shortcutssettingspage.cpp:95
+msgid "Use media keys to control Cantata:"
 msgstr ""
 
-#: gui/stdactions.cpp:62
-msgid "Low Priority (50)"
+#: 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 ""
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr ""
+
+#: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr ""
+
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr ""
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr ""
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
 msgstr ""
 
 #: gui/stdactions.cpp:63
-msgid "Default Priority (0)"
+msgid "Save As"
 msgstr ""
 
 #: gui/stdactions.cpp:64
-msgid "Custom Priority..."
+msgid "Add To Play Queue"
 msgstr ""
 
 #: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr ""
+
+#: gui/stdactions.cpp:66
+msgid "Replace Play Queue"
+msgstr ""
+
+#: gui/stdactions.cpp:67
+msgid "Add With Priority"
+msgstr ""
+
+#: gui/stdactions.cpp:68
+msgid "Highest Priority (255)"
+msgstr ""
+
+#: gui/stdactions.cpp:69
+msgid "High Priority (200)"
+msgstr ""
+
+#: gui/stdactions.cpp:70
+msgid "Medium Priority (125)"
+msgstr ""
+
+#: gui/stdactions.cpp:71
+msgid "Low Priority (50)"
+msgstr ""
+
+#: gui/stdactions.cpp:72
+msgid "Default Priority (0)"
+msgstr ""
+
+#: gui/stdactions.cpp:73
+msgid "Custom Priority..."
+msgstr ""
+
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr ""
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
 msgid "Organize Files"
 msgstr ""
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
 msgstr ""
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
 msgid "ReplayGain"
 msgstr ""
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 msgid "Copy Songs To Device"
 msgstr ""
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 msgid "Set Image"
 msgstr ""
 
-#: gui/stdactions.cpp:79
+#: gui/stdactions.cpp:88
 msgid "Refresh Database"
 msgstr ""
 
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr ""
 
-#: gui/trayitem.cpp:165
+#: gui/trayitem.cpp:192
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr ""
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:193
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr ""
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:195
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr ""
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:196
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr ""
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:223
 msgid "Now playing"
 msgstr ""
 
@@ -2517,6 +2710,16 @@ msgstr ""
 msgid "Inactive"
 msgstr ""
 
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr ""
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr ""
+
 #: models/devicesmodel.cpp:108
 msgid "Configure Device"
 msgstr ""
@@ -2537,7 +2740,7 @@ msgstr ""
 msgid "Edit CD Details"
 msgstr ""
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:690
 msgid "No Devices Attached"
 msgstr ""
 
@@ -2549,28 +2752,28 @@ msgstr ""
 msgid "Logged in"
 msgstr ""
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 msgid "Unknown error"
 msgstr ""
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr ""
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr ""
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr ""
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr ""
 
 #: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] ""
@@ -2580,227 +2783,248 @@ msgstr[1] ""
 msgid "Audio File"
 msgstr ""
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr ""
-
-#: models/dirviewmodel.cpp:192 models/musicmodel.cpp:120
-msgid "Cue Sheet"
-msgstr ""
-
-#: models/musiclibraryitemartist.cpp:218 models/musiclibraryitemartist.cpp:231
-#: models/musiclibraryitemroot.cpp:798
+#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
 msgid "Single Tracks"
 msgstr ""
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:185
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:172
+#: models/musicmodel.cpp:192
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
+#: models/musicmodel.cpp:198
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] ""
+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
+msgid "Configure Service"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
+#: models/onlineservicesmodel.cpp:84
+msgid "Refresh Service"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:125
+#: models/onlineservicesmodel.cpp:85
+msgid "Add Subscription"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:86
+msgid "Remove Subscription"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:87
+msgid "Refresh Subscription"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:137
 msgid "Last Search:%1"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:136
+#: models/onlineservicesmodel.cpp:149
 msgid "Searching..."
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:670
 msgid "Not Loaded"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:155
 msgid "Use search to locate tracks"
 msgstr ""
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:166
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: models/onlineservicesmodel.cpp:177
+msgid "(Downloading: %1%)"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:235
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr ""
+
+#: models/playlistsmodel.cpp:77
 msgid "New Playlist..."
 msgstr ""
 
-#: models/playqueuemodel.cpp:105
+#: models/playqueuemodel.cpp:102
 msgctxt "Track Number (#)"
 msgid "#"
 msgstr ""
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:103
 msgid "Length"
 msgstr ""
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:104
 msgid "Disc"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:138
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
 msgid "Year"
 msgstr ""
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:360
 msgid "<b>(Priority: %1)</b>"
 msgstr ""
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
 msgid "Loading..."
 msgstr ""
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:286
 msgid "Bookmarks"
 msgstr ""
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:560
 msgid "TuneIn"
 msgstr ""
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:563
 msgid "IceCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:564
 msgid "ShoutCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:567
 msgid "SomaFM"
 msgstr ""
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:568
 msgid "Digitally Imported"
 msgstr ""
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:569
 msgid "JazzRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:570
 msgid "RockRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:571
 msgid "Sky.fm"
 msgstr ""
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:572
 msgid "Favorites"
 msgstr ""
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr ""
+
+#: models/streamsmodel.cpp:578
 msgid "Bookmark Category"
 msgstr ""
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:579
 msgid "Add Stream To Favorites"
 msgstr ""
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:580
 msgid "Configure Streams"
 msgstr ""
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:660
 msgid "%1 (Read-Only)"
 msgstr ""
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1241
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr ""
 
-#: models/streamsmodel.cpp:1455
+#: models/streamsmodel.cpp:1639
 msgid "All"
 msgstr ""
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr ""
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:154
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr ""
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:156
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:361 mpd/mpdconnection.cpp:401
-#: mpd/mpdconnection.cpp:446 mpd/mpdconnection.cpp:984
-#: mpd/mpdconnection.cpp:1011
+#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
+#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
+#: mpd/mpdconnection.cpp:1036
 msgid "Connection to %1 failed"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
 msgid "Connection to %1 failed - incorrect password"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:455
 msgid "Failed to send command to %1 - not connected"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:472
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr ""
 
-#: mpd/mpdconnection.cpp:474
+#: mpd/mpdconnection.cpp:493
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr ""
 
-#: mpd/mpdconnection.cpp:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
 msgid "Failed to send command. Disconnected from %1"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1171
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1158
+#: mpd/mpdconnection.cpp:1183
 msgid "Failed to save <b>%1</b>"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1196
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1174
+#: mpd/mpdconnection.cpp:1199
 msgid "You cannot add a playlist to another playlist!"
 msgstr ""
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] ""
-msgstr[1] ""
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr ""
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:343
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -2839,19 +3063,19 @@ msgstr ""
 msgid "Streaming format:"
 msgstr ""
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr ""
 
-#: online/magnatuneservice.cpp:180
+#: online/magnatuneservice.cpp:179
 msgid "MP3 128k"
 msgstr ""
 
-#: online/magnatuneservice.cpp:181
+#: online/magnatuneservice.cpp:180
 msgid "MP3 VBR"
 msgstr ""
 
-#: online/magnatuneservice.cpp:184
+#: online/magnatuneservice.cpp:183
 msgid "WAV"
 msgstr ""
 
@@ -2859,10 +3083,6 @@ msgstr ""
 msgid "Magnatune Settings"
 msgstr ""
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr ""
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -2871,8 +3091,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:51 po/rc.cpp:694 po/rc.cpp:706
-#: rc.cpp:694 rc.cpp:706
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
+#: rc.cpp:711 rc.cpp:729
 msgid "Username:"
 msgstr ""
 
@@ -2880,7 +3100,7 @@ msgstr ""
 #. 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)
@@ -2892,7 +3112,7 @@ msgstr ""
 #. 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)
@@ -2900,53 +3120,268 @@ 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: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: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
 msgid "Password:"
 msgstr ""
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr ""
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr ""
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr ""
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr ""
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr ""
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr ""
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr ""
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr ""
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
 msgstr ""
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
+msgid "Search For Podcasts"
+msgstr ""
+
+#: online/onlineservicespage.cpp:63
+msgid "Download Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:329
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr ""
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:464
 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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:621
+msgid "Refresh episode listing from <b>%1</b>?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:695
+msgid "All selected podcasts have already been downloaded!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:699
+msgid "Do you wish to download the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:705
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:753
+msgid "All selected downloaded podcast episodes have already been deleted!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:757
+msgid ""
+"Do you wish to delete the downloaded file of the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:760
+msgid ""
+"Do you wish to the delete downloaded files of the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:763
+msgid ""
+"Do you wish to the delete downloaded files of the selected podcast episodes?"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:243
+msgid "RSS:"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Podcast details"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Select a podcast to display its details"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:322
+msgid "Enter search term..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:372
+msgid "Failed to fetch podcasts from %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:378
+msgid "There was a problem parsing the response from %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:439
+msgid "Failed to download directory listing"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:447
+msgid "Failed to parse directory listing"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:602
+msgid "Subscription added"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr ""
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr ""
+
+#: online/podcastservice.cpp:284
+msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
+msgstr ""
+
+#: online/podcastservice.cpp:286
+msgid "Failed to parse %1"
+msgstr ""
+
+#: online/podcastservice.cpp:290
+msgid "Failed to download %1"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:59
+msgid "Download episodes to:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:60
+msgid "Automatically download new episodes:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:82
+msgid "Podcast Settings"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:92
+msgid "Every week"
+msgstr ""
+
 #. i18n: file: context/othersettings.ui:19
 #. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
 #: po/rc.cpp:3 rc.cpp:3
@@ -3012,8 +3447,8 @@ msgstr ""
 #. 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
-#: rc.cpp:49 rc.cpp:721
+#: 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
 msgid "TextLabel"
 msgstr ""
 
@@ -3059,93 +3494,109 @@ msgstr ""
 msgid "Album Details"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:60
+#. 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:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:73
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
+#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
 msgid "Genre:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:86
 #. 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:86
 #. 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:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
 msgid "Year:"
 msgstr ""
 
-#. 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 ""
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:99
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #: po/rc.cpp:70 rc.cpp:70
 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/audiocdsettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:88 rc.cpp:88
 msgid "Album and Track Information Retrieval"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:91 rc.cpp:91
 msgid "Automatically lookup:"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:94 rc.cpp:94
 msgid "Initially look up via:"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:52
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:97 rc.cpp:97
 msgid "CDDB Host:"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:100 rc.cpp:100
 msgid "CDDB Port:"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:88
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:103 rc.cpp:103
 msgid "Audio Extraction"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:106 rc.cpp:106
 msgid "Full paranoia mode (best quality):"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:107
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:106 rc.cpp:106
+#: po/rc.cpp:109 rc.cpp:109
 msgid "Never skip on read error:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:109 rc.cpp:109
+#: po/rc.cpp:112 rc.cpp:112
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3153,62 +3604,62 @@ 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: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
 msgid "Music folder:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:118 rc.cpp:118
 msgid "Copy album covers as:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:121 rc.cpp:121
 msgid "Maximum cover size:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:82
 #. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: 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:124 rc.cpp:124
+#: 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:127 rc.cpp:127
+#: po/rc.cpp:130 rc.cpp:130
 msgid "Use cache:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:121
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:133 rc.cpp:133
 msgid "Default volume:"
 msgstr ""
 
@@ -3220,7 +3671,7 @@ msgstr ""
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
 #. 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:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
 msgid "Filenames"
 msgstr ""
 
@@ -3232,7 +3683,7 @@ msgstr ""
 #. 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
+#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
 msgid "Use only ASCII characters:"
 msgstr ""
 
@@ -3244,7 +3695,7 @@ msgstr ""
 #. 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
+#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
 msgid "Replace spaces with underscores:"
 msgstr ""
 
@@ -3256,7 +3707,7 @@ msgstr ""
 #. 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
+#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
 msgid "Ignore 'The' in artist names:"
 msgstr ""
 
@@ -3268,7 +3719,7 @@ msgstr ""
 #. 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:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
 msgid "Filename scheme:"
 msgstr ""
 
@@ -3280,79 +3731,79 @@ msgstr ""
 #. 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
+#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
 msgid "VFAT safe:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:250
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:154 rc.cpp:154
 msgid "Transcoding"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:261
 #. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:157 rc.cpp:157
 msgid "Only transcode if source file is of a different format:"
 msgstr ""
 
 #. i18n: file: devices/filenameschemedialog.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:160 rc.cpp:160
 msgid "Example:"
 msgstr ""
 
 #. i18n: file: devices/filenameschemedialog.ui:58
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:163 rc.cpp:163
 msgid "About filename schemes"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:82
+#. i18n: file: devices/filenameschemedialog.ui:70
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:166 rc.cpp:166
 msgid "Album Artist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:77
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:169 rc.cpp:169
 msgid "Album Title"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:91
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:175 rc.cpp:175
 msgid "Track Artist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:98
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:178 rc.cpp:178
 msgid "Track Title"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:117
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:181 rc.cpp:181
 msgid "Track Title (+Artist)"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:124
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:184 rc.cpp:184
 msgid "Track #"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:131
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:187 rc.cpp:187
 msgid "CD #"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:196 rc.cpp:196
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3360,17 +3811,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:162
 #. 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:162
 #. 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:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
 msgid "Type:"
 msgstr ""
 
@@ -3382,14 +3833,14 @@ 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:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
+#: rc.cpp:638
 msgid "Name:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#: po/rc.cpp:205 rc.cpp:205
 msgid "Options"
 msgstr ""
 
@@ -3397,7 +3848,7 @@ msgstr ""
 #. 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)
@@ -3407,14 +3858,14 @@ msgstr ""
 #. 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: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
 msgid "Port:"
 msgstr ""
 
@@ -3430,7 +3881,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:208 po/rc.cpp:226 po/rc.cpp:247 rc.cpp:208 rc.cpp:226 rc.cpp:247
+#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
 msgid "User:"
 msgstr ""
 
@@ -3442,7 +3893,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:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
 msgid "Domain:"
 msgstr ""
 
@@ -3454,7 +3905,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:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
 msgid "Share:"
 msgstr ""
 
@@ -3466,7 +3917,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:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
 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 "
@@ -3475,7 +3926,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:223 rc.cpp:223
+#: po/rc.cpp:229 rc.cpp:229
 msgid "Service name:"
 msgstr ""
 
@@ -3487,19 +3938,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:250 po/rc.cpp:259 rc.cpp:250 rc.cpp:259
+#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
 msgid "Folder:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:259 rc.cpp:259
 msgid "Extra Options:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:262 rc.cpp:262
 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 "
@@ -3508,7 +3959,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:268 rc.cpp:268
 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, "
@@ -3516,112 +3967,112 @@ msgid ""
 "attached.</i>"
 msgstr ""
 
-#. 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:271 rc.cpp:271
 msgid "No dynamizer port defined in server settings."
 msgstr ""
 
-#. 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:274 rc.cpp:274
 msgid "Remote dynamizer is not running."
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:277 rc.cpp:277
 msgid "Name of Dynamic Rules"
 msgstr ""
 
 #. 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:283 streams/streamspage.cpp:62 rc.cpp:283
 msgid "Edit"
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:289 rc.cpp:289
 msgid "About Rules"
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrule.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:295 rc.cpp:295
 msgid "Album Artist:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
+#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
 msgid "Album:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:103
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:310 rc.cpp:310
 msgid "From Year:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
 msgid "Any"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:126
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:316 rc.cpp:316
 msgid "To Year:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:136
+#. i18n: file: dynamic/dynamicrule.ui:149
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
+#: po/rc.cpp:322 rc.cpp:322
 msgid "Exact match:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:160
+#. i18n: file: dynamic/dynamicrule.ui:173
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
+#: po/rc.cpp:328 rc.cpp:328
 msgid "Include songs that match the following:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:165
+#. i18n: file: dynamic/dynamicrule.ui:178
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
+#: po/rc.cpp:331 rc.cpp:331
 msgid "Exclude songs that match the following:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:173
+#. i18n: file: dynamic/dynamicrule.ui:186
 #. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
+#: po/rc.cpp:334 rc.cpp:334
 msgid "Artists similar to:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:236
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:337 rc.cpp:337
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:249
+#. i18n: file: dynamic/dynamicrule.ui:262
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:340 rc.cpp:340
 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>"
@@ -3629,99 +4080,105 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
+#: 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: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
+#: 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:717
+#. 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:717
+#. i18n: file: gui/initialsettingswizard.ui:716
 #. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
+#: 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:730
+#. 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:730
+#. i18n: file: gui/initialsettingswizard.ui:729
 #. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
+#: 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:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
+#. i18n: file: gui/filesettings.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
+#: 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: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:110
 #. 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:364 rc.cpp:364
 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 ""
 
-#. i18n: file: gui/filesettings.ui:128
+#. i18n: file: gui/filesettings.ui:145
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:367 rc.cpp:367
 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>"
+"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 ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:370 rc.cpp:370
 msgid "Cantata First Run"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:361 rc.cpp:361
+#: po/rc.cpp:373 rc.cpp:373
 msgid "Welcome to Cantata"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:376 rc.cpp:376
 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 "
@@ -3734,13 +4191,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:379 rc.cpp:379
 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:370 rc.cpp:370
+#: po/rc.cpp:382 rc.cpp:382
 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 "
@@ -3750,28 +4207,14 @@ msgid ""
 msgstr ""
 
 #. 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 ""
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:385 rc.cpp:385
 msgid "Standard multi-user/server setup"
 msgstr ""
 
-#. 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 ""
-
-#. 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:388 rc.cpp:388
 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 "
@@ -3780,9 +4223,23 @@ msgid ""
 "that MPD is already configured and running.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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 ""
+
+#. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:386 rc.cpp:386
+#: po/rc.cpp:397 rc.cpp:397
 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-"
@@ -3791,75 +4248,75 @@ msgid ""
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
 
-#. 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:400 rc.cpp:400
 msgid "Connection details"
 msgstr ""
 
-#. 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:403 rc.cpp:403
 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 ""
 
-#. 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:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
 msgid "Host (or local socket):"
 msgstr ""
 
-#. 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:421 rc.cpp:421
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
 msgstr ""
 
-#. 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:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
 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 ""
 
-#. 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:427 rc.cpp:427
 msgid "Music folder"
 msgstr ""
 
-#. 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:430 rc.cpp:430
 msgid "Please choose the folder containing your music collection."
 msgstr ""
 
-#. 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:436 rc.cpp:436
 msgid "Covers, Lyrics, and Streams"
 msgstr ""
 
-#. 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:439 rc.cpp:439
 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 "
@@ -3868,33 +4325,47 @@ msgid ""
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:808
+#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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 ""
+
+#. i18n: file: gui/initialsettingswizard.ui:824
 #. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:443 rc.cpp:443
+#: po/rc.cpp:457 rc.cpp:457
 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>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:841
+#. i18n: file: gui/initialsettingswizard.ui:857
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:460 rc.cpp:460
 msgid "Finished!"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:880
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:463 rc.cpp:463
 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:902
+#. i18n: file: gui/initialsettingswizard.ui:918
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:466 rc.cpp:466
 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 "
@@ -3903,27 +4374,6 @@ msgid ""
 "effect."
 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 ""
-
 #. i18n: file: gui/interfacesettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
@@ -3932,25 +4382,25 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
 #. 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:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
 msgid "Covers:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
+#: po/rc.cpp:478 rc.cpp:478
 msgid "Show artist images:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:81
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:467 rc.cpp:467
+#: po/rc.cpp:481 rc.cpp:481
 msgid "Show album year:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:123
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:484 rc.cpp:484
 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"
@@ -3962,25 +4412,25 @@ msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:172
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:497 rc.cpp:497
 msgid "Sort albums:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:183
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Album/Artist"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:188
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:503 rc.cpp:503
 msgid "Artist/Album"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:506 rc.cpp:506
 msgid "Artist/Year/Album"
 msgstr ""
 
@@ -3992,221 +4442,207 @@ msgstr ""
 #. 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
+#: 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: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:518 rc.cpp:518
 msgid "Other Views"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
 msgid "Folder view style:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
 msgid "Streams view style:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Online view style:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:530 rc.cpp:530
 msgid "Devices view style:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:324
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:525 rc.cpp:525
+#: 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:534 rc.cpp:534
+#: 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:537 rc.cpp:537
+#: 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:540 rc.cpp:540
+#: po/rc.cpp:554 rc.cpp:554
 msgid "Use current album cover as background:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:398
+#. 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: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:560 rc.cpp:560
 msgid "External"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:404
+#. i18n: file: gui/interfacesettings.ui:417
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
+#: po/rc.cpp:563 rc.cpp:563
 msgid "Show icon in notification area:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:424
+#. i18n: file: gui/interfacesettings.ui:437
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
+#: po/rc.cpp:566 rc.cpp:566
 msgid "Minimize to notification area when closed:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:444
+#. i18n: file: gui/interfacesettings.ui:457
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
+#: po/rc.cpp:569 rc.cpp:569
 msgid "Show popup messages when changing tracks:"
 msgstr ""
 
-#. 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 ""
-
 #. i18n: file: gui/interfacesettings.ui:475
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
+#: po/rc.cpp:572 rc.cpp:572
 msgid "General"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:486
 #. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
+#: 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:564 rc.cpp:564
+#: po/rc.cpp:581 rc.cpp:581
 msgid "Multiple artist albums:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: file: gui/interfacesettings.ui:533
 #. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
+#: po/rc.cpp:584 rc.cpp:584
 msgid "Show delete action in context menus:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:533
+#. i18n: file: gui/interfacesettings.ui:550
 #. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
+#: po/rc.cpp:587 rc.cpp:587
 msgid "Enforce single-click activation of items:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:574
+#. i18n: file: gui/interfacesettings.ui:591
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
+#: po/rc.cpp:590 rc.cpp:590
 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:244
+#. i18n: file: gui/mainwindow.ui:287
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
+#: po/rc.cpp:593 rc.cpp:593
 msgid "[Dynamic]"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
+#: po/rc.cpp:596 rc.cpp:596
 msgid "Output"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:41
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:585 rc.cpp:585
+#: 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:588 rc.cpp:588
+#: po/rc.cpp:605 rc.cpp:605
 msgid " seconds"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:591 rc.cpp:591
+#: po/rc.cpp:608 rc.cpp:608
 msgid "Replay gain:"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:594 rc.cpp:594
+#: po/rc.cpp:611 rc.cpp:611
 msgid "About replay gain"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:104
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:597 rc.cpp:597
+#: po/rc.cpp:614 rc.cpp:614
 msgid "Devices:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:132
-#. i18n: ectx: property (title), widget (QGroupBox, streamBox)
-#: po/rc.cpp:600 rc.cpp:600
-msgid "HTTP Stream"
-msgstr ""
-
 #. 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 ""
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
-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>"
-msgstr ""
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: po/rc.cpp:609 rc.cpp:609
-msgid "Stopping Playback"
-msgstr ""
-
-#. i18n: file: gui/playbacksettings.ui:176
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:620 rc.cpp:620
 msgid "Fadeout on stop:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:189
+#. i18n: file: gui/playbacksettings.ui:154
 #. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
+#: po/rc.cpp:623 rc.cpp:623
 msgid "Stop playback on exit:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:202
+#. i18n: file: gui/playbacksettings.ui:167
 #. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
+#: po/rc.cpp:626 rc.cpp:626
 msgid "Stop dynamizer on exit:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:219
+#. 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:621 rc.cpp:621
+#: 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 "
@@ -4215,31 +4651,37 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:635 rc.cpp:635
 msgid "Collection:"
 msgstr ""
 
 #. 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:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
 msgid "Cover filename:"
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:645 rc.cpp:645
+#: po/rc.cpp:656 rc.cpp:656
 msgid "Dynamizer port:"
 msgstr ""
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:659 rc.cpp:659
+msgid "HTTP stream URL:"
+msgstr ""
+
+#. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:648 rc.cpp:648
+#: po/rc.cpp:662 rc.cpp:662
 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 "
@@ -4248,18 +4690,27 @@ msgid ""
 "album folder.</i>"
 msgstr ""
 
-#. i18n: file: gui/serversettings.ui:314
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+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 ""
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:677 rc.cpp:677
 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 ""
 
-#. 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:680 rc.cpp:680
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4267,19 +4718,19 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:666 rc.cpp:666
+#: po/rc.cpp:683 rc.cpp:683
 msgid "Network interface:"
 msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
+#: po/rc.cpp:686 rc.cpp:686
 msgid "Current URL:"
 msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:73
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:689 rc.cpp:689
 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 "
@@ -4291,25 +4742,33 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:693 rc.cpp:693
 msgid "Mode:"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:699 rc.cpp:699
 msgid "HTTP Proxy"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:685 rc.cpp:685
+#: po/rc.cpp:702 rc.cpp:702
 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."
+msgstr ""
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:723 rc.cpp:723
 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."
@@ -4319,202 +4778,260 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:726 rc.cpp:726
 msgid "Premium Account"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:735 rc.cpp:735
 msgid "Stream type:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:738 rc.cpp:738
 msgid "Status:"
 msgstr ""
 
 #. 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:741 streams/digitallyimportedsettings.cpp:130
+#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
 msgid "Login"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:747 rc.cpp:747
 msgid "Session expiry:"
 msgstr ""
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:750 rc.cpp:750
+msgid ""
+"<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
+"RockRadio.com, and Sky.fm</i>"
+msgstr ""
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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: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 ""
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+msgid "Configure Provider"
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:60
+#. i18n: ectx: property (text), widget (QPushButton, installButton)
+#: po/rc.cpp:762 rc.cpp:762
+msgid "Install"
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:768 rc.cpp:768
+msgid ""
+"<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
+"removed.</i>"
+msgstr ""
+
+#. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:727 rc.cpp:727
+#: po/rc.cpp:771 rc.cpp:771
 msgid "Search:"
 msgstr ""
 
-#. 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:774 rc.cpp:774
 msgid "Shortcut for Selected Action"
 msgstr ""
 
-#. 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:777 rc.cpp:777
 msgid "Default:"
 msgstr ""
 
-#. 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:783 rc.cpp:783
 msgid "Custom:"
 msgstr ""
 
-#. i18n: file: tags/tageditor.ui:22
+#. i18n: file: tags/tageditor.ui:25
 #. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
+#: po/rc.cpp:786 rc.cpp:786
 msgid "Track:"
 msgstr ""
 
-#. 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:795 rc.cpp:795
 msgid "Album artist:"
 msgstr ""
 
-#. 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:804 rc.cpp:804
 msgid "Track number:"
 msgstr ""
 
-#. 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:807 rc.cpp:807
 msgid "Disc number:"
 msgstr ""
 
 #. i18n: file: tags/trackorganiser.ui:155
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:834 rc.cpp:834
 msgid "Original Name"
 msgstr ""
 
 #. i18n: file: tags/trackorganiser.ui:160
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:837 rc.cpp:837
 msgid "New Name"
 msgstr ""
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:838 rc.cpp:838
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr ""
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:839 rc.cpp:839
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:121
 msgid "Show All Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:122
 msgid "Show Untagged Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
 msgid "Remove From List"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:140
+#: replaygain/rgdialog.cpp:136
 msgid "Album Gain"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:141
+#: replaygain/rgdialog.cpp:137
 msgid "Track Gain"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:142
+#: replaygain/rgdialog.cpp:138
 msgid "Album Peak"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:143
+#: replaygain/rgdialog.cpp:139
 msgid "Track Peak"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
 msgid "Scan"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:238
 msgid "Update ReplayGain tags in tracks?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
 msgid "Update Tags"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:252
 msgid "Abort scanning of tracks?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:257
+#: replaygain/rgdialog.cpp:261
 msgid "Abort reading of existing tags?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:287
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:285
+#: replaygain/rgdialog.cpp:289
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "Untagged Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "All Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:300
 msgid "Scanning tracks..."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:367
 msgid "Reading existing tags..."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr ""
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr ""
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
 msgid "Failed to update the tags of the following tracks:"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
+#: tags/trackorganiser.cpp:451
 msgid "Device is not connected."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
 msgid "%1 dB"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: 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
 msgid "Failed"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
 msgid "Remove the selected tracks from the list?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
 msgid "Remove Tracks"
 msgstr ""
 
@@ -4546,6 +5063,10 @@ msgstr ""
 msgid "Logout"
 msgstr ""
 
+#: streams/streamdialog.cpp:71
+msgid "URL:"
+msgstr ""
+
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
 msgstr ""
@@ -4566,113 +5087,146 @@ msgstr ""
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr ""
 
-#: streams/streamfetcher.cpp:198
+#: streams/streamfetcher.cpp:205
 msgid "Fetching %1"
 msgstr ""
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 msgid "Import Streams Into Favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 msgid "Export Favorite Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:123
-msgid "Search TuneIn:"
+#: streams/streamspage.cpp:124
+msgctxt "Service name"
+msgid "Digitally Imported"
 msgstr ""
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:242
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
 msgid "Import Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:245
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr ""
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:253
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr ""
 
-#: streams/streamspage.cpp:262
+#: streams/streamspage.cpp:265
 msgid "*.xml|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
 msgid "Export Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:267
 msgid "XML Streams (*.xml)"
 msgstr ""
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:279
 msgid "Failed to create <b>%1</b>!"
 msgstr ""
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr ""
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
 msgid "A stream named <b>%1</b> already exists!"
 msgstr ""
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:318
 msgid "Bookmark added"
 msgstr ""
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:320
 msgid "Already bookmarked"
 msgstr ""
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:366
 msgid "Added to favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:368
 msgid "Already in favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:393
 msgid "Reload <b>%1</b> streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:411
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr ""
 
-#: streams/streamspage.cpp:414
+#: streams/streamspage.cpp:417
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr ""
 
-#: streams/streamspage.cpp:442
+#: streams/streamspage.cpp:445
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:446
+#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr ""
 
-#: streams/streamspage.cpp:609
-msgid "Logged into Digitally Imported"
+#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+msgid "Search %1:"
+msgstr ""
+
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr ""
+
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+msgid "Install Streams"
+msgstr ""
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
+msgstr ""
+
+#: streams/streamssettings.cpp:144
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr ""
+
+#: streams/streamssettings.cpp:150
+msgid "Failed top open %1"
+msgstr ""
+
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr ""
+
+#: streams/streamssettings.cpp:170
+msgid "Failed to create stream category folder!"
+msgstr ""
+
+#: streams/streamssettings.cpp:176
+msgid "Failed to save stream list!"
 msgstr ""
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
+#: streams/streamssettings.cpp:227
+msgid "Failed to remove streams folder!"
 msgstr ""
 
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr ""
 
 #: support/dialog.cpp:90
@@ -4735,39 +5289,39 @@ msgstr ""
 msgid "&Next"
 msgstr ""
 
-#: support/fancytabwidget.cpp:952
+#: support/fancytabwidget.cpp:957
 msgid "Icons Only"
 msgstr ""
 
-#: support/fancytabwidget.cpp:953
+#: support/fancytabwidget.cpp:958
 msgid "Style"
 msgstr ""
 
-#: support/fancytabwidget.cpp:954
+#: support/fancytabwidget.cpp:959
 msgid "Large Sidebar"
 msgstr ""
 
-#: support/fancytabwidget.cpp:955
+#: support/fancytabwidget.cpp:960
 msgid "Small Sidebar"
 msgstr ""
 
-#: support/fancytabwidget.cpp:956
+#: support/fancytabwidget.cpp:961
 msgid "Top Bar"
 msgstr ""
 
-#: support/fancytabwidget.cpp:957
+#: support/fancytabwidget.cpp:962
 msgid "Bottom Bar"
 msgstr ""
 
-#: support/fancytabwidget.cpp:958
+#: support/fancytabwidget.cpp:963
 msgid "Tabs On Side"
 msgstr ""
 
-#: support/fancytabwidget.cpp:959
+#: support/fancytabwidget.cpp:964
 msgid "Tabs On Top"
 msgstr ""
 
-#: support/fancytabwidget.cpp:960
+#: support/fancytabwidget.cpp:965
 msgid "Tabs On Bottom"
 msgstr ""
 
@@ -4779,19 +5333,20 @@ msgstr ""
 msgid "Please enter password:"
 msgstr ""
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
 msgid "Warning"
 msgstr ""
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
 msgid "Question"
 msgstr ""
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
+#: support/messagebox.cpp:107 support/messagebox.cpp:113
+#: support/messagebox.h:62
 msgid "Error"
 msgstr ""
 
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr ""
 
@@ -4811,141 +5366,160 @@ msgstr ""
 msgid "Select File"
 msgstr ""
 
-#: support/utils.cpp:271 support/utils.cpp:279
+#: support/utils.cpp:390 support/utils.cpp:398
 msgid "%1 B"
 msgstr ""
 
-#: support/utils.cpp:272
+#: support/utils.cpp:391
 msgid "%1 kB"
 msgstr ""
 
-#: support/utils.cpp:273
+#: support/utils.cpp:392
 msgid "%1 MB"
 msgstr ""
 
-#: support/utils.cpp:275
+#: support/utils.cpp:394
 msgid "%1 GB"
 msgstr ""
 
-#: support/utils.cpp:280
+#: support/utils.cpp:399
 msgid "%1 KiB"
 msgstr ""
 
-#: support/utils.cpp:281
+#: support/utils.cpp:400
 msgid "%1 MiB"
 msgstr ""
 
-#: support/utils.cpp:283
+#: support/utils.cpp:402
 msgid "%1 GiB"
 msgstr ""
 
-#: tags/tageditor.cpp:131
+#: support/utils.cpp:602
+msgid "1 day %2"
+msgid_plural "%1 days %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: tags/tageditor.cpp:134
 msgid "Tags"
 msgstr ""
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:147
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr ""
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
 msgid "All tracks"
 msgstr ""
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:295
 msgid "(Various)"
 msgstr ""
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:336
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:367
+#: tags/tageditor.cpp:378
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:417
+#: tags/tageditor.cpp:428
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:418
+#: tags/tageditor.cpp:429
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 
-#: tags/tageditor.cpp:419
+#: tags/tageditor.cpp:430
 msgid "Album Artist from Artist"
 msgstr ""
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:463
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:485
+#: tags/tageditor.cpp:496
 msgid "Adjust the value of each track number by:"
 msgstr ""
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:554
 msgid "All tracks [modified]"
 msgstr ""
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:556
 msgid "%1 [modified]"
 msgstr ""
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:783
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 
-#: tags/tageditor.cpp:759
+#: tags/tageditor.cpp:784
 msgid "Rename Files"
 msgstr ""
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:150
 msgid "Abort renaming of files?"
 msgstr ""
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:263
+msgid "Source file does not exist!<br/>%1"
+msgstr ""
+
+#: tags/trackorganiser.cpp:282
 msgid "Destination file already exists!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:304
 msgid "Failed to create destination folder!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:325
 msgid "Failed to rename %1 to %2"
 msgstr ""
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:267
+msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
+msgstr ""
+
+#: widgets/coverwidget.cpp:269
 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:59
+#: widgets/genrecombo.cpp:54
 msgid "All Genres"
 msgstr ""
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:267
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr ""
+
+#: widgets/groupedview.cpp:269
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr ""
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:480
 msgid "Go Back"
 msgstr ""
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:485
 msgid "Go Home"
 msgstr ""
 
 #: widgets/menubutton.cpp:36
-msgid "Other Actions"
+msgid "Menu"
 msgstr ""
 
 #: widgets/searchwidget.cpp:62
@@ -4955,6 +5529,51 @@ msgstr ""
 #: widgets/searchwidget.cpp:66
 msgid "Close Search Bar"
 msgstr ""
+
+#: widgets/servicestatuslabel.cpp:43
+msgid "Logged into %1"
+msgstr ""
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr ""
+
+#: widgets/songdialog.cpp:48
+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
+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
+msgid "Mute"
+msgstr ""
+
+#: widgets/volumeslider.cpp:199
+msgid "Muted"
+msgstr ""
+
+#: widgets/volumeslider.cpp:238
+msgid "Unmute"
+msgstr ""
+
+#: widgets/volumeslider.cpp:276
+msgid "Volume Disabled"
+msgstr ""
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1% (Muted)"
+msgstr ""
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr ""
  
 
 #: ../gui/qtplural.h:30
@@ -5034,3 +5653,25 @@ msgstr ""
 msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr ""
+
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr ""
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr ""
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr ""
+
+#: ../gui/qtplural.h:63
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr ""
diff --git a/po/cs.po b/po/cs.po
index 380ce2c..2c2d090 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -6,8 +6,8 @@ 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-07-25 12:45+0200\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"
 "Language-Team: Czech <kde-i18n-doc at kde.org>\n"
 "Language: cs\n"
@@ -17,43 +17,43 @@ msgstr ""
 "Plural-Forms: nplurals=3; plural=((n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2);\n"
 "X-Language: cs_CZ\n"
 "X-Source-Language: C\n"
-"X-Generator: Lokalize 1.4\n"
+"X-Generator: Lokalize 1.5\n"
 
 #: context/albumview.cpp:63
 msgid "Refresh Album Information"
 msgstr "Obnovit informace o albu"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
 msgid "Album Information"
 msgstr "Informace o albu"
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:143
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
 msgid "Tracks"
 msgstr "Skladby"
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 msgid "Refresh Artist Information"
 msgstr "Obnovit informace o umělci"
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 context/contextwidget.cpp:306
+#: gui/cachesettings.cpp:260
 msgid "Artist Information"
 msgstr "Informace o umělci"
 
 #. i18n: file: gui/interfacesettings.ui:137
 #. 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:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
 msgid "Albums"
 msgstr "Alba"
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:333
 msgid "Web Links"
 msgstr "Internetové odkazy"
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:419
 msgid "Similar Artists"
 msgstr "Podobní umělci"
 
@@ -65,8 +65,8 @@ msgstr "Poskytovatelé textů písní"
 msgid "Wikipedia Languages"
 msgstr "Jazyky Wikipedie"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
-#: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
 msgid "Other"
 msgstr "Jiné"
 
@@ -74,12 +74,12 @@ msgstr "Jiné"
 msgid "Reset Spacing"
 msgstr "Nastavit znovu řádkování"
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
 msgid "Lyrics"
 msgstr "Slova písně"
 
-#: context/lastfmengine.cpp:65
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr "Číst více na Last.fm"
 
@@ -101,20 +101,20 @@ 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:47
+#. i18n: file: devices/albumdetails.ui:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
+#: rc.cpp:61 rc.cpp:304 rc.cpp:789
 msgid "Title:"
 msgstr "Název:"
 
@@ -122,16 +122,16 @@ msgstr "Název:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
+#: rc.cpp:55 rc.cpp:292 rc.cpp:792
 msgid "Artist:"
 msgstr "Umělec:"
 
@@ -139,111 +139,112 @@ msgstr "Umělec:"
 msgid "Search For Lyrics"
 msgstr "Hledat slova písně"
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 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:46
+#: context/lyricsettings.cpp:66
 msgid "(Polish Translations)"
 msgstr "Polština"
 
-#: context/lyricsettings.cpp:47
+#: context/lyricsettings.cpp:67
 msgid "(Portuguese Translations)"
 msgstr "Portugalština"
 
-#: context/songview.cpp:74
+#: context/songview.cpp:89
 msgid "Refresh Lyrics"
 msgstr "Obnovit slova písně"
 
-#: context/songview.cpp:75
+#: context/songview.cpp:90
 msgid "Edit Lyrics"
 msgstr "Upravit slova písně"
 
-#: context/songview.cpp:76
+#: context/songview.cpp:91
 msgid "Save Lyrics"
 msgstr "Uložit slova písně"
 
-#: context/songview.cpp:77
+#: context/songview.cpp:92
 msgid "Cancel Editing Lyrics"
 msgstr "Zrušit upravování slov písně"
 
-#: context/songview.cpp:78
+#: context/songview.cpp:93
 msgid "Delete Lyrics File"
 msgstr "Smazat soubor se slovy písně"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort editing of lyrics?"
 msgstr "Přerušit upravování slov písně?"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort Editing"
 msgstr "Přerušit upravování"
 
-#: 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: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
 msgid "Abort"
 msgstr "Přerušit"
 
-#: context/songview.cpp:106
+#: context/songview.cpp:121
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "Smazat uloženou kopii slov písně a stáhnout znovu?"
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:121 context/songview.cpp:122
+#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
 msgid "Re-download"
 msgstr "Stáhnout znovu"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 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:132
+#: context/songview.cpp:147
 msgid "Song Changed"
 msgstr "Píseň změněna"
 
-#: context/songview.cpp:133
+#: context/songview.cpp:148
 msgid "Perform Search"
 msgstr "Provést hledání"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save updated lyrics?"
 msgstr "Uložit obnovená slova písně?"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save"
 msgstr "Uložit"
 
-#: context/songview.cpp:170
+#: context/songview.cpp:185
 msgid "Failed to save lyrics."
 msgstr "Nepodařilo se uložit slova písně"
 
-#: context/songview.cpp:192
+#: context/songview.cpp:207
 msgid "Delete lyrics file?"
 msgstr "Smazat soubor se slovy písně?"
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
+#: context/songview.cpp:207 gui/mainwindow.cpp:292
+#: widgets/messageoverlay.cpp:43
 msgid "Cancel"
 msgstr "Zrušit"
 
-#: context/songview.cpp:416
+#: context/songview.cpp:431
 msgid "Fetching lyrics via %1"
 msgstr "Natahují se slova písně přes %1"
 
-#: context/wikipediaengine.cpp:250
+#: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Seznam skladeb"
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr "Číst víc na Wikipedii"
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr "Otevřít v prohlížeči"
 
-#: 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 "umělec|skupina|pěvec|zpěvák|zpěvačka|hudebník"
@@ -253,7 +254,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "album|hudba|zvukový záznam"
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:99
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -261,41 +262,46 @@ msgstr ""
 "Vyberte jazyky na Wikipedii, které chcete použít při hledání umělců a "
 "informací o albech"
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
+#: online/podcastsearchdialog.cpp:393
 msgid "Reload"
 msgstr "Nahrát znovu"
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr "Cantata přehrává skladbu"
+
+#: devices/actiondialog.cpp:76
 msgid "Songs To Be Copied"
 msgstr "Písně ke zkopírování"
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:146
 msgid "<b>INVALID</b>"
 msgstr "<b>NEPLATNÝ</b>"
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
 msgid "<i>(When different)</i>"
 msgstr "<i>(Když jiný)</i>"
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Umělci:%1, Alba:%2, Písně:%3"
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
+#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
 #: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
 msgid "%1 free"
 msgstr "%1 volno"
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
 msgid "Local Music Library"
 msgstr "Místní hudební knihovna"
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
+#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
 msgid "Audio CD"
 msgstr "Audio CD"
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:293
 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 +313,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:285
+#: devices/actiondialog.cpp:300
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -315,32 +321,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:334
+#: devices/actiondialog.cpp:349
 msgid "Copy Songs"
 msgstr "Kopírovat písně"
 
-#: 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:349 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Smazat písně"
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:380
 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:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
 msgid "Not Configured"
 msgstr "Nenastaveno"
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
 msgid "Use Defaults"
 msgstr "Použít výchozí nastavení"
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:384
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -348,63 +354,63 @@ msgstr ""
 "<p>Nenastavil jste zdrojové zařízení.<br/>Pokračovat s výchozím nastavením?</"
 "p>"
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:446
 msgid "Are you sure you wish to stop?"
 msgstr "Opravdu chcete zastavit?"
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Zastavit"
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
+#: tags/trackorganiser.cpp:446
 msgid "Device has been removed!"
 msgstr "Zařízení bylo odstraněno!"
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:491
 msgid "Device is not connected!"
 msgstr "Zařízení není připojeno!"
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
+#: tags/trackorganiser.cpp:456
 msgid "Device is busy?"
 msgstr "Zařízení je zaneprázdněno?"
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "Zařízení bylo změněno?"
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:562
 msgid "Clearing unused folders"
 msgstr "Uklízí se nepoužívané složky"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "Spočítat vyrovnání hlasitosti skladeb pro vytažené skladby?"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "ReplyGain"
 msgstr "Vyrovnání hlasitosti"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:578
 msgid "Calculate"
 msgstr "Spočítat"
 
-#: devices/actiondialog.cpp:618
+#: 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:621
+#: devices/actiondialog.cpp:637
 msgid "Song already exists!<hr/>%1"
 msgstr "Píseň již existuje!<hr/>%1"
 
-#: devices/actiondialog.cpp:624
+#: devices/actiondialog.cpp:640
 msgid "Song does not exist!<hr/>%1"
 msgstr "Píseň neexistuje!<hr/>%1"
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:643
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
 "permissions.<hr/>%1"
@@ -412,31 +418,31 @@ 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"
 
-#: devices/actiondialog.cpp:630
+#: 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:633
+#: devices/actiondialog.cpp:649
 msgid "Failed to copy.<hr/>%1"
 msgstr "Nepodařilo se zkopírovat.<hr/>%1"
 
-#: devices/actiondialog.cpp:634
+#: devices/actiondialog.cpp:650
 msgid "Failed to delete.<hr/>%1"
 msgstr "Nepodařilo se smazat.<hr/>%1"
 
-#: devices/actiondialog.cpp:637
+#: devices/actiondialog.cpp:653
 msgid "Not connected to device.<hr/>%1"
 msgstr "Nepřipojeno k zařízení.<hr/>%1"
 
-#: devices/actiondialog.cpp:640
+#: devices/actiondialog.cpp:656
 msgid "Selected codec is not available.<hr/>%1"
 msgstr "Vybraný kodek není dostupný.<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: 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:646
+#: devices/actiondialog.cpp:662
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
 "devices.)<hr/>%1"
@@ -444,60 +450,55 @@ msgstr ""
 "Nepodařilo se vytvořit dočasný soubor.<br/>(Požadováno pro překódování na "
 "zařízení MTP.)<hr/>%1"
 
-#: devices/actiondialog.cpp:649
+#: 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:652
+#: 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:655
+#: 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:658
+#: 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:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr ""
-"Nepodařilo se stáhnout skladbu - vyskytlo se příliš mnoho přesměrování.<br/"
-"><br/<hr/>%1"
-
-#: devices/actiondialog.cpp:664
+#: 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:667
+#: devices/actiondialog.cpp:680
 msgid "Failed to lock device.<hr/>%1"
 msgstr "Nepodařilo se uzamknout zařízení.<hr/>%1"
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:709
 msgid "Local Music Library Properties"
 msgstr "Vlastnosti místní hudební knihovny"
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
+#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
 msgid "<b>Error</b><br/>"
 msgstr "<b>Chyba</b><br/>"
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Skip"
 msgstr "Přeskočit"
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Auto Skip"
 msgstr "Automaticky přeskočit"
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:759
 msgid "Retry"
 msgstr "Zkusit znovu"
 
-#: devices/actiondialog.cpp:761
+#: 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</"
@@ -507,7 +508,7 @@ msgstr ""
 "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Skladba:</td><td>%3</"
 "td></tr>"
 
-#: devices/actiondialog.cpp:768
+#: 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>"
@@ -515,20 +516,21 @@ msgstr ""
 "<tr><td align=\"right\">Zdrojový soubor:</td><td>%1</td></tr><tr><td align="
 "\"right\">Cílový soubor:</td><td>%2</td></tr>"
 
-#: devices/actiondialog.cpp:773
+#: 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:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
 msgid "Calculating..."
 msgstr "Připojuje se..."
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:799
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (odhadováno)"
 
-#: devices/actiondialog.cpp:789
+#: devices/actiondialog.cpp:802
 msgid ""
 "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
 "i></tr>"
@@ -536,40 +538,40 @@ msgstr ""
 "<tr><i><td align=\"right\"><i>Zbývající čas:</i></td><td><i>%5</i></td></i></"
 "tr>"
 
-#: devices/actiondialog.cpp:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Ukládá se vyrovnávací paměť"
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
+#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Použít zařazení pod Různí umělci"
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
+#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Zvrátit zařazení pod Různí umělci"
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
+#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
 msgid "Capitalize"
 msgstr "Psát velkými písmeny"
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
 msgid "Adjust Track Numbers"
 msgstr "Upravit čísla skladeb"
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
 msgid "Tools"
 msgstr "Nástroje"
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "Použít zařazení pod Různí umělci?"
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -577,11 +579,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:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Zvrátit zařazení pod Různí umělci"
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
 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' "
@@ -594,36 +596,36 @@ 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:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
 msgid "Revert"
 msgstr "Vrátit"
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
 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:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
 msgid "Adjust track number by:"
 msgstr "Upravit číslo skladby o:"
 
-#: 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
+#: 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:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Čte se 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:353 gui/mainwindow.cpp:2199
+#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
+#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "Jedna skladba (%2)"
@@ -642,24 +644,24 @@ msgstr "MusicBrainz"
 msgid "Data Track"
 msgstr "Datová stopa"
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr "Nepodařilo se otevřít zařízení CD"
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
 #: devices/musicbrainz.cpp:217
 msgid "Track %1"
 msgstr "Stopa %1"
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr "Nepodařilo se vytvořit připojení CDDB"
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr "V CDDB nenalezeny žádné shody"
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr "Chyba CDDB: %1"
 
@@ -668,19 +670,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:157
+#. i18n: file: devices/albumdetails.ui:170
 #. 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:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
+#: rc.cpp:82
 msgid "Artist"
 msgstr "Umělec"
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:175
 #. 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:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
+#: rc.cpp:85
 msgid "Title"
 msgstr "Název"
 
@@ -698,10 +700,14 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr "Obnovuje se (%1)..."
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr "Obnovuje se (%1%)..."
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -805,24 +811,24 @@ msgstr "Zapomenout zařízení"
 msgid "Add Device"
 msgstr "Přidat zařízení"
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
 msgstr "Vyhledat podrobnosti alba a skladby?"
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455
 msgid "Refresh"
 msgstr "Obnovit"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr "Pomocí CDDB"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr "Pomocí 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>"
@@ -832,16 +838,16 @@ msgstr ""
 "pouze nové písně <i>(rychlé)</i></li><li>Úplný - Jsou prohledány všechny "
 "písně <i>(pomalé)</i></li></ul></p>"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr "Částečný"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr "Úplný"
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -849,31 +855,31 @@ msgstr ""
 "Opravdu chcete odstranit vybrané písně?\n"
 "Tento krok nelze vrátit zpět."
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr "Opravdu chcete zapomenout na <b>%1</b>?"
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr "Opravdu chcete vysunout zvukové CD <b>%1 - %2</b>?"
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr "Vysunout"
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr "Opravdu chcete odpojit <b>%1</b>?"
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr "Odpojit"
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
 msgid "Please close other dialogs first."
 msgstr "Nejprve, prosím, zavřete další dialogy"
 
-#: devices/encoders.cpp:78
+#: devices/encoders.cpp:77
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -889,7 +895,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:83
+#: devices/encoders.cpp:82
 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 "
@@ -916,25 +922,25 @@ msgstr ""
 "úhrnně lepší jakost a menší soubor než stálý datový tok bitrate po celou "
 "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>150kb/s</b> je dobrou volbou pro poslech "
-"hudby v přenosném přehrávači.<br/>Cokoli pod <b>120kb/s</b> může být hudebně "
-"neuspokojivé a cokoli nad <b>200kb/s</b> je pravděpodobně až přespříliš."
+"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š."
 
-#: devices/encoders.cpp:101 devices/encoders.cpp:141
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
 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:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
+#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
 msgid "Smaller file"
 msgstr "Menší soubor"
 
-#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:329
 msgid "Better sound quality"
 msgstr "Lepší kvalita zvuku"
 
-#: devices/encoders.cpp:120
+#: devices/encoders.cpp:119
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -950,7 +956,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:124
+#: devices/encoders.cpp:123
 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 "
@@ -974,15 +980,15 @@ msgstr ""
 "ú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 <a href=http://wwwffmpeg.org/faq.html#>průměrného datového toku</a> "
-"kódované skladby.<br><b>160kb/s</b> je dobrou volbou pro poslech hudby v "
-"přenosném přehrávači.<br/>Cokoli pod <b>120kb/s</b> může být hudebně "
-"neuspokojivé a cokoli nad <b>205kb/s</b> je pravděpodobně až přespříliš."
+"kódované skladby.<br><b>160 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>205 kb/s</b> je pravděpodobně až přespříliš."
 
-#: devices/encoders.cpp:156 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:159
+#: devices/encoders.cpp:158
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -998,7 +1004,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:164
+#: devices/encoders.cpp:163
 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 "
@@ -1024,7 +1030,7 @@ msgstr ""
 "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ž jaký dává stálý "
 "datový tok po celou dobu skladby.<br>Kodér Vorbis používá při hodnocení "
-"jakosti parameter \"-q\", což je hodnota mezi -1 a 10, aby stanovil určitou "
+"jakosti parametr \"-q\", což je hodnota mezi -1 a 10, aby stanovil určitou "
 "očekávanou úroveň kvality zvuku. Měřítko datového toku v tomto posuvníku je "
 "jen hrubým odhadem (obstaraným Vorbisem) průměrného datového toku kódované "
 "skladby daný hodnotou q. Vlastně je s novějšími a účinnějšími verzemi kodéru "
@@ -1032,15 +1038,63 @@ 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:184
+#: devices/encoders.cpp:183
 msgid "Quality rating"
 msgstr "Hodnocení jakosti"
 
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr "Opus"
+
+#: devices/encoders.cpp:203
+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 ""
+"<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
+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 ""
+"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
+msgid "Bitrate"
+msgstr "Datový tok"
+
+#: devices/encoders.cpp:241
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:244
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1055,11 +1109,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:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:262
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1075,7 +1129,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:230
+#: devices/encoders.cpp:266
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1100,19 +1154,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:245
+#: devices/encoders.cpp:281
 msgid "Compression level"
 msgstr "Úroveň zhuštění"
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:291
 msgid "Faster compression"
 msgstr "Rychlejší zhuštění"
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:298
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:301
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1127,7 +1181,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:268
+#: devices/encoders.cpp:305
 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> "
@@ -1150,88 +1204,126 @@ 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/encoders.cpp:282
-msgid "Bitrate"
-msgstr "Datový tok"
-
 #: devices/filenameschemedialog.cpp:33
 msgid "Filename Scheme"
 msgstr "Schéma názvu souboru"
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:52
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Různí umělci"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:53
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr "Vivaldi"
+
+#: devices/filenameschemedialog.cpp:55
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Nyní 5001"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:56
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Výkyv"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:57
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Tanec"
 
-#: devices/filenameschemedialog.cpp:99
+#: devices/filenameschemedialog.cpp:101
 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>Následující proměnné budou nahrazeny jejich odpovídajícím významem pro "
-"název každé skladby.</p><p><table border=\"1\"><tr><th><em>Tlačítko</em></"
-"th><th><em>Proměnná </em></th><th><em>Popis</em></th></tr><tr><td>"
-"%albumartist%</td><td>%1</td><td>U většiny alb to bude totéž co <i>Umělec "
-"skladby.</"
-"i> U sbírek ze skladeb (kompilací) to často bude <i>Různí umělci.</i> </td><"
-"/tr><tr><td>%album%</td><td>%2</"
-"td><td>Název alba.</td></tr><tr><td>%artist%</td><td>%3</"
-"td><td>Umělec každé skladby.</td></tr><tr><td>%title%</td><td>%4</"
-"td><td>Název "
-"skladby (bez <i>Umělec skladby</i>).</td></tr><tr><td>"
-"%artistandtitle%</td><td>%5</td><td>Název skladby (s <i>Umělec skladby</i>, "
-"je jiný než <i>Umělec alba</"
-"i>).</td></tr><tr><td>%track%</td><td>"
-"%6</td><td>Číslo skladby.</td></tr><tr><td>%discnumber%</td><td>%7</"
-"td><td>Číslo alba u alba s více alby. Sbírky "
-"skladeb (kompilace) se často skládají z více alb.</td></tr><tr><td>%year%</td>"
-"<td>%8</td><td>Rok vydání alba.</td></tr><tr><td>%genre%</td><td>%9</td><td>"
-"Žánr alba.</td></tr></table></p>"
-
-#: devices/fsdevice.cpp:678
+"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>"
+
+#: devices/filenameschemedialog.cpp:103
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</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>"
+
+#: devices/fsdevice.cpp:668
 msgid "Updating..."
 msgstr "Obnovuje se..."
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Čte se vyrovnávací paměť"
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
@@ -1265,16 +1357,15 @@ msgstr "Obnovují se soubory..."
 msgid "Updating tracks..."
 msgstr "Obnovují se skladby..."
 
-#: 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
+#: 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:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
+#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
+#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
 #: models/devicesmodel.cpp:140
 msgid "Not Connected"
 msgstr "Nepřipojeno"
@@ -1291,7 +1382,7 @@ msgstr "V MusicBrainz nenalezeny žádné shody"
 msgid "Connection"
 msgstr "Spojení"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
 msgid "Music Library"
 msgstr "Hudební knihovna"
 
@@ -1381,8 +1472,8 @@ msgstr "Neznámá velikost"
 
 #. i18n: file: gui/coverdialog.ui:30
 #. 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:53 gui/stdactions.cpp:92
+#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
 msgid "Search"
 msgstr "Hledat"
 
@@ -1426,22 +1517,22 @@ msgstr "Neprohledáno"
 msgid " (recommended)"
 msgstr " (doporučeno)"
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:208
 msgid "Start Dynamic Playlist"
 msgstr "Spustit dynamický seznam skladeb"
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:209
 msgid "Stop Dynamic Mode"
 msgstr "Zastavit dynamický režim"
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:257
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "1 pravidlo"
 msgstr[1] "%1 pravidla"
 msgstr[2] "%1 pravidel"
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:396
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
@@ -1449,71 +1540,71 @@ msgstr ""
 "Aby pracoval dynamický režim Cantaty, musíte do vašeho systému nainstalovat "
 "\"perl\"."
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:403
 msgid "Failed to locate rules file - %1"
 msgstr "Nepodařilo se najít soubor s pravidly - %1"
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:411
 msgid "Failed to remove previous rules file - %1"
 msgstr "Nepodařilo se odstranit předchozí soubor s pravidly - %1"
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:416
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "Nepodařilo se nainstalovat soubor s pravidly - %1 -> %2"
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:729
 msgid "Dynamizer has been terminated."
 msgstr "Dynamizátor byl ukončen."
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:816
 msgid "Uknown"
 msgstr "Neznámý"
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:818
 msgid "Loading list of rules"
 msgstr "Nahrává se seznam pravidel"
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:819
 msgid "Saving rule"
 msgstr "Ukládá se pravidlo"
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:820
 msgid "Deleting rule"
 msgstr "Maže se pravidlo"
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:821
 msgid "Setting active rule"
 msgstr "Nastavuje se činné pravidlo"
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:822
 msgid "Stopping dynamizer"
 msgstr "Zastavuje se dynamizátor"
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:823
 msgid "Requesting ID details"
 msgstr "Požadují se podrobnosti ID"
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:826
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Očekává se odpověď na předchozí příkaz. (%1)"
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:981
 msgid "Dynamizer is not active"
 msgstr "Dynamizátor není činný"
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:989
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Nepodařilo se získat seznam dynamických pravidel. (%1)"
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1020
 msgid "Failed to delete rules file. (%1)"
 msgstr "Nepodařilo se smazat soubor s pravidly. (%1)"
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Nepodařilo se zkontrolovat stav dynamizátoru. (%1)"
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1036
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Nepodařilo se nastavit nynější dynamická pravidla. (%1)"
 
@@ -1547,15 +1638,15 @@ msgstr "Dynamické pravidlo"
 
 #. 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:136 po/rc.cpp:280 rc.cpp:280
 msgid "Add"
 msgstr "Přidat"
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:202
 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:194
+#: dynamic/dynamicruledialog.cpp:205
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1571,45 +1662,51 @@ msgstr "Podobní umělci"
 msgid "AlbumArtist"
 msgstr "Umělec alba"
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr "Skladatel"
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
 msgid "Album"
 msgstr "Album"
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. 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:106
+#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
 msgid "Genre"
 msgstr "Žánr"
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr "Datum"
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr "Zahrnout"
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr "Vyloučit"
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr "(Přesné)"
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr "Dynamická pravidla"
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
 "of <i>Include</i> rules will be used to build a set of songs that can be "
@@ -1638,11 +1735,11 @@ msgstr ""
 "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>"
 
-#: dynamic/dynamicrulesdialog.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr "Nepodařilo se uložit %1"
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
@@ -1650,31 +1747,35 @@ msgstr ""
 "Seznam pravidel pojmenovaný '%1' již existuje!\n"
 "Přepsat?"
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 msgid "Overwrite Rules"
 msgstr "Přepsat pravidla"
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr "Ukládá se %1"
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:168
 msgid "Deleting..."
 msgstr "Maže se..."
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Name"
 msgstr "Název"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Item Count"
 msgstr "Počet položek"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Space Used"
 msgstr "Použité místo"
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr "Celkové použité místo: %1"
+
+#: gui/cachesettings.cpp:245
 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 "
@@ -1689,48 +1790,53 @@ msgstr ""
 "nastavil tak, aby tam položky neukládala). Níže je přehled o využití "
 "vyrovnávací paměti Cantaty."
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:257
 msgid "Covers"
 msgstr "Obaly"
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:258
 msgid "Backdrops"
 msgstr "Pozadí"
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
+#: 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:246
+#: gui/cachesettings.cpp:264
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:265
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr "Adresáře se záznamy (podcasty)"
+
+#: gui/cachesettings.cpp:273
 msgid "Delete All"
 msgstr "Smazat vše"
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:312
 msgid "Delete all '%1' items?"
 msgstr "Smazat všech '%1' položek?"
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
 msgid "Delete Cache Items"
 msgstr "Smazat položky ve vyrovnávací paměti"
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:322
 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:150 gui/main.cpp:169
+#: gui/coverdialog.cpp:151 gui/main.cpp:231
 msgid "Last.fm"
 msgstr "Last.fm"
 
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:165
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1741,7 +1847,7 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:183
+#: gui/coverdialog.cpp:184
 msgctxt ""
 "Google\n"
 "width x height (file size)"
@@ -1752,7 +1858,7 @@ msgstr ""
 "Google\n"
 "%1 x %2 (%3)"
 
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:204
 msgctxt ""
 "Discogs\n"
 "width x height"
@@ -1763,7 +1869,7 @@ msgstr ""
 "Discogs\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:237
+#: gui/coverdialog.cpp:238
 msgctxt ""
 "Current Cover\n"
 "width x height"
@@ -1774,28 +1880,28 @@ msgstr ""
 "Nynější obal\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:256
 msgid "Image"
 msgstr "Obrázek"
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:259
 msgid "Downloading..."
 msgstr "Stahuje se..."
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Obrázek (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:432
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
 msgstr ""
-"<p>Obal pro tohoto umělce již existuje, a soubor není zapisovatelný.<p></p><i>"
-"%1</i></p>"
+"<p>Obal pro tohoto umělce již existuje, a soubor není zapisovatelný.<p></"
+"p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:433
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1803,13 +1909,13 @@ msgstr ""
 "<p>Obal pro toto album již existuje, a soubor není zapisovatelný.<p></p><i>"
 "%1</i></p>"
 
-#: gui/coverdialog.cpp:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
+#: 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:613
+#: gui/coverdialog.cpp:579
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1817,37 +1923,44 @@ msgstr ""
 "Nepodařilo se nastavit obal!\n"
 "Nepodařilo se stáhnout do dočasného souboru!"
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:607
 msgid "Failed to download image!"
 msgstr "Nepodařilo se stáhnout obrázek!"
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
 msgid "Load Local Cover"
 msgstr "Nahrát místní obal"
 
-#: gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:795
 msgid "Images (*.png *.jpg)"
 msgstr "Obrázky (*.png *.jpg)"
 
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:800
 msgid "File is already in list!"
 msgstr "Soubor je již v seznamu!"
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:804
 msgid "Failed to read image!"
 msgstr "Nepodařilo se přečíst obrázek!"
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:817
 msgid "Display"
 msgstr "Zobrazit"
 
 #. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
 msgid "Remove"
 msgstr "Odstranit"
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1181
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1855,7 +1968,7 @@ msgstr ""
 "Nepodařilo se nastavit obal!\n"
 "Nepodařilo se udělat kopii!"
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1190
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1863,7 +1976,7 @@ msgstr ""
 "Nepodařilo se nastavit obal!\n"
 "Nepodařilo se zazálohovat originál!"
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1239
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1875,250 +1988,261 @@ msgstr ""
 msgid "Open In File Manager"
 msgstr "Otevřít ve správci souborů"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Established"
 msgstr "Spojení navázáno"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Failed"
 msgstr "Spojení se nezdařilo"
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. 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
+#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
+#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
 msgid "None"
 msgstr "Žádné"
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:40
 msgid "Small"
 msgstr "Malý"
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:41
 msgid "Medium"
 msgstr "Střední"
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:42
 msgid "Large"
 msgstr "Velký"
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:43
 msgid "Extra Large"
 msgstr "Hodně velký"
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:48
 msgid "Simple Tree"
 msgstr "Jednoduchý strom"
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:49
 msgid "Detailed Tree"
 msgstr "Podrobný strom"
 
 #. i18n: file: gui/interfacesettings.ui:329
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
 msgid "Grouped Albums"
 msgstr "Seskupená alba"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:53
 msgid "List"
 msgstr "Seznam"
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:55
 msgid "Icon/List"
 msgstr "Ikona/Seznam"
 
-#: gui/interfacesettings.cpp:85
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+msgstr "Složky"
+
+#. 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)
+#: 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
+msgid "Style:"
+msgstr "Styl:"
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr "Internet"
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr "Zařízení"
+
+#: gui/interfacesettings.cpp:178
 msgid "Grouped by 'Album Artist'"
 msgstr "Seskupeno podle Umělec alba"
 
-#: gui/interfacesettings.cpp:86
+#: gui/interfacesettings.cpp:179
 msgid "Grouped under 'Various Artists'"
 msgstr "Seskupeno podle Různí umělci"
 
-#: 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/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
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:152
+#: gui/main.cpp:214
 msgid "A KDE client for MPD"
 msgstr "KDE klient pro MPD"
 
-#: gui/main.cpp:154
-msgid "Copyright (C) 2011-2013 Craig Drummond"
-msgstr "Autorské právo (C) 2011-2013 Craig Drummond"
+#: gui/main.cpp:216
+msgid "Copyright (c) 2011–2013 Craig Drummond"
+msgstr "Autorské právo (c) 2011-2013 Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Maintainer"
 msgstr "Správce"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "UI Improvements"
 msgstr "Vylepšení rozhraní"
 
-#: gui/main.cpp:160
+#: gui/main.cpp:222
 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:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
 msgid "QtMPC author"
 msgstr "Autor QtMPC"
 
-#: gui/main.cpp:161
+#: gui/main.cpp:223
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:162
+#: gui/main.cpp:224
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:163
+#: gui/main.cpp:225
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
 "Pozadí pohledu na souvislosti (zvažte, prosím, nahrání vašeho vlastního "
-"fanouškovského "
-"umění na fanart.tv)"
+"fanouškovského umění na fanart.tv)"
 
-#: gui/main.cpp:168
+#: gui/main.cpp:230
 msgid "Wikipedia"
 msgstr "Wikipedie"
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:230 gui/main.cpp:231
 msgid "Context view metadata"
 msgstr "Popisná data pohledu na souvislosti"
 
-#: gui/main.cpp:173
+#: gui/main.cpp:235
 msgid "URL to open"
 msgstr "Adresa (URL) k otevření"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:238
 msgid "Quit"
 msgstr "Ukončit"
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:242
 msgid "Show Window"
 msgstr "Ukázat okno"
 
-#. 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:245 po/rc.cpp:418 rc.cpp:418
 msgid "Connect"
 msgstr "Spojit"
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
 msgid "Collection"
 msgstr "Sbírka"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:247
 msgid "Outputs"
 msgstr "Výstupy"
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr "Předchozí skladba"
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr "Další skladba"
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr "Přehrát/Pozastavit"
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr "Zastavit po současné skladbě"
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Zastavit po skladbě"
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr "Zvýšit hlasitost"
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr "Snížit hlasitost"
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr "Ztlumit"
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:249
 msgid "Add To Stored Playlist"
 msgstr "Přidat do uloženého seznamu skladeb"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:250
 msgid "Remove From Play Queue"
 msgstr "Odstranit z řady skladeb k přehrání"
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:251
 msgid "Copy Track Info"
 msgstr "Kopírovat informace o skladbě"
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:252
 msgid "Crop"
 msgstr "Oříznout"
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
-msgstr "Zamíchat"
+#: gui/mainwindow.cpp:253
+msgid "Shuffle Tracks"
+msgstr "Zamíchat skladby"
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:254
+msgid "Shuffle Albums"
+msgstr "Zamíchat alba"
+
+#: gui/mainwindow.cpp:255
 msgid "Add Stream URL"
 msgstr "Přidat adresu proudu"
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:256
 msgid "Clear"
 msgstr "Vyprázdnit"
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:257
 msgid "Expanded Interface"
 msgstr "Rozšířené rozhraní"
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:258
 msgid "Show Current Song Information"
 msgstr "Ukázat informace o nynější skladbě"
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:261
 msgid "Full Screen"
 msgstr "Na celou obrazovku"
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:263
 msgid "Random"
 msgstr "Náhodné"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:264
 msgid "Repeat"
 msgstr "Opakování"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid "Single"
 msgstr "Jednotlivé"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2126,11 +2250,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:290
+#: gui/mainwindow.cpp:266
 msgid "Consume"
 msgstr "Sníst"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
@@ -2138,121 +2262,128 @@ 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:291
+#: gui/mainwindow.cpp:267
 msgid "Search Play Queue"
 msgstr "Prohledat řadu přehrávaných skladeb"
 
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:269
 msgid "Set Priority"
 msgstr "Nastavit přednost"
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:271
 msgid "Play Stream"
 msgstr "Přehrát proud"
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:273
 msgid "Locate In Library"
 msgstr "Najít v knihovně"
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:275
 msgid "Edit Song Tags"
 msgstr "Upravit značky písně"
 
 #. i18n: file: gui/interfacesettings.ui:304
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
 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:302 po/rc.cpp:455 rc.cpp:455
+#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
 msgid "Artists"
 msgstr "Umělci"
 
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr "Složky"
-
 #. 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
+#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
 msgid "Playlists"
 msgstr "Seznamy"
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:282
 msgid "Dynamic"
 msgstr "Dynamický"
 
-#: gui/mainwindow.cpp:308
-msgid "Online"
-msgstr "Internet"
-
-#: gui/mainwindow.cpp:310
-msgid "Devices"
-msgstr "Zařízení"
-
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:288
 msgid "Expand All"
 msgstr "Rozbalit vše"
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:289
 msgid "Collapse All"
 msgstr "Složit vše"
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:290
+msgid "Remove All Songs"
+msgstr "Odstranit všechny písně"
+
+#: gui/mainwindow.cpp:398
 msgid "Info"
 msgstr "Informace"
 
-#: gui/mainwindow.cpp:435
+#: gui/mainwindow.cpp:405
 msgid "Auto Hide"
 msgstr "Automatické skrývání"
 
-#: gui/mainwindow.cpp:441
+#: gui/mainwindow.cpp:411
 msgid "Monochrome Icons"
 msgstr "Jednobarevné ikony"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:541
 msgid "Server information..."
 msgstr "Informace o serveru..."
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:552
 msgid "Configure Cantata..."
 msgstr "Nastavit Cantatu..."
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:559
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "O programu Cantata"
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:571
 msgid "&File"
 msgstr "&Soubor"
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:574
 msgid "&Settings"
 msgstr "&Nastavení"
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
 msgid "&Help"
 msgstr "Nápo&věda"
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:948
 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:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
 msgid "Connecting to %1"
 msgstr "Připojuje se k %1"
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+"Záznamy se nyní stahují.\n"
+"\n"
+"Pokud bude stahování přerušeno "
+"nyní, budou zrušena všechna stahování."
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr "Zrušit stahování a ukončit."
+
+#: gui/mainwindow.cpp:1447
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "O programu Cantata"
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1448
 msgctxt "Qt-only"
 msgid ""
 "<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
@@ -2263,55 +2394,51 @@ msgstr ""
 "2011-2013.<br/>Vydáno pod <a href=\"http://www.gnu.org/licenses/gpl.html"
 "\">GPLv3</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1450
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
 "QtMPC Authors<br/>"
 msgstr ""
-"<a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010  Autoři QtMPC<"
-"br/>"
+"<a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010  Autoři QtMPC<br/"
+">"
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1451
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
-"Pozadí pohledu na souvislosti díky laskavosti <a "
-"href=\"http://www.fanart.tv\">FanArt."
-"tv</a>"
+"Pozadí pohledu na souvislosti díky laskavosti <a href=\"http://www.fanart.tv"
+"\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1452
 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 ""
-"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>"
+"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:1468
+#: gui/mainwindow.cpp:1453
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 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>"
+"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:1479
+#: gui/mainwindow.cpp:1464
 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>"
 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\">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:1487
+#: gui/mainwindow.cpp:1472
 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</"
@@ -2323,89 +2450,83 @@ 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>"
+"\"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:1496
+#: gui/mainwindow.cpp:1481
 msgid "Server Information"
 msgstr "Informace o serveru"
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1728
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1730
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1773
 msgid "(Stream)"
 msgstr "(Proud)"
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1775
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr "Hlasitost vypnuta"
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1% (Muted)"
-msgstr "Hlasitost: %1% (ztlumeno)"
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
+msgstr "MPD nahlásilo následující chybu: %1"
 
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
-msgstr "Hlasitost %1%"
+#: gui/mainwindow.cpp:1990
+msgid "Remove all songs from play queue?"
+msgstr "Odstranit všechny písně z řady skladeb k přehrání?"
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
 msgid "Priority"
 msgstr "Přednost"
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2080
 msgid "Enter priority (0..255):"
 msgstr "Zadejte přednost (0..255):"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Playlist Name"
 msgstr "Název seznamu skladeb"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Enter a name for the playlist:"
 msgstr "Zadejte název pro seznam skladeb:"
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2106
 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:2146
+#: gui/mainwindow.cpp:2107
 msgid "Existing Playlist"
 msgstr "Existující seznam skladeb"
 
@@ -2417,10 +2538,10 @@ msgstr "Nezeslabovat"
 msgid " ms"
 msgstr " ms"
 
-#. i18n: file: devices/albumdetails.ui:152
+#. i18n: file: devices/albumdetails.ui:165
 #. 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:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
 msgid "Track"
 msgstr "Skladba"
 
@@ -2428,17 +2549,16 @@ msgstr "Skladba"
 msgid "Auto"
 msgstr "Automaticky"
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:164
 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>"
+"<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: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2446,7 +2566,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:153
+#: gui/playbacksettings.cpp:174
 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 "
@@ -2456,32 +2576,26 @@ 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>Vyrovnání hlasitosti (Replay Gain) je navržený standard zveřejněný v roce "
-"2001 k normalizaci "
-"vnímané hlasitosti počítačových zvukových formátů, jako jsou MP3 a Ogg "
-"Vorbis. Pracuje na základě skladba/album, a je nyní podporován rostoucím "
-"počtem "
-"přehrávačů.</p><p>Je možné použít následující nastavení vyrovnání hlasitosti:"
-"<ul><li><i>Žádné</i> - Není použito žádné vyrovnání hlasitosti.</li><li><i>"
-"Skladba</i> - "
-"Hlasitost je upravena za použití značek pro vyrovnání hlasitosti u skladby.<"
-"/li><li><i>Album</"
-"i> - Hlasitost je upravena za použití značek  pro vyrovnání hlasitosti u "
-"alba.</"
+"2001 k normalizaci vnímané hlasitosti počítačových zvukových formátů, jako "
+"jsou MP3 a Ogg Vorbis. Pracuje na základě skladba/album, a je nyní "
+"podporován rostoucím počtem přehrávačů.</p><p>Je možné použít následující "
+"nastavení vyrovnání hlasitosti:<ul><li><i>Žádné</i> - Není použito žádné "
+"vyrovnání hlasitosti.</li><li><i>Skladba</i> - Hlasitost je upravena za "
+"použití značek pro vyrovnání hlasitosti u skladby.</li><li><i>Album</i> - "
+"Hlasitost je upravena za použití značek  pro vyrovnání hlasitosti u alba.</"
 "li><li><i>Automaticky</i> - Hlasitost je upravena za použití značek pro "
-"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>"
+"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:759 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
 msgid "Rename"
 msgstr "Přejmenovat"
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:190
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2489,106 +2603,116 @@ msgstr ""
 "Opravdu chcete odstranit vybraný seznam skladeb?\n"
 "Tento krok nelze vrátit zpět."
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:191
 msgid "Remove Playlists"
 msgstr "Odstranit seznamy skladeb"
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
 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:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
 msgid "Overwrite Playlist"
 msgstr "Přepsat seznam skladeb"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Rename Playlist"
 msgstr "Přejmenovat seznam skladeb"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Enter new name for playlist:"
 msgstr "Zadejte nový název pro seznam skladeb:"
 
-#: gui/preferencesdialog.cpp:77
+#: gui/preferencesdialog.cpp:80
 msgid "Collection Settings"
 msgstr "Nastavení sbírky"
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
 msgid "Playback"
 msgstr "Přehrávání"
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:81
 msgid "Playback Settings"
 msgstr "Nastavení přehrávání"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "Files"
 msgstr "Soubory"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "File Settings"
 msgstr "Nastavení souborů"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface"
 msgstr "Rozhraní"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface Settings"
 msgstr "Nastavení rozhraní"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:85
+msgid "Streams Settings"
+msgstr "Nastavení proudů"
+
+#: gui/preferencesdialog.cpp:89
+msgid "Online Providers"
+msgstr "Internetoví poskytovatelé"
+
+#: gui/preferencesdialog.cpp:92
 msgid "Context"
 msgstr "Souvislosti"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:92
 msgid "Context View Settings"
 msgstr "Nastavení pohledu na souvislosti"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server"
 msgstr "Server HTTP"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server Settings"
 msgstr "Nastavení serveru HTTP"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:103
 msgid "Audio CD Settings"
 msgstr "Nastavení zvukového CD"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgid "Proxy"
 msgstr "Proxy"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Nastavení proxy"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Zkratky"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Nastavení klávesových zkratek"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cache"
 msgstr "Vyrovnávací paměť"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cached Items"
 msgstr "Položky ve vyrovnávací paměti"
 
-#: gui/preferencesdialog.cpp:118
+#: gui/preferencesdialog.cpp:116
 msgid "Configure"
 msgstr "Nastavit"
 
-#: gui/serversettings.cpp:75
+#: gui/serversettings.cpp:87
 msgid ""
 "<i> This folder will also be used to locate music files for transferring to "
 "(and from) devices.</i>"
@@ -2596,7 +2720,7 @@ 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:88
+#: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr "Nepoužíváno"
 
@@ -2612,12 +2736,12 @@ 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: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:208 po/rc.cpp:247 po/rc.cpp:705
+#: rc.cpp:208 rc.cpp:247 rc.cpp:705
 msgid "Host:"
 msgstr "Server:"
 
-#: 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 "
@@ -2632,7 +2756,7 @@ msgstr ""
 "dynamic</code>. Sama Cantata nemůže ovládat spuštění/zastavení této služby.</"
 "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 "
@@ -2649,152 +2773,226 @@ msgstr ""
 "této služby. Pokud toto nastaveno není, potom Cantata, aby usnadnila "
 "dynamické seznamy skladeb,  použije instanci dynamzátoru na uživatele.</i>"
 
-#: gui/serversettings.cpp:109
+#: 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 "
 "artist of the current song, and %album% will be replaced with the album name."
 "</i></p>"
 msgstr ""
-"<p>Souborový název (bez přípony), pod nímž se mají uložit stažené obaly.<br/> "
-"Jestliže bude ponecháno prázdné, použije se \"cover\".<br/><br/><i>%artist% "
-"bude "
-"nahrazen umělcem alba současné písně, a %album% bude nahrazeno názvem alba."
-"</i></p>"
+"<p>Souborový název (bez přípony), pod nímž se mají uložit stažené obaly.<br/"
+"> Jestliže bude ponecháno prázdné, použije se \"cover\".<br/><br/><i>%artist"
+"% bude nahrazen umělcem alba současné písně, a %album% bude nahrazeno názvem "
+"alba.</i></p>"
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:252
 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 ""
-"Který typ sbírky chcete připojit?<br/><ul><li>Obvyklý - "
-"hudební sbírku může být sdílena, je na jiném stroji, nebo je již nastavena</"
-"li><li>Základní - hudební sbírka není sdílena s ostatními, a Cantata nastaví "
-"a bude řídit instanci MPD</li></ul>"
+"Který typ sbírky chcete připojit?<br/><ul><li>Obvyklý - hudební sbírku může "
+"být sdílena, je na jiném stroji, nebo je již nastavena</li><li>Základní - "
+"hudební sbírka není sdílena s ostatními, a Cantata nastaví a bude řídit "
+"instanci MPD</li></ul>"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Add Collection"
 msgstr "Přidat sbírku"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Standard"
 msgstr "Obvyklý"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Basic"
 msgstr "Základní"
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:297
 msgid "Delete <b>%1</b>?"
 msgstr "Smazat <b>%1</b>?"
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:298
 msgid "Delete"
 msgstr "Smazat"
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:336
 msgid "New Collection %1"
 msgstr "Nová sbírka %1"
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
 msgid "Default"
 msgstr "Výchozí"
 
-#: gui/stdactions.cpp:55
-msgid "Save As"
-msgstr "Uložit jako"
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
+msgstr "Multimediální klávesy"
 
-#: gui/stdactions.cpp:56
-msgid "Add To Play Queue"
-msgstr "Přidat do řady přehrávaných skladeb"
+#: gui/shortcutssettingspage.cpp:80
+msgid "Do not use media keys to control Cantata"
+msgstr "Nepoužívat multimediální klávesy pro ovládání Cantaty"
 
-#: gui/stdactions.cpp:57
-msgid "Replace Play Queue"
-msgstr "Nahradit řadu přehrávaných skladeb"
+#: gui/shortcutssettingspage.cpp:81
+msgid "Use media keys to control Cantata"
+msgstr "Používat multimediální klávesy pro ovládání Cantaty"
 
-#: gui/stdactions.cpp:58
-msgid "Add With Priority"
-msgstr "Přidat s předností"
+#: gui/shortcutssettingspage.cpp:84
+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/stdactions.cpp:59
-msgid "Highest Priority (255)"
-msgstr "Nejvyšší přednost (255)"
+#: gui/shortcutssettingspage.cpp:85
+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
+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"
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr "Další skladba"
+
+#: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr "Přehrát/Pozastavit"
 
-#: gui/stdactions.cpp:60
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr "Zastavit po současné skladbě"
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr "Zvýšit hlasitost"
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr "Snížit hlasitost"
+
+#: gui/stdactions.cpp:63
+msgid "Save As"
+msgstr "Uložit jako"
+
+#: gui/stdactions.cpp:64
+msgid "Add To Play Queue"
+msgstr "Přidat do řady přehrávaných skladeb"
+
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+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"
+
+#: gui/stdactions.cpp:67
+msgid "Add With Priority"
+msgstr "Přidat s předností"
+
+#: gui/stdactions.cpp:68
+msgid "Highest Priority (255)"
+msgstr "Nejvyšší přednost (255)"
+
+#: gui/stdactions.cpp:69
 msgid "High Priority (200)"
 msgstr "Vysoká přednost (200)"
 
-#: gui/stdactions.cpp:61
+#: gui/stdactions.cpp:70
 msgid "Medium Priority (125)"
 msgstr "Střední přednost (125)"
 
-#: gui/stdactions.cpp:62
+#: gui/stdactions.cpp:71
 msgid "Low Priority (50)"
 msgstr "Nízká přednost (50)"
 
-#: gui/stdactions.cpp:63
+#: gui/stdactions.cpp:72
 msgid "Default Priority (0)"
 msgstr "Výchozí přednost (0)"
 
-#: gui/stdactions.cpp:64
+#: gui/stdactions.cpp:73
 msgid "Custom Priority..."
 msgstr "Vlastní přednost..."
 
-#: gui/stdactions.cpp:65
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr "Přidat do seznamu skladeb"
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
 msgid "Organize Files"
 msgstr "Uspořádat soubory"
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
 msgstr "Upravit značky"
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
 msgid "ReplayGain"
 msgstr "Vyrovnání hlasitosti"
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 msgid "Copy Songs To Device"
 msgstr "Kopírovat písně do zařízení"
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 msgid "Set Image"
 msgstr "Nastavit obrázek"
 
-#: gui/stdactions.cpp:79
+#: gui/stdactions.cpp:88
 msgid "Refresh Database"
 msgstr "Obnovit databázi"
 
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Zpět"
 
-#: gui/trayitem.cpp:165
+#: gui/trayitem.cpp:192
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 na %2"
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:193
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 na %2 (%3)"
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:195
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 od %2 na %3"
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:196
 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:196
+#: gui/trayitem.cpp:223
 msgid "Now playing"
 msgstr "Nyní se hraje"
 
@@ -2818,6 +3016,16 @@ msgstr "První činné rozhraní"
 msgid "Inactive"
 msgstr "Nečinné"
 
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr "List CUE"
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr "Seznam skladeb"
+
 #: models/devicesmodel.cpp:108
 msgid "Configure Device"
 msgstr "Nastavit zařízení"
@@ -2838,7 +3046,7 @@ msgstr "Odpojit zařízení"
 msgid "Edit CD Details"
 msgstr "Upravit podrobnosti CD"
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:690
 msgid "No Devices Attached"
 msgstr "Nepřipojeno žádné zařízení"
 
@@ -2850,28 +3058,28 @@ msgstr "Nepřihlášen"
 msgid "Logged in"
 msgstr "Přihlášen"
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 msgid "Unknown error"
 msgstr "Neznámá chyba"
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr "Žádné odběry"
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr "Nemáte žádný činný odběr"
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr "Přihlášen (vypršení: %1)"
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr "Sezení vypršelo"
 
 #: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "Jedna položka"
@@ -2882,195 +3090,224 @@ msgstr[2] "%1 položek"
 msgid "Audio File"
 msgstr "Zvukový soubor"
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr "Seznam skladeb"
-
-#: models/dirviewmodel.cpp:192 models/musicmodel.cpp:120
-msgid "Cue Sheet"
-msgstr "List CUE"
-
-#: models/musiclibraryitemartist.cpp:218 models/musiclibraryitemartist.cpp:231
-#: models/musiclibraryitemroot.cpp:798
+#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
 msgid "Single Tracks"
 msgstr "Jednotlivé skladby"
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "Jedna skladba"
 msgstr[1] "%1 skladby"
 msgstr[2] "%1 skladeb"
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:185
 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:172
+#: models/musicmodel.cpp:192
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "Jedno album"
 msgstr[1] "%1 alba"
 msgstr[2] "%1 alb"
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
-msgstr "Nastavit internetovou službu"
+#: models/musicmodel.cpp:198
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] "Jeden díl"
+msgstr[1] "%1 díly"
+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
+msgid "Configure Service"
+msgstr "Nastavit službu"
+
+#: models/onlineservicesmodel.cpp:84
+msgid "Refresh Service"
+msgstr "Obnovit službu"
+
+#: models/onlineservicesmodel.cpp:85
+msgid "Add Subscription"
+msgstr "Přidat odběr"
 
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
-msgstr "Obnovit internetovou službu"
+#: models/onlineservicesmodel.cpp:86
+msgid "Remove Subscription"
+msgstr "Odstranit odběr"
 
-#: models/onlineservicesmodel.cpp:125
+#: models/onlineservicesmodel.cpp:87
+msgid "Refresh Subscription"
+msgstr "Obnovit odběr"
+
+#: models/onlineservicesmodel.cpp:137
 msgid "Last Search:%1"
 msgstr "Poslední hledání: %1"
 
-#: models/onlineservicesmodel.cpp:136
+#: models/onlineservicesmodel.cpp:149
 msgid "Searching..."
 msgstr "Hledá se..."
 
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:670
 msgid "Not Loaded"
 msgstr "Nenahráno"
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:155
 msgid "Use search to locate tracks"
 msgstr "Použít hledání k nalezení skladeb"
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:166
+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
+msgid "(Downloading: %1%)"
+msgstr "(Stahuje se: %1%)"
+
+#: models/onlineservicesmodel.cpp:235
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: models/playlistsmodel.cpp:77
 msgid "New Playlist..."
 msgstr "Nový seznam skladeb..."
 
-#: models/playqueuemodel.cpp:105
+#: models/playqueuemodel.cpp:102
 msgctxt "Track Number (#)"
 msgid "#"
 msgstr "#"
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:103
 msgid "Length"
 msgstr "Délka"
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:104
 msgid "Disc"
 msgstr "Disk"
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:138
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
 msgid "Year"
 msgstr "Rok"
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:360
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Přednost: %1)</b>"
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
 msgid "Loading..."
 msgstr "Nahrává se..."
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:286
 msgid "Bookmarks"
 msgstr "Záložky"
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:560
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:563
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:564
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:567
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:568
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:569
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:570
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:571
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:572
 msgid "Favorites"
 msgstr "Oblíbené"
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr "Poslouchat živě"
+
+#: models/streamsmodel.cpp:578
 msgid "Bookmark Category"
 msgstr "Skupina záložky"
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:579
 msgid "Add Stream To Favorites"
 msgstr "Přidat proud do oblíbených"
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:580
 msgid "Configure Streams"
 msgstr "Nastavit proudy"
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:660
 msgid "%1 (Read-Only)"
 msgstr "%1 (Pouze pro čtení)"
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1241
 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:1455
+#: models/streamsmodel.cpp:1639
 msgid "All"
 msgstr "Vše"
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr "Poslouchat živě"
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:154
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:156
 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:372 mpd/mpdconnection.cpp:415
+#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
+#: mpd/mpdconnection.cpp:1036
 msgid "Connection to %1 failed"
 msgstr "Nepodařilo se připojit k %1"
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Nepodařilo se připojit k %1 - nesprávné heslo"
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:455
 msgid "Failed to send command to %1 - not connected"
 msgstr "Nepodařilo se poslat příkaz %1 - nepřipojeno"
 
-#: mpd/mpdconnection.cpp:472
+#: mpd/mpdconnection.cpp:491
 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:474
+#: mpd/mpdconnection.cpp:493
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3078,38 +3315,31 @@ 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:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Nepodařilo se poslat příkaz. Odpojeno od %1"
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1171
 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:1158
+#: mpd/mpdconnection.cpp:1183
 msgid "Failed to save <b>%1</b>"
 msgstr "Nepodařilo se uložit <b>%1</b>!"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1196
 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:1174
+#: mpd/mpdconnection.cpp:1199
 msgid "You cannot add a playlist to another playlist!"
 msgstr "Nelze přidat seznam skladeb do jiného seznamu skladeb!"
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] "Jeden den %2"
-msgstr[1] "%1 dny %2"
-msgstr[2] "%1 dnů %2"
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr "Osobní"
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:343
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3151,19 +3381,19 @@ msgstr "Ogg"
 msgid "Streaming format:"
 msgstr "Formát přenosu:"
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr "Přenos"
 
-#: 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"
 
@@ -3171,10 +3401,6 @@ msgstr "WAV"
 msgid "Magnatune Settings"
 msgstr "Nastavení pro Magnatune"
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr "Členství:"
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -3183,8 +3409,8 @@ msgstr "Členství:"
 #. 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:711 po/rc.cpp:729
+#: rc.cpp:711 rc.cpp:729
 msgid "Username:"
 msgstr "Uživatelské jméno:"
 
@@ -3192,7 +3418,7 @@ msgstr "Uživatelské jméno:"
 #. 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)
@@ -3204,7 +3430,7 @@ msgstr "Uživatelské jméno:"
 #. 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)
@@ -3212,53 +3438,268 @@ 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: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: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
 msgid "Password:"
 msgstr "Heslo:"
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr "Členství:"
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr "Stahování:"
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr "Stahuje se"
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr "Obnovuje se zobrazení"
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr "Seskupují se skladby"
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr "Zpracovává se odpověď"
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr "Nepodařilo se zpracovat"
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr "Nepodařilo se stáhnout"
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
 msgstr "Stáhnout do knihovny"
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
+msgid "Search For Podcasts"
+msgstr "Hledat záznamy"
+
+#: online/onlineservicespage.cpp:63
+msgid "Download Podcast Episodes"
+msgstr "Stáhnout díly záznamů"
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr "Smazat stažené díly záznamů"
+
+#: online/onlineservicespage.cpp:329
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Hledání %1:"
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:464
 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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr "Odhlásit odběr z <b>%1</b>?"
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr "Obnovit všechny soupisy záznamů?"
+
+#: online/onlineservicespage.cpp:621
+msgid "Refresh episode listing from <b>%1</b>?"
+msgstr "Obnovit soupis dílů z <b>%1</b>?"
+
+#: online/onlineservicespage.cpp:695
+msgid "All selected podcasts have already been downloaded!"
+msgstr "Všechny vybrané záznamy již byly staženy!"
+
+#: online/onlineservicespage.cpp:699
+msgid "Do you wish to download the following podcast episode?"
+msgstr "Chcete stáhnout následující díl záznamu?"
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr "Chcete stáhnout následující díly záznamu?"
+
+#: online/onlineservicespage.cpp:705
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr "Chcete stáhnout vybrané díly záznamu?"
+
+#: online/onlineservicespage.cpp:753
+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
+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?"
+
+#: online/onlineservicespage.cpp:760
+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?"
+
+#: online/onlineservicespage.cpp:763
+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?"
+
+#: online/podcastsearchdialog.cpp:243
+msgid "RSS:"
+msgstr "RSS:"
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr "Stránky:"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Podcast details"
+msgstr "Podrobnosti záznamu"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Select a podcast to display its details"
+msgstr "Vybrat záznam pro zobrazení jeho podrobností"
+
+#: online/podcastsearchdialog.cpp:322
+msgid "Enter search term..."
+msgstr "Zadat hledaný pojem..."
+
+#: online/podcastsearchdialog.cpp:372
+msgid "Failed to fetch podcasts from %1"
+msgstr "Nepodařilo se natáhnout záznamy z %1"
+
+#: online/podcastsearchdialog.cpp:378
+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
+msgid "Failed to download directory listing"
+msgstr "Nepodařilo se stáhnout soupis adresáře"
+
+#: online/podcastsearchdialog.cpp:447
+msgid "Failed to parse directory listing"
+msgstr "Nepodařilo se zpracovat soupis adresáře"
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr "Odebírat"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search %1"
+msgstr "Hledat %1"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr "Hledat záznamy na %1"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr "Procházet %1"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr "Procházet %1 záznamů"
+
+#: online/podcastsearchdialog.cpp:602
+msgid "Subscription added"
+msgstr "Odběr přidán"
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr "Již jste přihlášen k odběru tohoto záznamu!"
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr "Záznamy"
+
+#: online/podcastservice.cpp:284
+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
+msgid "Failed to parse %1"
+msgstr "Nepodařilo se zpracovat %1"
+
+#: online/podcastservice.cpp:290
+msgid "Failed to download %1"
+msgstr "Nepodařilo se stáhnout %1"
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr "Podívat se po nových dílech:"
+
+#: online/podcastsettingsdialog.cpp:59
+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:82
+msgid "Podcast Settings"
+msgstr "Nastavení záznamu"
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr "Ručně"
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr "Každých 15 minut"
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr "Každých 30 minut"
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr "Každou hodinu"
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr "Každé 2 hodiny"
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr "Každých 6 hodin"
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr "Každých 12 hodin"
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr "Každý den"
+
+#: online/podcastsettingsdialog.cpp:92
+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
@@ -3290,13 +3731,12 @@ msgid ""
 "cached articles (using the 'Cache' page).</i>"
 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 "
+"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 "
 "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 (pomocí stránky pro "
-"vyrovnávací paměť).</i>"
+"č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 "
+"(pomocí stránky pro vyrovnávací paměť).</i>"
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
@@ -3332,8 +3772,8 @@ msgstr "Kopírovat písně z:"
 #. 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
-#: rc.cpp:49 rc.cpp:721
+#: 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
 msgid "TextLabel"
 msgstr "TextovýŠtítek"
 
@@ -3379,93 +3819,109 @@ msgstr "Ke kopírování:"
 msgid "Album Details"
 msgstr "Podrobnosti alba"
 
-#. i18n: file: devices/albumdetails.ui:60
+#. 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:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:73
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
+#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
 msgid "Genre:"
 msgstr "Žánr:"
 
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:86
 #. 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:86
 #. 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:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
 msgid "Year:"
 msgstr "Rok:"
 
-#. 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 "Umělec písně:"
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:99
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #: po/rc.cpp:70 rc.cpp:70
 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/audiocdsettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:88 rc.cpp:88
 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:88 rc.cpp:88
+#: po/rc.cpp:91 rc.cpp:91
 msgid "Automatically lookup:"
 msgstr "Automaticky vyhledat:"
 
 #. i18n: file: devices/audiocdsettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:94 rc.cpp:94
 msgid "Initially look up via:"
 msgstr "Zpočátku vyhledávat pomocí:"
 
 #. i18n: file: devices/audiocdsettings.ui:52
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:97 rc.cpp:97
 msgid "CDDB Host:"
 msgstr "Server CDDB:"
 
 #. i18n: file: devices/audiocdsettings.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:100 rc.cpp:100
 msgid "CDDB Port:"
 msgstr "Přípojka CDDB:"
 
 #. i18n: file: devices/audiocdsettings.ui:88
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:103 rc.cpp:103
 msgid "Audio Extraction"
 msgstr "Vytažení zvuku"
 
 #. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:106 rc.cpp:106
 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:106 rc.cpp:106
+#: po/rc.cpp:109 rc.cpp:109
 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:109 rc.cpp:109
+#: po/rc.cpp:112 rc.cpp:112
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3475,62 +3931,62 @@ 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: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
 msgid "Music folder:"
 msgstr "Složka s hudbou:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:118 rc.cpp:118
 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:118 rc.cpp:118
+#: po/rc.cpp:121 rc.cpp:121
 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:121 rc.cpp:121
+#: 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:124 rc.cpp:124
+#: 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:127 rc.cpp:127
+#: po/rc.cpp:130 rc.cpp:130
 msgid "Use cache:"
 msgstr "Použít vyrovnávací paměť:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:121
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:133 rc.cpp:133
 msgid "Default volume:"
 msgstr "Výchozí svazek:"
 
@@ -3542,7 +3998,7 @@ msgstr "Výchozí svazek:"
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
 #. 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:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
 msgid "Filenames"
 msgstr "Názvy souborů"
 
@@ -3554,7 +4010,7 @@ msgstr "Názvy souborů"
 #. 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
+#: 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:"
 
@@ -3566,7 +4022,7 @@ msgstr "Použít pouze znaky ASCII:"
 #. 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
+#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
 msgid "Replace spaces with underscores:"
 msgstr "Nahradit mezery podtržítky:"
 
@@ -3578,7 +4034,7 @@ msgstr "Nahradit mezery podtržítky:"
 #. 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
+#: 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ů:"
 
@@ -3590,7 +4046,7 @@ msgstr "Nevšímat si 'The' ve jménech umělců:"
 #. 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:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
 msgid "Filename scheme:"
 msgstr "Schéma názvu souboru:"
 
@@ -3602,79 +4058,79 @@ msgstr "Schéma názvu souboru:"
 #. 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
+#: 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: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:154 rc.cpp:154
 msgid "Transcoding"
 msgstr "Překódování"
 
 #. i18n: file: devices/devicepropertieswidget.ui:261
 #. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
+#: 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/filenameschemedialog.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:160 rc.cpp:160
 msgid "Example:"
 msgstr "Příklad:"
 
 #. i18n: file: devices/filenameschemedialog.ui:58
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:163 rc.cpp:163
 msgid "About filename schemes"
 msgstr "O schématech pro názvy souborů"
 
-#. i18n: file: devices/filenameschemedialog.ui:82
+#. i18n: file: devices/filenameschemedialog.ui:70
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:166 rc.cpp:166
 msgid "Album Artist"
 msgstr "Umělec alba"
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:77
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:169 rc.cpp:169
 msgid "Album Title"
 msgstr "Název alba"
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:91
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:175 rc.cpp:175
 msgid "Track Artist"
 msgstr "Umělec skladby"
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:98
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:178 rc.cpp:178
 msgid "Track Title"
 msgstr "Název skladby"
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:117
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:181 rc.cpp:181
 msgid "Track Title (+Artist)"
 msgstr "Název skladby (+Umělec)"
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:124
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:184 rc.cpp:184
 msgid "Track #"
 msgstr "Skladba #"
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:131
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:187 rc.cpp:187
 msgid "CD #"
 msgstr "CD #"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:196 rc.cpp:196
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3684,17 +4140,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:162
 #. 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:162
 #. 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:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
 msgid "Type:"
 msgstr "Typ:"
 
@@ -3706,14 +4162,14 @@ 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:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
+#: rc.cpp:638
 msgid "Name:"
 msgstr "Název:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#: po/rc.cpp:205 rc.cpp:205
 msgid "Options"
 msgstr "Volby"
 
@@ -3721,7 +4177,7 @@ msgstr "Volby"
 #. 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)
@@ -3731,14 +4187,14 @@ msgstr "Volby"
 #. 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: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
 msgid "Port:"
 msgstr "Přípojka:"
 
@@ -3754,7 +4210,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:208 po/rc.cpp:226 po/rc.cpp:247 rc.cpp:208 rc.cpp:226 rc.cpp:247
+#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
 msgid "User:"
 msgstr "Uživatel:"
 
@@ -3766,7 +4222,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:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
 msgid "Domain:"
 msgstr "Doména:"
 
@@ -3778,7 +4234,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:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
 msgid "Share:"
 msgstr "Sdílení:"
 
@@ -3790,7 +4246,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:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
 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 "
@@ -3802,7 +4258,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:223 rc.cpp:223
+#: po/rc.cpp:229 rc.cpp:229
 msgid "Service name:"
 msgstr "Název služby:"
 
@@ -3814,19 +4270,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:250 po/rc.cpp:259 rc.cpp:250 rc.cpp:259
+#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
 msgid "Folder:"
 msgstr "Složka:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:259 rc.cpp:259
 msgid "Extra Options:"
 msgstr "Další volby:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:262 rc.cpp:262
 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 "
@@ -3838,7 +4294,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:268 rc.cpp:268
 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, "
@@ -3850,114 +4306,114 @@ msgstr ""
 "Pro běžné přehrávače záznamů, připojené přes USB, Cantata zobrazí zařízení "
 "automaticky, když je připojeno.</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:271 rc.cpp:271
 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:30
+#. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:274 rc.cpp:274
 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:271 rc.cpp:271
+#: po/rc.cpp:277 rc.cpp:277
 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:277 streams/streamspage.cpp:64 rc.cpp:277
+#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
 msgid "Edit"
 msgstr "Upravit"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:289 rc.cpp:289
 msgid "About Rules"
 msgstr "O pravidlech"
 
 #. i18n: file: dynamic/dynamicrule.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:295 rc.cpp:295
 msgid "Album Artist:"
 msgstr "Umělec alba"
 
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
+#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
 msgid "Album:"
 msgstr "Album:"
 
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:103
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:310 rc.cpp:310
 msgid "From Year:"
 msgstr "Od roku:"
 
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
 msgid "Any"
 msgstr "Jakýkoli"
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:126
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:316 rc.cpp:316
 msgid "To Year:"
 msgstr "Do roku:"
 
-#. i18n: file: dynamic/dynamicrule.ui:136
+#. i18n: file: dynamic/dynamicrule.ui:149
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
+#: po/rc.cpp:322 rc.cpp:322
 msgid "Exact match:"
 msgstr "Přesná shoda:"
 
-#. i18n: file: dynamic/dynamicrule.ui:160
+#. i18n: file: dynamic/dynamicrule.ui:173
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
+#: 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:165
+#. i18n: file: dynamic/dynamicrule.ui:178
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
+#: 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:173
+#. i18n: file: dynamic/dynamicrule.ui:186
 #. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
+#: po/rc.cpp:334 rc.cpp:334
 msgid "Artists similar to:"
 msgstr "Umělci podobní:"
 
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:236
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:337 rc.cpp:337
 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:249
+#. i18n: file: dynamic/dynamicrule.ui:262
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:340 rc.cpp:340
 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>"
@@ -3967,7 +4423,7 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
+#: 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></"
@@ -3975,67 +4431,74 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:37
 #. i18n: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
+#: 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:717
+#. 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:717
+#. i18n: file: gui/initialsettingswizard.ui:716
 #. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
+#: 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:730
+#. 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:730
+#. i18n: file: gui/initialsettingswizard.ui:729
 #. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
+#: 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:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
+#. i18n: file: gui/filesettings.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
+#: 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:93
+#. i18n: file: gui/filesettings.ui:110
 #. 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: 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:364 rc.cpp:364
 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>POZNÁMKA:</b> Pokud zvolíte, aby Cantata ukládala obaly, nebo texty "
-"písní ve složce s hudbou, a nemáte k této složce oprávnění pro zápis, potom "
+"<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 "
@@ -4043,40 +4506,39 @@ 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/filesettings.ui:128
+#. i18n: file: gui/filesettings.ui:145
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:367 rc.cpp:367
 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>"
+"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>POZNÁMKA:</b> Pokud změníte umístění, v němž jsou proudy ukládány (tj. "
 "přepnete volbu Uložit seznam oblíbených proudů ve složce s hudbou), Cantata "
-"pouze "
-"zobrazí proudy, jež jsou uloženy v příslušném umístění. Z tohoto důvodu, "
-"předtím než toto nastavení změníte, doporučuje se, abyste své si stávající "
-"proudy uložili. Potom je můžete znovu nahrát do nového umístění (poté co "
-"jste nastavení přepnuli).</i>"
+"pouze zobrazí proudy, jež jsou uloženy v příslušném umístění. Z tohoto "
+"důvodu, předtím než toto nastavení změníte, doporučuje se, abyste své si "
+"stávající proudy uložili. Potom je můžete znovu nahrát do nového umístění "
+"(poté co jste nastavení přepnuli).</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:370 rc.cpp:370
 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:361 rc.cpp:361
+#: po/rc.cpp:373 rc.cpp:373
 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:364 rc.cpp:364
+#: po/rc.cpp:376 rc.cpp:376
 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 "
@@ -4086,24 +4548,23 @@ msgid ""
 "p><p>This 'wizard' will guide you through the basic settings required for "
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
-"<html><head/><body><p>Cantata je klient pro Music Player Daemon (MPD). "
-"MPD je program běžící na pozadí, který se používá k přehrávání hudby.</p><p>"
-"Více "
-"informací o MPD naleznete na stránkách MPD <a href=\"http://www.musicpd.org\">"
-"<span style=\" text-"
-"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
-"p><p>Tento průvodce vás provede základními nastaveními, která jsou potřeba "
-"pro to, aby Cantata pracovala správně.</p></body></html>"
+"<html><head/><body><p>Cantata je klient pro Music Player Daemon (MPD). MPD "
+"je program běžící na pozadí, který se používá k přehrávání hudby.</p><p>Více "
+"informací o MPD naleznete na stránkách MPD <a href=\"http://www.musicpd.org"
+"\"><span style=\" text-decoration: underline; color:#0000ff;\">http://www."
+"musicpd.org</span></a></p><p>Tento průvodce vás provede základními "
+"nastaveními, která jsou potřeba pro to, aby Cantata pracovala správně.</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:379 rc.cpp:379
 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:370 rc.cpp:370
+#: po/rc.cpp:382 rc.cpp:382
 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 "
@@ -4111,37 +4572,21 @@ msgid ""
 "basis. Please select how you would like to have Cantata initially connect to "
 "(or startup) MPD:</p></body></html>"
 msgstr ""
-"<html><head/><body><p>Cantata je klient pro Music Player Daemon (MPD). "
-"MPD je program běžící na pozadí, který se používá k přehrávání hudby. MPD lze "
-"spustit buď "
-"pro celý systém, anebo uživatelsky. Vyberte, prosím, jak chcete, aby byla "
-"Cantata na začátku připojena k (nebo spouštěna) MPD:</p></body></html>"
+"<html><head/><body><p>Cantata je klient pro Music Player Daemon (MPD). MPD "
+"je program běžící na pozadí, který se používá k přehrávání hudby. MPD lze "
+"spustit buď pro celý systém, anebo uživatelsky. Vyberte, prosím, jak chcete, "
+"aby byla Cantata na začátku připojena k (nebo spouštěna) 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 "Základní nastavení pro jednoho uživatele"
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:385 rc.cpp:385
 msgid "Standard multi-user/server setup"
 msgstr "Standardní nastavení pro více uživatelů/server"
 
-#. 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>Tuto volbu vyberte v případě, že vaše sbírka není sdílena s ostatními, "
-"a vy si přejete, aby Cantata nastavila a řídila instanci MPD.</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:388 rc.cpp:388
 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 "
@@ -4150,14 +4595,30 @@ msgid ""
 "that MPD is already configured and running.</i>"
 msgstr ""
 "<i>Tuto volbu vyberte v případě, že vaše sbírka je sdílena mezi uživateli, "
-"vaše instance MPD běží na jiném stroji, nebo již máte osobní nastavení "
-"MPD. Pokud vyberete tuto volbu, Cantata sama nedokáže řídit spouštění "
-"a zastavování serveru MPD. Z toho důvodu budete muset zajistit, aby "
-"MPD bylo již nastaveno a běželo.</i>"
+"vaše instance MPD běží na jiném stroji, nebo již máte osobní nastavení MPD. "
+"Pokud vyberete tuto volbu, Cantata sama nedokáže řídit spouštění a "
+"zastavování serveru MPD. Z toho důvodu budete muset zajistit, aby MPD bylo "
+"již nastaveno a běželo.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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>Tuto volbu vyberte v případě, že vaše sbírka není sdílena s ostatními, a "
+"vy si přejete, aby Cantata nastavila a řídila instanci MPD.</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:397 rc.cpp:397
 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-"
@@ -4169,18 +4630,17 @@ msgstr ""
 "href=\"http://www.musicpd.org\"><span style=\" text-decoration: underline; "
 "color:#0000ff;\">http://www.musicpd.org</span></a></p><p>Tento průvodce vás "
 "provede základními nastaveními, která jsou potřeba pro to, aby Cantata "
-"pracovala správně.</p></"
-"body></html>"
+"pracovala správně.</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:400 rc.cpp:400
 msgid "Connection details"
 msgstr "Podrobnosti spojení"
 
-#. 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:403 rc.cpp:403
 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."
@@ -4188,21 +4648,21 @@ msgstr ""
 "Nastavení níže jsou základní nastavení požadovaná Cantatou. Zadejte, prosím, "
 "náležité podrobnosti a použijte tlačítko Spojit pro vyzkoušení spojení."
 
-#. 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:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
 msgid "Host (or local socket):"
 msgstr "Hostitel (nebo místní zásuvka):"
 
-#. 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:421 rc.cpp:421
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
@@ -4210,15 +4670,15 @@ 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>"
 
-#. 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:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
 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>"
@@ -4226,27 +4686,27 @@ msgstr ""
 "<i><b>POZNÁMKA:</b> Při použití místní zásuvky je potřeba nastavit úplnou "
 "absolutní cestu k zásuvce. (Číslo přípojky požadováno není.)</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:427 rc.cpp:427
 msgid "Music folder"
 msgstr "Složka s hudbou"
 
-#. 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:430 rc.cpp:430
 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: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:436 rc.cpp:436
 msgid "Covers, Lyrics, and Streams"
 msgstr "Obaly, slova písně a proudy"
 
-#. 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:439 rc.cpp:439
 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 "
@@ -4260,9 +4720,31 @@ 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:808
+#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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>POZNÁMKA:</b> Pokud zvolíte, aby Cantata ukládala obaly, nebo texty "
+"písní 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/initialsettingswizard.ui:824
 #. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:443 rc.cpp:443
+#: po/rc.cpp:457 rc.cpp:457
 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 "
@@ -4272,15 +4754,15 @@ msgstr ""
 "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:841
+#. i18n: file: gui/initialsettingswizard.ui:857
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:460 rc.cpp:460
 msgid "Finished!"
 msgstr "Dokončeno!"
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:880
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:463 rc.cpp:463
 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 "
@@ -4290,9 +4772,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:902
+#. i18n: file: gui/initialsettingswizard.ui:918
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:466 rc.cpp:466
 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 "
@@ -4306,27 +4788,6 @@ 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: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 "Styl:"
-
 #. i18n: file: gui/interfacesettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
@@ -4335,25 +4796,25 @@ msgstr "Styl:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
 #. 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:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
 msgid "Covers:"
 msgstr "Obaly:"
 
 #. i18n: file: gui/interfacesettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
+#: po/rc.cpp:478 rc.cpp:478
 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:467 rc.cpp:467
+#: po/rc.cpp:481 rc.cpp:481
 msgid "Show album year:"
 msgstr "Ukázat rok alba:"
 
 #. i18n: file: gui/interfacesettings.ui:123
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:484 rc.cpp:484
 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"
@@ -4371,25 +4832,25 @@ msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:172
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:497 rc.cpp:497
 msgid "Sort albums:"
 msgstr "Třídit alba:"
 
 #. i18n: file: gui/interfacesettings.ui:183
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Album/Artist"
 msgstr "Album/Umělec"
 
 #. i18n: file: gui/interfacesettings.ui:188
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:503 rc.cpp:503
 msgid "Artist/Album"
 msgstr "Umělec/Album"
 
 #. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:506 rc.cpp:506
 msgid "Artist/Year/Album"
 msgstr "Umělec/Rok/Album"
 
@@ -4401,127 +4862,133 @@ msgstr "Umělec/Rok/Album"
 #. 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
+#: 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: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:518 rc.cpp:518
 msgid "Other Views"
 msgstr "Jiné pohledy"
 
 #. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
 msgid "Folder view style:"
 msgstr "Styl pohledu se složkami:"
 
 #. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
 msgid "Streams view style:"
 msgstr "Styl pohledu s proudy:"
 
 #. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Online view style:"
 msgstr "Styl pohledu s internetem:"
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:530 rc.cpp:530
 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:525 rc.cpp:525
+#: 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:534 rc.cpp:534
+#: 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:537 rc.cpp:537
+#: 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:540 rc.cpp:540
+#: 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:398
+#. 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: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:560 rc.cpp:560
 msgid "External"
 msgstr "Vnější"
 
-#. i18n: file: gui/interfacesettings.ui:404
+#. i18n: file: gui/interfacesettings.ui:417
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
+#: 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:424
+#. i18n: file: gui/interfacesettings.ui:437
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
+#: 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:444
+#. i18n: file: gui/interfacesettings.ui:457
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
+#: 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:461
-#. i18n: ectx: property (text), widget (BuddyLabel, gnomeMediaKeysLabel)
-#: po/rc.cpp:555 rc.cpp:555
-msgid "Support media keys under GNOME/Unity:"
-msgstr "Podporovat multimediální klávesy pod GNOME/Unity:"
-
 #. i18n: file: gui/interfacesettings.ui:475
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
+#: po/rc.cpp:572 rc.cpp:572
 msgid "General"
 msgstr "Obecné"
 
 #. i18n: file: gui/interfacesettings.ui:486
 #. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
+#: 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:564 rc.cpp:564
+#: po/rc.cpp:581 rc.cpp:581
 msgid "Multiple artist albums:"
 msgstr "Alba s více umělci:"
 
-#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: file: gui/interfacesettings.ui:533
 #. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
+#: 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:533
+#. i18n: file: gui/interfacesettings.ui:550
 #. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
+#: 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:574
+#. i18n: file: gui/interfacesettings.ui:591
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
+#: po/rc.cpp:590 rc.cpp:590
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
@@ -4529,98 +4996,75 @@ 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:244
+#. i18n: file: gui/mainwindow.ui:287
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
+#: po/rc.cpp:593 rc.cpp:593
 msgid "[Dynamic]"
 msgstr "[Dynamický]"
 
 #. i18n: file: gui/playbacksettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
+#: po/rc.cpp:596 rc.cpp:596
 msgid "Output"
 msgstr "Výstup"
 
 #. i18n: file: gui/playbacksettings.ui:41
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:585 rc.cpp:585
+#: po/rc.cpp:602 rc.cpp:602
 msgid "Crossfading:"
 msgstr "Prolínání:"
 
 #. i18n: file: gui/playbacksettings.ui:51
 #. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:588 rc.cpp:588
+#: po/rc.cpp:605 rc.cpp:605
 msgid " seconds"
 msgstr " sekund"
 
 #. i18n: file: gui/playbacksettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:591 rc.cpp:591
+#: po/rc.cpp:608 rc.cpp:608
 msgid "Replay gain:"
 msgstr "Vyrovnání hlasitosti:"
 
 #. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:594 rc.cpp:594
+#: po/rc.cpp:611 rc.cpp:611
 msgid "About replay gain"
 msgstr "O vyrovnání hlasitosti"
 
 #. i18n: file: gui/playbacksettings.ui:104
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:597 rc.cpp:597
+#: po/rc.cpp:614 rc.cpp:614
 msgid "Devices:"
 msgstr "Zařízení:"
 
-#. i18n: file: gui/playbacksettings.ui:132
-#. i18n: ectx: property (title), widget (QGroupBox, streamBox)
-#: po/rc.cpp:600 rc.cpp:600
-msgid "HTTP Stream"
-msgstr "Proud HTTP"
-
 #. 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 "Adresa (URL):"
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
-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>"
-msgstr ""
-"<i><b>POZNÁMKA:</b> Toto 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>"
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: po/rc.cpp:609 rc.cpp:609
-msgid "Stopping Playback"
-msgstr "Zastavení přehrávání"
-
-#. i18n: file: gui/playbacksettings.ui:176
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:620 rc.cpp:620
 msgid "Fadeout on stop:"
 msgstr "Zeslabení při zastavení:"
 
-#. i18n: file: gui/playbacksettings.ui:189
+#. i18n: file: gui/playbacksettings.ui:154
 #. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
+#: 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:202
+#. i18n: file: gui/playbacksettings.ui:167
 #. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
+#: 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:219
+#. 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:621 rc.cpp:621
+#: 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 "
@@ -4628,36 +5072,41 @@ msgid ""
 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>"
+"nebo po nynější skladbě.</i>"
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:635 rc.cpp:635
 msgid "Collection:"
 msgstr "Sbírka:"
 
 #. 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:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
 msgid "Cover filename:"
 msgstr "Název souboru obalu:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:645 rc.cpp:645
+#: po/rc.cpp:656 rc.cpp:656
 msgid "Dynamizer port:"
 msgstr "Přípojka dynamizátoru:"
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:659 rc.cpp:659
+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:648 rc.cpp:648
+#: po/rc.cpp:662 rc.cpp:662
 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 "
@@ -4670,21 +5119,34 @@ msgstr ""
 "Pokud k této složce máte i oprávnění k zápisu (a do jejích podsložek), potom "
 "Cantata uloží všechny stažené obaly do příslušné složky alba.</i>"
 
-#. i18n: file: gui/serversettings.ui:314
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+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>"
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:677 rc.cpp:677
 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>POZNÁMKA:</b> Pokud změníte nastavení pro složku s hudbou, "
-"budete muset hudební databázi obnovovat ručně. To je možné provádět "
-"stisknutím tlačítka Obnovit databázi v pohledech s umělci nebo alby.</i>"
+"<i><b>POZNÁMKA:</b> Pokud změníte nastavení pro složku s hudbou, budete "
+"muset hudební databázi obnovovat ručně. To je možné provádět stisknutím "
+"tlačítka Obnovit databázi v pohledech s umělci nebo alby.</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:680 rc.cpp:680
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4694,19 +5156,19 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:666 rc.cpp:666
+#: po/rc.cpp:683 rc.cpp:683
 msgid "Network interface:"
 msgstr "Síťové rozhraní:"
 
 #. i18n: file: http/httpserversettings.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
+#: po/rc.cpp:686 rc.cpp:686
 msgid "Current URL:"
 msgstr "Nynější adresa (URL):"
 
 #. i18n: file: http/httpserversettings.ui:73
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:689 rc.cpp:689
 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 "
@@ -4715,34 +5177,45 @@ msgid ""
 "<b>NOTE:</b> If you choose 'Local loopback' for 'Network interface', then "
 "MPD <b>must</b> also be on this computer.</i>"
 msgstr ""
-"<i><b>POZNÁMKA:</b> MPD obvykle přehrává pouze ty písně, jež jsou "
-"uloženy v jeho složkách. Cantata obsahuje malý HTTP server, který se dá "
-"použít na 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>"
+"<i><b>POZNÁMKA:</b> MPD obvykle přehrává pouze ty písně, jež jsou uloženy v "
+"jeho složkách. Cantata obsahuje malý HTTP server, který se dá použít na "
+"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>"
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:693 rc.cpp:693
 msgid "Mode:"
 msgstr "Režim:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:699 rc.cpp:699
 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:702 rc.cpp:702
 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."
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:723 rc.cpp:723
 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."
@@ -4751,210 +5224,280 @@ msgid ""
 msgstr ""
 "Můžete poslouchat zdarma bez účtu, ale členové Premium mohou poslouchat "
 "proudy o vyšší kvalitě a bez reklam. Navštivte stránky <a href=\"http://www."
-"di.fm/premium/\">http://www.di.fm/premium/</a>, kde můžete udělat povýšení na "
-"prémiový účet."
+"di.fm/premium/\">http://www.di.fm/premium/</a>, kde můžete udělat povýšení "
+"na prémiový účet."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:726 rc.cpp:726
 msgid "Premium Account"
 msgstr "Prémiový účet"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:735 rc.cpp:735
 msgid "Stream type:"
 msgstr "Typ proudu:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:738 rc.cpp:738
 msgid "Status:"
 msgstr "Stav:"
 
 #. 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:741 streams/digitallyimportedsettings.cpp:130
+#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
 msgid "Login"
 msgstr "Přihlášení"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:747 rc.cpp:747
 msgid "Session expiry:"
 msgstr "Vypršení sezení:"
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:750 rc.cpp:750
+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>"
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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 "
+"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."
+msgstr ""
+"Následující je seznam skupin proudů na nejvyšší úrovni. Pro skrytí skupiny "
+"jednoduše zrušte "
+"její zaškrtnutí v tomto seznamu."
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+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
+msgid "Install"
+msgstr "Instalovat"
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:768 rc.cpp:768
+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>"
+
+#. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:727 rc.cpp:727
+#: po/rc.cpp:771 rc.cpp:771
 msgid "Search:"
 msgstr "Hledání:"
 
-#. 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:774 rc.cpp:774
 msgid "Shortcut for Selected Action"
 msgstr "Zkratka pro vybranou činnost"
 
-#. 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:777 rc.cpp:777
 msgid "Default:"
 msgstr "Výchozí:"
 
-#. 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:783 rc.cpp:783
 msgid "Custom:"
 msgstr "Vlastní:"
 
-#. i18n: file: tags/tageditor.ui:22
+#. i18n: file: tags/tageditor.ui:25
 #. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
+#: po/rc.cpp:786 rc.cpp:786
 msgid "Track:"
 msgstr "Skladba:"
 
-#. 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:795 rc.cpp:795
 msgid "Album artist:"
 msgstr "Umělec alba:"
 
-#. 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:804 rc.cpp:804
 msgid "Track number:"
 msgstr "Číslo skladby:"
 
-#. 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:807 rc.cpp:807
 msgid "Disc number:"
 msgstr "Číslo disku:"
 
 #. i18n: file: tags/trackorganiser.ui:155
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:834 rc.cpp:834
 msgid "Original Name"
 msgstr "Původní název"
 
 #. i18n: file: tags/trackorganiser.ui:160
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:837 rc.cpp:837
 msgid "New Name"
 msgstr "Nový název"
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:838 rc.cpp:838
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Pavel Fric"
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:839 rc.cpp:839
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "pavelfric at seznam.cz"
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:121
 msgid "Show All Tracks"
 msgstr "Ukázat všechny skladby"
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:122
 msgid "Show Untagged Tracks"
 msgstr "Ukázat skladby bez značek"
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
 msgid "Remove From List"
 msgstr "Odstranit ze seznamu"
 
-#: replaygain/rgdialog.cpp:140
+#: replaygain/rgdialog.cpp:136
 msgid "Album Gain"
 msgstr "Zesílení alba"
 
-#: replaygain/rgdialog.cpp:141
+#: replaygain/rgdialog.cpp:137
 msgid "Track Gain"
 msgstr "Zesílení skladby"
 
-#: replaygain/rgdialog.cpp:142
+#: replaygain/rgdialog.cpp:138
 msgid "Album Peak"
 msgstr "Vrchol alba"
 
-#: replaygain/rgdialog.cpp:143
+#: replaygain/rgdialog.cpp:139
 msgid "Track Peak"
 msgstr "Vrchol skladby"
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
 msgid "Scan"
 msgstr "Prohledat"
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:238
 msgid "Update ReplayGain tags in tracks?"
 msgstr "Obnovit značky pro vyrovnání hlasitosti ve skladbách?"
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
 msgid "Update Tags"
 msgstr "Obnovit značky"
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:252
 msgid "Abort scanning of tracks?"
 msgstr "Zrušit prohledávání značek?"
 
-#: replaygain/rgdialog.cpp:257
+#: replaygain/rgdialog.cpp:261
 msgid "Abort reading of existing tags?"
 msgstr "Zrušit čtení stávajících značek?"
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:287
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 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>"
+"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:285
+#: replaygain/rgdialog.cpp:289
 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:286
+#: replaygain/rgdialog.cpp:290
 msgid "Untagged Tracks"
 msgstr "Skladby bez značek"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "All Tracks"
 msgstr "Všechny skladby"
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:300
 msgid "Scanning tracks..."
 msgstr "Prohledávají se skladby..."
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:367
 msgid "Reading existing tags..."
 msgstr "Čtou se stávající značky..."
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr "%1 (časové omezení)"
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr "%1 (poškozené značky?)"
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
 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:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
+#: tags/trackorganiser.cpp:451
 msgid "Device is not connected."
 msgstr "Zařízení není připojeno."
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: 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
 msgid "Failed"
 msgstr "Nepodařilo se"
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
 msgid "Remove the selected tracks from the list?"
 msgstr "Odstranit vybrané skladby ze seznamu?"
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
 msgid "Remove Tracks"
 msgstr "Odstranit skladby"
 
@@ -4986,6 +5529,10 @@ msgstr "Přihlašuje se..."
 msgid "Logout"
 msgstr "Odhlásit se"
 
+#: streams/streamdialog.cpp:71
+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"
@@ -5006,115 +5553,148 @@ msgstr "Upravit proud"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>CHYBA:</b> Neplatný protokol</i>"
 
-#: streams/streamfetcher.cpp:198
+#: streams/streamfetcher.cpp:205
 msgid "Fetching %1"
 msgstr "Natahuje se %1"
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 msgid "Import Streams Into Favorites"
 msgstr "Zavést proudy do oblíbených"
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 msgid "Export Favorite Streams"
 msgstr "Vyvést oblíbené proudy"
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr "Přidat nový proud do oblíbených"
 
-#: streams/streamspage.cpp:123
-msgid "Search TuneIn:"
-msgstr "Hledat TuneIn:"
+#: streams/streamspage.cpp:124
+msgctxt "Service name"
+msgid "Digitally Imported"
+msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:242
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|Proudy XML"
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
 msgid "Import Streams"
 msgstr "Zavést proudy"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:245
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Proudy XML (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:253
 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:262
+#: streams/streamspage.cpp:265
 msgid "*.xml|XML Streams"
 msgstr "*.xml|Proudy XML"
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
 msgid "Export Streams"
 msgstr "Vyvést proudy"
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:267
 msgid "XML Streams (*.xml)"
 msgstr "Proudy XML (*.xml)"
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:279
 msgid "Failed to create <b>%1</b>!"
 msgstr "Nepodařilo se vytvořit <b>%1</b>!"
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "Proud již existuje!<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Proud pojmenovaný <b>%1</b> již existuje!"
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:318
 msgid "Bookmark added"
 msgstr "Záložka přidána"
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:320
 msgid "Already bookmarked"
 msgstr "Již opatřeno záložkou"
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:366
 msgid "Added to favorites"
 msgstr "Přidáno do oblíbených"
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:368
 msgid "Already in favorites"
 msgstr "Již v oblíbených"
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:393
 msgid "Reload <b>%1</b> streams?"
 msgstr "Nahrát znovu <b>%1</b> proudů?"
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:411
 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:414
+#: streams/streamspage.cpp:417
 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:442
+#: streams/streamspage.cpp:445
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "Opravdu chcete odstranit %1 vybrané proudy?"
 
-#: streams/streamspage.cpp:446
+#: streams/streamspage.cpp:449 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:609
-msgid "Logged into Digitally Imported"
-msgstr "Přihlášen k Digitally Imported"
+#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+msgid "Search %1:"
+msgstr "Hledání %1:"
+
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr "*.streams|Proudy Cantata"
+
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+msgid "Install Streams"
+msgstr "Nainstalovat proudy"
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
+msgstr "Proudy Cantata (*.streams)"
+
+#: streams/streamssettings.cpp:144
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr "Skupina pojmenovaná <b>%1</b> již existuje!<br/>Přepsat?"
+
+#: streams/streamssettings.cpp:150
+msgid "Failed top open %1"
+msgstr "Nepodařilo se otevřít %1"
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
-msgstr "<b>NE</b>přihlášen k Digitally Imported"
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr "Neplatný souborový formát!"
+
+#: streams/streamssettings.cpp:170
+msgid "Failed to create stream category folder!"
+msgstr "Nepodařilo se vytvořit složku pro skupinu proudu!"
+
+#: streams/streamssettings.cpp:176
+msgid "Failed to save stream list!"
+msgstr "Nepodařilo se uložit seznam proudu."
+
+#: streams/streamssettings.cpp:227
+msgid "Failed to remove streams folder!"
+msgstr "Nepodařilo se odstranit složku s proudy!"
 
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr "&OK"
 
 #: support/dialog.cpp:90
@@ -5177,39 +5757,39 @@ msgstr "&Předchozí"
 msgid "&Next"
 msgstr "&Další"
 
-#: support/fancytabwidget.cpp:952
+#: support/fancytabwidget.cpp:957
 msgid "Icons Only"
 msgstr "Pouze ikony"
 
-#: support/fancytabwidget.cpp:953
+#: support/fancytabwidget.cpp:958
 msgid "Style"
 msgstr "Styl"
 
-#: support/fancytabwidget.cpp:954
+#: support/fancytabwidget.cpp:959
 msgid "Large Sidebar"
 msgstr "Velký postranní panel"
 
-#: support/fancytabwidget.cpp:955
+#: support/fancytabwidget.cpp:960
 msgid "Small Sidebar"
 msgstr "Malý postranní panel"
 
-#: support/fancytabwidget.cpp:956
+#: support/fancytabwidget.cpp:961
 msgid "Top Bar"
 msgstr "Panel nahoře"
 
-#: support/fancytabwidget.cpp:957
+#: support/fancytabwidget.cpp:962
 msgid "Bottom Bar"
 msgstr "Panel dole"
 
-#: support/fancytabwidget.cpp:958
+#: support/fancytabwidget.cpp:963
 msgid "Tabs On Side"
 msgstr "Karty po straně"
 
-#: support/fancytabwidget.cpp:959
+#: support/fancytabwidget.cpp:964
 msgid "Tabs On Top"
 msgstr "Karty nahoře"
 
-#: support/fancytabwidget.cpp:960
+#: support/fancytabwidget.cpp:965
 msgid "Tabs On Bottom"
 msgstr "Karty dole"
 
@@ -5221,19 +5801,20 @@ msgstr "Heslo"
 msgid "Please enter password:"
 msgstr "Zadejte, prosím, heslo:"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
 msgid "Warning"
 msgstr "Varování"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
 msgid "Question"
 msgstr "Otázka"
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
+#: support/messagebox.cpp:107 support/messagebox.cpp:113
+#: support/messagebox.h:62
 msgid "Error"
 msgstr "Chyba"
 
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr "Informace"
 
@@ -5253,59 +5834,66 @@ msgstr "Vybrat složku"
 msgid "Select File"
 msgstr "Vybrat soubor"
 
-#: 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] "Jeden den %2"
+msgstr[1] "%1 dny %2"
+msgstr[2] "%1 dnů %2"
+
+#: tags/tageditor.cpp:134
 msgid "Tags"
 msgstr "Značky"
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:147
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "Nastavit Umělec alba z Umělec"
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
 msgid "All tracks"
 msgstr "Všechny skladby"
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:295
 msgid "(Various)"
 msgstr "(Různí)"
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:336
 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:367
+#: tags/tageditor.cpp:378
 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:417
+#: tags/tageditor.cpp:428
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5313,15 +5901,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:418
+#: tags/tageditor.cpp:429
 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:419
+#: tags/tageditor.cpp:430
 msgid "Album Artist from Artist"
 msgstr "Umělec alba z Umělec"
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:463
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5329,46 +5917,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:485
+#: tags/tageditor.cpp:496
 msgid "Adjust the value of each track number by:"
 msgstr "Upravit hodnotu čísla každé skladby o:"
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:554
 msgid "All tracks [modified]"
 msgstr "Všechny skladby [změněno]"
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:556
 msgid "%1 [modified]"
 msgstr "%1 [změněno]"
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:783
 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:759
+#: tags/tageditor.cpp:784
 msgid "Rename Files"
 msgstr "Přejmenovat soubory"
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:150
 msgid "Abort renaming of files?"
 msgstr "Zrušit přejmenování souborů?"
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:263
+msgid "Source file does not exist!<br/>%1"
+msgstr "Zdrojový soubor neexistuje!<br/>%1"
+
+#: tags/trackorganiser.cpp:282
 msgid "Destination file already exists!<br/>%1"
 msgstr "Cílový soubor již existuje!<hr/>%1"
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:304
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Nepodařilo se vytvořit cílovou složku!<br/>%1"
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:325
 msgid "Failed to rename %1 to %2"
 msgstr "Nepodařilo se přejmenovat %1 na %2"
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:267
+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
 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:"
@@ -5378,26 +5974,31 @@ 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:59
+#: widgets/genrecombo.cpp:54
 msgid "All Genres"
 msgstr "Všechny žánry"
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:267
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: widgets/groupedview.cpp:269
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:480
 msgid "Go Back"
 msgstr "Jít zpět"
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:485
 msgid "Go Home"
 msgstr "Jít do domovské složky"
 
 #: widgets/menubutton.cpp:36
-msgid "Other Actions"
-msgstr "Jiné činnosti"
+msgid "Menu"
+msgstr "Nabídka"
 
 #: widgets/searchwidget.cpp:62
 msgid "Search..."
@@ -5407,6 +6008,56 @@ msgstr "Hledání..."
 msgid "Close Search Bar"
 msgstr "Zavřít vyhledávací pole"
 
+#: widgets/servicestatuslabel.cpp:43
+msgid "Logged into %1"
+msgstr "Přihlášen k %1"
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr "<b>NENÍ</b>přihlášen k %1"
+
+#: widgets/songdialog.cpp:48
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
+"\" setting, and MPD's \"music_directory\" setting.</p>"
+msgstr ""
+"<p>Nelze přistupovat k souborům s písněmi!<br/><br/>Prověřte, prosím, "
+"nastavení složky s hudbou Cantaty a nastavení adresáře s hudbou MPD "
+"(music_directory).</p>"
+
+#: widgets/songdialog.cpp:51
+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>"
+
+#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
+#: widgets/volumeslider.cpp:238
+msgid "Mute"
+msgstr "Ztlumit"
+
+#: widgets/volumeslider.cpp:199
+msgid "Muted"
+msgstr "Ztlumeno"
+
+#: widgets/volumeslider.cpp:238
+msgid "Unmute"
+msgstr "Zrušit ztišení"
+
+#: widgets/volumeslider.cpp:276
+msgid "Volume Disabled"
+msgstr "Hlasitost vypnuta"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1% (Muted)"
+msgstr "Hlasitost: %1% (ztlumeno)"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr "Hlasitost %1%"
+
 #: ../gui/qtplural.h:30
 msgctxt "Singular"
 msgid "1 Track"
@@ -5485,6 +6136,90 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr "Pravidla: %1"
 
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr "Jeden záznam"
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr "Záznamy: %1"
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr "Jeden díl"
+
+#: ../gui/qtplural.h:63
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr "Díly: %1"
+
+#~ msgid ""
+#~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
+#~ msgstr ""
+#~ "Nepodařilo se stáhnout skladbu - vyskytlo se příliš mnoho přesměrování."
+#~ "<br/><br/<hr/>%1"
+
+#~ 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>Následující proměnné budou nahrazeny jejich odpovídajícím významem pro "
+#~ "název každé skladby.</p><p><table border=\"1\"><tr><th><em>Tlačítko</em></"
+#~ "th><th><em>Proměnná </em></th><th><em>Popis</em></th></tr><tr><td>"
+#~ "%albumartist%</td><td>%1</td><td>U většiny alb to bude totéž co <i>Umělec "
+#~ "skladby.</i> U sbírek ze skladeb (kompilací) to často bude <i>Různí "
+#~ "umělci.</i> </td></tr><tr><td>%album%</td><td>%2</td><td>Název alba.</"
+#~ "td></tr><tr><td>%artist%</td><td>%3</td><td>Umělec každé skladby.</td></"
+#~ "tr><tr><td>%title%</td><td>%4</td><td>Název skladby (bez <i>Umělec "
+#~ "skladby</i>).</td></tr><tr><td>%artistandtitle%</td><td>%5</td><td>Název "
+#~ "skladby (s <i>Umělec skladby</i>, je jiný než <i>Umělec alba</i>).</td></"
+#~ "tr><tr><td>%track%</td><td>%6</td><td>Číslo skladby.</td></tr><tr><td>"
+#~ "%discnumber%</td><td>%7</td><td>Číslo alba u alba s více alby. Sbírky "
+#~ "skladeb (kompilace) se často skládají z více alb.</td></tr><tr><td>%year"
+#~ "%</td><td>%8</td><td>Rok vydání alba.</td></tr><tr><td>%genre%</td><td>"
+#~ "%9</td><td>Žánr alba.</td></tr></table></p>"
+
+#~ msgid "Configure Online Service"
+#~ msgstr "Nastavit internetovou službu"
+
+#~ msgid "Refresh Online Service"
+#~ msgstr "Obnovit internetovou službu"
+
+#~ msgid "Support media keys under GNOME/Unity:"
+#~ msgstr "Podporovat multimediální klávesy pod GNOME/Unity:"
+
+#~ msgid "Stopping Playback"
+#~ msgstr "Zastavení přehrávání"
+
+#~ msgid "Search TuneIn:"
+#~ msgstr "Hledat TuneIn:"
+
+#~ msgid "Logged into Digitally Imported"
+#~ msgstr "Přihlášen k Digitally Imported"
+
+#~ msgid "Other Actions"
+#~ msgstr "Jiné činnosti"
+
 #~ msgid "Disc %1"
 #~ msgstr "Disk %1"
 
@@ -5574,19 +6309,9 @@ msgstr "Pravidla: %1"
 #~ msgid "Disconnect Online Service"
 #~ msgstr "Odpojit internetovou službu"
 
-#~ msgid "Failed to parse downloaded stream list."
-#~ msgstr "Nepodařilo se zpracovat seznam staženého proudu."
-
 #~ msgid "Failed to read downloaded stream list."
 #~ msgstr "Nepodařilo se přečíst seznam staženého proudu."
 
-#~ msgid "Failed to download stream list."
-#~ msgstr "Nepodařilo se stáhnout seznam proudu."
-
-#~ msgctxt "name (host)"
-#~ msgid "%1 (%2)"
-#~ msgstr "%1 (%2)"
-
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "Nepodařilo se znovu připojit k %1"
 
@@ -5734,9 +6459,6 @@ msgstr "Pravidla: %1"
 #~ msgid "Music folder not writeable."
 #~ msgstr "Složka s hudbou není zapisovatelná"
 
-#~ msgid "*.cantata|Cantata Streams"
-#~ msgstr "*.streams|Proudy Cantata"
-
 #~ msgid "Are you sure you wish to remove the selected categories &streams?"
 #~ msgstr "Opravdu chcete odstranit vybrané skupiny &a proudy?"
 
@@ -5771,9 +6493,6 @@ msgstr "Pravidla: %1"
 #~ msgid "Download streams from %1?"
 #~ msgstr "Stáhnout proudy z %1?"
 
-#~ msgid "Download %1"
-#~ msgstr "Stáhnout %1"
-
 #~ msgctxt ""
 #~ "message \n"
 #~ " url"
@@ -5892,18 +6611,12 @@ msgstr "Pravidla: %1"
 #~ msgid "Failed to update the tags of some tracks."
 #~ msgstr "Nepodařilo se zaktualizovat značky některých skladeb."
 
-#~ msgid "Are you sure you wish to forget the selected device?"
-#~ msgstr "Opravdu chcete zapomenout vybrané zařízení?"
-
 #~ msgid "Select Music Folder"
 #~ msgstr "Vybrat složku s hudbou"
 
 #~ msgid "Small Control Buttons"
 #~ msgstr "Malá tlačítka pro ovládání"
 
-#~ msgid "External Settings"
-#~ msgstr "Vnější nastavení"
-
 #~ 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"
diff --git a/po/de.po b/po/de.po
index 9a4b405..693fe52 100644
--- a/po/de.po
+++ b/po/de.po
@@ -8,8 +8,8 @@ msgstr ""
 "Project-Id-Version: \n"
 "Report-Msgid-Bugs-To: \n"
 "POT-Creation-Date: 2013-07-20 19:42+0100\n"
-"PO-Revision-Date: 2013-09-24 04:33+0200\n"
-"Last-Translator: Markus Slopianka <kamikazow at web.de>\n"
+"PO-Revision-Date: 2013-11-27 23:32+0100\n"
+"Last-Translator: Lutz Lüttke <lutz at blutgemetzel.de>\n"
 "Language-Team: German <kde-i18n-de at kde.org>\n"
 "Language: de\n"
 "MIME-Version: 1.0\n"
@@ -59,11 +59,11 @@ msgstr "Ähnliche Künstler"
 
 #: context/contextsettings.cpp:36
 msgid "Lyrics Providers"
-msgstr "Liedtextanbieter"
+msgstr "Textanbieter"
 
 #: context/contextsettings.cpp:37
 msgid "Wikipedia Languages"
-msgstr "Wikipedia-Sprachen"
+msgstr "Wikipedia Sprachen"
 
 #: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
 #: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
@@ -77,11 +77,11 @@ msgstr "Abstand zurücksetzen"
 #: context/contextwidget.cpp:301 context/songview.cpp:90
 #: gui/cachesettings.cpp:241
 msgid "Lyrics"
-msgstr "Liedtexte"
+msgstr "Texte"
 
 #: context/lastfmengine.cpp:65
 msgid "Read more on last.fm"
-msgstr "Lese mehr auf last.fm"
+msgstr "Mehr auf last.fm"
 
 #: context/lyricsdialog.cpp:42
 msgid ""
@@ -93,7 +93,7 @@ msgid ""
 "If this search does find new lyrics, these will still be associated with the "
 "original song title and artist as displayed in Cantata."
 msgstr ""
-"Wenn Cantata keine oder falsche Liedtexte gefunden hat diesen Dialog zum "
+"Wenn Cantata keine oder falsche Texte gefunden hat diesen Dialog zum "
 "erneuten Suchen verwenden, zum Beispiel wenn das aktuelle Stück eine "
 "Coverversion ist. Die Suche nach dem Originalkünstler könnte das korrekte "
 "Ergebnis erzielen.\n"
@@ -137,7 +137,7 @@ msgstr "Künstler:"
 
 #: context/lyricsdialog.cpp:68
 msgid "Search For Lyrics"
-msgstr "Suche nach Liedtexten"
+msgstr "Suche nach Texten"
 
 #: context/lyricsettings.cpp:34
 msgid "Choose the websites you want to use when searching for lyrics."
@@ -153,19 +153,19 @@ msgstr "(Portugiesische Übersetzung)"
 
 #: context/songview.cpp:74
 msgid "Refresh Lyrics"
-msgstr "Aktualisiere Liedtexte"
+msgstr "Aktualisiere Texte"
 
 #: context/songview.cpp:75
 msgid "Edit Lyrics"
-msgstr "Bearbeite Liedtexte"
+msgstr "Bearbeite Texte"
 
 #: context/songview.cpp:76
 msgid "Save Lyrics"
-msgstr "Speichere Liedtexte"
+msgstr "Speichere Texte"
 
 #: context/songview.cpp:77
 msgid "Cancel Editing Lyrics"
-msgstr "Bearbeitung der Liedtexte abbrechen"
+msgstr "Bearbeitung der Texte abbrechen"
 
 #: context/songview.cpp:78
 msgid "Delete Lyrics File"
@@ -173,7 +173,7 @@ msgstr "Lösche Liedtextdatei?"
 
 #: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
 msgid "Abort editing of lyrics?"
-msgstr "Bearbeitung der Liedtexte abbrechen?"
+msgstr "Bearbeitung der Texte abbrechen?"
 
 #: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
 msgid "Abort Editing"
@@ -211,7 +211,7 @@ msgstr "Führe Suche aus"
 
 #: context/songview.cpp:157
 msgid "Save updated lyrics?"
-msgstr "Speichern der aktualisieren Liedtexte?"
+msgstr "Speichern der aktualisieren Texte?"
 
 #: context/songview.cpp:157
 msgid "Save"
@@ -219,7 +219,7 @@ msgstr "Speichern"
 
 #: context/songview.cpp:170
 msgid "Failed to save lyrics."
-msgstr "Fehler beim Speichern des Liedtextes."
+msgstr "Fehler beim Speichern des Textes."
 
 #: context/songview.cpp:192
 msgid "Delete lyrics file?"
@@ -231,7 +231,7 @@ msgstr "Abbruch"
 
 #: context/songview.cpp:416
 msgid "Fetching lyrics via %1"
-msgstr "Empfange Liedtexte über %1"
+msgstr "Empfange Texte über %1"
 
 #: context/wikipediaengine.cpp:250
 msgid "Track listing"
@@ -545,12 +545,12 @@ msgstr "Speichere Cache"
 #: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
 #: tags/tageditor.cpp:142 tags/tageditor.cpp:330
 msgid "Apply \"Various Artists\" Workaround"
-msgstr "Hinzufügen des „Verschiedene Künstler“-Workarounds"
+msgstr "Hinzufügen der „Verschiedene Künstler Problembehebung"
 
 #: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
 #: tags/tageditor.cpp:143 tags/tageditor.cpp:375
 msgid "Revert \"Various Artists\" Workaround"
-msgstr "Zurücksetzen des „Verschiedene Künstler“-Workarounds"
+msgstr "Zurücksetzen der „Verschiedene Künstler“ Problembehebung"
 
 #: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
 #: tags/tageditor.cpp:145 tags/tageditor.cpp:456
@@ -560,7 +560,7 @@ msgstr "Großschrift"
 #: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
 #: tags/tageditor.cpp:146 tags/tageditor.cpp:485
 msgid "Adjust Track Numbers"
-msgstr "Anpassen der Stücknummern:"
+msgstr "Anpassen der Stücknummern"
 
 #: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
 msgid "Tools"
@@ -568,7 +568,7 @@ msgstr "Werkzeuge"
 
 #: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
 msgid "Apply \"Various Artists\" workaround?"
-msgstr "Hinzufügen des „Verschiedene Künstler“-Workarounds?"
+msgstr "Hinzufügen der „Verschiedene Künstler“ Problembehebung?"
 
 #: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
 msgid ""
@@ -580,7 +580,7 @@ msgstr ""
 
 #: devices/albumdetailsdialog.cpp:244 tags/tageditor.cpp:368
 msgid "Revert \"Various Artists\" workaround"
-msgstr "Zurücksetzen des „Verschiedene Künstler“-Workarounds?"
+msgstr "Zurücksetzen der „Verschiedene Künstler“ Problembehebung"
 
 #: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
 msgid ""
@@ -706,6 +706,10 @@ msgstr "%1 – %2 (%3)"
 msgid "Updating (%1)..."
 msgstr "Aktualisiere (%1)..."
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr "Aktualisiere (%1%)..."
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -771,14 +775,15 @@ msgid ""
 msgstr ""
 "<p>Wenn Sie dies aktiviert haben, wird Cantata einen Zwischenspeicher für die "
 "Musikbibliothek des Gerätes erstellen. Dies wird das Auslesen von "
-"nachfolgenden Biblotheksaufrufen beschleunigen (es wird der Zwischenspeicher "
-"verwendet an statt jeden Tag neu zu lesen.)<hr/><b>Beachten Sie:</b> Wenn Sie "
-"ein "
-"anderes Programm zum aktualisieren der Musikbibliothek benutzen wird der "
-"Zwischenspeicher ungültig. Um dies zu korrigieren, einfach auf den "
-"\"Aktualisieren\"-Symbol klicken in der Geräteliste. Dadurch wird die "
-"Zwischenspeicher-"
-"Datei entfernt und der Inhalt des Gerätes erneut eingelesen.</p>"
+"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
 msgid "Do not transcode"
@@ -836,9 +841,9 @@ msgid ""
 "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
 msgid "Partial"
@@ -914,7 +919,7 @@ msgid ""
 "<b>120kb/s</b> might be unsatisfactory for music and anything above <b>200kb/"
 "s</b> is probably overkill."
 msgstr ""
-"Die Bitrate ist eine Einheit für die Menge an Daten, um eine Sekunde des "
+"Die Bitrate ist eine Einheit für die Menge an Daten um eine Sekunde des "
 "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 "
@@ -1048,7 +1053,7 @@ msgstr ""
 
 #: devices/encoders.cpp:184
 msgid "Quality rating"
-msgstr "Qualitätswert"
+msgstr "Qualitätsbewertung"
 
 #: devices/encoders.cpp:205
 msgid "Apple Lossless"
@@ -1065,8 +1070,8 @@ msgid ""
 "FLAC."
 msgstr ""
 "<a href=http://de.wikipedia.org/wiki/Apple_Lossless>Apple Lossless </a> "
-"(ALAC) ist ein Audio-Codec für verlustfreie Komprimierung von digitaler "
-"Musik.<br>Empfohlen nur für Apple-Musik-Spieler und Spieler welche keine "
+"(ALAC) ist ein Audio-Codec für die verlustfreie Komprimierung digitaler "
+"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
@@ -1087,7 +1092,7 @@ msgstr ""
 "Audio Codec </a> (FLAC) ist ein offener und lizenzfreier Codec für "
 "verlustfreie Komprimierung von digitaler Musik. <br> Wenn Sie Ihre Musik "
 "ohne Kompromisse bei der Audioqualität speichern möchten, ist FLAC eine "
-"ausgezeichnete Wahl ist."
+"ausgezeichnete Wahl."
 
 #: devices/encoders.cpp:230
 msgid ""
@@ -1106,16 +1111,16 @@ msgstr ""
 "Der <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "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 "
+"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 genau das gleiche unabhängig von der Kompression.<br/>Levels "
-"über <b>5</b> erhöhen erheblich die Kompressionszeit, aber erstellen kaum "
-"kleinere Dateien."
+"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
 msgid "Compression level"
@@ -1141,8 +1146,8 @@ msgid ""
 msgstr ""
 "<a href=http://de.wikipedia.org/wiki/Windows_Media_Audio>Windows Media "
 "Audio</a> (WMA) ist ein proprietärer Codec von Microsoft für "
-"verlustbehaftete Audio-Kompression.<br>Empfohlen nur für tragbare Musik-"
-"Player welche nicht unterstützen Ogg Vorbis unterstützen."
+"verlustbehaftete Audiokompression.<br>Empfohlen nur für tragbare Geräte "
+"welche nicht Ogg Vorbis unterstützen."
 
 #: devices/encoders.cpp:268
 msgid ""
@@ -1160,13 +1165,13 @@ msgstr ""
 "Die Bitrate ist eine Einheit für die Menge an Daten um eine Sekunde des "
 "Stückes darzustellen.<br>Aufgrund der Einschränkungen des proprietären "
 "<b>WMA</b>-Formats und die Schwierigkeit eines Reverse-Engineerings des "
-"Encoders wird der WMA-Encoder welcher von Cantata benutzt wird <a "
+"Encoders wird der WMA-Encoder, welcher von Cantata benutzt wird <a "
 "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 Player.<br/>Alles unter <b>112kb/s</ b> könnte nicht "
-"zufriedenstellend sein alles über <b>182kb/s</b> ist wahrscheinlich "
+"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
@@ -1245,7 +1250,7 @@ msgstr "Aktualisiere..."
 #: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
 #: online/onlineservice.cpp:160
 msgid "Reading cache"
-msgstr "Lese Zwischenspeicher:"
+msgstr "Lese den Zwischenspeicher"
 
 #: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
 msgctxt "Message percent"
@@ -1462,8 +1467,8 @@ msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr ""
-"Sie müssen \"perl\"  auf ihrem System installieren, um den DynamicMode von "
-"Cantata zu benutzen."
+"Sie müssen \"perl\"  auf ihrem System installieren, um den dynamischen Modus "
+"von Cantata zu benutzen."
 
 #: dynamic/dynamic.cpp:390
 msgid "Failed to locate rules file - %1"
@@ -1569,7 +1574,7 @@ msgstr "Hinzufügen"
 
 #: dynamic/dynamicruledialog.cpp:191
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
-msgstr "<i><b>Fehler:</b> 'Von Jahr' muss weniger an 'Zu Jahr' sein</i>"
+msgstr "<i><b>FEHLER:</b> 'Von Jahr' muss kleiner als 'Zu Jahr' sein</i>"
 
 #: dynamic/dynamicruledialog.cpp:194
 msgid ""
@@ -1691,11 +1696,11 @@ msgid ""
 "cannot access it, or you have configured Cantata to not save these items "
 "there). Below is a summary of Cantata's cache usage."
 msgstr ""
-"Um die Geschwindigkeit der Medienbibliothek zu erhöhen, verwendet Cantata "
+"Um die Geschwindigkeit der Medienbibliothek zu erhöhen verwendet Cantata "
 "einen lokalen Zwischenspeicher. Cantata kann auch "
-"heruntergeladene Cover oder Liedtexte zwischenspeichern. Diese können nicht "
+"heruntergeladene Cover oder Texte zwischenspeichern. Diese können nicht "
 "im MPD-Ordner gespeichert werden. Unten sehen Sie eine Zusammenstellung des "
-"Cantata-Zwischenspeichers."
+"Cantata Zwischenspeichers."
 
 #: gui/cachesettings.cpp:239
 msgid "Covers"
@@ -1956,8 +1961,8 @@ 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 © 2011–2013 Craig Drummond"
+msgid "Copyright (c) 2011-2013 Craig Drummond"
+msgstr "Alle Rechte (c) 2011–2013 Craig Drummond"
 
 #: gui/main.cpp:158
 msgid "Craig Drummond"
@@ -2247,8 +2252,8 @@ msgstr "&Hilfe"
 #: gui/mainwindow.cpp:980
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
-"Keine Stücke gefunden, welche auf die dynamischen Regeln der Wiedergabeliste "
-"zutreffen."
+"Keine Stücke gefunden, welche auf den dynamischen Regeln der Wiedergabeliste "
+"entsprechen."
 
 #: gui/mainwindow.cpp:1101 mpd/mpdconnection.cpp:356
 msgid "Connecting to %1"
@@ -2266,16 +2271,16 @@ msgid ""
 "<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/>© Craig Drummond 2011–2013."
+"<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>"
 
 #: gui/mainwindow.cpp:1464
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
 "QtMPC Authors<br/>"
 msgstr ""
-"Basierend auf <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> – © 2007–2010 "
+"Basierend auf <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> – (c) 2007–2010 "
 "Die "
 "QtMPC Authoren<br/>"
 
@@ -2628,12 +2633,12 @@ msgid ""
 "relevant host - Cantata itself cannot control the starting/stopping of this "
 "service.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> 'Dynamizer port' ist nur relevant, wenn Sie "
-"'dynamische "
-"Playlisten' benutzen wollen. Um die  <code>cantata-dynamic</code>-Funktion "
-"zu benutzen <b>muss</b> diese bereits auf der relevanten MPD-Instanz "
-"installiert und gestartet sein. Cantata kann diesen Dienst nicht von sich "
-"aus starten oder stoppen.</i>"
+"<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>"
 
 #: gui/serversettings.cpp:100
 msgid ""
@@ -2645,13 +2650,14 @@ msgid ""
 "then Cantata will use a per-user instance of the dynamizer to facilitate "
 "dynamic playlists.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> 'Dynamizer port' ist nur relevant, wenn Sie "
-"'dynamische "
-"Wiedergabelisten' systemweit oder nicht lokal benutzen wollen. Um die  "
-"<code>cantata-dynamic</code>-Funktion zu benutzen, <b>muss</b> diese bereits "
-"auf der relevanten MPD-Instanz installiert und gestartet sein. Cantata kann "
-"diesen Dienst nicht von sich aus starten oder stoppen. Ist dies nicht "
-"gesetzt, wird Cantata eine Benutzerinstanz für den Dynamizer benutzen.</i>"
+"<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
 msgid ""
@@ -3297,14 +3303,15 @@ msgid ""
 "there may be parsing errors. You will also need to remove any currently "
 "cached articles (using the 'Cache' page).</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Cantata zeigt nicht die volle Wikipedia-Seiten (mit "
-"Bildern,"
-"Links uws.), sondern es zeigt eine abgespeckte Version. Das Trimmen ist nicht"
-"immer 100% genau, daher wird standardmäßig Cantata nur die grundlegende"
-"Einführung zu jedem Artikel anzeigen. Wenn Sie sich dafür entscheiden, "
-"den ganzen Artikel zeigen, dann"
-"kann es zu Verarbeitungsfehlern kommen. Der Zwischengespeicher für Artikel "
-"müssten geleert werden (über die „Zwischengespeicher“-Seite).<i>"
+"<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)
@@ -3479,7 +3486,7 @@ msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Diese Einstellungen sind nur gültig, wenn das Gerät "
+"<i><b>Hinweis:</b> Diese Einstellungen sind nur gültig, wenn das Gerät "
 "verbunden ist.</i>"
 
 #. i18n: file: devices/devicepropertieswidget.ui:35
@@ -3523,7 +3530,7 @@ msgstr "Maximale Größe des Albumcovers:"
 #. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
 #: po/rc.cpp:121 rc.cpp:121
 msgid "'Various Artists' workaround:"
-msgstr "Verschiedene Künstler:"
+msgstr "Verschiedene Künstler Problembehebung:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:95
 #. i18n: ectx: property (text), widget (BuddyLabel, autoScanLabel)
@@ -3688,7 +3695,7 @@ msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Diese Einstellungen sind nur gültig, wenn das Gerät "
+"<i><b>Hinweis:</b> Diese Einstellungen sind nur gültig, wenn das Gerät "
 "nicht "
 "verbunden ist.</i>"
 
@@ -3806,7 +3813,7 @@ msgid ""
 "<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>Beachten Sie:</b> Wenn Sie hier ein Kennwort eingeben, wird es <b>"
+"<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 '-'<"
@@ -3844,7 +3851,7 @@ msgid ""
 "application (ksshaskpass, ssh-askpass-gnome, etc.) will be required to enter "
 "the password.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Aufgrund der Art wie sshfs arbeitet, benötigen Sie "
+"<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>"
@@ -3858,7 +3865,7 @@ msgid ""
 "attached via USB, Cantata will automatically display the device when it is "
 "attached.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Dieser Dialog wird nur verwendet, um entfernte (z. B. "
+"<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 "
@@ -3966,7 +3973,7 @@ msgstr "Künstler ähnlich zu:"
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Nur Werte für Tags angeben, welche auch gesucht "
+"<i><b>Hinweis:</b> Nur Werte für Tags angeben, welche auch gesucht "
 "werden.</i>"
 
 #. i18n: file: dynamic/dynamicrule.ui:249
@@ -3976,7 +3983,7 @@ 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>Beachten Sie:</b> Für Genre nach dem letzten Buchstaben ein * findet "
+"<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>"
 
@@ -4068,7 +4075,7 @@ msgid ""
 "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>Beachten Sie:</b> Wenn Sie den Speicherort der Streams ändern (z. B. "
+"<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 "
@@ -4222,9 +4229,9 @@ msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Die Musikverzeichnis-Einstellungen dienen der Suche "
+"<i><b>Hinweis:</b> Die Musikverzeichnis-Einstellungen dienen der Suche "
 "nach "
-"Covern, Liedtexten usw.</i>"
+"Covern, Texten usw.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:521
 #. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
@@ -4239,7 +4246,7 @@ 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>Beachten Sie:</b>Wenn Sie einen lokalen Domain-Socket benutzen, müssen "
+"<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>"
 
@@ -4259,7 +4266,7 @@ msgstr "Bitte wählen Sie den Ordner mit ihrem Musikverzeichnis."
 #. i18n: ectx: property (text), widget (QLabel, label_6f)
 #: po/rc.cpp:425 rc.cpp:425
 msgid "Covers, Lyrics, and Streams"
-msgstr "Cover, Liedtexte und Streams"
+msgstr "Cover, Texte und Streams"
 
 #. i18n: file: gui/initialsettingswizard.ui:686
 #. i18n: ectx: property (text), widget (QLabel, label_5f)
@@ -4271,7 +4278,7 @@ msgid ""
 "confirm whether you wish Cantata to store the relevant files within the "
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
-"<p>Cantata wird fehlende Cover und Liedtexte aus dem Internet herunterladen. "
+"<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>"
@@ -4284,17 +4291,15 @@ msgid ""
 "currently cannot upload files to external HTTP servers. Therefore, the above "
 "settings should be left disabled.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Das Musikverzeichnis ist auf eine  HTTP-Adresse "
-"gesetzt "
-"und "
-"Cantata kann aktuell keine Dateien hochladen. Die obrigen Einstellungen "
-"sollten deaktiviert werden.</i>"
+"<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>"
 
 #. i18n: file: gui/initialsettingswizard.ui:841
 #. i18n: ectx: property (text), widget (QLabel, label_6)
 #: po/rc.cpp:446 rc.cpp:446
 msgid "Finished!"
-msgstr "Fertig."
+msgstr "Fertig!"
 
 #. i18n: file: gui/initialsettingswizard.ui:864
 #. i18n: ectx: property (text), widget (QLabel, label_5)
@@ -4319,7 +4324,7 @@ msgid ""
 "effect."
 msgstr ""
 "<b>Achtung:</b> Sie sind aktuell nicht Mitglied der 'users'-Gruppe. Cantata "
-"wird besser funktionieren (Albencover speichern, Liedtexte usw. mit den "
+"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."
@@ -4380,7 +4385,7 @@ msgid ""
 "displayed, it will be cropped (either top/bottom, or left/right) to provide "
 "a square image.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Wenn nach Künstlerbildern gesucht wird, schaut "
+"<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 "
@@ -4447,7 +4452,7 @@ msgstr "Stil der Streamansicht:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
 #: po/rc.cpp:513 rc.cpp:513
 msgid "Online view style:"
-msgstr "Online-Ansicht"
+msgstr "Stil der Onlineansicht"
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
@@ -4495,7 +4500,7 @@ msgstr "Zeige Icon in der Systemleiste:"
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
 #: po/rc.cpp:549 rc.cpp:549
 msgid "Minimize to notification area when closed:"
-msgstr "In die Systemleiste minimieren:"
+msgstr "Beim Schließen in die Systemleiste minimieren:"
 
 #. i18n: file: gui/interfacesettings.ui:444
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
@@ -4546,7 +4551,7 @@ 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>Beachten Sie:</b> Änderung von 'Erzwinge Einzelklick'-Einstellung "
+"<i><b>Hinweis:</b> Änderung von 'Erzwinge Einzelklick'-Einstellung "
 "benötigt "
 "einen Neustart von Cantata.</i>"
 
@@ -4611,7 +4616,7 @@ 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>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Ausgabe des HTTP-Streams wird nur benutzt, wenn MPD "
+"<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>"
@@ -4648,7 +4653,7 @@ msgid ""
 "shown allowing you to choose whether to stop playback now, or after the "
 "current track.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Wenn Sie die Stopp-Schaltfläche gedrückt halten, "
+"<i><b>Hinweis:</b> Wenn Sie die Stopp-Schaltfläche gedrückt halten, "
 "öffnet "
 "sich ein Menü für verschiedene Aktionen.</i>"
 
@@ -4686,7 +4691,7 @@ msgid ""
 "folders), then Cantata will save any downloaded covers into the respective "
 "album folder.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> Das Musikverzeichnis wird zur Coversuche benötigt "
+"<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 "
@@ -4700,7 +4705,7 @@ msgid ""
 "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>Beachten Sie:</b> Wenn sie die Einstellung zum Musikverzeichnis ändern, "
+"<i><b>Hinweis:</b> Wenn sie die Einstellung zum Musikverzeichnis ändern, "
 "muss "
 "die Musikbibliothek manuell aktualisiert werden. Dies kann über die "
 "Schaltfläche 'Aktualisiere Datenbank'  ausgeführt werden.</i>"
@@ -4712,7 +4717,7 @@ 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>Beachten Sie:</b> Wenn keine Einstellung zum Covernamen angegeben sind, "
+"<i><b>Hinweis:</b> Wenn keine Einstellung zum Covernamen angegeben sind, "
 "wird "
 "Cantata den voreingestellten Namen <code>cover</code> nehmen.</i>"
 
@@ -4739,12 +4744,12 @@ msgid ""
 "<b>NOTE:</b> If you choose 'Local loopback' for 'Network interface', then "
 "MPD <b>must</b> also be on this computer.</i>"
 msgstr ""
-"<i><b>Beachten Sie:</b> MPD spielt normal nur Stücke welche in seinem "
+"<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"
-"<b>Beachten Sie:</b> Wenn Sie  'Local loopback' für die  'Netzwerkkarte', "
+"<b>Hinweis:</b> Wenn Sie  'Local loopback' für die  'Netzwerkkarte', "
 "eingestellt "
 "haben <b>muss</b> sich MPD auf dem gleichen Computer befinden.</i>"
 
@@ -4810,7 +4815,7 @@ msgstr "Logge ein"
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
 #: po/rc.cpp:724 rc.cpp:724
 msgid "Session expiry:"
-msgstr "Sitzung abgelaufen"
+msgstr "Sitzung abgelaufen:"
 
 #. i18n: file: support/shortcutssettingspage.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
@@ -4892,7 +4897,7 @@ msgstr "Zeige nicht getaggte Stücke"
 
 #: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
 msgid "Remove From List"
-msgstr "Von Liste entfernen?"
+msgstr "Von Liste entfernen"
 
 #: replaygain/rgdialog.cpp:140
 #, fuzzy
@@ -4939,7 +4944,7 @@ 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>Beachten Sie: Alle Stücke besitzen "
+"Suche in <b>allen</b> Stücken?<br><br><i>Hinweis: Alle Stücke besitzen "
 "einen "
 "ReplayGain-Tag. </i>"
 
@@ -5145,7 +5150,7 @@ msgid "<b>NOT</b> logged into Digitally Imported"
 msgstr "<b>NICHT</b> eingeloggt bei Digitally Imported"
 
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr "&OK"
 
 #: support/dialog.cpp:90
@@ -5331,12 +5336,14 @@ msgstr "(Verschiedene)"
 #: tags/tageditor.cpp:325
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
-"Hinzufügen des „Verschiedene Künstler“-Workarounds bei <b>allen</b> Stücken?"
+"Hinzufügen der „Verschiedene Künstler“ Problembehebung bei <b>allen</b> "
+"Stücken?"
 
 #: tags/tageditor.cpp:367
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
-"Zurücksetzen des „Verschiedene Künstler“-Workarounds bei <b>allen</b> Stücken?"
+"Zurücksetzen der „Verschiedene Künstler“ Problembehebung bei <b>allen</b> "
+"Stücken?"
 
 #: tags/tageditor.cpp:417
 msgid ""
@@ -5378,7 +5385,7 @@ msgstr "%1 [geändert]"
 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?"
+"Möchten Sie Ihre Song Dateien so umbenennen, dass Sie zu Ihren Tags passen?"
 
 #: tags/tageditor.cpp:759
 msgid "Rename Files"
@@ -5700,7 +5707,7 @@ msgstr "%1 Regeln"
 #~ "active interface.<br/><br/><b>NOTE:</b> Leave port set to 'Dynamic' to "
 #~ "have Cantata choose a random port number.</i>"
 #~ msgstr ""
-#~ "<i><b>Beachten Sie:</b> MPD spielt normal nur Dateien welche auch in den "
+#~ "<i><b>Hinweis:</b> MPD spielt normal nur Dateien welche auch in den "
 #~ "konfigurierten Ordnern abgelegt sind. Wenn Sie MPD via a lokalen Socket "
 #~ "verbunden haben, können Sie auch Dateien ihres Dateisystems abspielen. "
 #~ "Wenn Sie nicht via lokalen Socket (z.B. haben Sie einen Hostnamen oder "
diff --git a/po/en_GB.po b/po/en_GB.po
index cd06472..852a90e 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -1,58 +1,56 @@
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
-#
 # Craig Drummond <craig.p.drummond at gmail.com>, 2013.
-# Markus Slopianka <kamikazow at web.de>, 2013.
+#
 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-09-15 02:01+0200\n"
-"Last-Translator: Markus Slopianka <kamikazow at web.de>\n"
-"Language-Team: British English\n"
+"POT-Creation-Date: 2013-11-14 20:26+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"
 "Language: en_GB\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
 
 #: context/albumview.cpp:63
 msgid "Refresh Album Information"
 msgstr ""
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
 msgid "Album Information"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:143
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
 msgid "Tracks"
 msgstr ""
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 msgid "Refresh Artist Information"
 msgstr ""
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 context/contextwidget.cpp:306
+#: gui/cachesettings.cpp:260
 msgid "Artist Information"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:137
 #. 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:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
 msgid "Albums"
 msgstr ""
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:333
 msgid "Web Links"
 msgstr ""
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:419
 msgid "Similar Artists"
 msgstr ""
 
@@ -64,8 +62,8 @@ msgstr ""
 msgid "Wikipedia Languages"
 msgstr ""
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
-#: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
 msgid "Other"
 msgstr ""
 
@@ -73,12 +71,12 @@ msgstr ""
 msgid "Reset Spacing"
 msgstr ""
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
 msgid "Lyrics"
 msgstr ""
 
-#: context/lastfmengine.cpp:65
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr ""
 
@@ -93,20 +91,20 @@ msgid ""
 "original song title and artist as displayed in Cantata."
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:47
+#. i18n: file: devices/albumdetails.ui:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
+#: rc.cpp:61 rc.cpp:304 rc.cpp:789
 msgid "Title:"
 msgstr ""
 
@@ -114,16 +112,16 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
+#: rc.cpp:55 rc.cpp:292 rc.cpp:792
 msgid "Artist:"
 msgstr ""
 
@@ -131,111 +129,112 @@ msgstr ""
 msgid "Search For Lyrics"
 msgstr ""
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr ""
 
-#: context/lyricsettings.cpp:46
+#: context/lyricsettings.cpp:66
 msgid "(Polish Translations)"
 msgstr ""
 
-#: context/lyricsettings.cpp:47
+#: context/lyricsettings.cpp:67
 msgid "(Portuguese Translations)"
 msgstr ""
 
-#: context/songview.cpp:74
+#: context/songview.cpp:89
 msgid "Refresh Lyrics"
 msgstr ""
 
-#: context/songview.cpp:75
+#: context/songview.cpp:90
 msgid "Edit Lyrics"
 msgstr ""
 
-#: context/songview.cpp:76
+#: context/songview.cpp:91
 msgid "Save Lyrics"
 msgstr ""
 
-#: context/songview.cpp:77
+#: context/songview.cpp:92
 msgid "Cancel Editing Lyrics"
 msgstr ""
 
-#: context/songview.cpp:78
+#: context/songview.cpp:93
 msgid "Delete Lyrics File"
 msgstr ""
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort editing of lyrics?"
 msgstr ""
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort Editing"
 msgstr ""
 
-#: 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: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
 msgid "Abort"
 msgstr ""
 
-#: context/songview.cpp:106
+#: context/songview.cpp:121
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr ""
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:121 context/songview.cpp:122
+#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
 msgid "Re-download"
 msgstr ""
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Current playing song has changed, still perform search?"
 msgstr ""
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Song Changed"
 msgstr ""
 
-#: context/songview.cpp:133
+#: context/songview.cpp:148
 msgid "Perform Search"
 msgstr ""
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save updated lyrics?"
 msgstr ""
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save"
 msgstr ""
 
-#: context/songview.cpp:170
+#: context/songview.cpp:185
 msgid "Failed to save lyrics."
 msgstr ""
 
-#: context/songview.cpp:192
+#: context/songview.cpp:207
 msgid "Delete lyrics file?"
 msgstr ""
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
+#: context/songview.cpp:207 gui/mainwindow.cpp:292
+#: widgets/messageoverlay.cpp:43
 msgid "Cancel"
 msgstr ""
 
-#: context/songview.cpp:416
+#: context/songview.cpp:431
 msgid "Fetching lyrics via %1"
 msgstr ""
 
-#: context/wikipediaengine.cpp:250
+#: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr ""
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr ""
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr ""
 
-#: 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 ""
@@ -245,47 +244,52 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr ""
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:99
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr ""
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
+#: online/podcastsearchdialog.cpp:393
 msgid "Reload"
 msgstr ""
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr ""
+
+#: devices/actiondialog.cpp:76
 msgid "Songs To Be Copied"
 msgstr ""
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:146
 msgid "<b>INVALID</b>"
 msgstr ""
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
 msgid "<i>(When different)</i>"
 msgstr ""
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr ""
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
+#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
 #: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
 msgid "%1 free"
 msgstr ""
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
 msgid "Local Music Library"
 msgstr ""
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
+#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
 msgid "Audio CD"
 msgstr ""
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:293
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -293,261 +297,259 @@ msgid ""
 "successfully copied."
 msgstr ""
 
-#: devices/actiondialog.cpp:285
+#: devices/actiondialog.cpp:300
 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:334
+#: devices/actiondialog.cpp:349
 msgid "Copy Songs"
 msgstr ""
 
-#: 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:349 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr ""
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:380
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr ""
 
-#: devices/actiondialog.cpp:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
 msgid "Not Configured"
 msgstr ""
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
 msgid "Use Defaults"
 msgstr ""
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:384
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr ""
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:446
 msgid "Are you sure you wish to stop?"
 msgstr ""
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr ""
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
+#: tags/trackorganiser.cpp:446
 msgid "Device has been removed!"
 msgstr ""
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:491
 msgid "Device is not connected!"
 msgstr ""
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
+#: tags/trackorganiser.cpp:456
 msgid "Device is busy?"
 msgstr ""
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr ""
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:562
 msgid "Clearing unused folders"
 msgstr ""
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr ""
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "ReplyGain"
 msgstr ""
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:578
 msgid "Calculate"
 msgstr ""
 
-#: devices/actiondialog.cpp:618
+#: devices/actiondialog.cpp:634
 msgid "The destination filename already exists!<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:621
+#: devices/actiondialog.cpp:637
 msgid "Song already exists!<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:624
+#: devices/actiondialog.cpp:640
 msgid "Song does not exist!<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:643
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
 "permissions.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:630
+#: devices/actiondialog.cpp:646
 msgid "Source file no longer exists?<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:633
+#: devices/actiondialog.cpp:649
 msgid "Failed to copy.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:634
+#: devices/actiondialog.cpp:650
 msgid "Failed to delete.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:637
+#: devices/actiondialog.cpp:653
 msgid "Not connected to device.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:640
+#: devices/actiondialog.cpp:656
 msgid "Selected codec is not available.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:659
 msgid "Transcoding failed.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:646
+#: devices/actiondialog.cpp:662
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
 "devices.)<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:649
+#: devices/actiondialog.cpp:665
 msgid "Failed to read source file.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:652
+#: devices/actiondialog.cpp:668
 msgid "Failed to write to destination file.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:655
+#: devices/actiondialog.cpp:671
 msgid "No space left on device.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:658
+#: devices/actiondialog.cpp:674
 msgid "Failed to update metadata.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr ""
-
-#: devices/actiondialog.cpp:664
+#: devices/actiondialog.cpp:677
 msgid "Failed to download track.<br/><br/<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:667
+#: devices/actiondialog.cpp:680
 msgid "Failed to lock device.<hr/>%1"
 msgstr ""
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:709
 msgid "Local Music Library Properties"
 msgstr ""
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
+#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
 msgid "<b>Error</b><br/>"
 msgstr ""
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Skip"
 msgstr ""
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Auto Skip"
 msgstr ""
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:759
 msgid "Retry"
 msgstr ""
 
-#: devices/actiondialog.cpp:761
+#: 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 ""
 
-#: devices/actiondialog.cpp:768
+#: 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 ""
 
-#: devices/actiondialog.cpp:773
+#: devices/actiondialog.cpp:786
 msgid "<tr><td align=\"right\">File:</td><td>%1</td></tr>"
 msgstr ""
 
-#: devices/actiondialog.cpp:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
 msgid "Calculating..."
 msgstr ""
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:799
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr ""
 
-#: devices/actiondialog.cpp:789
+#: devices/actiondialog.cpp:802
 msgid ""
 "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
 "i></tr>"
 msgstr ""
 
-#: devices/actiondialog.cpp:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
+#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
 msgid "Apply \"Various Artists\" Workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
+#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
 msgid "Revert \"Various Artists\" Workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
+#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
 msgid "Capitalize"
 msgstr "Capitalise"
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
 msgid "Adjust Track Numbers"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
 msgid "Tools"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
 msgid "Apply \"Various Artists\" workaround?"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
 msgid "Revert \"Various Artists\" workaround"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
 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' "
@@ -556,37 +558,37 @@ msgid ""
 "will be set to \"Wobble\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
 msgid "Revert"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
 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:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
 msgid "Adjust track number by:"
 msgstr ""
 
-#: 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
+#: 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:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr ""
 
-#: 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:353 gui/mainwindow.cpp:2199
+#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
+#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] ""
@@ -604,24 +606,24 @@ msgstr ""
 msgid "Data Track"
 msgstr ""
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr ""
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
 #: devices/musicbrainz.cpp:217
 msgid "Track %1"
 msgstr ""
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr ""
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr ""
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr ""
 
@@ -629,19 +631,19 @@ msgstr ""
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:157
+#. i18n: file: devices/albumdetails.ui:170
 #. 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:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
+#: rc.cpp:82
 msgid "Artist"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:175
 #. 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:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
+#: rc.cpp:85
 msgid "Title"
 msgstr ""
 
@@ -659,10 +661,14 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr ""
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr ""
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr ""
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -751,70 +757,70 @@ msgstr ""
 msgid "Add Device"
 msgstr ""
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
 msgstr ""
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455
 msgid "Refresh"
 msgstr ""
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr ""
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr ""
 
-#: 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 ""
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr ""
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr ""
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
 msgstr ""
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr ""
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr ""
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr ""
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr ""
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr ""
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
 msgid "Please close other dialogs first."
 msgstr ""
 
-#: devices/encoders.cpp:78
+#: devices/encoders.cpp:77
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -825,7 +831,7 @@ msgid ""
 "a reasonable choice for the iPod and some other portable music players."
 msgstr ""
 
-#: devices/encoders.cpp:83
+#: devices/encoders.cpp:82
 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 "
@@ -843,21 +849,21 @@ msgid ""
 "s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:101 devices/encoders.cpp:141
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr ""
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
+#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
 msgid "Smaller file"
 msgstr ""
 
-#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:329
 msgid "Better sound quality"
 msgstr ""
 
-#: devices/encoders.cpp:120
+#: devices/encoders.cpp:119
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -868,7 +874,7 @@ msgid ""
 "and is widely supported on portable music players."
 msgstr ""
 
-#: devices/encoders.cpp:124
+#: devices/encoders.cpp:123
 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 "
@@ -884,11 +890,11 @@ msgid ""
 "anything above <b>205kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:156 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr ""
 
-#: devices/encoders.cpp:159
+#: devices/encoders.cpp:158
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -899,7 +905,7 @@ msgid ""
 "excellent choice, especially for portable music players that support it."
 msgstr ""
 
-#: devices/encoders.cpp:164
+#: devices/encoders.cpp:163
 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 "
@@ -918,15 +924,48 @@ msgid ""
 "anything above <b>8</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:184
+#: devices/encoders.cpp:183
 msgid "Quality rating"
 msgstr ""
 
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr ""
+
+#: devices/encoders.cpp:203
+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:205
+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 ""
+
+#: devices/encoders.cpp:222 devices/encoders.cpp:319
+msgid "Bitrate"
+msgstr ""
+
+#: devices/encoders.cpp:241
 msgid "Apple Lossless"
 msgstr ""
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:244
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -937,11 +976,11 @@ msgid ""
 "FLAC."
 msgstr ""
 
-#: devices/encoders.cpp:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr ""
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:262
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -952,7 +991,7 @@ msgid ""
 "compromising on audio quality, FLAC is an excellent choice."
 msgstr ""
 
-#: devices/encoders.cpp:230
+#: devices/encoders.cpp:266
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -967,19 +1006,19 @@ msgid ""
 "file, and are not recommended."
 msgstr ""
 
-#: devices/encoders.cpp:245
+#: devices/encoders.cpp:281
 msgid "Compression level"
 msgstr ""
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:291
 msgid "Faster compression"
 msgstr ""
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:298
 msgid "Windows Media Audio"
 msgstr ""
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:301
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -990,7 +1029,7 @@ msgid ""
 "not support Ogg Vorbis."
 msgstr ""
 
-#: devices/encoders.cpp:268
+#: devices/encoders.cpp:305
 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> "
@@ -1004,69 +1043,112 @@ msgid ""
 "probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:282
-msgid "Bitrate"
-msgstr ""
-
 #: devices/filenameschemedialog.cpp:33
 msgid "Filename Scheme"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:52
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:53
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr ""
+
+#: devices/filenameschemedialog.cpp:55
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:56
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:57
 msgctxt "Example genre"
 msgid "Dance"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:99
+#: devices/filenameschemedialog.cpp:101
 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 ""
-
-#: devices/fsdevice.cpp:678
+"for each track name.</p>"
+msgstr ""
+
+#: devices/filenameschemedialog.cpp:103
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</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
 msgid "Updating..."
 msgstr ""
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr ""
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr ""
@@ -1100,16 +1182,15 @@ msgstr ""
 msgid "Updating tracks..."
 msgstr ""
 
-#: 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
+#: 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:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
+#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
+#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
 #: models/devicesmodel.cpp:140
 msgid "Not Connected"
 msgstr ""
@@ -1126,7 +1207,7 @@ msgstr ""
 msgid "Connection"
 msgstr ""
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
 msgid "Music Library"
 msgstr ""
 
@@ -1211,8 +1292,8 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:30
 #. 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:53 gui/stdactions.cpp:92
+#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
 msgid "Search"
 msgstr ""
 
@@ -1256,91 +1337,91 @@ msgstr ""
 msgid " (recommended)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:208
 msgid "Start Dynamic Playlist"
 msgstr ""
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:209
 msgid "Stop Dynamic Mode"
 msgstr ""
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:257
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] ""
 msgstr[1] ""
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:396
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr ""
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:403
 msgid "Failed to locate rules file - %1"
 msgstr ""
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:411
 msgid "Failed to remove previous rules file - %1"
 msgstr ""
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:416
 msgid "Failed to install rules file - %1 -> %2"
 msgstr ""
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:729
 msgid "Dynamizer has been terminated."
 msgstr "Dynamiser has been terminated."
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:816
 msgid "Uknown"
 msgstr ""
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:818
 msgid "Loading list of rules"
 msgstr ""
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:819
 msgid "Saving rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:820
 msgid "Deleting rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:821
 msgid "Setting active rule"
 msgstr ""
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:822
 msgid "Stopping dynamizer"
 msgstr "Stopping dynamiser"
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:823
 msgid "Requesting ID details"
 msgstr ""
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:826
 msgid "Awaiting response for previous command. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:981
 msgid "Dynamizer is not active"
 msgstr "Dynamiser is not active"
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:989
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1020
 msgid "Failed to delete rules file. (%1)"
 msgstr ""
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Failed to control dynamiser state. (%1)"
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1036
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr ""
 
@@ -1372,15 +1453,15 @@ msgstr ""
 
 #. 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:136 po/rc.cpp:280 rc.cpp:280
 msgid "Add"
 msgstr ""
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:202
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr ""
 
-#: dynamic/dynamicruledialog.cpp:194
+#: dynamic/dynamicruledialog.cpp:205
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1394,45 +1475,51 @@ msgstr ""
 msgid "AlbumArtist"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr ""
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
 msgid "Album"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. 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:106
+#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
 msgid "Genre"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
 "of <i>Include</i> rules will be used to build a set of songs that can be "
@@ -1448,41 +1535,45 @@ msgid ""
 "to keep the play queue filled with 10 entries.</p>"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 msgid "Overwrite Rules"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr ""
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:168
 msgid "Deleting..."
 msgstr ""
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Name"
 msgstr ""
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Item Count"
 msgstr ""
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Space Used"
 msgstr ""
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr ""
+
+#: gui/cachesettings.cpp:245
 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 "
@@ -1491,48 +1582,53 @@ msgid ""
 "there). Below is a summary of Cantata's cache usage."
 msgstr ""
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:257
 msgid "Covers"
 msgstr ""
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:258
 msgid "Backdrops"
 msgstr ""
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
+#: 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:246
+#: gui/cachesettings.cpp:264
 msgid "Jamendo"
 msgstr ""
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:265
 msgid "Magnatune"
 msgstr ""
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr ""
+
+#: gui/cachesettings.cpp:273
 msgid "Delete All"
 msgstr ""
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:312
 msgid "Delete all '%1' items?"
 msgstr ""
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
 msgid "Delete Cache Items"
 msgstr ""
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:322
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr ""
 
-#: gui/coverdialog.cpp:150 gui/main.cpp:169
+#: gui/coverdialog.cpp:151 gui/main.cpp:231
 msgid "Last.fm"
 msgstr ""
 
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:165
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1541,7 +1637,7 @@ msgid ""
 "%2 x %3 (%4)"
 msgstr ""
 
-#: gui/coverdialog.cpp:183
+#: gui/coverdialog.cpp:184
 msgctxt ""
 "Google\n"
 "width x height (file size)"
@@ -1550,7 +1646,7 @@ msgid ""
 "%1 x %2 (%3)"
 msgstr ""
 
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:204
 msgctxt ""
 "Discogs\n"
 "width x height"
@@ -1559,7 +1655,7 @@ msgid ""
 "%1 x %2"
 msgstr ""
 
-#: gui/coverdialog.cpp:237
+#: gui/coverdialog.cpp:238
 msgctxt ""
 "Current Cover\n"
 "width x height"
@@ -1568,86 +1664,93 @@ msgid ""
 "%1 x %2"
 msgstr ""
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:256
 msgid "Image"
 msgstr ""
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:259
 msgid "Downloading..."
 msgstr ""
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr ""
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:432
 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:432
+#: gui/coverdialog.cpp:433
 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:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
+#: gui/coverdialog.cpp:440 models/albumsmodel.cpp:267
+#: models/musicmodel.cpp:234
 msgctxt "Album by Artist"
 msgid "%1 by %2"
 msgstr ""
 
-#: gui/coverdialog.cpp:613
+#: gui/coverdialog.cpp:579
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
 msgstr ""
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:607
 msgid "Failed to download image!"
 msgstr ""
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
 msgid "Load Local Cover"
 msgstr ""
 
-#: gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:795
 msgid "Images (*.png *.jpg)"
 msgstr ""
 
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:800
 msgid "File is already in list!"
 msgstr ""
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:804
 msgid "Failed to read image!"
 msgstr ""
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:817
 msgid "Display"
 msgstr ""
 
 #. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
 msgid "Remove"
 msgstr ""
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1181
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
 msgstr ""
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1190
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
 msgstr ""
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1239
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1657,375 +1760,390 @@ msgstr ""
 msgid "Open In File Manager"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Established"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Failed"
 msgstr ""
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. 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
+#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
+#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
 msgid "None"
 msgstr ""
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:40
 msgid "Small"
 msgstr ""
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:41
 msgid "Medium"
 msgstr ""
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:42
 msgid "Large"
 msgstr ""
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:43
 msgid "Extra Large"
 msgstr ""
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:48
 msgid "Simple Tree"
 msgstr ""
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:49
 msgid "Detailed Tree"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:329
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
 msgid "Grouped Albums"
 msgstr ""
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:53
 msgid "List"
 msgstr ""
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:55
 msgid "Icon/List"
 msgstr ""
 
-#: gui/interfacesettings.cpp:85
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+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)
+#: 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
+msgid "Style:"
+msgstr ""
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr ""
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr ""
+
+#: gui/interfacesettings.cpp:178
 msgid "Grouped by 'Album Artist'"
 msgstr ""
 
-#: gui/interfacesettings.cpp:86
+#: gui/interfacesettings.cpp:179
 msgid "Grouped under 'Various Artists'"
 msgstr ""
 
-#: 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/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
 msgid "Cantata"
 msgstr ""
 
-#: gui/main.cpp:152
+#: gui/main.cpp:214
 msgid "A KDE client for MPD"
 msgstr ""
 
-#: gui/main.cpp:154
-msgid "Copyright (C) 2011-2013 Craig Drummond"
+#: gui/main.cpp:216
+msgid "Copyright (c) 2011–2013 Craig Drummond"
 msgstr ""
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Craig Drummond"
 msgstr ""
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Maintainer"
 msgstr ""
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "Piotr Wicijowski"
 msgstr ""
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "UI Improvements"
 msgstr ""
 
-#: gui/main.cpp:160
+#: gui/main.cpp:222
 msgid "Sander Knopper"
 msgstr ""
 
-#: gui/main.cpp:160 gui/main.cpp:161 gui/main.cpp:162 gui/main.cpp:163
+#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
 msgid "QtMPC author"
 msgstr ""
 
-#: gui/main.cpp:161
+#: gui/main.cpp:223
 msgid "Roeland Douma"
 msgstr ""
 
-#: gui/main.cpp:162
+#: gui/main.cpp:224
 msgid "Daniel Selinger"
 msgstr ""
 
-#: gui/main.cpp:163
+#: gui/main.cpp:225
 msgid "Armin Walland"
 msgstr ""
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid "FanArt.tv"
 msgstr ""
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
 
-#: gui/main.cpp:168
+#: gui/main.cpp:230
 msgid "Wikipedia"
 msgstr ""
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:230 gui/main.cpp:231
 msgid "Context view metadata"
 msgstr ""
 
-#: gui/main.cpp:173
+#: gui/main.cpp:235
 msgid "URL to open"
 msgstr ""
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:238
 msgid "Quit"
 msgstr ""
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:242
 msgid "Show Window"
 msgstr ""
 
-#. 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:245 po/rc.cpp:418 rc.cpp:418
 msgid "Connect"
 msgstr ""
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
 msgid "Collection"
 msgstr ""
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:247
 msgid "Outputs"
 msgstr ""
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr ""
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr ""
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr ""
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr ""
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr ""
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr ""
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr ""
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr ""
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:249
 msgid "Add To Stored Playlist"
 msgstr ""
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:250
 msgid "Remove From Play Queue"
 msgstr ""
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:251
 msgid "Copy Track Info"
 msgstr ""
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:252
 msgid "Crop"
 msgstr ""
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
+#: gui/mainwindow.cpp:253
+msgid "Shuffle Tracks"
+msgstr ""
+
+#: gui/mainwindow.cpp:254
+msgid "Shuffle Albums"
 msgstr ""
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:255
 msgid "Add Stream URL"
 msgstr ""
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:256
 msgid "Clear"
 msgstr ""
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:257
 msgid "Expanded Interface"
 msgstr ""
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:258
 msgid "Show Current Song Information"
 msgstr ""
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:261
 msgid "Full Screen"
 msgstr ""
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:263
 msgid "Random"
 msgstr ""
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:264
 msgid "Repeat"
 msgstr ""
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid "Single"
 msgstr ""
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
 msgstr ""
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid "Consume"
 msgstr ""
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr ""
 
-#: gui/mainwindow.cpp:291
+#: gui/mainwindow.cpp:267
 msgid "Search Play Queue"
 msgstr ""
 
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:269
 msgid "Set Priority"
 msgstr ""
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:271
 msgid "Play Stream"
 msgstr ""
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:273
 msgid "Locate In Library"
 msgstr ""
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:275
 msgid "Edit Song Tags"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:304
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
 msgid "Play Queue"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:27
 #. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:302 po/rc.cpp:455 rc.cpp:455
+#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
 msgid "Artists"
 msgstr ""
 
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr ""
-
 #. 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
+#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
 msgid "Playlists"
 msgstr ""
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:282
 msgid "Dynamic"
 msgstr ""
 
-#: gui/mainwindow.cpp:308
-msgid "Online"
-msgstr ""
-
-#: gui/mainwindow.cpp:310
-msgid "Devices"
-msgstr ""
-
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:288
 msgid "Expand All"
 msgstr ""
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:289
 msgid "Collapse All"
 msgstr ""
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:290
+msgid "Remove All Songs"
+msgstr ""
+
+#: gui/mainwindow.cpp:398
 msgid "Info"
 msgstr ""
 
-#: gui/mainwindow.cpp:435
+#: gui/mainwindow.cpp:405
 msgid "Auto Hide"
 msgstr ""
 
-#: gui/mainwindow.cpp:441
+#: gui/mainwindow.cpp:411
 msgid "Monochrome Icons"
 msgstr ""
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:541
 msgid "Server information..."
 msgstr ""
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:552
 msgid "Configure Cantata..."
 msgstr ""
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:559
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr ""
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:571
 msgid "&File"
 msgstr ""
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:574
 msgid "&Settings"
 msgstr ""
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
 msgid "&Help"
 msgstr ""
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:948
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
 
-#: gui/mainwindow.cpp:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
 msgid "Connecting to %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr ""
+
+#: gui/mainwindow.cpp:1447
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1448
 msgctxt "Qt-only"
 msgid ""
 "<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
@@ -2033,40 +2151,40 @@ msgid ""
 "\">GPLv3</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1450
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
 "QtMPC Authors<br/>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1451
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1452
 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:1468
+#: gui/mainwindow.cpp:1453
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1479
+#: gui/mainwindow.cpp:1464
 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>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1487
+#: gui/mainwindow.cpp:1472
 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</"
@@ -2076,81 +2194,77 @@ msgid ""
 "%6</td></tr></table></p>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1496
+#: gui/mainwindow.cpp:1481
 msgid "Server Information"
 msgstr ""
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
 msgid "Cantata (%1)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1728
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1730
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr ""
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1773
 msgid "(Stream)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1775
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr ""
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr ""
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr ""
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1% (Muted)"
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
 msgstr ""
 
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
+#: gui/mainwindow.cpp:1990
+msgid "Remove all songs from play queue?"
 msgstr ""
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
 msgid "Priority"
 msgstr ""
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2080
 msgid "Enter priority (0..255):"
 msgstr ""
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Playlist Name"
 msgstr ""
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Enter a name for the playlist:"
 msgstr ""
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2106
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr ""
 
-#: gui/mainwindow.cpp:2146
+#: gui/mainwindow.cpp:2107
 msgid "Existing Playlist"
 msgstr ""
 
@@ -2162,10 +2276,10 @@ msgstr ""
 msgid " ms"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:152
+#. i18n: file: devices/albumdetails.ui:165
 #. 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:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
 msgid "Track"
 msgstr ""
 
@@ -2173,7 +2287,7 @@ msgstr ""
 msgid "Auto"
 msgstr ""
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:164
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2181,13 +2295,13 @@ msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:26
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
 msgstr ""
 
-#: gui/playbacksettings.cpp:153
+#: gui/playbacksettings.cpp:174
 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 "
@@ -2197,136 +2311,136 @@ 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.</"
-"li></ul></p>"
-msgstr ""
-"<p>Replay Gain is a proposed standard published in 2001 to normalise the "
-"perceived loudness of computer audio formats such as MP3 and Ogg Vorbis. It "
-"works on a track/album basis, and is now supported in a growing number of "
-"players.</p><p>The following ReplayGain settings may be used:"
-"<ul><li><i>None</i> - No ReplayGain is applied.</li><li><i>Track</i> - "
-"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 activated, otherwise the album's tags will be used.</"
 "li></ul></p>"
+msgstr ""
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:759 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
 msgid "Rename"
 msgstr ""
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:190
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
 msgstr ""
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:191
 msgid "Remove Playlists"
 msgstr ""
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr ""
 
-#: gui/playlistspage.cpp:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
 msgid "Overwrite Playlist"
 msgstr ""
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Rename Playlist"
 msgstr ""
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Enter new name for playlist:"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:77
+#: gui/preferencesdialog.cpp:80
 msgid "Collection Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
 msgid "Playback"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:81
 msgid "Playback Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "Files"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "File Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:85
+msgid "Streams Settings"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:89
+msgid "Online Providers"
+msgstr ""
+
+#: gui/preferencesdialog.cpp:92
 msgid "Context"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:92
 msgid "Context View Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:103
 msgid "Audio CD Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgid "Proxy"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cache"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cached Items"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:118
+#: gui/preferencesdialog.cpp:116
 msgid "Configure"
 msgstr ""
 
-#: gui/serversettings.cpp:75
+#: 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:88
+#: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr ""
 
@@ -2342,12 +2456,12 @@ msgstr ""
 #. 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:208 po/rc.cpp:247 po/rc.cpp:705
+#: rc.cpp:208 rc.cpp:247 rc.cpp:705
 msgid "Host:"
 msgstr ""
 
-#: 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 "
@@ -2362,7 +2476,7 @@ msgstr ""
 "relevant host - Cantata itself cannot control the starting/stopping of this "
 "service.</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 "
@@ -2380,7 +2494,7 @@ msgstr ""
 "then Cantata will use a per-user instance of the dynamiser to facilitate "
 "dynamic playlists.</i>"
 
-#: gui/serversettings.cpp:109
+#: 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 "
@@ -2388,7 +2502,7 @@ msgid ""
 "</i></p>"
 msgstr ""
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:252
 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</"
@@ -2396,127 +2510,194 @@ msgid ""
 "configure and control the MPD instance</li></ul>"
 msgstr ""
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Add Collection"
 msgstr ""
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Standard"
 msgstr ""
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Basic"
 msgstr ""
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:297
 msgid "Delete <b>%1</b>?"
 msgstr ""
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:298
 msgid "Delete"
 msgstr ""
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:336
 msgid "New Collection %1"
 msgstr ""
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
 msgid "Default"
 msgstr ""
 
-#: gui/stdactions.cpp:55
-msgid "Save As"
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:80
+msgid "Do not use media keys to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:81
+msgid "Use media keys to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:84
+msgid "Use media keys, as configured in desktop settings, to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:85
+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
+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 ""
 
 #: gui/stdactions.cpp:56
-msgid "Add To Play Queue"
+msgid "Next Track"
 msgstr ""
 
 #: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr ""
+
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr ""
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr ""
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr ""
+
+#: gui/stdactions.cpp:63
+msgid "Save As"
+msgstr ""
+
+#: gui/stdactions.cpp:64
+msgid "Add To Play Queue"
+msgstr ""
+
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr ""
+
+#: gui/stdactions.cpp:66
 msgid "Replace Play Queue"
 msgstr ""
 
-#: gui/stdactions.cpp:58
+#: gui/stdactions.cpp:67
 msgid "Add With Priority"
 msgstr ""
 
-#: gui/stdactions.cpp:59
+#: gui/stdactions.cpp:68
 msgid "Highest Priority (255)"
 msgstr ""
 
-#: gui/stdactions.cpp:60
+#: gui/stdactions.cpp:69
 msgid "High Priority (200)"
 msgstr ""
 
-#: gui/stdactions.cpp:61
+#: gui/stdactions.cpp:70
 msgid "Medium Priority (125)"
 msgstr ""
 
-#: gui/stdactions.cpp:62
+#: gui/stdactions.cpp:71
 msgid "Low Priority (50)"
 msgstr ""
 
-#: gui/stdactions.cpp:63
+#: gui/stdactions.cpp:72
 msgid "Default Priority (0)"
 msgstr ""
 
-#: gui/stdactions.cpp:64
+#: gui/stdactions.cpp:73
 msgid "Custom Priority..."
 msgstr ""
 
-#: gui/stdactions.cpp:65
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr ""
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
 msgid "Organize Files"
 msgstr "Organise Files"
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
 msgstr ""
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
 msgid "ReplayGain"
 msgstr ""
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 msgid "Copy Songs To Device"
 msgstr ""
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 msgid "Set Image"
 msgstr ""
 
-#: gui/stdactions.cpp:79
+#: gui/stdactions.cpp:88
 msgid "Refresh Database"
 msgstr ""
 
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr ""
 
-#: gui/trayitem.cpp:165
+#: gui/trayitem.cpp:192
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr ""
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:193
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr ""
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:195
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr ""
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:196
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr ""
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:223
 msgid "Now playing"
 msgstr ""
 
@@ -2540,6 +2721,16 @@ msgstr ""
 msgid "Inactive"
 msgstr ""
 
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr ""
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr ""
+
 #: models/devicesmodel.cpp:108
 msgid "Configure Device"
 msgstr ""
@@ -2560,7 +2751,7 @@ msgstr ""
 msgid "Edit CD Details"
 msgstr ""
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:690
 msgid "No Devices Attached"
 msgstr ""
 
@@ -2572,28 +2763,28 @@ msgstr ""
 msgid "Logged in"
 msgstr ""
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 msgid "Unknown error"
 msgstr ""
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr ""
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr ""
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr ""
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr ""
 
 #: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] ""
@@ -2603,227 +2794,248 @@ msgstr[1] ""
 msgid "Audio File"
 msgstr ""
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr ""
-
-#: models/dirviewmodel.cpp:192 models/musicmodel.cpp:120
-msgid "Cue Sheet"
-msgstr ""
-
-#: models/musiclibraryitemartist.cpp:218 models/musiclibraryitemartist.cpp:231
-#: models/musiclibraryitemroot.cpp:798
+#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
 msgid "Single Tracks"
 msgstr ""
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:185
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/musicmodel.cpp:172
+#: models/musicmodel.cpp:192
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] ""
 msgstr[1] ""
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
+#: models/musicmodel.cpp:198
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] ""
+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
+msgid "Configure Service"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:84
+msgid "Refresh Service"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:85
+msgid "Add Subscription"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:86
+msgid "Remove Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
+#: models/onlineservicesmodel.cpp:87
+msgid "Refresh Subscription"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:125
+#: models/onlineservicesmodel.cpp:137
 msgid "Last Search:%1"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:136
+#: models/onlineservicesmodel.cpp:149
 msgid "Searching..."
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:670
 msgid "Not Loaded"
 msgstr ""
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:155
 msgid "Use search to locate tracks"
 msgstr ""
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:166
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: models/onlineservicesmodel.cpp:177
+msgid "(Downloading: %1%)"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:235
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr ""
+
+#: models/playlistsmodel.cpp:77
 msgid "New Playlist..."
 msgstr ""
 
-#: models/playqueuemodel.cpp:105
+#: models/playqueuemodel.cpp:102
 msgctxt "Track Number (#)"
 msgid "#"
 msgstr ""
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:103
 msgid "Length"
 msgstr ""
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:104
 msgid "Disc"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:138
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
 msgid "Year"
 msgstr ""
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:360
 msgid "<b>(Priority: %1)</b>"
 msgstr ""
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
 msgid "Loading..."
 msgstr ""
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:286
 msgid "Bookmarks"
 msgstr ""
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:560
 msgid "TuneIn"
 msgstr ""
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:563
 msgid "IceCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:564
 msgid "ShoutCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:567
 msgid "SomaFM"
 msgstr ""
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:568
 msgid "Digitally Imported"
 msgstr ""
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:569
 msgid "JazzRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:570
 msgid "RockRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:571
 msgid "Sky.fm"
 msgstr ""
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:572
 msgid "Favorites"
 msgstr "Favourites"
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr ""
+
+#: models/streamsmodel.cpp:578
 msgid "Bookmark Category"
 msgstr ""
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:579
 msgid "Add Stream To Favorites"
 msgstr "Add Stream To Favourites"
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:580
 msgid "Configure Streams"
 msgstr ""
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:660
 msgid "%1 (Read-Only)"
 msgstr ""
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1241
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr ""
 
-#: models/streamsmodel.cpp:1455
+#: models/streamsmodel.cpp:1639
 msgid "All"
 msgstr ""
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr ""
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:154
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr ""
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:156
 msgctxt "name (host:port)"
 msgid "\"%1\" (%2:%3)"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:361 mpd/mpdconnection.cpp:401
-#: mpd/mpdconnection.cpp:446 mpd/mpdconnection.cpp:984
-#: mpd/mpdconnection.cpp:1011
+#: mpd/mpdconnection.cpp:372 mpd/mpdconnection.cpp:415
+#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
+#: mpd/mpdconnection.cpp:1036
 msgid "Connection to %1 failed"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
 msgid "Connection to %1 failed - incorrect password"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:455
 msgid "Failed to send command to %1 - not connected"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:472
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr ""
 
-#: mpd/mpdconnection.cpp:474
+#: mpd/mpdconnection.cpp:493
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr ""
 
-#: mpd/mpdconnection.cpp:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
 msgid "Failed to send command. Disconnected from %1"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1171
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1158
+#: mpd/mpdconnection.cpp:1183
 msgid "Failed to save <b>%1</b>"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1196
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1174
+#: mpd/mpdconnection.cpp:1199
 msgid "You cannot add a playlist to another playlist!"
 msgstr ""
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] ""
-msgstr[1] ""
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr ""
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:343
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -2862,19 +3074,19 @@ msgstr ""
 msgid "Streaming format:"
 msgstr ""
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr ""
 
-#: online/magnatuneservice.cpp:180
+#: online/magnatuneservice.cpp:179
 msgid "MP3 128k"
 msgstr ""
 
-#: online/magnatuneservice.cpp:181
+#: online/magnatuneservice.cpp:180
 msgid "MP3 VBR"
 msgstr ""
 
-#: online/magnatuneservice.cpp:184
+#: online/magnatuneservice.cpp:183
 msgid "WAV"
 msgstr ""
 
@@ -2882,10 +3094,6 @@ msgstr ""
 msgid "Magnatune Settings"
 msgstr ""
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr ""
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -2894,8 +3102,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:51 po/rc.cpp:694 po/rc.cpp:706
-#: rc.cpp:694 rc.cpp:706
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
+#: rc.cpp:711 rc.cpp:729
 msgid "Username:"
 msgstr ""
 
@@ -2903,7 +3111,7 @@ msgstr ""
 #. 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)
@@ -2915,7 +3123,7 @@ msgstr ""
 #. 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)
@@ -2923,53 +3131,268 @@ 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: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: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
 msgid "Password:"
 msgstr ""
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr ""
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr ""
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr ""
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr ""
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr ""
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr ""
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr ""
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr ""
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
 msgstr ""
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
+msgid "Search For Podcasts"
+msgstr ""
+
+#: online/onlineservicespage.cpp:63
+msgid "Download Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:329
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr ""
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:464
 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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:621
+msgid "Refresh episode listing from <b>%1</b>?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:695
+msgid "All selected podcasts have already been downloaded!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:699
+msgid "Do you wish to download the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:705
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:753
+msgid "All selected downloaded podcast episodes have already been deleted!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:757
+msgid ""
+"Do you wish to delete the downloaded file of the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:760
+msgid ""
+"Do you wish to the delete downloaded files of the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:763
+msgid ""
+"Do you wish to the delete downloaded files of the selected podcast episodes?"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:243
+msgid "RSS:"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Podcast details"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Select a podcast to display its details"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:322
+msgid "Enter search term..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:372
+msgid "Failed to fetch podcasts from %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:378
+msgid "There was a problem parsing the response from %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:439
+msgid "Failed to download directory listing"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:447
+msgid "Failed to parse directory listing"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:602
+msgid "Subscription added"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr ""
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr ""
+
+#: online/podcastservice.cpp:284
+msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
+msgstr ""
+
+#: online/podcastservice.cpp:286
+msgid "Failed to parse %1"
+msgstr ""
+
+#: online/podcastservice.cpp:290
+msgid "Failed to download %1"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:59
+msgid "Download episodes to:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:60
+msgid "Automatically download new episodes:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:82
+msgid "Podcast Settings"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:92
+msgid "Every week"
+msgstr ""
+
 #. i18n: file: context/othersettings.ui:19
 #. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
 #: po/rc.cpp:3 rc.cpp:3
@@ -3035,8 +3458,8 @@ msgstr ""
 #. 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
-#: rc.cpp:49 rc.cpp:721
+#: 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
 msgid "TextLabel"
 msgstr ""
 
@@ -3082,93 +3505,109 @@ msgstr ""
 msgid "Album Details"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:60
+#. 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:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:73
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
+#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
 msgid "Genre:"
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:86
 #. 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:86
 #. 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:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
 msgid "Year:"
 msgstr ""
 
-#. 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 ""
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:99
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #: po/rc.cpp:70 rc.cpp:70
 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/audiocdsettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:88 rc.cpp:88
 msgid "Album and Track Information Retrieval"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:91 rc.cpp:91
 msgid "Automatically lookup:"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:94 rc.cpp:94
 msgid "Initially look up via:"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:52
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:97 rc.cpp:97
 msgid "CDDB Host:"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:100 rc.cpp:100
 msgid "CDDB Port:"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:88
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:103 rc.cpp:103
 msgid "Audio Extraction"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:106 rc.cpp:106
 msgid "Full paranoia mode (best quality):"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:107
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:106 rc.cpp:106
+#: po/rc.cpp:109 rc.cpp:109
 msgid "Never skip on read error:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:109 rc.cpp:109
+#: po/rc.cpp:112 rc.cpp:112
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3176,62 +3615,62 @@ 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: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
 msgid "Music folder:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:118 rc.cpp:118
 msgid "Copy album covers as:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:121 rc.cpp:121
 msgid "Maximum cover size:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:82
 #. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: 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:124 rc.cpp:124
+#: 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:127 rc.cpp:127
+#: po/rc.cpp:130 rc.cpp:130
 msgid "Use cache:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:121
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:133 rc.cpp:133
 msgid "Default volume:"
 msgstr ""
 
@@ -3243,7 +3682,7 @@ msgstr ""
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
 #. 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:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
 msgid "Filenames"
 msgstr ""
 
@@ -3255,7 +3694,7 @@ msgstr ""
 #. 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
+#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
 msgid "Use only ASCII characters:"
 msgstr ""
 
@@ -3267,7 +3706,7 @@ msgstr ""
 #. 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
+#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
 msgid "Replace spaces with underscores:"
 msgstr ""
 
@@ -3279,7 +3718,7 @@ msgstr ""
 #. 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
+#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
 msgid "Ignore 'The' in artist names:"
 msgstr ""
 
@@ -3291,7 +3730,7 @@ msgstr ""
 #. 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:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
 msgid "Filename scheme:"
 msgstr ""
 
@@ -3303,79 +3742,79 @@ msgstr ""
 #. 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
+#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
 msgid "VFAT safe:"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:250
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:154 rc.cpp:154
 msgid "Transcoding"
 msgstr ""
 
 #. i18n: file: devices/devicepropertieswidget.ui:261
 #. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:157 rc.cpp:157
 msgid "Only transcode if source file is of a different format:"
 msgstr ""
 
 #. i18n: file: devices/filenameschemedialog.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:160 rc.cpp:160
 msgid "Example:"
 msgstr ""
 
 #. i18n: file: devices/filenameschemedialog.ui:58
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:163 rc.cpp:163
 msgid "About filename schemes"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:82
+#. i18n: file: devices/filenameschemedialog.ui:70
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:166 rc.cpp:166
 msgid "Album Artist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:77
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:169 rc.cpp:169
 msgid "Album Title"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:91
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:175 rc.cpp:175
 msgid "Track Artist"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:98
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:178 rc.cpp:178
 msgid "Track Title"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:117
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:181 rc.cpp:181
 msgid "Track Title (+Artist)"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:124
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:184 rc.cpp:184
 msgid "Track #"
 msgstr ""
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:131
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:187 rc.cpp:187
 msgid "CD #"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:196 rc.cpp:196
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3383,17 +3822,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:162
 #. 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:162
 #. 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:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
 msgid "Type:"
 msgstr ""
 
@@ -3405,14 +3844,14 @@ 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:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
+#: rc.cpp:638
 msgid "Name:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#: po/rc.cpp:205 rc.cpp:205
 msgid "Options"
 msgstr ""
 
@@ -3420,7 +3859,7 @@ msgstr ""
 #. 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)
@@ -3430,14 +3869,14 @@ msgstr ""
 #. 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: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
 msgid "Port:"
 msgstr ""
 
@@ -3453,7 +3892,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:208 po/rc.cpp:226 po/rc.cpp:247 rc.cpp:208 rc.cpp:226 rc.cpp:247
+#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
 msgid "User:"
 msgstr ""
 
@@ -3465,7 +3904,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:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
 msgid "Domain:"
 msgstr ""
 
@@ -3477,7 +3916,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:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
 msgid "Share:"
 msgstr ""
 
@@ -3489,7 +3928,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:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
 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 "
@@ -3498,7 +3937,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:223 rc.cpp:223
+#: po/rc.cpp:229 rc.cpp:229
 msgid "Service name:"
 msgstr ""
 
@@ -3510,19 +3949,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:250 po/rc.cpp:259 rc.cpp:250 rc.cpp:259
+#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
 msgid "Folder:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:259 rc.cpp:259
 msgid "Extra Options:"
 msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:262 rc.cpp:262
 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 "
@@ -3531,7 +3970,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:268 rc.cpp:268
 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, "
@@ -3539,112 +3978,112 @@ msgid ""
 "attached.</i>"
 msgstr ""
 
-#. 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:271 rc.cpp:271
 msgid "No dynamizer port defined in server settings."
 msgstr "No dynamiser port defined in server settings."
 
-#. 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:274 rc.cpp:274
 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:271 rc.cpp:271
+#: po/rc.cpp:277 rc.cpp:277
 msgid "Name of Dynamic Rules"
 msgstr ""
 
 #. 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:283 streams/streamspage.cpp:62 rc.cpp:283
 msgid "Edit"
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:289 rc.cpp:289
 msgid "About Rules"
 msgstr ""
 
 #. i18n: file: dynamic/dynamicrule.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:295 rc.cpp:295
 msgid "Album Artist:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
+#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
 msgid "Album:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:103
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:310 rc.cpp:310
 msgid "From Year:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
 msgid "Any"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:126
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:316 rc.cpp:316
 msgid "To Year:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:136
+#. i18n: file: dynamic/dynamicrule.ui:149
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
+#: po/rc.cpp:322 rc.cpp:322
 msgid "Exact match:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:160
+#. i18n: file: dynamic/dynamicrule.ui:173
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
+#: po/rc.cpp:328 rc.cpp:328
 msgid "Include songs that match the following:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:165
+#. i18n: file: dynamic/dynamicrule.ui:178
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
+#: po/rc.cpp:331 rc.cpp:331
 msgid "Exclude songs that match the following:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:173
+#. i18n: file: dynamic/dynamicrule.ui:186
 #. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
+#: po/rc.cpp:334 rc.cpp:334
 msgid "Artists similar to:"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:236
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:337 rc.cpp:337
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
 
-#. i18n: file: dynamic/dynamicrule.ui:249
+#. i18n: file: dynamic/dynamicrule.ui:262
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:340 rc.cpp:340
 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>"
@@ -3652,82 +4091,88 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
+#: 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: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
+#: 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:717
+#. 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:717
+#. i18n: file: gui/initialsettingswizard.ui:716
 #. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
+#: 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:730
+#. 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:730
+#. i18n: file: gui/initialsettingswizard.ui:729
 #. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
+#: 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:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
+#. i18n: file: gui/filesettings.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
+#: 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: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:110
 #. 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:364 rc.cpp:364
 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 ""
 
-#. i18n: file: gui/filesettings.ui:128
+#. i18n: file: gui/filesettings.ui:145
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:367 rc.cpp:367
 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>"
+"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>NOTE:</b> If you change the location where streams are stored (i.e. "
 "you toggle the 'Save list of favourite streams in music folder' option), "
@@ -3738,19 +4183,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:370 rc.cpp:370
 msgid "Cantata First Run"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:361 rc.cpp:361
+#: po/rc.cpp:373 rc.cpp:373
 msgid "Welcome to Cantata"
 msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:376 rc.cpp:376
 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 "
@@ -3763,13 +4208,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:379 rc.cpp:379
 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:370 rc.cpp:370
+#: po/rc.cpp:382 rc.cpp:382
 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 "
@@ -3779,28 +4224,14 @@ msgid ""
 msgstr ""
 
 #. 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 ""
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:385 rc.cpp:385
 msgid "Standard multi-user/server setup"
 msgstr ""
 
-#. 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 ""
-
-#. 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:388 rc.cpp:388
 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 "
@@ -3809,9 +4240,23 @@ msgid ""
 "that MPD is already configured and running.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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 ""
+
+#. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:386 rc.cpp:386
+#: po/rc.cpp:397 rc.cpp:397
 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-"
@@ -3820,75 +4265,75 @@ msgid ""
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
 
-#. 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:400 rc.cpp:400
 msgid "Connection details"
 msgstr ""
 
-#. 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:403 rc.cpp:403
 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 ""
 
-#. 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:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
 msgid "Host (or local socket):"
 msgstr ""
 
-#. 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:421 rc.cpp:421
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
 msgstr ""
 
-#. 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:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
 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 ""
 
-#. 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:427 rc.cpp:427
 msgid "Music folder"
 msgstr ""
 
-#. 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:430 rc.cpp:430
 msgid "Please choose the folder containing your music collection."
 msgstr ""
 
-#. 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:436 rc.cpp:436
 msgid "Covers, Lyrics, and Streams"
 msgstr ""
 
-#. 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:439 rc.cpp:439
 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 "
@@ -3897,33 +4342,47 @@ msgid ""
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:808
+#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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 ""
+
+#. i18n: file: gui/initialsettingswizard.ui:824
 #. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:443 rc.cpp:443
+#: po/rc.cpp:457 rc.cpp:457
 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>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:841
+#. i18n: file: gui/initialsettingswizard.ui:857
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:460 rc.cpp:460
 msgid "Finished!"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:880
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:463 rc.cpp:463
 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:902
+#. i18n: file: gui/initialsettingswizard.ui:918
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:466 rc.cpp:466
 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 "
@@ -3932,27 +4391,6 @@ msgid ""
 "effect."
 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 ""
-
 #. i18n: file: gui/interfacesettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
@@ -3961,25 +4399,25 @@ msgstr ""
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
 #. 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:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
 msgid "Covers:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
+#: po/rc.cpp:478 rc.cpp:478
 msgid "Show artist images:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:81
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:467 rc.cpp:467
+#: po/rc.cpp:481 rc.cpp:481
 msgid "Show album year:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:123
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:484 rc.cpp:484
 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"
@@ -3991,25 +4429,25 @@ msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:172
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:497 rc.cpp:497
 msgid "Sort albums:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:183
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Album/Artist"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:188
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:503 rc.cpp:503
 msgid "Artist/Album"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:506 rc.cpp:506
 msgid "Artist/Year/Album"
 msgstr ""
 
@@ -4021,221 +4459,207 @@ msgstr ""
 #. 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
+#: 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: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:518 rc.cpp:518
 msgid "Other Views"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
 msgid "Folder view style:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
 msgid "Streams view style:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Online view style:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:530 rc.cpp:530
 msgid "Devices view style:"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:324
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:525 rc.cpp:525
+#: 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:534 rc.cpp:534
+#: 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:537 rc.cpp:537
+#: 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:540 rc.cpp:540
+#: po/rc.cpp:554 rc.cpp:554
 msgid "Use current album cover as background:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:398
+#. 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: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:560 rc.cpp:560
 msgid "External"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:404
+#. i18n: file: gui/interfacesettings.ui:417
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
+#: po/rc.cpp:563 rc.cpp:563
 msgid "Show icon in notification area:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:424
+#. i18n: file: gui/interfacesettings.ui:437
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
+#: 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:444
+#. i18n: file: gui/interfacesettings.ui:457
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
+#: po/rc.cpp:569 rc.cpp:569
 msgid "Show popup messages when changing tracks:"
 msgstr ""
 
-#. 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 ""
-
 #. i18n: file: gui/interfacesettings.ui:475
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
+#: po/rc.cpp:572 rc.cpp:572
 msgid "General"
 msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:486
 #. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
+#: 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:564 rc.cpp:564
+#: po/rc.cpp:581 rc.cpp:581
 msgid "Multiple artist albums:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: file: gui/interfacesettings.ui:533
 #. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
+#: po/rc.cpp:584 rc.cpp:584
 msgid "Show delete action in context menus:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:533
+#. i18n: file: gui/interfacesettings.ui:550
 #. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
+#: po/rc.cpp:587 rc.cpp:587
 msgid "Enforce single-click activation of items:"
 msgstr ""
 
-#. i18n: file: gui/interfacesettings.ui:574
+#. i18n: file: gui/interfacesettings.ui:591
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
+#: po/rc.cpp:590 rc.cpp:590
 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:244
+#. i18n: file: gui/mainwindow.ui:287
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
+#: po/rc.cpp:593 rc.cpp:593
 msgid "[Dynamic]"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
+#: po/rc.cpp:596 rc.cpp:596
 msgid "Output"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:41
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:585 rc.cpp:585
+#: 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:588 rc.cpp:588
+#: po/rc.cpp:605 rc.cpp:605
 msgid " seconds"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:591 rc.cpp:591
+#: po/rc.cpp:608 rc.cpp:608
 msgid "Replay gain:"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:594 rc.cpp:594
+#: po/rc.cpp:611 rc.cpp:611
 msgid "About replay gain"
 msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:104
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:597 rc.cpp:597
+#: po/rc.cpp:614 rc.cpp:614
 msgid "Devices:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:132
-#. i18n: ectx: property (title), widget (QGroupBox, streamBox)
-#: po/rc.cpp:600 rc.cpp:600
-msgid "HTTP Stream"
-msgstr ""
-
 #. 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 ""
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
-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>"
-msgstr ""
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: po/rc.cpp:609 rc.cpp:609
-msgid "Stopping Playback"
-msgstr ""
-
-#. i18n: file: gui/playbacksettings.ui:176
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:620 rc.cpp:620
 msgid "Fadeout on stop:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:189
+#. i18n: file: gui/playbacksettings.ui:154
 #. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
+#: po/rc.cpp:623 rc.cpp:623
 msgid "Stop playback on exit:"
 msgstr ""
 
-#. i18n: file: gui/playbacksettings.ui:202
+#. i18n: file: gui/playbacksettings.ui:167
 #. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
+#: po/rc.cpp:626 rc.cpp:626
 msgid "Stop dynamizer on exit:"
 msgstr "Stop dynamiser on exit:"
 
-#. i18n: file: gui/playbacksettings.ui:219
+#. 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:621 rc.cpp:621
+#: 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 "
@@ -4244,31 +4668,37 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:635 rc.cpp:635
 msgid "Collection:"
 msgstr ""
 
 #. 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:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
 msgid "Cover filename:"
 msgstr ""
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:645 rc.cpp:645
+#: po/rc.cpp:656 rc.cpp:656
 msgid "Dynamizer port:"
 msgstr "Dynamiser port:"
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:659 rc.cpp:659
+msgid "HTTP stream URL:"
+msgstr ""
+
+#. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:648 rc.cpp:648
+#: po/rc.cpp:662 rc.cpp:662
 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 "
@@ -4277,18 +4707,27 @@ msgid ""
 "album folder.</i>"
 msgstr ""
 
-#. i18n: file: gui/serversettings.ui:314
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+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 ""
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:677 rc.cpp:677
 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 ""
 
-#. 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:680 rc.cpp:680
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4296,19 +4735,19 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:666 rc.cpp:666
+#: po/rc.cpp:683 rc.cpp:683
 msgid "Network interface:"
 msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
+#: po/rc.cpp:686 rc.cpp:686
 msgid "Current URL:"
 msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:73
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:689 rc.cpp:689
 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 "
@@ -4320,25 +4759,33 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:693 rc.cpp:693
 msgid "Mode:"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:699 rc.cpp:699
 msgid "HTTP Proxy"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:685 rc.cpp:685
+#: po/rc.cpp:702 rc.cpp:702
 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."
+msgstr ""
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:723 rc.cpp:723
 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."
@@ -4348,202 +4795,260 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:726 rc.cpp:726
 msgid "Premium Account"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:735 rc.cpp:735
 msgid "Stream type:"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:738 rc.cpp:738
 msgid "Status:"
 msgstr ""
 
 #. 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:741 streams/digitallyimportedsettings.cpp:130
+#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
 msgid "Login"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:747 rc.cpp:747
 msgid "Session expiry:"
 msgstr ""
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:750 rc.cpp:750
+msgid ""
+"<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
+"RockRadio.com, and Sky.fm</i>"
+msgstr ""
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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: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 ""
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+msgid "Configure Provider"
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:60
+#. i18n: ectx: property (text), widget (QPushButton, installButton)
+#: po/rc.cpp:762 rc.cpp:762
+msgid "Install"
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:768 rc.cpp:768
+msgid ""
+"<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
+"removed.</i>"
+msgstr ""
+
+#. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:727 rc.cpp:727
+#: po/rc.cpp:771 rc.cpp:771
 msgid "Search:"
 msgstr ""
 
-#. 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:774 rc.cpp:774
 msgid "Shortcut for Selected Action"
 msgstr ""
 
-#. 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:777 rc.cpp:777
 msgid "Default:"
 msgstr ""
 
-#. 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:783 rc.cpp:783
 msgid "Custom:"
 msgstr ""
 
-#. i18n: file: tags/tageditor.ui:22
+#. i18n: file: tags/tageditor.ui:25
 #. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
+#: po/rc.cpp:786 rc.cpp:786
 msgid "Track:"
 msgstr ""
 
-#. 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:795 rc.cpp:795
 msgid "Album artist:"
 msgstr ""
 
-#. 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:804 rc.cpp:804
 msgid "Track number:"
 msgstr ""
 
-#. 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:807 rc.cpp:807
 msgid "Disc number:"
 msgstr ""
 
 #. i18n: file: tags/trackorganiser.ui:155
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:834 rc.cpp:834
 msgid "Original Name"
 msgstr ""
 
 #. i18n: file: tags/trackorganiser.ui:160
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:837 rc.cpp:837
 msgid "New Name"
 msgstr ""
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:838 rc.cpp:838
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr ""
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:839 rc.cpp:839
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:121
 msgid "Show All Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:122
 msgid "Show Untagged Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
 msgid "Remove From List"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:140
+#: replaygain/rgdialog.cpp:136
 msgid "Album Gain"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:141
+#: replaygain/rgdialog.cpp:137
 msgid "Track Gain"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:142
+#: replaygain/rgdialog.cpp:138
 msgid "Album Peak"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:143
+#: replaygain/rgdialog.cpp:139
 msgid "Track Peak"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
 msgid "Scan"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:238
 msgid "Update ReplayGain tags in tracks?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
 msgid "Update Tags"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:252
 msgid "Abort scanning of tracks?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:257
+#: replaygain/rgdialog.cpp:261
 msgid "Abort reading of existing tags?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:287
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:285
+#: replaygain/rgdialog.cpp:289
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "Untagged Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "All Tracks"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:300
 msgid "Scanning tracks..."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:367
 msgid "Reading existing tags..."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr ""
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr ""
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
 msgid "Failed to update the tags of the following tracks:"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
+#: tags/trackorganiser.cpp:451
 msgid "Device is not connected."
 msgstr ""
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
 msgid "%1 dB"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: 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
 msgid "Failed"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
 msgid "Remove the selected tracks from the list?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
 msgid "Remove Tracks"
 msgstr ""
 
@@ -4575,6 +5080,10 @@ msgstr ""
 msgid "Logout"
 msgstr ""
 
+#: streams/streamdialog.cpp:71
+msgid "URL:"
+msgstr ""
+
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
 msgstr ""
@@ -4595,113 +5104,146 @@ msgstr ""
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr ""
 
-#: streams/streamfetcher.cpp:198
+#: streams/streamfetcher.cpp:205
 msgid "Fetching %1"
 msgstr ""
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 msgid "Import Streams Into Favorites"
 msgstr "Import Streams Into Favourites"
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 msgid "Export Favorite Streams"
 msgstr "Export Favourite Streams"
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr "Add New Stream To Favourites"
 
-#: streams/streamspage.cpp:123
-msgid "Search TuneIn:"
+#: streams/streamspage.cpp:124
+msgctxt "Service name"
+msgid "Digitally Imported"
 msgstr ""
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:242
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
 msgid "Import Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:245
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr ""
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:253
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr ""
 
-#: streams/streamspage.cpp:262
+#: streams/streamspage.cpp:265
 msgid "*.xml|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
 msgid "Export Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:267
 msgid "XML Streams (*.xml)"
 msgstr ""
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:279
 msgid "Failed to create <b>%1</b>!"
 msgstr ""
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr ""
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
 msgid "A stream named <b>%1</b> already exists!"
 msgstr ""
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:318
 msgid "Bookmark added"
 msgstr ""
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:320
 msgid "Already bookmarked"
 msgstr ""
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:366
 msgid "Added to favorites"
 msgstr "Added to favourites"
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:368
 msgid "Already in favorites"
 msgstr "Already in favourites"
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:393
 msgid "Reload <b>%1</b> streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:411
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr ""
 
-#: streams/streamspage.cpp:414
+#: streams/streamspage.cpp:417
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr ""
 
-#: streams/streamspage.cpp:442
+#: streams/streamspage.cpp:445
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:446
+#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr ""
 
-#: streams/streamspage.cpp:609
-msgid "Logged into Digitally Imported"
+#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+msgid "Search %1:"
+msgstr ""
+
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr ""
+
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+msgid "Install Streams"
+msgstr ""
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
+msgstr ""
+
+#: streams/streamssettings.cpp:144
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr ""
+
+#: streams/streamssettings.cpp:150
+msgid "Failed top open %1"
 msgstr ""
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr ""
+
+#: streams/streamssettings.cpp:170
+msgid "Failed to create stream category folder!"
+msgstr ""
+
+#: streams/streamssettings.cpp:176
+msgid "Failed to save stream list!"
+msgstr ""
+
+#: streams/streamssettings.cpp:227
+msgid "Failed to remove streams folder!"
 msgstr ""
 
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr ""
 
 #: support/dialog.cpp:90
@@ -4764,39 +5306,39 @@ msgstr ""
 msgid "&Next"
 msgstr ""
 
-#: support/fancytabwidget.cpp:952
+#: support/fancytabwidget.cpp:957
 msgid "Icons Only"
 msgstr ""
 
-#: support/fancytabwidget.cpp:953
+#: support/fancytabwidget.cpp:958
 msgid "Style"
 msgstr ""
 
-#: support/fancytabwidget.cpp:954
+#: support/fancytabwidget.cpp:959
 msgid "Large Sidebar"
 msgstr ""
 
-#: support/fancytabwidget.cpp:955
+#: support/fancytabwidget.cpp:960
 msgid "Small Sidebar"
 msgstr ""
 
-#: support/fancytabwidget.cpp:956
+#: support/fancytabwidget.cpp:961
 msgid "Top Bar"
 msgstr ""
 
-#: support/fancytabwidget.cpp:957
+#: support/fancytabwidget.cpp:962
 msgid "Bottom Bar"
 msgstr ""
 
-#: support/fancytabwidget.cpp:958
+#: support/fancytabwidget.cpp:963
 msgid "Tabs On Side"
 msgstr ""
 
-#: support/fancytabwidget.cpp:959
+#: support/fancytabwidget.cpp:964
 msgid "Tabs On Top"
 msgstr ""
 
-#: support/fancytabwidget.cpp:960
+#: support/fancytabwidget.cpp:965
 msgid "Tabs On Bottom"
 msgstr ""
 
@@ -4808,19 +5350,20 @@ msgstr ""
 msgid "Please enter password:"
 msgstr ""
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
 msgid "Warning"
 msgstr ""
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
 msgid "Question"
 msgstr ""
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
+#: support/messagebox.cpp:107 support/messagebox.cpp:113
+#: support/messagebox.h:62
 msgid "Error"
 msgstr ""
 
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr ""
 
@@ -4840,73 +5383,79 @@ msgstr ""
 msgid "Select File"
 msgstr ""
 
-#: support/utils.cpp:271 support/utils.cpp:279
+#: support/utils.cpp:390 support/utils.cpp:398
 msgid "%1 B"
 msgstr ""
 
-#: support/utils.cpp:272
+#: support/utils.cpp:391
 msgid "%1 kB"
 msgstr ""
 
-#: support/utils.cpp:273
+#: support/utils.cpp:392
 msgid "%1 MB"
 msgstr ""
 
-#: support/utils.cpp:275
+#: support/utils.cpp:394
 msgid "%1 GB"
 msgstr ""
 
-#: support/utils.cpp:280
+#: support/utils.cpp:399
 msgid "%1 KiB"
 msgstr ""
 
-#: support/utils.cpp:281
+#: support/utils.cpp:400
 msgid "%1 MiB"
 msgstr ""
 
-#: support/utils.cpp:283
+#: support/utils.cpp:402
 msgid "%1 GiB"
 msgstr ""
 
-#: tags/tageditor.cpp:131
+#: support/utils.cpp:602
+msgid "1 day %2"
+msgid_plural "%1 days %2"
+msgstr[0] ""
+msgstr[1] ""
+
+#: tags/tageditor.cpp:134
 msgid "Tags"
 msgstr ""
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:147
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr ""
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
 msgid "All tracks"
 msgstr ""
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:295
 msgid "(Various)"
 msgstr ""
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:336
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:367
+#: tags/tageditor.cpp:378
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:417
+#: tags/tageditor.cpp:428
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
 msgstr ""
 
-#: tags/tageditor.cpp:418
+#: tags/tageditor.cpp:429
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 
-#: tags/tageditor.cpp:419
+#: tags/tageditor.cpp:430
 msgid "Album Artist from Artist"
 msgstr ""
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:463
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -4914,69 +5463,82 @@ msgstr ""
 "Capitalise the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
 
-#: tags/tageditor.cpp:485
+#: tags/tageditor.cpp:496
 msgid "Adjust the value of each track number by:"
 msgstr ""
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:554
 msgid "All tracks [modified]"
 msgstr ""
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:556
 msgid "%1 [modified]"
 msgstr ""
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:783
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 
-#: tags/tageditor.cpp:759
+#: tags/tageditor.cpp:784
 msgid "Rename Files"
 msgstr ""
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:150
 msgid "Abort renaming of files?"
 msgstr ""
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:263
+msgid "Source file does not exist!<br/>%1"
+msgstr ""
+
+#: tags/trackorganiser.cpp:282
 msgid "Destination file already exists!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:304
 msgid "Failed to create destination folder!<br/>%1"
 msgstr ""
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:325
 msgid "Failed to rename %1 to %2"
 msgstr ""
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:267
+msgid "<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>"
+msgstr ""
+
+#: widgets/coverwidget.cpp:269
 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:59
+#: widgets/genrecombo.cpp:54
 msgid "All Genres"
 msgstr ""
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:267
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr ""
+
+#: widgets/groupedview.cpp:269
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr ""
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:480
 msgid "Go Back"
 msgstr ""
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:485
 msgid "Go Home"
 msgstr ""
 
 #: widgets/menubutton.cpp:36
-msgid "Other Actions"
+msgid "Menu"
 msgstr ""
 
 #: widgets/searchwidget.cpp:62
@@ -4987,6 +5549,51 @@ msgstr ""
 msgid "Close Search Bar"
 msgstr ""
 
+#: widgets/servicestatuslabel.cpp:43
+msgid "Logged into %1"
+msgstr ""
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr ""
+
+#: widgets/songdialog.cpp:48
+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
+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
+msgid "Mute"
+msgstr ""
+
+#: widgets/volumeslider.cpp:199
+msgid "Muted"
+msgstr ""
+
+#: widgets/volumeslider.cpp:238
+msgid "Unmute"
+msgstr ""
+
+#: widgets/volumeslider.cpp:276
+msgid "Volume Disabled"
+msgstr ""
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1% (Muted)"
+msgstr ""
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr ""
+
 #: ../gui/qtplural.h:30
 msgctxt "Singular"
 msgid "1 Track"
@@ -5065,3 +5672,24 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr ""
 
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr ""
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr ""
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr ""
+
+#: ../gui/qtplural.h:63
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr ""
diff --git a/po/es.po b/po/es.po
index ab91b9f..4e6193f 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-07-20 19:42+0100\n"
+"POT-Creation-Date: 2013-11-14 20:26+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,37 +21,37 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Actualizar información de álbum"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
 msgid "Album Information"
 msgstr "Información de albúm"
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:143
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
 msgid "Tracks"
 msgstr "Pistas"
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 msgid "Refresh Artist Information"
 msgstr "Actualizar información de artista"
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 context/contextwidget.cpp:306
+#: gui/cachesettings.cpp:260
 msgid "Artist Information"
 msgstr "Información de artista"
 
 #. i18n: file: gui/interfacesettings.ui:137
 #. 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:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
 msgid "Albums"
 msgstr "Álbumes"
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:333
 msgid "Web Links"
 msgstr "Enlaces web"
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:419
 msgid "Similar Artists"
 msgstr "Artistas similares"
 
@@ -63,8 +63,8 @@ msgstr "Proveedores de letras"
 msgid "Wikipedia Languages"
 msgstr "Idiomas de Wikipedia"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
-#: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
 msgid "Other"
 msgstr "Otro"
 
@@ -72,12 +72,12 @@ msgstr "Otro"
 msgid "Reset Spacing"
 msgstr "Restablecer espaciado"
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
 msgid "Lyrics"
 msgstr "Letras"
 
-#: context/lastfmengine.cpp:65
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr "Vea más en last.fm"
 
@@ -99,20 +99,20 @@ 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:47
+#. i18n: file: devices/albumdetails.ui:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
+#: rc.cpp:61 rc.cpp:304 rc.cpp:789
 msgid "Title:"
 msgstr "Título:"
 
@@ -120,16 +120,16 @@ msgstr "Título:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
+#: rc.cpp:55 rc.cpp:292 rc.cpp:792
 msgid "Artist:"
 msgstr "Artista:"
 
@@ -137,111 +137,112 @@ msgstr "Artista:"
 msgid "Search For Lyrics"
 msgstr "Búsqueda de letras"
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 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:46
+#: context/lyricsettings.cpp:66
 msgid "(Polish Translations)"
 msgstr "(Traducción al polaco)"
 
-#: context/lyricsettings.cpp:47
+#: context/lyricsettings.cpp:67
 msgid "(Portuguese Translations)"
 msgstr "(Traducción al portugués)"
 
-#: context/songview.cpp:74
+#: context/songview.cpp:89
 msgid "Refresh Lyrics"
 msgstr "Actualizar letras"
 
-#: context/songview.cpp:75
+#: context/songview.cpp:90
 msgid "Edit Lyrics"
 msgstr "Editar letras"
 
-#: context/songview.cpp:76
+#: context/songview.cpp:91
 msgid "Save Lyrics"
 msgstr "Guardar letras"
 
-#: context/songview.cpp:77
+#: context/songview.cpp:92
 msgid "Cancel Editing Lyrics"
 msgstr "Cancelar edición de letras"
 
-#: context/songview.cpp:78
+#: context/songview.cpp:93
 msgid "Delete Lyrics File"
 msgstr "Eliminar fichero de letras"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort editing of lyrics?"
 msgstr "¿Desea cancelar la edición de letras?"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort Editing"
 msgstr "Cancelar edición"
 
-#: 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: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
 msgid "Abort"
 msgstr "Cancelar"
 
-#: context/songview.cpp:106
+#: context/songview.cpp:121
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "¿Desea eliminar y descargar otra vez la copia de las letras?"
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:121 context/songview.cpp:122
+#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
 msgid "Re-download"
 msgstr "Volver a descargar"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 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:132
+#: context/songview.cpp:147
 msgid "Song Changed"
 msgstr "Canción modificada"
 
-#: context/songview.cpp:133
+#: context/songview.cpp:148
 msgid "Perform Search"
 msgstr "Realizar búsqueda"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save updated lyrics?"
 msgstr "¿Desea guardar las letras actualizadas?"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save"
 msgstr "Guardar"
 
-#: context/songview.cpp:170
+#: context/songview.cpp:185
 msgid "Failed to save lyrics."
 msgstr "Fallo al guardar las letras"
 
-#: context/songview.cpp:192
+#: context/songview.cpp:207
 msgid "Delete lyrics file?"
 msgstr "¿Desea eliminar el fichero de letras?"
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
+#: context/songview.cpp:207 gui/mainwindow.cpp:292
+#: widgets/messageoverlay.cpp:43
 msgid "Cancel"
 msgstr "Cancelar"
 
-#: context/songview.cpp:416
+#: context/songview.cpp:431
 msgid "Fetching lyrics via %1"
 msgstr "Obteniendo letras mediante %1"
 
-#: context/wikipediaengine.cpp:250
+#: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Lista de pistas"
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr "Lea más en Wikipedia"
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr "Abrir en explorador"
 
-#: 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 "artista|banda|cantante|vocalista|músico"
@@ -251,7 +252,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "albúm|pista|banda sonora"
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:99
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -259,41 +260,46 @@ msgstr ""
 "Seleccione los idiomas de Wikipeda que utilizar para la búsqueda de "
 "información de artista y álbum."
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
+#: online/podcastsearchdialog.cpp:393
 msgid "Reload"
 msgstr "Actualizar"
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr ""
+
+#: devices/actiondialog.cpp:76
 msgid "Songs To Be Copied"
 msgstr "Canciones que copiar"
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:146
 msgid "<b>INVALID</b>"
 msgstr "<b>NO VÁLIDO</b>"
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
 msgid "<i>(When different)</i>"
 msgstr "<i>(Cuando hay diferencias)</i>"
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Artistas:%1, Álbumes:%2, Canciones:%3"
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
+#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
 #: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
 msgid "%1 free"
 msgstr "%1 libre"
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
 msgid "Local Music Library"
 msgstr "Biblioteca de música local"
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
+#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
 msgid "Audio CD"
 msgstr "CD de audio"
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:293
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -305,7 +311,7 @@ msgstr ""
 "Las canciones se tendrán que transcodificar a un tamaño de fichero menor "
 "para la copia."
 
-#: devices/actiondialog.cpp:285
+#: devices/actiondialog.cpp:300
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -313,17 +319,17 @@ msgstr ""
 "No hay suficiente espacio en el destino.\n"
 "Las canciones seleccionadas ocupan %1, pero sólo hay %2 libre."
 
-#: devices/actiondialog.cpp:334
+#: devices/actiondialog.cpp:349
 msgid "Copy Songs"
 msgstr "Copiar canciones"
 
-#: 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:349 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Eliminar canciones"
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:380
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
@@ -331,15 +337,15 @@ msgstr ""
 "<p>El dispositivo de destino no está configurado.<br/>¿Desea continuar con "
 "las opciones predefinidas?</p>"
 
-#: devices/actiondialog.cpp:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
 msgid "Not Configured"
 msgstr "Sin configuración"
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
 msgid "Use Defaults"
 msgstr "Utilizar valores predefinidos"
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:384
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -347,63 +353,63 @@ msgstr ""
 "<p>El dispositivo de origen no está configurado.<br/>¿Desea continuar con "
 "las opciones predefinidas?</p>"
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:446
 msgid "Are you sure you wish to stop?"
 msgstr "¿Está seguro de que desea detener?"
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Detener"
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
+#: tags/trackorganiser.cpp:446
 msgid "Device has been removed!"
 msgstr "El dispositivo se ha extraído."
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:491
 msgid "Device is not connected!"
 msgstr "El dispositivo no está conectado."
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
+#: tags/trackorganiser.cpp:456
 msgid "Device is busy?"
 msgstr "¿Está el dispositivo en uso?"
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "¿Ha cambiado el dispositivo?"
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:562
 msgid "Clearing unused folders"
 msgstr "Eliminando directorios no utilizados"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "¿Desea calcular la ganancia de reproducción para pistas extraídas?"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "ReplyGain"
 msgstr "Ganancia de reproducción"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:578
 msgid "Calculate"
 msgstr "Calcular"
 
-#: devices/actiondialog.cpp:618
+#: devices/actiondialog.cpp:634
 msgid "The destination filename already exists!<hr/>%1"
 msgstr "El nombre de fichero de destino ya existe.<hr/>%1"
 
-#: devices/actiondialog.cpp:621
+#: devices/actiondialog.cpp:637
 msgid "Song already exists!<hr/>%1"
 msgstr "La canción ya existe.<hr/>%1"
 
-#: devices/actiondialog.cpp:624
+#: devices/actiondialog.cpp:640
 msgid "Song does not exist!<hr/>%1"
 msgstr "La canción no existe.<hr/>%1"
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:643
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
 "permissions.<hr/>%1"
@@ -411,31 +417,31 @@ msgstr ""
 "No se ha podido crear el directorio de destino.<br/>Compruebe que tiene "
 "permisos necesarios.<hr/>%1"
 
-#: devices/actiondialog.cpp:630
+#: devices/actiondialog.cpp:646
 msgid "Source file no longer exists?<br/><br/<hr/>%1"
 msgstr "¿Ha desaparecido el fichero de origen?<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:633
+#: devices/actiondialog.cpp:649
 msgid "Failed to copy.<hr/>%1"
 msgstr "Fallo al copiar.<hr/>%1"
 
-#: devices/actiondialog.cpp:634
+#: devices/actiondialog.cpp:650
 msgid "Failed to delete.<hr/>%1"
 msgstr "Fallo al eliminar.<hr/>%1"
 
-#: devices/actiondialog.cpp:637
+#: devices/actiondialog.cpp:653
 msgid "Not connected to device.<hr/>%1"
 msgstr "El dispositivo no está conectado.<hr/>%1"
 
-#: devices/actiondialog.cpp:640
+#: devices/actiondialog.cpp:656
 msgid "Selected codec is not available.<hr/>%1"
 msgstr "El códec seleccionado no está disponible.<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:659
 msgid "Transcoding failed.<br/><br/<hr/>%1"
 msgstr "Fallo durante la transcodificación.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:646
+#: devices/actiondialog.cpp:662
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
 "devices.)<hr/>%1"
@@ -443,133 +449,129 @@ msgstr ""
 "Fallo al crear el fichero temporal.<br/>(Necesario para la transcodificación "
 "a dispositivos MTP.)<hr/>%1"
 
-#: devices/actiondialog.cpp:649
+#: devices/actiondialog.cpp:665
 msgid "Failed to read source file.<br/><br/<hr/>%1"
 msgstr "Fallo de lectura del fichero fuente.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:652
+#: devices/actiondialog.cpp:668
 msgid "Failed to write to destination file.<br/><br/<hr/>%1"
 msgstr "Fallo de escritura en el fichero de destino.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:655
+#: devices/actiondialog.cpp:671
 msgid "No space left on device.<br/><br/<hr/>%1"
 msgstr "No hay espacio libre en el dispositivo.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:658
+#: devices/actiondialog.cpp:674
 msgid "Failed to update metadata.<br/><br/<hr/>%1"
 msgstr "Fallo de actualización de metadatos.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr ""
-"Fallo de descarga de la pista: demasiadas redirecciones "
-"detectadas.<br/><br/<hr/>%1"
-
-#: devices/actiondialog.cpp:664
+#: 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:667
+#: devices/actiondialog.cpp:680
 msgid "Failed to lock device.<hr/>%1"
 msgstr "Fallo de bloqueo de dispositivo.<hr/>%1"
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:709
 msgid "Local Music Library Properties"
 msgstr "Propiedades de la biblioteca de música local"
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
+#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
 msgid "<b>Error</b><br/>"
 msgstr "<b>Error</b><br/>"
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Skip"
 msgstr "Omitir"
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Auto Skip"
 msgstr "Omitir automáticamente"
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:759
 msgid "Retry"
 msgstr "Reintentar"
 
-#: devices/actiondialog.cpp:761
+#: 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>"
+"<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:768
+#: 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\">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>"
+"<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:773
+#: 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:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
 msgid "Calculating..."
 msgstr "Calculando..."
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:799
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (Estimación)"
 
-#: devices/actiondialog.cpp:789
+#: 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>Tiempo restante:</i></td><td><i>%"
-"5</i></td></i></tr>"
+"<tr><i><td align=\"right\"><i>Tiempo restante:</i></td><td><i>%5</i></td></"
+"i></tr>"
 
-#: devices/actiondialog.cpp:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Guardando almacén"
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
+#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Arreglo para «Varios Artistas»"
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
+#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Deshacer arreglo para «Varios Artistas»"
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
+#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
 msgid "Capitalize"
 msgstr "Aplicar mayúsculas"
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
 msgid "Adjust Track Numbers"
 msgstr "Ajustar números de pista"
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
 msgid "Tools"
 msgstr "Herramientas"
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "¿Desea aplicar el arreglo para «Various Artists»?"
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -577,11 +579,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:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Deshacer arreglo para «Varios Artistas»"
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
 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' "
@@ -591,42 +593,42 @@ msgid ""
 msgstr ""
 "<i>Si «Artista del álbum» es igual a «Artista» y «Título» tiene el formato "
 "«Artista de pista - Título de pista», el valor para «Artista» se tomará de "
-"«Título», y «Título» se definirá solo con el título de pista. Por "
-"ejemplo:<br/><br/>si «Título» es «Wibble - Wobble», entonces «Artista» se "
-"define como «Wibble», y «Título» se define como «Wobble»</i>"
+"«Título», y «Título» se definirá solo con el título de pista. Por ejemplo:"
+"<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:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
 msgid "Revert"
 msgstr "Revertir"
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
 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:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
 msgid "Adjust track number by:"
 msgstr "Ajustar números de pista según:"
 
-#: 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
+#: 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:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Leyendo disco"
 
-#: 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:353 gui/mainwindow.cpp:2199
+#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
+#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "1 pista (%2)"
@@ -644,24 +646,24 @@ msgstr "MusicBrainz"
 msgid "Data Track"
 msgstr "Pista de datos"
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr "Fallo al abrir el dispositivo de CD"
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
 #: devices/musicbrainz.cpp:217
 msgid "Track %1"
 msgstr "Pista %1"
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr "Fallo de conexión a CDDB"
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr "No se han encontrado coincidencias en CDDB"
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr "Fallo de CDDB: %1"
 
@@ -671,19 +673,19 @@ msgstr ""
 "Se han encontrado varias coincidencias. Seleccione la coincidencia "
 "pertinente de la lista a continuación:"
 
-#. i18n: file: devices/albumdetails.ui:157
+#. i18n: file: devices/albumdetails.ui:170
 #. 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:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
+#: rc.cpp:82
 msgid "Artist"
 msgstr "Artista"
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:175
 #. 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:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
+#: rc.cpp:85
 msgid "Title"
 msgstr "Título"
 
@@ -701,10 +703,14 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr "Actualizando (%1)..."
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr "Actualizando (%1%)..."
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -808,24 +814,24 @@ msgstr "Olvidar dispositivo"
 msgid "Add Device"
 msgstr "Añadir dispositivo"
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
 msgstr "¿Desea consultar los detalles de álbum y pista?"
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455
 msgid "Refresh"
 msgstr "Actualizar"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr "Mediante CDDB"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr "Mediante 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>"
@@ -835,16 +841,16 @@ msgstr ""
 "analizan canciones nuevas <i>(rápido)</i></li><li>Completa - Se analizan "
 "todas las canciones <i>(lento)</i></li></ul></p>"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr "Parcial"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr "Completa"
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -852,31 +858,31 @@ msgstr ""
 "¿Desea eliminar las canciones seleccionadas?\n"
 "Esta acción no se puede deshacer."
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr "¿Desea olvidar <b>%1</b>?"
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr "¿Desea expulsar el CD de audio <b>%1 - %2</b>?"
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr "Expulsar"
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr "¿Está seguro de que quiere desconectar <b>%1</b>?"
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr "Desconectar"
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
 msgid "Please close other dialogs first."
 msgstr "Primero cierre otras ventanas de diálogo."
 
-#: devices/encoders.cpp:78
+#: devices/encoders.cpp:77
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -892,7 +898,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:83
+#: devices/encoders.cpp:82
 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 "
@@ -925,22 +931,22 @@ msgstr ""
 "insatisfactorio para la música y algo superior a <b>200kb/s</b> es "
 "posiblemente demasiado."
 
-#: devices/encoders.cpp:101 devices/encoders.cpp:141
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
 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:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
+#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
 msgid "Smaller file"
 msgstr "Fichero más pequeño"
 
-#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:329
 msgid "Better sound quality"
 msgstr "Mayor calidad de audio"
 
-#: devices/encoders.cpp:120
+#: devices/encoders.cpp:119
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -956,7 +962,7 @@ msgstr ""
 "el almacenamiento de audio, y generalmente compatible con todos los "
 "reproductores de música portátiles."
 
-#: devices/encoders.cpp:124
+#: devices/encoders.cpp:123
 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 "
@@ -973,24 +979,24 @@ msgid ""
 msgstr ""
 "La tasa de bits es la medida de la cantidad de datos utilizados para "
 "representar un segundo de la pista de audio.<br>El codificador <b>MP3</b> "
-"utilizado por Cantata permite una <a "
-"href=http://en.wikipedia.org/wiki/MP3#VBR>tasa de bits variable (VBR)</a> ; "
-"esto es, la tasa de bits varía a lo largo de la pista en base al contenido "
-"de audio. Los intervalos de datos más complejos se codifican con una tasa de "
-"bits más elevada que los intervalos más sencillos; este enfoque ofrece una "
-"calidad general superior y un fichero más pequeño que el generado con una "
-"tasa de bits constante en toda la pista.<br>Por ello, la medida de la tasa "
-"de bits en esta barra deslizante es una estimación de la tasa de bits media "
-"de la pista codificada.<br><b>160kb/s</b> es una buena elección para la "
-"reproducción de música con un dispositivo portátil.<br/>Algo inferior a "
-"<b>120kb/s</b> puede insatisfactorio para la música y algo superior a "
-"<b>205kb/s</b> es posiblemente demasiado."
-
-#: devices/encoders.cpp:156 online/magnatuneservice.cpp:182
+"utilizado por Cantata permite una <a href=http://en.wikipedia.org/wiki/"
+"MP3#VBR>tasa de bits variable (VBR)</a> ; esto es, la tasa de bits varía a "
+"lo largo de la pista en base al contenido de audio. Los intervalos de datos "
+"más complejos se codifican con una tasa de bits más elevada que los "
+"intervalos más sencillos; este enfoque ofrece una calidad general superior y "
+"un fichero más pequeño que el generado con una tasa de bits constante en "
+"toda la pista.<br>Por ello, la medida de la tasa de bits en esta barra "
+"deslizante es una estimación de la tasa de bits media de la pista codificada."
+"<br><b>160kb/s</b> es una buena elección para la reproducción de música con "
+"un dispositivo portátil.<br/>Algo inferior a <b>120kb/s</b> puede "
+"insatisfactorio para la música y algo superior a <b>205kb/s</b> es "
+"posiblemente demasiado."
+
+#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:159
+#: devices/encoders.cpp:158
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1005,7 +1011,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:164
+#: devices/encoders.cpp:163
 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 "
@@ -1041,15 +1047,63 @@ 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:184
+#: devices/encoders.cpp:183
 msgid "Quality rating"
 msgstr "Clasificación de calidad"
 
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr ""
+
+#: devices/encoders.cpp:203
+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:205
+#, fuzzy
+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 ""
+"La tasa de bits es la medida de la cantidad de datos utilizados para "
+"representar un segundo de la pista de audio.<br>El codificador <b>MP3</b> "
+"utilizado por Cantata permite una <a href=http://en.wikipedia.org/wiki/"
+"MP3#VBR>tasa de bits variable (VBR)</a> ; esto es, la tasa de bits varía a "
+"lo largo de la pista en base al contenido de audio. Los intervalos de datos "
+"más complejos se codifican con una tasa de bits más elevada que los "
+"intervalos más sencillos; este enfoque ofrece una calidad general superior y "
+"un fichero más pequeño que el generado con una tasa de bits constante en "
+"toda la pista.<br>Por ello, la medida de la tasa de bits en esta barra "
+"deslizante es una estimación de la tasa de bits media de la pista codificada."
+"<br><b>160kb/s</b> es una buena elección para la reproducción de música con "
+"un dispositivo portátil.<br/>Algo inferior a <b>120kb/s</b> puede "
+"insatisfactorio para la música y algo superior a <b>205kb/s</b> es "
+"posiblemente demasiado."
+
+#: devices/encoders.cpp:222 devices/encoders.cpp:319
+msgid "Bitrate"
+msgstr "Tasa de bits"
+
+#: devices/encoders.cpp:241
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:244
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1064,11 +1118,11 @@ msgstr ""
 "de datos.<br>Solo se recomienda para reproductores de música Apple y "
 "reproductores no compatibles con FLAC."
 
-#: devices/encoders.cpp:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:262
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1083,7 +1137,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:230
+#: devices/encoders.cpp:266
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1110,19 +1164,19 @@ msgstr ""
 "sustancialmente el tiempo de compresión pero generan un fichero "
 "superficialmente menor, y no se recomiendan."
 
-#: devices/encoders.cpp:245
+#: devices/encoders.cpp:281
 msgid "Compression level"
 msgstr "Nivel de compresión"
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:291
 msgid "Faster compression"
 msgstr "Compresión más rápida"
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:298
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:301
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1137,7 +1191,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:268
+#: devices/encoders.cpp:305
 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> "
@@ -1162,86 +1216,112 @@ msgstr ""
 "valor inferior a <b>112kb/s</b> puede ser insatisfactorio, y un valor "
 "superior a <b>182kb/s</b> es posiblemente demasiado."
 
-#: devices/encoders.cpp:282
-msgid "Bitrate"
-msgstr "Tasa de bits"
-
 #: devices/filenameschemedialog.cpp:33
 msgid "Filename Scheme"
 msgstr "Esquema de nombre de fichero"
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:52
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Varios artistas"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:53
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr ""
+
+#: devices/filenameschemedialog.cpp:55
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Now 5001"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:56
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Wobble"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:57
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Dance"
 
-#: devices/filenameschemedialog.cpp:99
+#: devices/filenameschemedialog.cpp:101
 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>Las siguientes variables se sustituyen por su significado correspondiente "
-"para cada nombre de pista.</p><p><table border=\"1\"><tr><th><em>Botón</em></"
-"th><th><em>Variable</em></th><th><em>Descripción</em></th></tr><tr><td>%"
-"albumartist%</td><td>%1</td><td>El artista del álbum. Para la mayoría de "
-"álbumes, será idéntico a <i>Artista de pista.</i> Para compilaciones, "
-"habitualmente será <i>Varios Artistas.</i> </td></tr><tr><td>%album%"
-"</td><td>%2</td><td>El nombre del álbum.</td></tr><tr><td>%artist%</td><td>%"
-"3</td><td>El artista de cada pista.</td></tr><tr><td>%title%</td><td>%"
-"4</td><td>El título de pista (sin <i>Artista de "
-"pista</i>).</td></tr><tr><td>%artistandtitle%</td><td>%5</td><td>El título "
-"de pista (con <i>Artista de pista</i>, si es distinto a <i>Artista del "
-"albúm</i>).</td></tr><tr><td>%track%</td><td>%6</td><td>El número de "
-"pista.</td></tr><tr><td>%discnumber%</td><td>%7</td><td>El número de disco "
-"de un álbum de varios discos. Habitualmente, las compilaciones se componen "
-"de varios discos.</td></tr><tr><td>%year%</td><td>%8</td><td>El año de "
-"publicación del álbum.</td></tr><tr><td>%genre%</td><td>%9</td><td>El género "
-"del álbum.</td></tr></table></p>"
-
-#: devices/fsdevice.cpp:678
+"for each track name.</p>"
+msgstr ""
+
+#: devices/filenameschemedialog.cpp:103
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</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
 msgid "Updating..."
 msgstr "Actualizando..."
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Leyendo caché"
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
@@ -1275,16 +1355,15 @@ msgstr "Actualizando ficheros..."
 msgid "Updating tracks..."
 msgstr "Actualizando pistas..."
 
-#: 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
+#: 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:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
+#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
+#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
 #: models/devicesmodel.cpp:140
 msgid "Not Connected"
 msgstr "Sin conexión"
@@ -1301,7 +1380,7 @@ msgstr "No se han encontrado coincidencias en MusicBrainz"
 msgid "Connection"
 msgstr "Conexión"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
 msgid "Music Library"
 msgstr "Biblioteca de música"
 
@@ -1392,8 +1471,8 @@ msgstr "Capacidad desconocida"
 
 #. i18n: file: gui/coverdialog.ui:30
 #. 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:53 gui/stdactions.cpp:92
+#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
 msgid "Search"
 msgstr "Buscar"
 
@@ -1437,21 +1516,21 @@ msgstr "No se ha analizado"
 msgid " (recommended)"
 msgstr " (recomendado)"
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:208
 msgid "Start Dynamic Playlist"
 msgstr "Iniciar lista de reproducción dinámica"
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:209
 msgid "Stop Dynamic Mode"
 msgstr "Detener modo dinámico"
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:257
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "1 norma"
 msgstr[1] "%1 normas"
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:396
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
@@ -1459,71 +1538,71 @@ msgstr ""
 "Es necesario instalar Perl en su sistema para el funcionamiento del modo "
 "dinámico de Cantata."
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:403
 msgid "Failed to locate rules file - %1"
 msgstr "No se ha podido detectar el fichero de normas - %1"
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:411
 msgid "Failed to remove previous rules file - %1"
 msgstr "No se ha podido eliminar el fichero anterior de normas - %1"
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:416
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "No se ha podido instalar el fichero de normas - %1 -> %2"
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:729
 msgid "Dynamizer has been terminated."
 msgstr "El dinamizador se ha interrumpido."
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:816
 msgid "Uknown"
 msgstr "Desconocido"
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:818
 msgid "Loading list of rules"
 msgstr "Cargando lista de normas"
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:819
 msgid "Saving rule"
 msgstr "Guardando norma"
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:820
 msgid "Deleting rule"
 msgstr "Eliminando norma"
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:821
 msgid "Setting active rule"
 msgstr "Definiendo norma activa"
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:822
 msgid "Stopping dynamizer"
 msgstr "Deteniendo dinamizador"
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:823
 msgid "Requesting ID details"
 msgstr "Solicitando detalles de identificación"
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:826
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Esperando la respuesta de la orden anterior. (%1)"
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:981
 msgid "Dynamizer is not active"
 msgstr "El dinamizador no está activo"
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:989
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Fallo al obtener la lista de normas dinámicas. (%1)"
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1020
 msgid "Failed to delete rules file. (%1)"
 msgstr "Fallo al eliminar el fichero de normas. (%1)"
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Fallo de control del estado del dinamizador. (%1)"
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1036
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Fallo al definir la lista de normas dinámicas. (%1)"
 
@@ -1557,15 +1636,15 @@ msgstr "Norma dinámica"
 
 #. 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:136 po/rc.cpp:280 rc.cpp:280
 msgid "Add"
 msgstr "Añadir"
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:202
 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:194
+#: dynamic/dynamicruledialog.cpp:205
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1581,45 +1660,51 @@ msgstr "Artistas similares"
 msgid "AlbumArtist"
 msgstr "Artista del álbum"
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr ""
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
 msgid "Album"
 msgstr "Álbum"
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. 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:106
+#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
 msgid "Genre"
 msgstr "Género"
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr "Fecha"
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr "Incluir"
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr "Excluir"
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr " (Exacto)"
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr "Normas dinámicas"
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
 "of <i>Include</i> rules will be used to build a set of songs that can be "
@@ -1640,20 +1725,20 @@ msgstr ""
 "un conjunto de canciones que no se utilizarán. Si no hay normas bajo "
 "<i>Incluir</i>, Cantata supone que todas las canciones (a excepción de las "
 "normas <i>Excluir</i>) se pueden utilizar. <br/>Por ejemplo, para que "
-"Cantata busque \"Canciones de rock por Wibble O canciones de Varios "
-"Artistas\", necesita lo siguiente: <ul><li>Include AlbumArtist=Wibble "
-"Genre=Rock</li><li>Include AlbumArtist=Various Artists</li></ul> Para que "
-"Cantata busque \"Canciones por Wibble pero no del álbum Abc\", necesita lo "
-"siguiente: <ul><li>Include AlbumArtist=Wibble</li><li>Exclude "
-"Album=Abc</li></ul>Después de generar el conjunto de canciones que utilizar, "
-"Cantata seleccionará canciones de forma aleatoria para mantener 10 "
-"canciones en la lista de reproducción.</p>"
-
-#: dynamic/dynamicrulesdialog.cpp:307
+"Cantata busque \"Canciones de rock por Wibble O canciones de Varios Artistas"
+"\", necesita lo siguiente: <ul><li>Include AlbumArtist=Wibble Genre=Rock</"
+"li><li>Include AlbumArtist=Various Artists</li></ul> Para que Cantata busque "
+"\"Canciones por Wibble pero no del álbum Abc\", necesita lo siguiente: "
+"<ul><li>Include AlbumArtist=Wibble</li><li>Exclude Album=Abc</li></"
+"ul>Después de generar el conjunto de canciones que utilizar, Cantata "
+"seleccionará canciones de forma aleatoria para mantener 10 canciones en la "
+"lista de reproducción.</p>"
+
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr "Fallo al guardar %1"
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
@@ -1661,31 +1746,35 @@ msgstr ""
 "Ya existe un conjunto de normas llamado «%1».\n"
 "¿Desea sobrescribir?"
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 msgid "Overwrite Rules"
 msgstr "Sobreescribir normas"
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr "Guardando %1"
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:168
 msgid "Deleting..."
 msgstr "Eliminando…"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Name"
 msgstr "Nombre"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Item Count"
 msgstr "Recuento de elementos"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Space Used"
 msgstr "Espacio utilizado"
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr ""
+
+#: gui/cachesettings.cpp:245
 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 "
@@ -1700,48 +1789,53 @@ msgstr ""
 "que no almacene ahí estos elementos). A continuación tiene un listado del "
 "uso del almacén de Cantata."
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:257
 msgid "Covers"
 msgstr "Carátulas"
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:258
 msgid "Backdrops"
 msgstr "Fondos"
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
+#: 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:246
+#: gui/cachesettings.cpp:264
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:265
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr ""
+
+#: gui/cachesettings.cpp:273
 msgid "Delete All"
 msgstr "Eliminar todo"
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:312
 msgid "Delete all '%1' items?"
 msgstr "¿Desea eliminar los '%1' elementos?"
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
 msgid "Delete Cache Items"
 msgstr "Eliminar los elementos de la caché"
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:322
 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:150 gui/main.cpp:169
+#: gui/coverdialog.cpp:151 gui/main.cpp:231
 msgid "Last.fm"
 msgstr "Last.fm"
 
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:165
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1752,7 +1846,7 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:183
+#: gui/coverdialog.cpp:184
 msgctxt ""
 "Google\n"
 "width x height (file size)"
@@ -1763,7 +1857,7 @@ msgstr ""
 "Google\n"
 "%1 x %2 (%3)"
 
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:204
 msgctxt ""
 "Discogs\n"
 "width x height"
@@ -1774,7 +1868,7 @@ msgstr ""
 "Discogs\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:237
+#: gui/coverdialog.cpp:238
 msgctxt ""
 "Current Cover\n"
 "width x height"
@@ -1785,20 +1879,20 @@ msgstr ""
 "Carátula actual\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:256
 msgid "Image"
 msgstr "Imagen"
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:259
 msgid "Downloading..."
 msgstr "Descargando..."
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Imagen (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:432
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
@@ -1806,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:432
+#: gui/coverdialog.cpp:433
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1814,13 +1908,13 @@ 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:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
+#: 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:613
+#: gui/coverdialog.cpp:579
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1828,37 +1922,44 @@ msgstr ""
 "Fallo al definir al carátula.\n"
 "No se pudo descargar a un fichero temporal."
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:607
 msgid "Failed to download image!"
 msgstr "Fallo al descargar la imagen."
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
 msgid "Load Local Cover"
 msgstr "Cargar carátula local"
 
-#: gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:795
 msgid "Images (*.png *.jpg)"
 msgstr "Imágenes (*.png *.jpg)"
 
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:800
 msgid "File is already in list!"
 msgstr "El fichero ya está listado."
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:804
 msgid "Failed to read image!"
 msgstr "Fallo al leer la imagen"
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:817
 msgid "Display"
 msgstr "Mostrar"
 
 #. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
 msgid "Remove"
 msgstr "Eliminar"
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1181
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1866,7 +1967,7 @@ msgstr ""
 "Fallo al definir la carátula.\n"
 "No se ha podido realizar una copia."
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1190
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1874,7 +1975,7 @@ msgstr ""
 "Fallo al definir la carátula.\n"
 "No ha podido realizar una copia de seguridad del original."
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1239
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1886,249 +1987,264 @@ msgstr ""
 msgid "Open In File Manager"
 msgstr "Abrir en el explorador de ficheros"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Established"
 msgstr "Conexión realizada"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Failed"
 msgstr "Fallo de conexión"
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. 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
+#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
+#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
 msgid "None"
 msgstr "Ninguno"
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:40
 msgid "Small"
 msgstr "Pequeña"
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:41
 msgid "Medium"
 msgstr "Mediana"
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:42
 msgid "Large"
 msgstr "Grande"
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:43
 msgid "Extra Large"
 msgstr "Extra grande"
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:48
 msgid "Simple Tree"
 msgstr "Árbol sencillo"
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:49
 msgid "Detailed Tree"
 msgstr "Árbol con detalles"
 
 #. i18n: file: gui/interfacesettings.ui:329
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
 msgid "Grouped Albums"
 msgstr "Álbumes agrupados"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:53
 msgid "List"
 msgstr "Lista"
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:55
 msgid "Icon/List"
 msgstr "Icono/Lista"
 
-#: gui/interfacesettings.cpp:85
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+msgstr "Directorios"
+
+#. 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)
+#: 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
+msgid "Style:"
+msgstr "Estilo:"
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr "Conectado"
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr "Dispositivos"
+
+#: gui/interfacesettings.cpp:178
 msgid "Grouped by 'Album Artist'"
 msgstr "Agrupado por «Artista del álbum»"
 
-#: gui/interfacesettings.cpp:86
+#: gui/interfacesettings.cpp:179
 msgid "Grouped under 'Various Artists'"
 msgstr "Agrupado bajo «Varios artistas»"
 
-#: 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/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
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:152
+#: gui/main.cpp:214
 msgid "A KDE client for MPD"
 msgstr "Un cliente de MPD para KDE"
 
-#: gui/main.cpp:154
-msgid "Copyright (C) 2011-2013 Craig Drummond"
-msgstr "Derechos de autor (C) 2011-2013 Craig Drummond"
+#: gui/main.cpp:216
+#, fuzzy
+msgid "Copyright (c) 2011–2013 Craig Drummond"
+msgstr "Derechos de autor (c) 2011-2013 Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Maintainer"
 msgstr "Desarrollador"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "UI Improvements"
 msgstr "Mejora de la interfaz"
 
-#: gui/main.cpp:160
+#: gui/main.cpp:222
 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:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
 msgid "QtMPC author"
 msgstr "Autor de QtMPC"
 
-#: gui/main.cpp:161
+#: gui/main.cpp:223
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:162
+#: gui/main.cpp:224
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:163
+#: gui/main.cpp:225
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
-"Fondos de vista contextual (considere enviar su fan-art de música a "
-"fanart.tv)"
+"Fondos de vista contextual (considere enviar su fan-art de música a fanart."
+"tv)"
 
-#: gui/main.cpp:168
+#: gui/main.cpp:230
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:230 gui/main.cpp:231
 msgid "Context view metadata"
 msgstr "Metadatos de vista contextual"
 
-#: gui/main.cpp:173
+#: gui/main.cpp:235
 msgid "URL to open"
 msgstr "URL a abrir"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:238
 msgid "Quit"
 msgstr "Cerrar"
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:242
 msgid "Show Window"
 msgstr "Mostrar ventana"
 
-#. 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:245 po/rc.cpp:418 rc.cpp:418
 msgid "Connect"
 msgstr "Conectar"
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
 msgid "Collection"
 msgstr "Colección"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:247
 msgid "Outputs"
 msgstr "Salidas"
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr "Pista anterior"
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr "Pista siguiente"
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr "Reproducir/Pausa"
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr "Detener después de la pista actual"
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Detener después de la pista"
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr "Subir volumen"
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr "Bajar volumen"
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr "Silenciar"
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:249
 msgid "Add To Stored Playlist"
 msgstr "Añadir a lista de reproducción guardada"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:250
 msgid "Remove From Play Queue"
 msgstr "Eliminar de la cola de reproducción"
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:251
 msgid "Copy Track Info"
 msgstr "Copiar información de pista"
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:252
 msgid "Crop"
 msgstr "Recortar"
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
+#: gui/mainwindow.cpp:253
+#, fuzzy
+msgid "Shuffle Tracks"
+msgstr "Pistas únicas"
+
+#: gui/mainwindow.cpp:254
+#, fuzzy
+msgid "Shuffle Albums"
 msgstr "Modificar orden"
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:255
 msgid "Add Stream URL"
 msgstr "Añadir URL de flujo"
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:256
 msgid "Clear"
 msgstr "Vaciar"
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:257
 msgid "Expanded Interface"
 msgstr "Interfaz expandida"
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:258
 msgid "Show Current Song Information"
 msgstr "Mostrar información de la canción actual"
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:261
 msgid "Full Screen"
 msgstr "Pantalla completa"
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:263
 msgid "Random"
 msgstr "Aleatorio"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:264
 msgid "Repeat"
 msgstr "Repetir"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid "Single"
 msgstr "Pistas únicas"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2136,11 +2252,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:290
+#: gui/mainwindow.cpp:266
 msgid "Consume"
 msgstr "Eliminar tras reproducir"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
@@ -2148,178 +2264,181 @@ 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:291
+#: gui/mainwindow.cpp:267
 msgid "Search Play Queue"
 msgstr "Buscar en lista de reproducción"
 
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:269
 msgid "Set Priority"
 msgstr "Definir prioridad"
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:271
 msgid "Play Stream"
 msgstr "Reproducir flujo"
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:273
 msgid "Locate In Library"
 msgstr "Ubicar en biblioteca"
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:275
 msgid "Edit Song Tags"
 msgstr "Editar etiquetas de canciones"
 
 #. i18n: file: gui/interfacesettings.ui:304
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
 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:302 po/rc.cpp:455 rc.cpp:455
+#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
 msgid "Artists"
 msgstr "Artistas"
 
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr "Directorios"
-
 #. 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
+#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
 msgid "Playlists"
 msgstr "Listas de reproducción"
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:282
 msgid "Dynamic"
 msgstr "Dinámico"
 
-#: gui/mainwindow.cpp:308
-msgid "Online"
-msgstr "Conectado"
-
-#: gui/mainwindow.cpp:310
-msgid "Devices"
-msgstr "Dispositivos"
-
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:288
 msgid "Expand All"
 msgstr "Expandir todo"
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:289
 msgid "Collapse All"
 msgstr "Contraer todo"
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:290
+#, fuzzy
+msgid "Remove All Songs"
+msgstr "Eliminar listas de reproducción"
+
+#: gui/mainwindow.cpp:398
 msgid "Info"
 msgstr "Información"
 
-#: gui/mainwindow.cpp:435
+#: gui/mainwindow.cpp:405
 msgid "Auto Hide"
 msgstr "Ocultar automáticamente"
 
-#: gui/mainwindow.cpp:441
+#: gui/mainwindow.cpp:411
 msgid "Monochrome Icons"
 msgstr "Iconos monocromos"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:541
 msgid "Server information..."
 msgstr "Información del servidor..."
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:552
 msgid "Configure Cantata..."
 msgstr "Configurar Cantata..."
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:559
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "Acerca de Cantata..."
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:571
 msgid "&File"
 msgstr "&Fichero"
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:574
 msgid "&Settings"
 msgstr "&Ajustes"
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
 msgid "&Help"
 msgstr "A&yuda"
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:948
 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:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
 msgid "Connecting to %1"
 msgstr "Conectando a %1"
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr ""
+
+#: gui/mainwindow.cpp:1447
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "Acerca de Cantata"
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1448
 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.html\">GPLv3</a>"
+"<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."
+"html\">GPLv3</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1450
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
 "QtMPC Authors<br/>"
 msgstr ""
-"Basado en <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 Los "
+"Basado en <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 Los "
 "autores de QtMPC<br/>"
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1451
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
-"Fondos de vista contextual gracias a <a "
-"href=\"http://www.fanart.tv\">FanArt.tv</a>"
+"Fondos de vista contextual gracias a <a href=\"http://www.fanart.tv\">FanArt."
+"tv</a>"
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1452
 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 ""
-"Metadatos de vista contextual gracias a <a "
-"href=\"http://www.wikipedia.org\">Wikipedia</a> y <a "
-"href=\"http://www.last.fm\">Last.fm</a>"
+"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:1468
+#: gui/mainwindow.cpp:1453
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
-"Considere enviar su propio fan-art de música a <a "
-"href=\"http://www.fanart.tv\">FanArt.tv</a>"
+"Considere enviar su propio fan-art de música a <a href=\"http://www.fanart.tv"
+"\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1479
+#: gui/mainwindow.cpp:1464
 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>"
 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>"
+"<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:1487
+#: gui/mainwindow.cpp:1472
 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</"
@@ -2328,91 +2447,87 @@ msgid ""
 "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>%2</td></tr><tr><td "
-"align=\"right\">Canciones:</td><td>%3</td></tr><tr><td "
-"align=\"right\">Manipuladores de URL:</td><td>%4</td></tr><tr><td "
-"align=\"right\">Duración total:</td><td>%5</td></tr><tr><td align=\"right\">Last "
+"<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>"
+"%2</td></tr><tr><td align=\"right\">Canciones:</td><td>%3</td></tr><tr><td "
+"align=\"right\">Manipuladores de URL:</td><td>%4</td></tr><tr><td align="
+"\"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:1496
+#: gui/mainwindow.cpp:1481
 msgid "Server Information"
 msgstr "Información del servidor"
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1728
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1730
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1773
 msgid "(Stream)"
 msgstr "(Flujo)"
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1775
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr "Volumen desactivado"
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1% (Muted)"
-msgstr "Volumen: %1 % (silenciado)"
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
+msgstr ""
 
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
-msgstr "Volumen %1%"
+#: gui/mainwindow.cpp:1990
+#, fuzzy
+msgid "Remove all songs from play queue?"
+msgstr "Eliminar de la cola de reproducción"
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
 msgid "Priority"
 msgstr "Prioridad"
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2080
 msgid "Enter priority (0..255):"
 msgstr "Introduzca la prioridad (0...255):"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Playlist Name"
 msgstr "Nombre de lista de reproducción"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Enter a name for the playlist:"
 msgstr "Introduzca un nombre para la lista de reproducción:"
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2106
 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:2146
+#: gui/mainwindow.cpp:2107
 msgid "Existing Playlist"
 msgstr "Lista de reproducción existente"
 
@@ -2424,10 +2539,10 @@ msgstr "Sin disminución progresiva de volumen"
 msgid " ms"
 msgstr " ms"
 
-#. i18n: file: devices/albumdetails.ui:152
+#. i18n: file: devices/albumdetails.ui:165
 #. 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:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
 msgid "Track"
 msgstr "Pista"
 
@@ -2435,7 +2550,7 @@ msgstr "Pista"
 msgid "Auto"
 msgstr "Automático"
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:164
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2445,7 +2560,7 @@ msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:26
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2453,7 +2568,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:153
+#: gui/playbacksettings.cpp:174
 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 "
@@ -2463,25 +2578,25 @@ 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>ReplayGain es una propuesta de estándar publicada en 2001 para normalizar "
 "el alto volumen percibido en formatos de audio de PC como MP3 y Ogg Vorbis. "
 "Funciona para pista/álbum, y ya es compatible con un número creciente de "
-"reproductores.</p><p>Se pueden utilizar los siguientes ajustes de "
-"ReplayGain:<ul><li><i>Ninguno</i> No se aplica ReplayGain.</li><li>Pista<i> "
-"El volumen se ajusta con las etiquetas ReplayGain de la "
-"pista</li><li><i>Álbum</i> El volumen se ajusta con las etiquetas ReplayGain "
-"del álbum.</li><li><i>Automático</i> El volumen se ajusta con las etiquetas "
-"ReplayGain 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:759 tags/trackorganiser.cpp:65
+"reproductores.</p><p>Se pueden utilizar los siguientes ajustes de ReplayGain:"
+"<ul><li><i>Ninguno</i> No se aplica ReplayGain.</li><li>Pista<i> El volumen "
+"se ajusta con las etiquetas ReplayGain de la pista</li><li><i>Álbum</i> El "
+"volumen se ajusta con las etiquetas ReplayGain del álbum.</"
+"li><li><i>Automático</i> El volumen se ajusta con las etiquetas ReplayGain "
+"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
 msgid "Rename"
 msgstr "Renombrar"
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:190
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2489,108 +2604,120 @@ msgstr ""
 "¿Desea eliminar las listas de reproducción seleccionadas?\n"
 "No se puede deshacer esta acción."
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:191
 msgid "Remove Playlists"
 msgstr "Eliminar listas de reproducción"
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
 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:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
 msgid "Overwrite Playlist"
 msgstr "Sobrescribir la lista de reproducción"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Rename Playlist"
 msgstr "Renombrar lista de reproducción"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Enter new name for playlist:"
 msgstr "Introduzca un nombre nuevo para la lista de reproducción:"
 
-#: gui/preferencesdialog.cpp:77
+#: gui/preferencesdialog.cpp:80
 msgid "Collection Settings"
 msgstr "Ajustes de collección"
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
 msgid "Playback"
 msgstr "Reproducción"
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:81
 msgid "Playback Settings"
 msgstr "Opciones de reproducción"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "Files"
 msgstr "Ficheros"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "File Settings"
 msgstr "Configuración de fichero"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface"
 msgstr "Interfaz"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface Settings"
 msgstr "Configuración de la interfaz"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:85
+#, fuzzy
+msgid "Streams Settings"
+msgstr "Emisión de flujo"
+
+#: gui/preferencesdialog.cpp:89
+#, fuzzy
+msgid "Online Providers"
+msgstr "Proveedores de letras"
+
+#: gui/preferencesdialog.cpp:92
 msgid "Context"
 msgstr "Contexto"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:92
 msgid "Context View Settings"
 msgstr "Configuración de visualización de contexto"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server"
 msgstr "Servidor HTTP"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server Settings"
 msgstr "Configuración del servidor HTTP"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:103
 msgid "Audio CD Settings"
 msgstr "Configuración de CD de audio"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgid "Proxy"
 msgstr "Proxy"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Ajustes de proxy"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Atajos de teclado"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Configuración de atajos de teclado"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cache"
 msgstr "Almacén"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cached Items"
 msgstr "Elementos almacenados"
 
-#: gui/preferencesdialog.cpp:118
+#: gui/preferencesdialog.cpp:116
 msgid "Configure"
 msgstr "Configuración"
 
-#: gui/serversettings.cpp:75
+#: gui/serversettings.cpp:87
 msgid ""
 "<i> This folder will also be used to locate music files for transferring to "
 "(and from) devices.</i>"
@@ -2598,7 +2725,7 @@ msgstr ""
 "<i> Este directorio se utilizará para ubicar los ficheros de audio para la "
 "transferencia desde y al dispositivo.</i>"
 
-#: gui/serversettings.cpp:88
+#: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr "No está en uso"
 
@@ -2614,12 +2741,12 @@ 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: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:208 po/rc.cpp:247 po/rc.cpp:705
+#: rc.cpp:208 rc.cpp:247 rc.cpp:705
 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 "
@@ -2633,7 +2760,7 @@ msgstr ""
 "instalar e iniciar la aplicación <code>cantata-dynamic</code> en el sistema "
 "host relevante. Cantata no puede iniciar/detener este servicio.</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 "
@@ -2651,19 +2778,19 @@ msgstr ""
 "instancia a nivel de usuario del dinamizador para facilitar las listas de "
 "reproducción dinámicas.</i>"
 
-#: gui/serversettings.cpp:109
+#: 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 "
 "artist of the current song, and %album% will be replaced with the album name."
 "</i></p>"
 msgstr ""
-"<p>Nombre de fichero (sin extensión) para guardar las carátulas "
-"descargadas.<br/>Si no se define, se utiliza «cover».<br/><br/><i>%artist% "
-"se sustituirá por el artista de álbum de la canción actual, y %album% se "
-"sustituirá por el nombre del álbum.</i></p>"
+"<p>Nombre de fichero (sin extensión) para guardar las carátulas descargadas."
+"<br/>Si no se define, se utiliza «cover».<br/><br/><i>%artist% se sustituirá "
+"por el artista de álbum de la canción actual, y %album% se sustituirá por el "
+"nombre del álbum.</i></p>"
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:252
 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</"
@@ -2675,127 +2802,195 @@ 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:233
+#: gui/serversettings.cpp:255
 msgid "Add Collection"
 msgstr "Añadir colección"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Standard"
 msgstr "Estándar"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Basic"
 msgstr "Básico"
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:297
 msgid "Delete <b>%1</b>?"
 msgstr "¿Eliminar <b>%1</b>?"
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:298
 msgid "Delete"
 msgstr "Eliminar"
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:336
 msgid "New Collection %1"
 msgstr "Colección nueva %1"
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
 msgid "Default"
 msgstr "Predefinido"
 
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:80
+msgid "Do not use media keys to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:81
+msgid "Use media keys to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:84
+msgid "Use media keys, as configured in desktop settings, to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:85
+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
+#, 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"
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr "Pista siguiente"
+
+#: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr "Reproducir/Pausa"
+
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr "Detener después de la pista actual"
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr "Subir volumen"
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr "Bajar volumen"
+
+#: gui/stdactions.cpp:63
 msgid "Save As"
 msgstr "Guardar como"
 
-#: gui/stdactions.cpp:56
+#: gui/stdactions.cpp:64
 msgid "Add To Play Queue"
 msgstr "Añadir a lista de reproducción"
 
-#: gui/stdactions.cpp:57
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr ""
+
+#: gui/stdactions.cpp:66
 msgid "Replace Play Queue"
 msgstr "Reemplazar lista de reproducción"
 
-#: gui/stdactions.cpp:58
+#: gui/stdactions.cpp:67
 msgid "Add With Priority"
 msgstr "Añadir con prioridad"
 
-#: gui/stdactions.cpp:59
+#: gui/stdactions.cpp:68
 msgid "Highest Priority (255)"
 msgstr "Prioridad máxima (255)"
 
-#: gui/stdactions.cpp:60
+#: gui/stdactions.cpp:69
 msgid "High Priority (200)"
 msgstr "Prioridad alta (200)"
 
-#: gui/stdactions.cpp:61
+#: gui/stdactions.cpp:70
 msgid "Medium Priority (125)"
 msgstr "Prioridad media (125)"
 
-#: gui/stdactions.cpp:62
+#: gui/stdactions.cpp:71
 msgid "Low Priority (50)"
 msgstr "Prioridad baja (50)"
 
-#: gui/stdactions.cpp:63
+#: gui/stdactions.cpp:72
 msgid "Default Priority (0)"
 msgstr "Prioridad predefinida (0)"
 
-#: gui/stdactions.cpp:64
+#: gui/stdactions.cpp:73
 msgid "Custom Priority..."
 msgstr "Prioridad personalizada..."
 
-#: gui/stdactions.cpp:65
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr "Añadir a lista de reproducción"
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
 msgid "Organize Files"
 msgstr "Organizar ficheros"
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
 msgstr "Editar etiquetas"
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
 msgid "ReplayGain"
 msgstr "Ganancia de reproducción"
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 msgid "Copy Songs To Device"
 msgstr "Copiar canciones a dispositivo"
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 msgid "Set Image"
 msgstr "Establecer imagen"
 
-#: gui/stdactions.cpp:79
+#: gui/stdactions.cpp:88
 msgid "Refresh Database"
 msgstr "Actualizar base de datos"
 
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Retroceder"
 
-#: gui/trayitem.cpp:165
+#: gui/trayitem.cpp:192
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 en %2"
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:193
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:195
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 por %2 en %3"
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:196
 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:196
+#: gui/trayitem.cpp:223
 msgid "Now playing"
 msgstr "En reproducción"
 
@@ -2819,6 +3014,16 @@ msgstr "Primera interfaz activa"
 msgid "Inactive"
 msgstr "Inactivo"
 
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr "Hoja cue"
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr "Lista de reproducción"
+
 #: models/devicesmodel.cpp:108
 msgid "Configure Device"
 msgstr "Configurar dispositivo"
@@ -2839,7 +3044,7 @@ msgstr "Desconecte el dispositivo"
 msgid "Edit CD Details"
 msgstr "Editar detalles de CD"
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:690
 msgid "No Devices Attached"
 msgstr "No hay dispositivos conectados"
 
@@ -2851,28 +3056,28 @@ msgstr "No ha iniciado una sesión"
 msgid "Logged in"
 msgstr "Sesión iniciada"
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 msgid "Unknown error"
 msgstr "Error desconocido"
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr "Ninguna suscripción"
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr "No tiene ninguna suscripción activa"
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr "Sesión iniciada (finalización:%1)"
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr "Sesión finalizada"
 
 #: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "1 entrada"
@@ -2882,194 +3087,228 @@ msgstr[1] "%1 entradas"
 msgid "Audio File"
 msgstr "Fichero de audio"
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr "Lista de reproducción"
-
-#: models/dirviewmodel.cpp:192 models/musicmodel.cpp:120
-msgid "Cue Sheet"
-msgstr "Hoja cue"
-
-#: models/musiclibraryitemartist.cpp:218 models/musiclibraryitemartist.cpp:231
-#: models/musiclibraryitemroot.cpp:798
+#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
 msgid "Single Tracks"
 msgstr "Pistas únicas"
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "1 pista"
 msgstr[1] "%1 pistas"
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:185
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "1 artista"
 msgstr[1] "%1 artistas"
 
-#: models/musicmodel.cpp:172
+#: models/musicmodel.cpp:192
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "1 álbum"
 msgstr[1] "%1 álbumes"
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
-msgstr "Configurar servicio online"
+#: models/musicmodel.cpp:198
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] ""
+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
+#, fuzzy
+msgid "Configure Service"
+msgstr "Configurar dispositivo"
+
+#: models/onlineservicesmodel.cpp:84
+#, fuzzy
+msgid "Refresh Service"
+msgstr "Actualizar dispositivo"
+
+#: models/onlineservicesmodel.cpp:85
+#, fuzzy
+msgid "Add Subscription"
+msgstr "Ninguna suscripción"
 
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
-msgstr "Actualizar servicio online"
+#: models/onlineservicesmodel.cpp:86
+#, fuzzy
+msgid "Remove Subscription"
+msgstr "Ninguna suscripción"
 
-#: models/onlineservicesmodel.cpp:125
+#: models/onlineservicesmodel.cpp:87
+#, fuzzy
+msgid "Refresh Subscription"
+msgstr "Ninguna suscripción"
+
+#: models/onlineservicesmodel.cpp:137
 msgid "Last Search:%1"
 msgstr "Última búsqueda:%1"
 
-#: models/onlineservicesmodel.cpp:136
+#: models/onlineservicesmodel.cpp:149
 msgid "Searching..."
 msgstr "Buscando..."
 
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:670
 msgid "Not Loaded"
 msgstr "No se ha cargado"
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:155
 msgid "Use search to locate tracks"
 msgstr "Utilizar búsqueda para ubicar pistas"
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:166
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: models/onlineservicesmodel.cpp:177
+#, fuzzy
+msgid "(Downloading: %1%)"
+msgstr "Descargando"
+
+#: models/onlineservicesmodel.cpp:235
+#, fuzzy
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr "%1 (Disco %2)"
+
+#: models/playlistsmodel.cpp:77
 msgid "New Playlist..."
 msgstr "Nueva lista de reproducción…"
 
-#: models/playqueuemodel.cpp:105
+#: models/playqueuemodel.cpp:102
 msgctxt "Track Number (#)"
 msgid "#"
 msgstr "Núm."
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:103
 msgid "Length"
 msgstr "Duración"
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:104
 msgid "Disc"
 msgstr "Disco"
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:138
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
 msgid "Year"
 msgstr "Año"
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:360
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Prioridad: %1)</b>"
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
 msgid "Loading..."
 msgstr "Cargando…"
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:286
 msgid "Bookmarks"
 msgstr "Favoritos"
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:560
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:563
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:564
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:567
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:568
 msgid "Digitally Imported"
 msgstr "Importe digitalmente"
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:569
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:570
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:571
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:572
 msgid "Favorites"
 msgstr "Favoritos"
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr "Listen Live"
+
+#: models/streamsmodel.cpp:578
 msgid "Bookmark Category"
 msgstr "Categoría de favorito"
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:579
 msgid "Add Stream To Favorites"
 msgstr "Añadir flujo a favoritos"
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:580
 msgid "Configure Streams"
 msgstr "Configuración de flujos"
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:660
 msgid "%1 (Read-Only)"
 msgstr "%1 (Solo lectura)"
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1241
 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:1455
+#: models/streamsmodel.cpp:1639
 msgid "All"
 msgstr "Todo"
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr "Listen Live"
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:154
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:156
 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:372 mpd/mpdconnection.cpp:415
+#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
+#: mpd/mpdconnection.cpp:1036
 msgid "Connection to %1 failed"
 msgstr "Fallo de conexión a %1"
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Fallo de conexión a %1 - contraseña incorrecta"
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:455
 msgid "Failed to send command to %1 - not connected"
 msgstr "Fallo al enviar la orden a %1: no conectado"
 
-#: mpd/mpdconnection.cpp:472
+#: mpd/mpdconnection.cpp:491
 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:474
+#: mpd/mpdconnection.cpp:493
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3077,37 +3316,31 @@ msgstr ""
 "Fallo al cargar. MPD solo puede reproducir ficheros locales si se conecta a "
 "través de un fichero socket local."
 
-#: mpd/mpdconnection.cpp:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Fallo al enviar la orden. Desconectado de %1"
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1171
 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:1158
+#: mpd/mpdconnection.cpp:1183
 msgid "Failed to save <b>%1</b>"
 msgstr "Fallo al crear <b>%1</b>"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1196
 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:1174
+#: mpd/mpdconnection.cpp:1199
 msgid "You cannot add a playlist to another playlist!"
 msgstr "No puede añadir una lista de reproducción a otra."
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] "1 día %2"
-msgstr[1] "%1 días %2"
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr "Personal"
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:343
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3149,19 +3382,19 @@ msgstr "Ogg"
 msgid "Streaming format:"
 msgstr "Formato de flujo:"
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr "Emisión de flujo"
 
-#: 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"
 
@@ -3169,10 +3402,6 @@ msgstr "WAV"
 msgid "Magnatune Settings"
 msgstr "Configuración de Magnatune"
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr "Datos de la cuenta:"
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -3181,8 +3410,8 @@ msgstr "Datos de la cuenta:"
 #. 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:711 po/rc.cpp:729
+#: rc.cpp:711 rc.cpp:729
 msgid "Username:"
 msgstr "Nombre de usuario:"
 
@@ -3190,7 +3419,7 @@ msgstr "Nombre de usuario:"
 #. 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)
@@ -3202,7 +3431,7 @@ msgstr "Nombre de usuario:"
 #. 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)
@@ -3210,53 +3439,281 @@ 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: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: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
 msgid "Password:"
 msgstr "Contraseña:"
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr "Datos de la cuenta:"
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr "Descargas:"
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr "Descargando"
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr "Actualizando visualización"
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr "Agrupación de pistas"
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr "Analizando respuesta"
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr "Fallo de análisis"
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr "Fallo de descarga"
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
 msgstr "Descargar a biblioteca"
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
+#, fuzzy
+msgid "Search For Podcasts"
+msgstr "Búsqueda de letras"
+
+#: online/onlineservicespage.cpp:63
+msgid "Download Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:329
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Buscar %1:"
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:464
 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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:621
+msgid "Refresh episode listing from <b>%1</b>?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:695
+msgid "All selected podcasts have already been downloaded!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:699
+msgid "Do you wish to download the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:705
+#, fuzzy
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr "¿Desea eliminar los %1 flujos seleccionados?"
+
+#: online/onlineservicespage.cpp:753
+msgid "All selected downloaded podcast episodes have already been deleted!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:757
+msgid ""
+"Do you wish to delete the downloaded file of the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:760
+msgid ""
+"Do you wish to the delete downloaded files of the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:763
+msgid ""
+"Do you wish to the delete downloaded files of the selected podcast episodes?"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:243
+msgid "RSS:"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:252
+#, fuzzy
+msgid "Podcast details"
+msgstr "Detalles de conexión"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Select a podcast to display its details"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:322
+msgid "Enter search term..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:372
+#, fuzzy
+msgid "Failed to fetch podcasts from %1"
+msgstr "Fallo de conexión con «%1»"
+
+#: online/podcastsearchdialog.cpp:378
+msgid "There was a problem parsing the response from %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:439
+#, fuzzy
+msgid "Failed to download directory listing"
+msgstr "Fallo al descargar la imagen."
+
+#: online/podcastsearchdialog.cpp:447
+#, fuzzy
+msgid "Failed to parse directory listing"
+msgstr "Fallo de análisis"
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#, fuzzy
+msgid "Search %1"
+msgstr "Buscar %1:"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:602
+#, fuzzy
+msgid "Subscription added"
+msgstr "Ninguna suscripción"
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr ""
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr ""
+
+#: online/podcastservice.cpp:284
+msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
+msgstr ""
+
+#: online/podcastservice.cpp:286
+#, fuzzy
+msgid "Failed to parse %1"
+msgstr "Fallo de análisis"
+
+#: online/podcastservice.cpp:290
+#, fuzzy
+msgid "Failed to download %1"
+msgstr "Fallo de descarga"
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:59
+#, fuzzy
+msgid "Download episodes to:"
+msgstr "Descargas:"
+
+#: online/podcastsettingsdialog.cpp:60
+#, fuzzy
+msgid "Automatically download new episodes:"
+msgstr "Consulta automática:"
+
+#: online/podcastsettingsdialog.cpp:82
+#, fuzzy
+msgid "Podcast Settings"
+msgstr "Ajustes de proxy"
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:92
+msgid "Every week"
+msgstr ""
+
 #. i18n: file: context/othersettings.ui:19
 #. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
 #: po/rc.cpp:3 rc.cpp:3
@@ -3329,8 +3786,8 @@ msgstr "Copiar canciones desde:"
 #. 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
-#: rc.cpp:49 rc.cpp:721
+#: 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
 msgid "TextLabel"
 msgstr "TextLabel"
 
@@ -3376,93 +3833,109 @@ msgstr "Para copiar:"
 msgid "Album Details"
 msgstr "Detalles del álbum"
 
-#. i18n: file: devices/albumdetails.ui:60
+#. 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:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:73
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
+#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
 msgid "Genre:"
 msgstr "Género:"
 
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:86
 #. 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:86
 #. 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:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
 msgid "Year:"
 msgstr "Año:"
 
-#. 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 "Único artista:"
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:99
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #: po/rc.cpp:70 rc.cpp:70
 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:"
+msgstr "Único artista:"
+
 #. i18n: file: devices/audiocdsettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:88 rc.cpp:88
 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:88 rc.cpp:88
+#: po/rc.cpp:91 rc.cpp:91
 msgid "Automatically lookup:"
 msgstr "Consulta automática:"
 
 #. i18n: file: devices/audiocdsettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:94 rc.cpp:94
 msgid "Initially look up via:"
 msgstr "Consulta inicial mediante:"
 
 #. i18n: file: devices/audiocdsettings.ui:52
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:97 rc.cpp:97
 msgid "CDDB Host:"
 msgstr "Host CDDB:"
 
 #. i18n: file: devices/audiocdsettings.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:100 rc.cpp:100
 msgid "CDDB Port:"
 msgstr "Puerto CDDB:"
 
 #. i18n: file: devices/audiocdsettings.ui:88
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:103 rc.cpp:103
 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:103 rc.cpp:103
+#: 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:107
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:106 rc.cpp:106
+#: po/rc.cpp:109 rc.cpp:109
 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:109 rc.cpp:109
+#: po/rc.cpp:112 rc.cpp:112
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3472,62 +3945,62 @@ 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: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
 msgid "Music folder:"
 msgstr "Directorio de música:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:118 rc.cpp:118
 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:118 rc.cpp:118
+#: po/rc.cpp:121 rc.cpp:121
 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:121 rc.cpp:121
+#: po/rc.cpp:124 rc.cpp:124
 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:124 rc.cpp:124
+#: po/rc.cpp:127 rc.cpp:127
 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:127 rc.cpp:127
+#: po/rc.cpp:130 rc.cpp:130
 msgid "Use cache:"
 msgstr "Utilizar caché:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:121
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:133 rc.cpp:133
 msgid "Default volume:"
 msgstr "Volumen predefinido:"
 
@@ -3539,7 +4012,7 @@ msgstr "Volumen predefinido:"
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
 #. 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:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
 msgid "Filenames"
 msgstr "Nombres de fichero"
 
@@ -3551,7 +4024,7 @@ msgstr "Nombres de fichero"
 #. 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
+#: 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:"
 
@@ -3563,7 +4036,7 @@ msgstr "Utilizar sólo caracteres ASCII:"
 #. 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
+#: 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:"
 
@@ -3575,7 +4048,7 @@ msgstr "Sustituir espacios por guiones bajos:"
 #. 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
+#: 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:"
 
@@ -3587,7 +4060,7 @@ msgstr "Ignorar «The» en nombres de artista:"
 #. 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:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
 msgid "Filename scheme:"
 msgstr "Esquema de nombre de fichero:"
 
@@ -3599,19 +4072,19 @@ msgstr "Esquema de nombre de fichero:"
 #. 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
+#: po/rc.cpp:151 po/rc.cpp:831 rc.cpp:151 rc.cpp:831
 msgid "VFAT safe:"
 msgstr "Compatibilidad con VFAT:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:250
 #. i18n: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:154 rc.cpp:154
 msgid "Transcoding"
 msgstr "Transcodificación"
 
 #. i18n: file: devices/devicepropertieswidget.ui:261
 #. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:157 rc.cpp:157
 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 "
@@ -3619,61 +4092,61 @@ msgstr ""
 
 #. i18n: file: devices/filenameschemedialog.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:160 rc.cpp:160
 msgid "Example:"
 msgstr "Ejemplo:"
 
 #. i18n: file: devices/filenameschemedialog.ui:58
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:163 rc.cpp:163
 msgid "About filename schemes"
 msgstr "Acerca de esquemas de nombre de fichero"
 
-#. i18n: file: devices/filenameschemedialog.ui:82
+#. i18n: file: devices/filenameschemedialog.ui:70
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:166 rc.cpp:166
 msgid "Album Artist"
 msgstr "Artista del álbum"
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:77
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:169 rc.cpp:169
 msgid "Album Title"
 msgstr "Nombre de álbum"
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:91
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:175 rc.cpp:175
 msgid "Track Artist"
 msgstr "Artista de pista"
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:98
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:178 rc.cpp:178
 msgid "Track Title"
 msgstr "Nombre de pista"
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:117
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:181 rc.cpp:181
 msgid "Track Title (+Artist)"
 msgstr "Nombre de pista (+Artista)"
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:124
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:184 rc.cpp:184
 msgid "Track #"
 msgstr "Núm. de pista"
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:131
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:187 rc.cpp:187
 msgid "CD #"
 msgstr "Núm. de disco"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:196 rc.cpp:196
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3683,17 +4156,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:162
 #. 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:162
 #. 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:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
 msgid "Type:"
 msgstr "Tipo:"
 
@@ -3705,14 +4178,14 @@ 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:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
+#: rc.cpp:638
 msgid "Name:"
 msgstr "Nombre:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#: po/rc.cpp:205 rc.cpp:205
 msgid "Options"
 msgstr "Opciones"
 
@@ -3720,7 +4193,7 @@ msgstr "Opciones"
 #. 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)
@@ -3730,14 +4203,14 @@ msgstr "Opciones"
 #. 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: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
 msgid "Port:"
 msgstr "Puerto:"
 
@@ -3753,7 +4226,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:208 po/rc.cpp:226 po/rc.cpp:247 rc.cpp:208 rc.cpp:226 rc.cpp:247
+#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
 msgid "User:"
 msgstr "Usuario:"
 
@@ -3765,7 +4238,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:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
 msgid "Domain:"
 msgstr "Dominio:"
 
@@ -3777,7 +4250,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:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
 msgid "Share:"
 msgstr "Recurso compartido:"
 
@@ -3789,7 +4262,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:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
 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 "
@@ -3802,7 +4275,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:223 rc.cpp:223
+#: po/rc.cpp:229 rc.cpp:229
 msgid "Service name:"
 msgstr "Nombre del servicio:"
 
@@ -3814,19 +4287,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:250 po/rc.cpp:259 rc.cpp:250 rc.cpp:259
+#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
 msgid "Folder:"
 msgstr "Directorio:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:259 rc.cpp:259
 msgid "Extra Options:"
 msgstr "Opciones adicionales:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:262 rc.cpp:262
 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 "
@@ -3838,7 +4311,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:268 rc.cpp:268
 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, "
@@ -3850,115 +4323,115 @@ msgstr ""
 "localmente. Para reproductores normales con conexión USB, Cantata mostrará "
 "automáticamente el dispositivo cuando se conecte.</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:271 rc.cpp:271
 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:30
+#. i18n: file: dynamic/dynamicpage.ui:33
 #. i18n: ectx: property (text), widget (StatusLabel, remoteRunningLabel)
-#: po/rc.cpp:268 rc.cpp:268
+#: po/rc.cpp:274 rc.cpp:274
 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:271 rc.cpp:271
+#: po/rc.cpp:277 rc.cpp:277
 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:277 streams/streamspage.cpp:64 rc.cpp:277
+#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
 msgid "Edit"
 msgstr "Editar"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:289 rc.cpp:289
 msgid "About Rules"
 msgstr "Acerca de las normas"
 
 #. i18n: file: dynamic/dynamicrule.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:295 rc.cpp:295
 msgid "Album Artist:"
 msgstr "Artista del álbum:"
 
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
+#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
 msgid "Album:"
 msgstr "Álbum:"
 
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:103
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:310 rc.cpp:310
 msgid "From Year:"
 msgstr "Del año:"
 
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
 msgid "Any"
 msgstr "Todo"
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:126
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:316 rc.cpp:316
 msgid "To Year:"
 msgstr "Al año:"
 
-#. i18n: file: dynamic/dynamicrule.ui:136
+#. i18n: file: dynamic/dynamicrule.ui:149
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
+#: po/rc.cpp:322 rc.cpp:322
 msgid "Exact match:"
 msgstr "Coincidencia exacta:"
 
-#. i18n: file: dynamic/dynamicrule.ui:160
+#. i18n: file: dynamic/dynamicrule.ui:173
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
+#: 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:165
+#. i18n: file: dynamic/dynamicrule.ui:178
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
+#: po/rc.cpp:331 rc.cpp:331
 msgid "Exclude songs that match the following:"
 msgstr "Excluir las canciones que coinciden con lo siguiente:"
 
-#. i18n: file: dynamic/dynamicrule.ui:173
+#. i18n: file: dynamic/dynamicrule.ui:186
 #. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
+#: po/rc.cpp:334 rc.cpp:334
 msgid "Artists similar to:"
 msgstr "Artistas similares a:"
 
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:236
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:337 rc.cpp:337
 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:249
+#. i18n: file: dynamic/dynamicrule.ui:262
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:340 rc.cpp:340
 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>"
@@ -3969,70 +4442,78 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
+#: 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: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
+#: 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:717
+#. 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:717
+#. i18n: file: gui/initialsettingswizard.ui:716
 #. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
+#: 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:730
+#. 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:730
+#. i18n: file: gui/initialsettingswizard.ui:729
 #. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
+#: 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:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
+#. i18n: file: gui/filesettings.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
+#: 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:93
+#. i18n: file: gui/filesettings.ui:110
 #. 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: 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:364 rc.cpp:364
+#, 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>NOTA:</b> Si se selecciona que Cantata almacene portadas o letras "
 "dentro de la carpeta de música, y el usuario no tiene permisos de escritura "
@@ -4040,20 +4521,19 @@ msgstr ""
 "personal. Por otra parte, para flujos, si el usuario no tiene permisos de "
 "escritura, sólo podrá ver (y reproducir) los flujos almacenados en la "
 "carpeta de música, y no podrá añadir o editar ningún flujo. Si se selecciona "
-"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>"
+"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:128
+#. i18n: file: gui/filesettings.ui:145
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:367 rc.cpp:367
 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>"
+"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>NOTA:</b> Si se modifica la ubicación dónde almacenar los flujos(por "
 "ejemplo, conmuta la opción «Guardar la lista de flujos favoritos en el "
@@ -4064,19 +4544,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:370 rc.cpp:370
 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:361 rc.cpp:361
+#: po/rc.cpp:373 rc.cpp:373
 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:364 rc.cpp:364
+#: po/rc.cpp:376 rc.cpp:376
 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 "
@@ -4090,20 +4570,19 @@ msgstr ""
 "potente y fácil de utilizar. MPD es una aplicación de segundo plano que "
 "sirve para reproducir música.</p><p>Para más información sobre MPD, consulte "
 "el sitio web de MPD <a href=\"http://www.musicpd.org\"><span style=\" text-"
-"decoration: underline; "
-"color:#0000ff;\">http://www.musicpd.org</span></a></p><p>Este asistente le "
-"guiará por los pasos necesarios para el funcionamiento adecuado de "
-"Cantata.</p></body></html>"
+"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
+"p><p>Este asistente le guiará por los pasos necesarios para el "
+"funcionamiento adecuado de Cantata.</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:379 rc.cpp:379
 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:370 rc.cpp:370
+#: po/rc.cpp:382 rc.cpp:382
 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 "
@@ -4118,30 +4597,14 @@ msgstr ""
 "inicialmente (o arranque) a 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 "Configuración básica para un usuario"
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:385 rc.cpp:385
 msgid "Standard multi-user/server setup"
 msgstr "Configuración estándar para varios usuarios/servidores"
 
-#. 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>Seleccione esta opción si no comparte con otros su colección de música, y "
-"desea que Cantata configure y controle la instancia de MPD.</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:388 rc.cpp:388
 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 "
@@ -4155,9 +4618,25 @@ msgstr ""
 "puede controlar el inicio y parada del servidor MPD. Por ello, tendrá que "
 "asegurarse de que MPD está configurado y en ejecución.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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>Seleccione esta opción si no comparte con otros su colección de música, y "
+"desea que Cantata configure y controle la instancia de MPD.</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:397 rc.cpp:397
 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-"
@@ -4171,15 +4650,15 @@ msgstr ""
 "asistente le guiará por los pasos necesarios para el funcionamiento adecuado "
 "de Cantata.</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:400 rc.cpp:400
 msgid "Connection details"
 msgstr "Detalles de conexión"
 
-#. 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:403 rc.cpp:403
 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."
@@ -4188,21 +4667,21 @@ msgstr ""
 "Introduzca los detalles pertinentes y utilice el botón «Conectar» para "
 "probar la conexión."
 
-#. 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:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
 msgid "Host (or local socket):"
 msgstr "Host (o socket local):"
 
-#. 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:421 rc.cpp:421
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
@@ -4210,15 +4689,15 @@ msgstr ""
 "<i><b>NOTE:</b> El ajuste «Directorio de música» se utiliza para buscar "
 "portadas, letras y otros.</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:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
 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>"
@@ -4226,27 +4705,27 @@ msgstr ""
 "<i><b>NOTA:</b> Al utilizar un «socket» local, se debe especificar la ruta "
 "absoluta al mismo. (El número de puerto no es necesario.)</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:427 rc.cpp:427
 msgid "Music folder"
 msgstr "Directorio de música"
 
-#. 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:430 rc.cpp:430
 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: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:436 rc.cpp:436
 msgid "Covers, Lyrics, and Streams"
 msgstr "Portadas, letras y flujos"
 
-#. 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:439 rc.cpp:439
 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 "
@@ -4258,12 +4737,34 @@ msgstr ""
 "también permite almacenar una lista de flujos de Internet (por ejemplo, "
 "emisoras de radio) que desee reproducir.</p><p>Para cada uno de estos "
 "elementos, confirme si desea que Cantata guarde los ficheros pertinentes "
-"dentro del directorio de músico, o dentro de las carpetas de usuario "
-"«cache/config».</p>"
+"dentro del directorio de músico, o dentro de las carpetas de usuario «cache/"
+"config».</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:808
+#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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>NOTA:</b> Si se selecciona que Cantata almacene portadas o letras "
+"dentro de la carpeta de música, y el usuario no tiene permisos de escritura "
+"para esta carpeta, Cantata almacenará los ficheros en su carpeta de caché "
+"personal. Por otra parte, para flujos, si el usuario no tiene permisos de "
+"escritura, sólo podrá ver (y reproducir) los flujos almacenados en la "
+"carpeta de música, y no podrá añadir o editar ningún flujo. Si se selecciona "
+"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:443 rc.cpp:443
+#: po/rc.cpp:457 rc.cpp:457
 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 "
@@ -4274,15 +4775,15 @@ msgstr ""
 "externos. Por ello, los ajustes en la parte superior se deben dejar "
 "desactivados.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:841
+#. i18n: file: gui/initialsettingswizard.ui:857
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:460 rc.cpp:460
 msgid "Finished!"
 msgstr "Finalizado"
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:880
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:463 rc.cpp:463
 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 "
@@ -4293,9 +4794,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:902
+#. i18n: file: gui/initialsettingswizard.ui:918
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:466 rc.cpp:466
 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 "
@@ -4308,27 +4809,6 @@ 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: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 "Estilo:"
-
 #. i18n: file: gui/interfacesettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
@@ -4337,25 +4817,25 @@ msgstr "Estilo:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
 #. 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:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
 msgid "Covers:"
 msgstr "Carátulas:"
 
 #. i18n: file: gui/interfacesettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
+#: po/rc.cpp:478 rc.cpp:478
 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:467 rc.cpp:467
+#: po/rc.cpp:481 rc.cpp:481
 msgid "Show album year:"
 msgstr "Mostrar año de publicación:"
 
 #. i18n: file: gui/interfacesettings.ui:123
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:484 rc.cpp:484
 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"
@@ -4373,25 +4853,25 @@ msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:172
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:497 rc.cpp:497
 msgid "Sort albums:"
 msgstr "Organizar álbumes:"
 
 #. i18n: file: gui/interfacesettings.ui:183
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Album/Artist"
 msgstr "Álbum/Artista"
 
 #. i18n: file: gui/interfacesettings.ui:188
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:503 rc.cpp:503
 msgid "Artist/Album"
 msgstr "Artista/Álbum"
 
 #. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:506 rc.cpp:506
 msgid "Artist/Year/Album"
 msgstr "Artista/Año/Álbum"
 
@@ -4403,127 +4883,134 @@ msgstr "Artista/Año/Álbum"
 #. 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
+#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
 msgid "Initially collapse albums:"
 msgstr "Colapsar álbumes en el inicio:"
 
 #. i18n: file: gui/interfacesettings.ui:242
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:518 rc.cpp:518
 msgid "Other Views"
 msgstr "Otras vistas"
 
 #. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
 msgid "Folder view style:"
 msgstr "Estilo de vista de directorios:"
 
 #. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
 msgid "Streams view style:"
 msgstr "Estilo de vista de flujos:"
 
 #. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Online view style:"
 msgstr "Estilo de vista online:"
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:530 rc.cpp:530
 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:525 rc.cpp:525
+#: 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:534 rc.cpp:534
+#: po/rc.cpp:548 rc.cpp:548
 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:537 rc.cpp:537
+#: po/rc.cpp:551 rc.cpp:551
 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:540 rc.cpp:540
+#: 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:398
+#. 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: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:560 rc.cpp:560
 msgid "External"
 msgstr "Externo"
 
-#. i18n: file: gui/interfacesettings.ui:404
+#. i18n: file: gui/interfacesettings.ui:417
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
+#: po/rc.cpp:563 rc.cpp:563
 msgid "Show icon in notification area:"
 msgstr "Mostrar icono en el área de notificación:"
 
-#. i18n: file: gui/interfacesettings.ui:424
+#. i18n: file: gui/interfacesettings.ui:437
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
+#: po/rc.cpp:566 rc.cpp:566
 msgid "Minimize to notification area when closed:"
 msgstr "Minimizar al área de notificación cuando está cerrado:"
 
-#. i18n: file: gui/interfacesettings.ui:444
+#. i18n: file: gui/interfacesettings.ui:457
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
+#: 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:461
-#. i18n: ectx: property (text), widget (BuddyLabel, gnomeMediaKeysLabel)
-#: po/rc.cpp:555 rc.cpp:555
-msgid "Support media keys under GNOME/Unity:"
-msgstr "Compatibilidad con teclas multimedia bajo GNOME/Unity:"
-
 #. i18n: file: gui/interfacesettings.ui:475
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
+#: po/rc.cpp:572 rc.cpp:572
 msgid "General"
 msgstr "General"
 
 #. i18n: file: gui/interfacesettings.ui:486
 #. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
+#: po/rc.cpp:575 rc.cpp:575
 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
+#, fuzzy
+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:564 rc.cpp:564
+#: po/rc.cpp:581 rc.cpp:581
 msgid "Multiple artist albums:"
 msgstr "Álbumes de varios artistas:"
 
-#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: file: gui/interfacesettings.ui:533
 #. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
+#: po/rc.cpp:584 rc.cpp:584
 msgid "Show delete action in context menus:"
 msgstr "Mostrar la acción de eliminar en el menú contextual:"
 
-#. i18n: file: gui/interfacesettings.ui:533
+#. i18n: file: gui/interfacesettings.ui:550
 #. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
+#: po/rc.cpp:587 rc.cpp:587
 msgid "Enforce single-click activation of items:"
 msgstr "Forzar la activación de elementos con un solo clic:"
 
-#. i18n: file: gui/interfacesettings.ui:574
+#. i18n: file: gui/interfacesettings.ui:591
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
+#: po/rc.cpp:590 rc.cpp:590
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
@@ -4531,98 +5018,75 @@ 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:244
+#. i18n: file: gui/mainwindow.ui:287
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
+#: po/rc.cpp:593 rc.cpp:593
 msgid "[Dynamic]"
 msgstr "[Dinámico]"
 
 #. i18n: file: gui/playbacksettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
+#: 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:585 rc.cpp:585
+#: 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:588 rc.cpp:588
+#: 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:591 rc.cpp:591
+#: 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:594 rc.cpp:594
+#: 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:597 rc.cpp:597
+#: po/rc.cpp:614 rc.cpp:614
 msgid "Devices:"
 msgstr "Dispositivos:"
 
-#. i18n: file: gui/playbacksettings.ui:132
-#. i18n: ectx: property (title), widget (QGroupBox, streamBox)
-#: po/rc.cpp:600 rc.cpp:600
-msgid "HTTP Stream"
-msgstr "Flujo HTTP"
-
 #. 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/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
-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>"
-msgstr ""
-"<i><b>NOTA:</b> Esto es de utilidad solo si se ha configurado MPD para que "
-"su salida sea un flujo HTTP, y desea que Cantata pueda reproducir ese "
-"flujo.</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 "Deteniendo reproducción"
-
-#. i18n: file: gui/playbacksettings.ui:176
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:620 rc.cpp:620
 msgid "Fadeout on stop:"
 msgstr "Desvanecimiento progresivo de audio al detener:"
 
-#. i18n: file: gui/playbacksettings.ui:189
+#. i18n: file: gui/playbacksettings.ui:154
 #. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
+#: po/rc.cpp:623 rc.cpp:623
 msgid "Stop playback on exit:"
 msgstr "Detener reproducción al cerrar:"
 
-#. i18n: file: gui/playbacksettings.ui:202
+#. i18n: file: gui/playbacksettings.ui:167
 #. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
+#: 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:219
+#. 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:621 rc.cpp:621
+#: 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 "
@@ -4634,31 +5098,38 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:635 rc.cpp:635
 msgid "Collection:"
 msgstr "Colección:"
 
 #. 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:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
 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:645 rc.cpp:645
+#: po/rc.cpp:656 rc.cpp:656
 msgid "Dynamizer port:"
 msgstr "Puerto del dinamizador:"
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:659 rc.cpp:659
+#, fuzzy
+msgid "HTTP stream URL:"
+msgstr "Flujo HTTP"
+
+#. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:648 rc.cpp:648
+#: po/rc.cpp:662 rc.cpp:662
 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 "
@@ -4672,9 +5143,22 @@ msgstr ""
 "escritura en el directorio (y subdirectorios), Cantata guardará cualquier "
 "portada descargada en la carpeta respectiva de cada álbum.</i>"
 
-#. i18n: file: gui/serversettings.ui:314
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+#, 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>NOTA:</b> Esto es de utilidad solo si se ha configurado MPD para que "
+"su salida sea un flujo HTTP, y desea que Cantata pueda reproducir ese flujo."
+"</i>"
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:677 rc.cpp:677
 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 "
@@ -4685,9 +5169,9 @@ msgstr ""
 "pulsando el botón «Actualizar base de datos» en las vistas de «Artistas» o "
 "«Álbumes».</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:680 rc.cpp:680
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4697,19 +5181,19 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:666 rc.cpp:666
+#: po/rc.cpp:683 rc.cpp:683
 msgid "Network interface:"
 msgstr "Interfaz de red:"
 
 #. i18n: file: http/httpserversettings.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
+#: po/rc.cpp:686 rc.cpp:686
 msgid "Current URL:"
 msgstr "URL actual:"
 
 #. i18n: file: http/httpserversettings.ui:73
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:689 rc.cpp:689
 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 "
@@ -4727,25 +5211,33 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:693 rc.cpp:693
 msgid "Mode:"
 msgstr "Modo:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:699 rc.cpp:699
 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:702 rc.cpp:702
 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 ""
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:723 rc.cpp:723
 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."
@@ -4753,160 +5245,212 @@ msgid ""
 "account."
 msgstr ""
 "Puede escuchar sin coste sin una cuenta, pero los miembros Premium pueden "
-"escuchar flujos de calidad mayor sin anuncios. Visite <a "
-"href=\"http://www.di.fm/premium/\">http://www.di.fm/premium/</a> para pasar a "
-"una cuenta premium."
+"escuchar flujos de calidad mayor sin anuncios. Visite <a href=\"http://www."
+"di.fm/premium/\">http://www.di.fm/premium/</a> para pasar a una cuenta "
+"premium."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:726 rc.cpp:726
 msgid "Premium Account"
 msgstr "Cuenta premium"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:735 rc.cpp:735
 msgid "Stream type:"
 msgstr "Tipo de flujo:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:738 rc.cpp:738
 msgid "Status:"
 msgstr "Estado:"
 
 #. 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:741 streams/digitallyimportedsettings.cpp:130
+#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
 msgid "Login"
 msgstr "Iniciar sesión"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:747 rc.cpp:747
 msgid "Session expiry:"
 msgstr "Hora de finalización de sesión:"
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:750 rc.cpp:750
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
+"RockRadio.com, and Sky.fm</i>"
+msgstr ""
+"<i><b>NOTA:</b> Estos ajustes solo son editables cuando el dispositivo está "
+"conectado.</i>"
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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: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 ""
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+#, 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
+msgid "Install"
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:768 rc.cpp:768
+#, fuzzy
+msgid ""
+"<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
+"removed.</i>"
+msgstr ""
+"<i><b>NOTA:</b> Estos ajustes solo son válidos y editables cuando el "
+"dispositivo está conectado.</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:771 rc.cpp:771
 msgid "Search:"
 msgstr "Buscar:"
 
-#. 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:774 rc.cpp:774
 msgid "Shortcut for Selected Action"
 msgstr "Atajo para la acción seleccionada"
 
-#. 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:777 rc.cpp:777
 msgid "Default:"
 msgstr "Predefinido:"
 
-#. 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:783 rc.cpp:783
 msgid "Custom:"
 msgstr "Personalizado:"
 
-#. i18n: file: tags/tageditor.ui:22
+#. i18n: file: tags/tageditor.ui:25
 #. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
+#: po/rc.cpp:786 rc.cpp:786
 msgid "Track:"
 msgstr "Pista:"
 
-#. 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:795 rc.cpp:795
 msgid "Album artist:"
 msgstr "Artista del álbum:"
 
-#. 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:804 rc.cpp:804
 msgid "Track number:"
 msgstr "Número de pista:"
 
-#. 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:807 rc.cpp:807
 msgid "Disc number:"
 msgstr "Número de disco:"
 
 #. i18n: file: tags/trackorganiser.ui:155
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:834 rc.cpp:834
 msgid "Original Name"
 msgstr "Nombre original"
 
 #. i18n: file: tags/trackorganiser.ui:160
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:837 rc.cpp:837
 msgid "New Name"
 msgstr "Nombre nuevo"
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:838 rc.cpp:838
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Omar Campagne Polaino"
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:839 rc.cpp:839
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "ocampagne at gmail.com"
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:121
 msgid "Show All Tracks"
 msgstr "Mostrar todas las pistas"
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:122
 msgid "Show Untagged Tracks"
 msgstr "Mostrar pistas sin etiquetar"
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
 msgid "Remove From List"
 msgstr "Eliminar de la lista"
 
-#: replaygain/rgdialog.cpp:140
+#: replaygain/rgdialog.cpp:136
 msgid "Album Gain"
 msgstr "Ganancia de reproducción del álbum"
 
-#: replaygain/rgdialog.cpp:141
+#: replaygain/rgdialog.cpp:137
 msgid "Track Gain"
 msgstr "Ganancia de reproducción de pista"
 
-#: replaygain/rgdialog.cpp:142
+#: replaygain/rgdialog.cpp:138
 msgid "Album Peak"
 msgstr "Punto más alto del álbum"
 
-#: replaygain/rgdialog.cpp:143
+#: replaygain/rgdialog.cpp:139
 msgid "Track Peak"
 msgstr "Punto más alto del pista"
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
 msgid "Scan"
 msgstr "Analizar"
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:238
 msgid "Update ReplayGain tags in tracks?"
 msgstr "¿Desea actualizar las etiquetas ReplayGain de las pistas?"
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
 msgid "Update Tags"
 msgstr "Actualizar etiquetas"
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:252
 msgid "Abort scanning of tracks?"
 msgstr "¿Desea interrumpir el análisis de las pistas?"
 
-#: replaygain/rgdialog.cpp:257
+#: replaygain/rgdialog.cpp:261
 msgid "Abort reading of existing tags?"
 msgstr "¿Desea cancelar la lectura de las etiquetas existentes?"
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:287
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
@@ -4914,49 +5458,63 @@ msgstr ""
 "¿Desea analizar <b>todas</b>las pistas?<br><br><i>NOTA: Todas las pistas ya "
 "tienen etiquetas ReplyGain.</i>"
 
-#: replaygain/rgdialog.cpp:285
+#: replaygain/rgdialog.cpp:289
 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:286
+#: replaygain/rgdialog.cpp:290
 msgid "Untagged Tracks"
 msgstr "Pistas sin etiquetar"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "All Tracks"
 msgstr "Todas las pistas"
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:300
 msgid "Scanning tracks..."
 msgstr "Analizando pistas..."
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:367
 msgid "Reading existing tags..."
 msgstr "Leyendo etiquetas existentes..."
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#, fuzzy
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr "%1 (Estimación)"
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr ""
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
 msgid "Failed to update the tags of the following tracks:"
 msgstr "Fallo al actualizar las etiquetas de las siguientes pistas:"
 
-#: replaygain/rgdialog.cpp:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
+#: tags/trackorganiser.cpp:451
 msgid "Device is not connected."
 msgstr "El dispositivo no está conectado."
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: 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
 msgid "Failed"
 msgstr "Fallo"
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
 msgid "Remove the selected tracks from the list?"
 msgstr "¿Eliminar las pistas seleccionadas de la lista?"
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
 msgid "Remove Tracks"
 msgstr "Eliminar pistas"
 
@@ -4988,6 +5546,10 @@ msgstr "Iniciando sesión…"
 msgid "Logout"
 msgstr "Finalizar sesión"
 
+#: streams/streamdialog.cpp:71
+msgid "URL:"
+msgstr "URL:"
+
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
 msgstr "Añadir a la cola de reproducción, no guardar"
@@ -5008,113 +5570,157 @@ msgstr "Editar flujo"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>ERROR:</b>Protocolo no válido</i>"
 
-#: streams/streamfetcher.cpp:198
+#: streams/streamfetcher.cpp:205
 msgid "Fetching %1"
 msgstr "Obteniendo %1"
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 msgid "Import Streams Into Favorites"
 msgstr "Importar flujos a favoritos"
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 msgid "Export Favorite Streams"
 msgstr "Exportar flujos favoritos"
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr "Añadir flujo nuevo a favoritos"
 
-#: streams/streamspage.cpp:123
-msgid "Search TuneIn:"
-msgstr "Buscar TuneIn:"
+#: streams/streamspage.cpp:124
+#, fuzzy
+msgctxt "Service name"
+msgid "Digitally Imported"
+msgstr "Importe digitalmente"
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:242
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|Flujos XML"
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
 msgid "Import Streams"
 msgstr "Importar flujos"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:245
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Flujos XML (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:253
 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:262
+#: streams/streamspage.cpp:265
 msgid "*.xml|XML Streams"
 msgstr "*.xml|Flujos XML"
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
 msgid "Export Streams"
 msgstr "Exportar flujos"
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:267
 msgid "XML Streams (*.xml)"
 msgstr "Flujos XML (*.xml)"
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:279
 msgid "Failed to create <b>%1</b>!"
 msgstr "Fallo al crear <b>%1</b>."
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "El flujo ya existe.<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Ya existe un flujo llamado <b>%1</b>."
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:318
 msgid "Bookmark added"
 msgstr "Favorito añadido"
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:320
 msgid "Already bookmarked"
 msgstr "Ya está en favoritos"
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:366
 msgid "Added to favorites"
 msgstr "Añadido a favoritos"
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:368
 msgid "Already in favorites"
 msgstr "Ya está en favoritos"
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:393
 msgid "Reload <b>%1</b> streams?"
 msgstr "¿Actualizar <b>%1</b> flujos?"
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:411
 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:414
+#: streams/streamspage.cpp:417
 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:442
+#: streams/streamspage.cpp:445
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "¿Desea eliminar los %1 flujos seleccionados?"
 
-#: streams/streamspage.cpp:446
+#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "¿Desea eliminar <b>%1</b>?"
 
-#: streams/streamspage.cpp:609
-msgid "Logged into Digitally Imported"
-msgstr "Registrado en Importe digital"
+#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#, fuzzy
+msgid "Search %1:"
+msgstr "Buscar %1:"
+
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr ""
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
-msgstr "<b>NO</b> registrado en Importe digital"
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+#, fuzzy
+msgid "Install Streams"
+msgstr "Importar flujos"
+
+#: streams/streamssettings.cpp:127
+#, fuzzy
+msgid "Cantata Streams (*.streams)"
+msgstr "Flujos XML (*.xml)"
+
+#: streams/streamssettings.cpp:144
+#, fuzzy
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr ""
+"Se ha detectado una lista de reproducción llamada <b>%1</b><br/>. "
+"¿Sobrescribir?"
+
+#: streams/streamssettings.cpp:150
+#, fuzzy
+msgid "Failed top open %1"
+msgstr "Fallo al guardar %1"
+
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr ""
+
+#: streams/streamssettings.cpp:170
+#, fuzzy
+msgid "Failed to create stream category folder!"
+msgstr "Fallo al crear el directorio de destino. <br/>%1"
+
+#: streams/streamssettings.cpp:176
+#, fuzzy
+msgid "Failed to save stream list!"
+msgstr "Fallo al guardar las letras"
+
+#: streams/streamssettings.cpp:227
+#, fuzzy
+msgid "Failed to remove streams folder!"
+msgstr "No se ha podido eliminar el fichero anterior de normas - %1"
 
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr "&Aceptar"
 
 #: support/dialog.cpp:90
@@ -5177,39 +5783,39 @@ msgstr "Anter&ior"
 msgid "&Next"
 msgstr "Sig&uiente"
 
-#: support/fancytabwidget.cpp:952
+#: support/fancytabwidget.cpp:957
 msgid "Icons Only"
 msgstr "Solo iconos"
 
-#: support/fancytabwidget.cpp:953
+#: support/fancytabwidget.cpp:958
 msgid "Style"
 msgstr "Estilo"
 
-#: support/fancytabwidget.cpp:954
+#: support/fancytabwidget.cpp:959
 msgid "Large Sidebar"
 msgstr "Barra lateral grande"
 
-#: support/fancytabwidget.cpp:955
+#: support/fancytabwidget.cpp:960
 msgid "Small Sidebar"
 msgstr "Barra lateral pequeña"
 
-#: support/fancytabwidget.cpp:956
+#: support/fancytabwidget.cpp:961
 msgid "Top Bar"
 msgstr "Barra superior"
 
-#: support/fancytabwidget.cpp:957
+#: support/fancytabwidget.cpp:962
 msgid "Bottom Bar"
 msgstr "Barra inferior"
 
-#: support/fancytabwidget.cpp:958
+#: support/fancytabwidget.cpp:963
 msgid "Tabs On Side"
 msgstr "Pestañas en el lado"
 
-#: support/fancytabwidget.cpp:959
+#: support/fancytabwidget.cpp:964
 msgid "Tabs On Top"
 msgstr "Pestañas en la parte superior"
 
-#: support/fancytabwidget.cpp:960
+#: support/fancytabwidget.cpp:965
 msgid "Tabs On Bottom"
 msgstr "Pestañas en la parte inferior"
 
@@ -5221,19 +5827,20 @@ msgstr "Contraseña"
 msgid "Please enter password:"
 msgstr "Introduzca la contraseña:"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
 msgid "Warning"
 msgstr "Advertencia"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
 msgid "Question"
 msgstr "Pregunta"
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
+#: support/messagebox.cpp:107 support/messagebox.cpp:113
+#: support/messagebox.h:62
 msgid "Error"
 msgstr "Fallo"
 
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr "Información"
 
@@ -5253,61 +5860,67 @@ msgstr "Seleccione el directorio"
 msgid "Select File"
 msgstr "Seleccione el fichero"
 
-#: 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] "1 día %2"
+msgstr[1] "%1 días %2"
+
+#: tags/tageditor.cpp:134
 msgid "Tags"
 msgstr "Etiquetas"
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:147
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "Definir «Artista del álbum» como «Artista»"
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
 msgid "All tracks"
 msgstr "Todas las pistas"
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:295
 msgid "(Various)"
 msgstr "(Varios)"
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:336
 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:367
+#: tags/tageditor.cpp:378
 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:417
+#: tags/tageditor.cpp:428
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5315,17 +5928,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:418
+#: tags/tageditor.cpp:429
 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:419
+#: tags/tageditor.cpp:430
 msgid "Album Artist from Artist"
 msgstr "«Artista del álbum» como «Artista»"
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:463
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5333,74 +5946,90 @@ 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:485
+#: tags/tageditor.cpp:496
 msgid "Adjust the value of each track number by:"
 msgstr "Ajustar el valor de cada número de pista en:"
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:554
 msgid "All tracks [modified]"
 msgstr "Todas las pistas [modificado]"
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:556
 msgid "%1 [modified]"
 msgstr "%1 [modificado]"
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:783
 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:759
+#: tags/tageditor.cpp:784
 msgid "Rename Files"
 msgstr "Renombrar ficheros"
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:150
 msgid "Abort renaming of files?"
 msgstr "¿Cancelar la modificación de los ficheros?"
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:263
+#, fuzzy
+msgid "Source file does not exist!<br/>%1"
+msgstr "La canción no existe.<hr/>%1"
+
+#: tags/trackorganiser.cpp:282
 msgid "Destination file already exists!<br/>%1"
 msgstr "El fichero de destino ya existe.<br/>%1"
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:304
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Fallo al crear el directorio de destino. <br/>%1"
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:325
 msgid "Failed to rename %1 to %2"
 msgstr "Fallo al renombrar %1 a %2"
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:267
+#, 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
 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 ""
-"<tr><td align=\"right\"><b>Artista:</b></td><td>%1</td></tr><tr><td "
-"align=\"right\"><b>Álbum:</b></td><td>%2</td></tr><tr><td "
-"align=\"right\"><b>Año:</b></td><td>%3</td></tr>"
+"<tr><td align=\"right\"><b>Artista:</b></td><td>%1</td></tr><tr><td align="
+"\"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:59
+#: widgets/genrecombo.cpp:54
 msgid "All Genres"
 msgstr "Todos los géneros"
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:267
+#, fuzzy
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr "%1 (Disco %2)"
+
+#: widgets/groupedview.cpp:269
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:480
 msgid "Go Back"
 msgstr "Retroceder"
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:485
 msgid "Go Home"
 msgstr "Página inicial"
 
 #: widgets/menubutton.cpp:36
-msgid "Other Actions"
-msgstr "Otras acciones"
+msgid "Menu"
+msgstr ""
 
 #: widgets/searchwidget.cpp:62
 msgid "Search..."
@@ -5410,6 +6039,54 @@ msgstr "Buscar…"
 msgid "Close Search Bar"
 msgstr "Cerrar barra de búsqueda"
 
+#: widgets/servicestatuslabel.cpp:43
+#, fuzzy
+msgid "Logged into %1"
+msgstr "Sesión iniciada"
+
+#: widgets/servicestatuslabel.cpp:44
+#, fuzzy
+msgid "<b>NOT</b> logged into %1"
+msgstr "<b>NO</b> registrado en Importe digital"
+
+#: widgets/songdialog.cpp:48
+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
+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
+msgid "Mute"
+msgstr "Silenciar"
+
+#: widgets/volumeslider.cpp:199
+#, fuzzy
+msgid "Muted"
+msgstr "Silenciar"
+
+#: widgets/volumeslider.cpp:238
+msgid "Unmute"
+msgstr ""
+
+#: widgets/volumeslider.cpp:276
+msgid "Volume Disabled"
+msgstr "Volumen desactivado"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1% (Muted)"
+msgstr "Volumen: %1 % (silenciado)"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr "Volumen %1%"
+
 #: ../gui/qtplural.h:30
 msgctxt "Singular"
 msgid "1 Track"
@@ -5488,3 +6165,88 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr "%1 normas"
 
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr ""
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr ""
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr ""
+
+#: ../gui/qtplural.h:63
+#, fuzzy, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr "%1 entradas"
+
+#~ msgid ""
+#~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
+#~ msgstr ""
+#~ "Fallo de descarga de la pista: demasiadas redirecciones detectadas.<br/"
+#~ "><br/<hr/>%1"
+
+#~ 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>Las siguientes variables se sustituyen por su significado "
+#~ "correspondiente para cada nombre de pista.</p><p><table border="
+#~ "\"1\"><tr><th><em>Botón</em></th><th><em>Variable</em></"
+#~ "th><th><em>Descripción</em></th></tr><tr><td>%albumartist%</td><td>%1</"
+#~ "td><td>El artista del álbum. Para la mayoría de álbumes, será idéntico a "
+#~ "<i>Artista de pista.</i> Para compilaciones, habitualmente será <i>Varios "
+#~ "Artistas.</i> </td></tr><tr><td>%album%</td><td>%2</td><td>El nombre del "
+#~ "álbum.</td></tr><tr><td>%artist%</td><td>%3</td><td>El artista de cada "
+#~ "pista.</td></tr><tr><td>%title%</td><td>%4</td><td>El título de pista "
+#~ "(sin <i>Artista de pista</i>).</td></tr><tr><td>%artistandtitle%</td><td>"
+#~ "%5</td><td>El título de pista (con <i>Artista de pista</i>, si es "
+#~ "distinto a <i>Artista del albúm</i>).</td></tr><tr><td>%track%</td><td>"
+#~ "%6</td><td>El número de pista.</td></tr><tr><td>%discnumber%</td><td>%7</"
+#~ "td><td>El número de disco de un álbum de varios discos. Habitualmente, "
+#~ "las compilaciones se componen de varios discos.</td></tr><tr><td>%year%</"
+#~ "td><td>%8</td><td>El año de publicación del álbum.</td></tr><tr><td>%genre"
+#~ "%</td><td>%9</td><td>El género del álbum.</td></tr></table></p>"
+
+#~ msgid "Configure Online Service"
+#~ msgstr "Configurar servicio online"
+
+#~ msgid "Refresh Online Service"
+#~ msgstr "Actualizar servicio online"
+
+#~ msgid "Support media keys under GNOME/Unity:"
+#~ msgstr "Compatibilidad con teclas multimedia bajo GNOME/Unity:"
+
+#~ msgid "Stopping Playback"
+#~ msgstr "Deteniendo reproducción"
+
+#~ msgid "Search TuneIn:"
+#~ msgstr "Buscar TuneIn:"
+
+#~ msgid "Logged into Digitally Imported"
+#~ msgstr "Registrado en Importe digital"
+
+#~ msgid "Other Actions"
+#~ msgstr "Otras acciones"
diff --git a/po/generate.sh b/po/generate.sh
index 11007b6..4d5be02 100755
--- a/po/generate.sh
+++ b/po/generate.sh
@@ -44,7 +44,7 @@ echo "../gui/qtplural.h" >> ${WDIR}/infiles.qt.list
 # grep -Ev to remove any blank contexts...
 lupdate @infiles.qt.list -ts ${PROJECT}.ts && lconvert -i ${PROJECT}.ts -of po | sed s^QObject\|^^g | grep -Ev 'msgctxt ""' > ${PROJECT}_qt.po && msguniq -o ${PROJECT}_qt.pot ${PROJECT}_qt.po && rm ${PROJECT}.ts ${PROJECT}_qt.po
 
-Fix charset...
+# Fix charset...
 cat ${PROJECT}_kde.pot | sed s^charset=CHARSET^charset=UTF-8^g > ${PROJECT}_kde.pot-new
 tail -n +7 ${PROJECT}_qt.pot | sed s^charset=CHARSET^charset=UTF-8^g > ${PROJECT}_qt.pot-new
 cat ${PROJECT}_kde.pot-new > ${PROJECT}.pot
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..9504418
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,6192 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+#
+# Török Árpád, 2013.
+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"
+"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"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Poedit 1.5.4\n"
+
+#: context/albumview.cpp:63
+msgid "Refresh Album Information"
+msgstr "Albuminformációk frissítése"
+
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
+msgid "Album Information"
+msgstr "Albuminformációk"
+
+#. i18n: file: devices/albumdetails.ui:143
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
+msgid "Tracks"
+msgstr "Számok"
+
+#: context/artistview.cpp:85
+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
+msgid "Artist Information"
+msgstr "Előadói információk"
+
+#. i18n: file: gui/interfacesettings.ui:137
+#. i18n: ectx: attribute (title), widget (QWidget, tab_2)
+#: context/artistview.cpp:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
+msgid "Albums"
+msgstr "Albumok"
+
+#: context/artistview.cpp:333
+msgid "Web Links"
+msgstr "Web-hivatkozások"
+
+#: context/artistview.cpp:419
+msgid "Similar Artists"
+msgstr "Hasonló művészek"
+
+#: context/contextsettings.cpp:36
+msgid "Lyrics Providers"
+msgstr "Szövegtárak"
+
+#: context/contextsettings.cpp:37
+msgid "Wikipedia Languages"
+msgstr "Wikipédia nyelvek"
+
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
+msgid "Other"
+msgstr "Továbbiak"
+
+#: context/contextwidget.cpp:98
+msgid "Reset Spacing"
+msgstr "Szüneteket alaphelyzetbe"
+
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
+msgid "Lyrics"
+msgstr "Dalszövegek"
+
+#: context/lastfmengine.cpp:63
+msgid "Read more on last.fm"
+msgstr "Továbbiakat a last.fm-en olvashatsz"
+
+#: context/lyricsdialog.cpp:42
+msgid ""
+"If Cantata has failed to find lyrics, or has found the wrong ones, use this "
+"dialog to enter new search details. For example, the current song may "
+"actually be a cover-version - if so, then searching for lyrics by the "
+"original artist might help.\n"
+"\n"
+"If this search does find new lyrics, these will still be associated with the "
+"original song title and artist as displayed in Cantata."
+msgstr ""
+"Ha a Cantata nem találja a dalszöveget, vagy nem megfelelőt talált, ezt a "
+"párbeszédet használd új keresési feltételek meghatározására. Például, a "
+"jelenlegi szám feldolgozás - ha így lenne, a dalszöveg keresése az eredeti "
+"előadóval segíthet.\n"
+"\n"
+"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: ectx: property (text), widget (BuddyLabel, label_2)
+#. i18n: file: dynamic/dynamicrule.ui:77
+#. 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: ectx: property (text), widget (BuddyLabel, label_2)
+#. i18n: file: dynamic/dynamicrule.ui:77
+#. 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
+msgid "Title:"
+msgstr "Cím:"
+
+#. i18n: file: devices/albumdetails.ui:34
+#. i18n: ectx: property (text), widget (BuddyLabel, label)
+#. i18n: file: dynamic/dynamicrule.ui:25
+#. 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: ectx: property (text), widget (BuddyLabel, label)
+#. i18n: file: dynamic/dynamicrule.ui:25
+#. 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
+msgid "Artist:"
+msgstr "Előadó:"
+
+#: context/lyricsdialog.cpp:68
+msgid "Search For Lyrics"
+msgstr "Dalszöveg keresése"
+
+#: context/lyricsettings.cpp:35
+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/lyricsettings.cpp:67
+msgid "(Portuguese Translations)"
+msgstr "(Portugál fordítás)"
+
+#: context/songview.cpp:89
+msgid "Refresh Lyrics"
+msgstr "Dalszöveg frissítése"
+
+#: context/songview.cpp:90
+msgid "Edit Lyrics"
+msgstr "Dalszöveg szerkesztése"
+
+#: context/songview.cpp:91
+msgid "Save Lyrics"
+msgstr "Dalszöveg mentése"
+
+#: context/songview.cpp:92
+msgid "Cancel Editing Lyrics"
+msgstr "A dalszöveg szerkesztésének elvetése"
+
+#: context/songview.cpp:93
+msgid "Delete Lyrics File"
+msgstr "Dalszöveg-fájl törlése"
+
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
+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
+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
+msgid "Abort"
+msgstr "Megszakít"
+
+#: context/songview.cpp:121
+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
+msgid "Re-download"
+msgstr "Újra betölt"
+
+#: context/songview.cpp:147
+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
+msgid "Song Changed"
+msgstr "A dal megváltozott"
+
+#: context/songview.cpp:148
+msgid "Perform Search"
+msgstr "Keresés"
+
+#: context/songview.cpp:172
+msgid "Save updated lyrics?"
+msgstr "Mented a frissített dalszövegeket?"
+
+#: context/songview.cpp:172
+msgid "Save"
+msgstr "Mentés"
+
+#: context/songview.cpp:185
+msgid "Failed to save lyrics."
+msgstr "Nem sikerült menteni a dalszöveget."
+
+#: context/songview.cpp:207
+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:431
+msgid "Fetching lyrics via %1"
+msgstr "Dalszöveg leszedése innen %1"
+
+#: context/wikipediaengine.cpp:248
+msgid "Track listing"
+msgstr "Számlista"
+
+#: context/wikipediaengine.cpp:301
+msgid "Read more on wikipedia"
+msgstr "Továbbiakat a Wikipédiából."
+
+#: context/wikipediaengine.cpp:302
+msgid "Open in browser"
+msgstr "Megnyitás böngészőben"
+
+#: context/wikipediaengine.cpp:441
+msgctxt "Search pattern for an artist or band, separated by |"
+msgid "artist|band|singer|vocalist|musician"
+msgstr "előadó|együttes|énekes|vokál|zenész"
+
+#: context/wikipediaengine.cpp:445
+msgctxt "Search pattern for an album, separated by |"
+msgid "album|score|soundtrack"
+msgstr "album|kotta|hangsáv"
+
+#: context/wikipediasettings.cpp:99
+msgid ""
+"Choose the wikipedia languages you want to use when searching for artist and "
+"album information."
+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
+msgid "Reload"
+msgstr "Újratöltés"
+
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr "A Cantata éppen számot játszik le"
+
+#: devices/actiondialog.cpp:76
+msgid "Songs To Be Copied"
+msgstr "Másolandó dal"
+
+#: devices/actiondialog.cpp:146
+msgid "<b>INVALID</b>"
+msgstr "<b>ÉRVÉNYTELEN</b>"
+
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
+msgid "<i>(When different)</i>"
+msgstr "<i>(Ha eltérő)</i>"
+
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
+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
+msgid "%1 free"
+msgstr "%1 szabad"
+
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
+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
+msgid "Audio CD"
+msgstr "Hang CD"
+
+#: devices/actiondialog.cpp:293
+msgid ""
+"There is insufficient space left on the destination device.\n"
+"The selected songs consume %1, but there is only %2 left.\n"
+"The songs will need to be transcoded to a smaller filesize in order to be "
+"successfully copied."
+msgstr ""
+"A céleszközön nem maradt elegendő hely\n"
+"A kiválasztott számnak %1 hely kell, de csak %2 maradt\n"
+"A számot át kell kódolni kisebb fájlméretűre, hogy sikeresen másolni "
+"lehessen."
+
+#: devices/actiondialog.cpp:300
+msgid ""
+"There is insufficient space left on the destination.\n"
+"The selected songs consume %1, but there is only %2 left."
+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
+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
+#: gui/stdactions.cpp:85
+msgid "Delete Songs"
+msgstr "Dalok törlése"
+
+#: devices/actiondialog.cpp:380
+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
+msgid "Not Configured"
+msgstr "Nincs beállítva"
+
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
+msgid "Use Defaults"
+msgstr "Alapbeállítások alkalmazása"
+
+#: devices/actiondialog.cpp:384
+msgid ""
+"<p>You have not configured the source device.<br/>Continue with the default "
+"settings?</p>"
+msgstr ""
+"<p>Nem állítottad be a forráseszközt.</br> Használjuk az alapbeállításokat?</"
+"p>"
+
+#: devices/actiondialog.cpp:446
+msgid "Are you sure you wish to stop?"
+msgstr "Biztosan le szeretnéd állítani?"
+
+#: devices/actiondialog.cpp:446 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
+msgid "Device has been removed!"
+msgstr "Az eszköz el lett távolítva!"
+
+#: devices/actiondialog.cpp:491
+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
+msgid "Device is busy?"
+msgstr "Az eszköz foglalt?"
+
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
+msgid "Device has been changed?"
+msgstr "Az eszköz megváltozott?"
+
+#: devices/actiondialog.cpp:562
+msgid "Clearing unused folders"
+msgstr "A használaton kívüli könyvtárak tisztítása"
+
+#: devices/actiondialog.cpp:577
+msgid "Calculate ReplayGain for ripped tracks?"
+msgstr "Kiszámítsam a lejátszási szintet leszedett számokra?"
+
+#: devices/actiondialog.cpp:577
+msgid "ReplyGain"
+msgstr "Lejátszási szint"
+
+#: devices/actiondialog.cpp:578
+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:637
+msgid "Song already exists!<hr/>%1"
+msgstr "A dal már létezik!<hr/>%1"
+
+#: devices/actiondialog.cpp:640
+msgid "Song does not exist!<hr/>%1"
+msgstr "A dal nem létezik!<hr/>%1"
+
+#: devices/actiondialog.cpp:643
+msgid ""
+"Failed to create destination folder!<br/>Please check you have sufficient "
+"permissions.<hr/>%1"
+msgstr ""
+"Nem sikerült létrehozni a cél kö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:649
+msgid "Failed to copy.<hr/>%1"
+msgstr "Nem sikerült másolni.<hr/>%1"
+
+#: devices/actiondialog.cpp:650
+msgid "Failed to delete.<hr/>%1"
+msgstr "Nem sikerült törölni.<hr/>%1"
+
+#: devices/actiondialog.cpp:653
+msgid "Not connected to device.<hr/>%1"
+msgstr "Nincs csatlakoztatva az eszközhöz.<hr/>%1"
+
+#: 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:659
+msgid "Transcoding failed.<br/><br/<hr/>%1"
+msgstr "Az átkódolás nem sikerült. <br><br/<hr/>%1"
+
+#: devices/actiondialog.cpp:662
+msgid ""
+"Failed to create temporary file.<br/>(Required for transcoding to MTP "
+"devices.)<hr/>%1"
+msgstr ""
+"Nem sikerült létrehozni az átmeneti fájlt.<br/>(MTP eszközre átkódoláshoz "
+"kell.)<hr/>%1"
+
+#: 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: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: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: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: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:680
+msgid "Failed to lock device.<hr/>%1"
+msgstr "Nem sikerült zárolni az eszközt.<hr/>%1"
+
+#: devices/actiondialog.cpp:709
+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:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
+msgid "Skip"
+msgstr "Kihagy"
+
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
+msgid "Auto Skip"
+msgstr "Automatikusan kihagy"
+
+#: devices/actiondialog.cpp:759
+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>"
+
+#: 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>"
+
+#: 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:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
+msgid "Calculating..."
+msgstr "Számol..."
+
+#: devices/actiondialog.cpp:799
+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:825 devices/fsdevice.cpp:755
+#: 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
+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
+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
+msgid "Capitalize"
+msgstr "Váltás nagybetűre"
+
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
+msgid "Adjust Track Numbers"
+msgstr "Számok sorszámának beállítása"
+
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
+msgid "Tools"
+msgstr "Eszközök"
+
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
+msgid "Apply \"Various Artists\" workaround?"
+msgstr "Alkalmazza a \"Vegyes előadók\" munkakörnyezetet?"
+
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
+msgid ""
+"<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
+"'Title' to \"TrackArtist - TrackTitle\"</i>"
+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
+msgid "Revert \"Various Artists\" workaround"
+msgstr "Visszaállítja a \"Vegyes előadók\" munkakörnyezetet"
+
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
+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' "
+"and 'Title' itself will be set to just the title. e.g. <br/><br/>If 'Title' "
+"is \"Wibble - Wobble\", then 'Artist' will be set to \"Wibble\" and 'Title' "
+"will be set to \"Wobble\"</i>"
+msgstr ""
+"<i>Ahol az \"Album előadó\" megegyezik az \"Előadó és a  Címmel, illetve "
+"\"Cím\" \"SzámElőadó -SzámCím\" formátumú, az Előadót a \"Cím\"-ből veszi és "
+"a \"Cím\" maga egyszerűen a cím lesz, pl. <br/><br/>ha a \"Cím\" \"Wibble - "
+"Wobble\", akkor az \"Előadó\" egyszerűen \"Wibble\", a \"Cím\" pedig \"Wobble"
+"\" lesz.</i>"
+
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
+msgid "Revert"
+msgstr "Visszaállít"
+
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
+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
+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
+msgid "1 Track (%2)"
+msgid_plural "%1 Tracks (%2)"
+msgstr[0] "1 Szám (%2)"
+msgstr[1] "%1 Számok (%2)"
+
+#: devices/audiocdsettings.cpp:38
+msgid "CDDB"
+msgstr "CDDB"
+
+#: devices/audiocdsettings.cpp:39
+msgid "MusicBrainz"
+msgstr "MusicBrainz"
+
+#: devices/cddbinterface.cpp:53
+msgid "Data Track"
+msgstr "Adatsáv"
+
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
+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
+msgid "Track %1"
+msgstr "Szám %1"
+
+#: devices/cddbinterface.cpp:291
+msgid "Failed to create CDDB connection"
+msgstr "Nem sikerült CDDB kapcsolatot létesíteni"
+
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
+msgid "No matches found in CDDB"
+msgstr "Nincs egyezés a CDDB-ben"
+
+#: devices/cddbinterface.cpp:305
+msgid "CDDB error: %1"
+msgstr "CDDB hiba: %1"
+
+#: devices/cddbselectiondialog.cpp:38
+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: 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
+msgid "Artist"
+msgstr "Előadó"
+
+#. i18n: file: devices/albumdetails.ui:175
+#. 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
+msgid "Title"
+msgstr "Cím"
+
+#: devices/cddbselectiondialog.cpp:55
+msgid "Disc Selection"
+msgstr "Lemezválogatás"
+
+#: devices/cddbselectiondialog.cpp:67
+msgctxt "artist - album Disc disc (year)"
+msgid "%1 -%2 Disc %3 (%4)"
+msgstr "%1 -%2 Lemez %3 (%4)"
+
+#: devices/cddbselectiondialog.cpp:69
+msgctxt "artist - album (year)"
+msgid "%1 - %2 (%3)"
+msgstr "%1 - %2 (%3)"
+
+#: devices/device.cpp:346
+msgid "Updating (%1)..."
+msgstr "Frissítés (%1)..."
+
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr "Frissítés (%1%)..."
+
+#: devices/devicepropertiesdialog.cpp:32
+#: devices/remotedevicepropertiesdialog.cpp:40
+msgid "Device Properties"
+msgstr "Eszközjellemzők"
+
+#: devices/devicepropertieswidget.cpp:83
+msgid "Don't copy covers"
+msgstr "Ne másolja a borítókat"
+
+#: devices/devicepropertieswidget.cpp:84
+msgid "Embed cover within each file"
+msgstr "Borító beágyazás minden fájlba"
+
+#: devices/devicepropertieswidget.cpp:90
+msgid "No maximum size"
+msgstr "Nincs maximális méret"
+
+#: devices/devicepropertieswidget.cpp:90
+msgid "400 pixels"
+msgstr "400 pixel"
+
+#: devices/devicepropertieswidget.cpp:90
+msgid "300 pixels"
+msgstr "300 pixel"
+
+#: devices/devicepropertieswidget.cpp:90
+msgid "200 pixels"
+msgstr "200 pixel"
+
+#: devices/devicepropertieswidget.cpp:90
+msgid "100 pixels"
+msgstr "100 pixel"
+
+#: devices/devicepropertieswidget.cpp:91
+msgid ""
+"<p>When copying tracks to a device, and the 'Album Artist' is set to "
+"'Various Artists', then Cantata will set the 'Artist' tag of all tracks to "
+"'Various Artists' and the track 'Title' tag to 'TrackArtist - TrackTitle'."
+"<hr/> When copying from a device, Cantata 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>"
+msgstr ""
+"<p>Amikor az eszközre számokat másol, és az 'Album Előadó' 'Vegyes előadók', "
+"a Cantata az 'Előadó' címke az összes számnál 'Vegyes előadók'-ra lesz "
+"állítva és a számok 'Cím\" jelzője 'SzámElőadó - SzámCím'-re változik.<hr/> "
+"Eszközre másolás során a Cantata ellenőrzi, hogy az 'Album Előadó' és az "
+"'Előadó' egyaránt 'Vegyes Előadó'-e. Ha igen, megpróbálja a \"Cím\" címkéből "
+"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
+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 "
+"cache file will be used instead of having to read the tags of each file.)<hr/"
+"><b>NOTE:</b> If you use another application to update 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>"
+msgstr ""
+"<p>Ha ezt engedélyezed, a Cantata az eszközök zenekönyvtárainak létrehoz "
+"cache-t. Ez felgyorsítja a következő könyvtár átvizsgálásokat (mert a cache "
+"fájlját használja ahelyett, hogy az egyes fájlok címkéit kellene végig "
+"olvasnia.)<hr/><b>Megjegyzés:</b> Ha egy másik alkalmazással frissíted az "
+"eszközök könyvtárait, akkor ez a cache elavulttá válik. Ennek helyesbítésére "
+"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
+msgid "Do not transcode"
+msgstr "Ne kódolja át"
+
+#: devices/devicepropertieswidget.cpp:212
+msgid "Encoder"
+msgstr "Kódoló"
+
+#: devices/devicepropertieswidget.cpp:228
+msgid "Transcode to %1"
+msgstr "Átkódolás erre %1"
+
+#: devices/devicepropertieswidget.cpp:259
+msgctxt "name (size free)"
+msgid "%1 (%2 free)"
+msgstr "%1 (%2 szabad)"
+
+#: devices/devicespage.cpp:65 devices/syncdialog.cpp:103
+msgid "Copy To Library"
+msgstr "Másolás könyvtárba"
+
+#: devices/devicespage.cpp:67
+msgid "Sync"
+msgstr "Sync"
+
+#: devices/devicespage.cpp:71
+msgid "Forget Device"
+msgstr "Eszköz elfelejtése"
+
+#: devices/devicespage.cpp:114 devices/remotedevicepropertiesdialog.cpp:60
+msgid "Add Device"
+msgstr "Eszköz hozzáadása"
+
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
+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
+msgid "Refresh"
+msgstr "Frissítés"
+
+#: devices/devicespage.cpp:433
+msgid "Via CDDB"
+msgstr "CDDB útján"
+
+#: devices/devicespage.cpp:433
+msgid "Via MusicBrainz"
+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>"
+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>"
+
+#: devices/devicespage.cpp:455
+msgid "Partial"
+msgstr "Részleges"
+
+#: devices/devicespage.cpp:455
+msgid "Full"
+msgstr "Teljes"
+
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
+msgid ""
+"Are you sure you wish to delete the selected songs?\n"
+"This cannot be undone."
+msgstr ""
+"Biztosan törölni akarod a kiválasztott dalokat?\n"
+"Ezt nem lehet visszaállítani."
+
+#: devices/devicespage.cpp:529
+msgid "Are you sure you wish to forget <b>%1</b>?"
+msgstr "Biztosan el akarod felejteni <b>%1</b>?"
+
+#: devices/devicespage.cpp:548
+msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
+msgstr "Biztosan ki szeretnéd adni a hang CD-t <b>%1 - %2</b>"
+
+#: devices/devicespage.cpp:549
+msgid "Eject"
+msgstr "Kiadás"
+
+#: devices/devicespage.cpp:550
+msgid "Are you sure you wish to disconnect <b>%1</b>?"
+msgstr "Biztosan le szeretnéd csatlakoztatni <b>%1</b>?"
+
+#: devices/devicespage.cpp:551
+msgid "Disconnect"
+msgstr "Leválasztás"
+
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
+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
+msgctxt ""
+"Feel free to redirect the english Wikipedia link to a local version, if it "
+"exists."
+msgid ""
+"<a href=http://en.wikipedia.org/wiki/Advanced_Audio_Coding>Advanced Audio "
+"Coding</a> (AAC) is a patented lossy codec for digital audio.<br>AAC "
+"generally achieves better sound quality than MP3 at similar bit rates. It is "
+"a reasonable choice for the iPod and some other portable music players."
+msgstr ""
+"<a href=http://en.wikipedia.org/wiki/Advanced_Audio_Coding>Advanced Audio "
+"Coding</a> (AAC) szabadalmaztatott veszteséges digitális hang codec.<br>AAC "
+"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
+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 "
+"href=http://en.wikipedia.org/wiki/"
+"Variable_bitrate#Advantages_and_disadvantages_of_VBR>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 <a href=http://www.ffmpeg.org/faq."
+"html#SEC21>average bitrate</a> of the encoded track.<br><b>150kb/s</b> is a "
+"good choice for music listening on a portable player.<br/>Anything below "
+"<b>120kb/s</b> might be unsatisfactory for music and anything above <b>200kb/"
+"s</b> is probably overkill."
+msgstr ""
+"A bitráta az adatminőség mérésére szolgál a szám egy másodpercére "
+"vonatkoztatva.<br> A Cantata által használt <b>AAC</b> kódoló támogatj a <a "
+"href=http://hu.wikipedia.org/wiki/Változó_bitráta>változó bitráta (VBR)</a> "
+"beállítását, ami azt jelenti, hogy értéke változik a szám során, annak "
+"megfelelően, hogy a hanganyag tartalma mennyire összetett. A komplexebb "
+"adatszakaszok magasabb bitrátával lesznek kódolva, mint a kevésbé komplexek; "
+"ez a megközelítés egyszerre produkál jobb minőséget és kisebb fájlt, mint az "
+"állandó bitráta a szám egésze során. <br>Ezért a csúszkán lévő bitrátaérték "
+"csak becslése <a href=http://www.ffmpeg.org/faq.html#SEC21>az átlagos "
+"értéknek <b>150kb/s</b> jó választás zenék 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>200kb/s</b> fölött túlzó lehet."
+
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
+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
+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
+msgid "Better sound quality"
+msgstr "Jobb hangminőség"
+
+#: devices/encoders.cpp:119
+msgctxt ""
+"Feel free to redirect the english Wikipedia link to a local version, if it "
+"exists."
+msgid ""
+"<a href=http://en.wikipedia.org/wiki/MP3>MPEG Audio Layer 3</a> (MP3) is a "
+"patented digital audio codec using a form of lossy data compression.<br>In "
+"spite of its shortcomings, it is a common format for consumer audio storage, "
+"and is widely supported on portable music players."
+msgstr ""
+"<a href=http://hu.wikipedia.org/wiki/MP3>MPEG Audio Layer 3</a> (MP3) "
+"veszteséges adattömörítést alkalmazó szabadalmaztatott digitális hang codec, "
+"<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
+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 "
+"href=http://en.wikipedia.org/wiki/MP3#VBR>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>160kb/"
+"s</b> is a good choice for music listening on a portable player.<br/"
+">Anything below <b>120kb/s</b> might be unsatisfactory for music and "
+"anything above <b>205kb/s</b> is probably overkill."
+msgstr ""
+"A bitráta az adatminőség mérésére szolgál a szám egy másodpercére "
+"vonatkoztatva.<br> A Cantata által használt <b>MP3</b> kódoló támogatja a <a "
+"href=http://en.wikipedia.org/wiki/MP3#VBR>változó bitráta (VBR)</a> "
+"beállítását, ami azt jelenti, hogy értéke változik a szám során, annak "
+"megfelelően, hogy a hanganyag tartalma mennyire összetett. A komplexebb "
+"adatszakaszok magasabb bitrátával lesznek kódolva, mint a kevésbé komplexek; "
+"ez a megközelítés egyszerre produkál jobb minőséget és kisebb fájlt, mint az "
+"állandó bitráta a szám egésze során. <br><b>160kb/s</b> jó választás zenék "
+"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
+msgid "Ogg Vorbis"
+msgstr "Ogg Vorbis"
+
+#: devices/encoders.cpp:158
+msgctxt ""
+"Feel free to redirect the english Wikipedia link to a local version, if it "
+"exists."
+msgid ""
+"<a href=http://en.wikipedia.org/wiki/Vorbis>Ogg Vorbis</a> is an open and "
+"royalty-free audio codec for lossy audio compression.<br>It produces smaller "
+"files than MP3 at equivalent or higher quality. Ogg Vorbis is an all-around "
+"excellent choice, especially for portable music players that support it."
+msgstr ""
+"<a href=http://hu.wikipedia.org/wiki/Ogg>Ogg Vorbis</a> nyílt jogtiszta "
+"veszteséges hangtömörítő hang codec. <br> Az MP3-nál kisebb fájlokat "
+"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
+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 "
+"<a href=http://en.wikipedia.org/wiki/Vorbis#Technical_Encoder>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>The Vorbis encoder uses a quality "
+"rating between -1 and 10 to define a certain expected audio quality level. "
+"The bitrate measure in this slider is just a rough estimate (provided by "
+"Vorbis) of the average bitrate of the encoded track given a quality value. "
+"In fact, with newer and more efficient Vorbis versions the actual bitrate is "
+"even lower.<br><b>5</b> is a good choice for music listening on a portable "
+"player.<br/>Anything below <b>3</b> might be unsatisfactory for music and "
+"anything above <b>8</b> is probably overkill."
+msgstr ""
+"A bitráta az adatminőség mérésére szolgál a szám egy másodpercére "
+"vonatkoztatva.<br> A Cantata által használt <b>Ogg Vorbis</b> kódoló "
+"támogatja <a href=http://hu.wikipedia.org/wiki/Vorbis>változó bitráta (VBR)</"
+"a> beállítását, ami azt jelenti, hogy értéke változik a szám során, annak "
+"megfelelően, hogy a hanganyag tartalma mennyire összetett. A komplexebb "
+"adatszakaszok magasabb bitrátával lesznek kódolva, mint a kevésbé komplexek;"
+"ez a megközelítés egyszerre produkál jobb minőséget és kisebb fájlt, mint  "
+"az állandó bitráta a szám egésze során. <br>A Vorbis kódoló -1 és 10 közötti "
+"értéket használ egy adott elvárt hangminőség meghatározására A bitráta érték "
+"a csúszkán csak durva becslése (Vorbis adja meg) a kódolt szám minőségének. "
+"A valóságban az újabb Vorbis verziók bitrátája ennél kisebb. <b><b>5</b> jó  "
+"választás zenék hordozható lejátszókon történő hallgatására. <br/>Bármi "
+"<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
+msgid "Quality rating"
+msgstr "Minőségi osztályzat"
+
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr "Opus"
+
+#: devices/encoders.cpp:203
+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 ""
+"<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
+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 ""
+"A bitráta az adatminőség mérésére szolgál a szám egy másodpercére "
+"vonatkoztatva.<br> A Cantata által használt <b>Opus</b> kódoló támogatja a "
+"<a href=http://hu.wikipedia.org/wiki/Változó_bitráta>változó bitráta (VBR)</"
+"a> beállítását, ami azt jelenti, hogy értéke változik a szám során, annak "
+"megfelelően, hogy a hanganyag tartalma mennyire összetett. A komplexebb "
+"adatszakaszok magasabb bitrátával lesznek kódolva, mint a kevésbé komplexek; "
+"ez a megközelítés egyszerre produkál jobb minőséget és kisebb fájlt, mint a "
+"szám egésze során állandó bitráta. <br>Ezért a csúszkán lévő bitrátaérték "
+"csak becslése az átkódolt szám átlagos bitrátájának.<br><b>128kb/s</b> jó "
+"választás zenék hordozható lejátszókon történő hallgatására. <br/>Bármi "
+"<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
+msgid "Bitrate"
+msgstr "Bitráta"
+
+#: devices/encoders.cpp:241
+msgid "Apple Lossless"
+msgstr "Apple veszteségmentes"
+
+#: devices/encoders.cpp:244
+msgctxt ""
+"Feel free to redirect the english Wikipedia link to a local version, if it "
+"exists."
+msgid ""
+"<a href=http://en.wikipedia.org/wiki/Apple_Lossless>Apple Lossless</a> "
+"(ALAC) is an audio codec for lossless compression of digital music."
+"<br>Recommended only for Apple music players and players that do not support "
+"FLAC."
+msgstr ""
+"<a href=http://en.wikipedia.org/wiki/Apple_Lossless>Apple Lossless</a> "
+"(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
+msgid "FLAC"
+msgstr "FLAC"
+
+#: devices/encoders.cpp:262
+msgctxt ""
+"Feel free to redirect the english Wikipedia link to a local version, if it "
+"exists."
+msgid ""
+"<a href=http://en.wikipedia.org/wiki/Free_Lossless_Audio_Codec>Free Lossless "
+"Audio Codec</a> (FLAC) is an open and royalty-free codec for lossless "
+"compression of digital music.<br>If you wish to store your music without "
+"compromising on audio quality, FLAC is an excellent choice."
+msgstr ""
+"<a href=http://hu.wikipedia.org/wiki/Free_Lossless_Audio_Codec>Free Lossless "
+"Audio Codec</a> (FLAC) egy veszteségmentes, nyílt és jogdíjmentes digitális "
+"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
+msgid ""
+"The <a href=http://flac.sourceforge.net/documentation_tools_flac."
+"html>compression level</a> is an integer value between 0 and 8 that "
+"represents the tradeoff between file size and compression speed while "
+"encoding with <b>FLAC</b>.<br/> Setting the compression level to <b>0</b> "
+"yields the shortest compression time but generates a comparably big file.<br/"
+">On the other hand, a compression level of <b>8</b> makes compression quite "
+"slow but produces the smallest file.<br/>Note that since FLAC is by "
+"definition a lossless codec, the audio quality of the output is exactly the "
+"same regardless of the compression level.<br/>Also, levels above <b>5</b> "
+"dramatically increase compression time but create an only slightly smaller "
+"file, and are not recommended."
+msgstr ""
+"A FLAC <a href=http://flac.sourceforge.net/documentation_tools_flac."
+"html>tömörítési szintjét</a> 0 és 8 közötti egész érték jelzi a  <b>FLAC</b> "
+"általi a kódolás során a fájl mérete és a tömörítés sebessége közötti "
+"kompromisszumot. <br/>A tömörítés szintjét <b>0</b>-ra állítva a tömörítési "
+"idő rövid lesz, de viszonylag nagy fájlt eredményez. <br/>Más részről ha a "
+"tömörítés szintje <b>8<b>, a tömörítés nagyon lassú lesz, de a legkisebb "
+"mérete adja. <br/> Mellesleg, mivel definíciója szerint a FLAC "
+"veszteségmentes kódoló, a kimeneti hangfájl minősége a tömörítés értékétől "
+"függetlenül azonos lesz.</br>Minden <b>5<b> fölötti érték miközben drámaian "
+"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
+msgid "Compression level"
+msgstr "Tömörítési szint"
+
+#: devices/encoders.cpp:291
+msgid "Faster compression"
+msgstr "Gyorsabb tömörítés"
+
+#: devices/encoders.cpp:298
+msgid "Windows Media Audio"
+msgstr "Windows Media Audio"
+
+#: devices/encoders.cpp:301
+msgctxt ""
+"Feel free to redirect the english Wikipedia link to a local version, if it "
+"exists."
+msgid ""
+"<a href=http://en.wikipedia.org/wiki/Windows_Media_Audio>Windows Media "
+"Audio</a> (WMA) is a proprietary codec developed by Microsoft for lossy "
+"audio compression.<br>Recommended only for portable music players that do "
+"not support Ogg Vorbis."
+msgstr ""
+"<a href=http://en.wikipedia.org/wiki/Windows_Media_Audio>Windows Media "
+"Audio</a> (WMA) Microsoft által kifejlesztett, szabadalmaztatott veszteséges "
+"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
+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> "
+"format and the difficulty of reverse-engineering a proprietary encoder, the "
+"WMA encoder used by Cantata sets a <a href=http://en.wikipedia.org/wiki/"
+"Windows_Media_Audio#Windows_Media_Audio>constant bitrate (CBR)</a> setting."
+"<br>For this reason, the bitrate measure in this slider is a pretty accurate "
+"estimate of the bitrate of the encoded track.<br><b>136kb/s</b> is a good "
+"choice for music listening on a portable player.<br/>Anything below <b>112kb/"
+"s</b> might be unsatisfactory for music and anything above <b>182kb/s</b> is "
+"probably overkill."
+msgstr ""
+"A bitráta az adatminőség mérésére szolgál a szám egy másodpercére "
+"vonatkoztatva.<br> A szabadalmi korlátozások és a jogvédett kódoló "
+"visszafejtésének nehézségei következtében a Cantata által használt <b>WMA</"
+"b> kódoló  <a href=http://en.wikipedia.org/wiki/"
+"Windows_Media_Audio#Windows_Media_Audio>állandó bitrátát (CBR)</a> alkalmaz. "
+"<br>Ennek következtében a csúszkán a szám kódolásának jelzett bitrátája elég "
+"pontos becslés. <br><b>136kb/s<!b> jó választás zenék hordozható lejátszón "
+"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
+msgid "Filename Scheme"
+msgstr "Fájlnév-séma"
+
+#: devices/filenameschemedialog.cpp:52
+msgctxt "Example album artist"
+msgid "Various Artists"
+msgstr "Vegyes előadók"
+
+#: devices/filenameschemedialog.cpp:53
+msgctxt "Example artist"
+msgid "Wibble"
+msgstr "Zengetés"
+
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr "Vivaldi"
+
+#: devices/filenameschemedialog.cpp:55
+msgctxt "Example album"
+msgid "Now 5001"
+msgstr "Now 5001"
+
+#: devices/filenameschemedialog.cpp:56
+msgctxt "Example song name"
+msgid "Wobble"
+msgstr "Wobble"
+
+#: devices/filenameschemedialog.cpp:57
+msgctxt "Example genre"
+msgid "Dance"
+msgstr "Dance"
+
+#: devices/filenameschemedialog.cpp:101
+msgid ""
+"<p>The following variables will be replaced with their corresponding meaning "
+"for each track name.</p>"
+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
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</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>"
+
+#: 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
+msgid "Updating..."
+msgstr "Frissítés..."
+
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
+msgid "Reading cache"
+msgstr "Cache olvasása"
+
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
+msgctxt "Message percent"
+msgid "%1 %2%"
+msgstr "%1 %2%"
+
+#: devices/mtpdevice.cpp:137
+msgid "Connecting to device..."
+msgstr "Csatlakozás az eszközhöz..."
+
+#: devices/mtpdevice.cpp:139 devices/mtpdevice.cpp:161
+msgid "No devices found"
+msgstr "Nem találtam eszközt"
+
+#: devices/mtpdevice.cpp:173
+msgid "Connected to device"
+msgstr "Csatlakozva az eszközhöz"
+
+#: devices/mtpdevice.cpp:183
+msgid "Disconnected from device"
+msgstr "Leválasztva az eszközről"
+
+#: devices/mtpdevice.cpp:250
+msgid "Updating folders..."
+msgstr "Könyvtárak frissítése"
+
+#: devices/mtpdevice.cpp:257
+msgid "Updating files..."
+msgstr "Fájlok frissítése..."
+
+#: devices/mtpdevice.cpp:262 devices/remotefsdevice.cpp:465
+#: devices/remotefsdevice.cpp:485
+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
+msgid "Not Connected"
+msgstr "Nincs csatlakozva"
+
+#: devices/musicbrainz.cpp:320
+msgid "%1 (Disc %2)"
+msgstr "%1 (Lemez %2)"
+
+#: devices/musicbrainz.cpp:408
+msgid "No matches found in MusicBrainz"
+msgstr "Nincs találat a MusicBrainz-ben"
+
+#: devices/remotedevicepropertiesdialog.cpp:51
+msgid "Connection"
+msgstr "Csatlakozás"
+
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
+msgid "Music Library"
+msgstr "Zenekönyvtár"
+
+#: devices/remotedevicepropertiesdialog.cpp:91
+msgid ""
+"A remote device named \"%1\" already exists!\n"
+"Please choose a different name"
+msgstr ""
+"A \"%1\" nevű távoli eszköz már létezik!\n"
+"Kérem válassz más nevet"
+
+#: devices/remotedevicepropertieswidget.cpp:52
+msgid "Samba Share"
+msgstr "Szamba-megosztás"
+
+#: devices/remotedevicepropertieswidget.cpp:53
+msgid "Samba Share (Auto-discover host and port)"
+msgstr "Szamba-megosztás (kiszolgáló és port automatikus felderítése)"
+
+#: devices/remotedevicepropertieswidget.cpp:54
+msgid "Secure Shell (sshfs)"
+msgstr "Biztonságos héj (sshfs)"
+
+#: devices/remotedevicepropertieswidget.cpp:55
+msgid "Locally Mounted Folder"
+msgstr "Helyileg csatolt könyvtár"
+
+#: devices/remotefsdevice.cpp:203 devices/remotefsdevice.cpp:612
+msgid "Available"
+msgstr "Elérhető"
+
+#: devices/remotefsdevice.cpp:211 devices/remotefsdevice.cpp:610
+msgid "Not Available"
+msgstr "Nem elérhető"
+
+#: devices/remotefsdevice.cpp:315
+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
+msgid "Connecting..."
+msgstr "Csatlakozás..."
+
+#: devices/remotefsdevice.cpp:358
+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
+msgid ""
+"No suitable ssh-askpass application installed! This is required for entering "
+"passwords."
+msgstr ""
+"Nincs megfelelő ssh-jelszóbekérő alkalmazás telepítve. A jelszó beviteléhez "
+"szükséges."
+
+#: devices/remotefsdevice.cpp:386
+msgid "Mount point (\"%1\") is not empty!"
+msgstr "Csatolási pont (\"%1\") nem üres!"
+
+#: devices/remotefsdevice.cpp:398
+msgid "\"sshfs\" is not installed!"
+msgstr "\"sshfs\" nincs telepítve!"
+
+#: devices/remotefsdevice.cpp:426 devices/remotefsdevice.cpp:446
+msgid "Disconnecting..."
+msgstr "Leválasztás..."
+
+#: devices/remotefsdevice.cpp:440
+msgid "\"fusermount\" is not installed!"
+msgstr "\"fusermount\" nincs telepítve!"
+
+#: devices/remotefsdevice.cpp:461 devices/remotefsdevice.cpp:482
+msgid "Failed to connect to \"%1\""
+msgstr "Nem sikerült csatlakozni ehhez \"%1\""
+
+#: devices/remotefsdevice.cpp:462 devices/remotefsdevice.cpp:497
+msgid "Failed to disconnect from \"%1\""
+msgstr "Nem sikerült leválasztani erről \"%1\""
+
+#: devices/remotefsdevice.cpp:573
+msgid "Capacity Unknown"
+msgstr "Kapacitás ismeretlen"
+
+#. i18n: file: gui/coverdialog.ui:30
+#. 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
+msgid "Search"
+msgstr "Keresés"
+
+#: devices/synccollectionwidget.cpp:62
+msgid "Check Items"
+msgstr "Tételek kiválasztása"
+
+#: devices/synccollectionwidget.cpp:64
+msgid "Uncheck Items"
+msgstr "Tételek kiválasztásának törlése"
+
+#: devices/synccollectionwidget.cpp:266
+msgid "Nothing selected"
+msgstr "Semmi sincs kiválasztva"
+
+#: devices/syncdialog.cpp:102
+msgid "Songs Only In Library:"
+msgstr "Dalok csak ebből a könyvtárból:"
+
+#: devices/syncdialog.cpp:102
+msgid "Copy To Device"
+msgstr "Másolás eszközre"
+
+#: devices/syncdialog.cpp:103
+msgid "Songs Only On Device:"
+msgstr "Dalok csak ezen az eszközön:"
+
+#: devices/syncdialog.cpp:107
+msgid "Synchronize"
+msgstr "Szinkronizálás"
+
+#: devices/syncdialog.cpp:164
+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
+msgid "Not Scanned"
+msgstr "Nincs átnézve"
+
+#: devices/valueslider.cpp:99
+msgid " (recommended)"
+msgstr " (ajánlott)"
+
+#: dynamic/dynamic.cpp:208
+msgid "Start Dynamic Playlist"
+msgstr "Dinamikus lejátszási lista indítása"
+
+#: dynamic/dynamic.cpp:209
+msgid "Stop Dynamic Mode"
+msgstr "Dinamikus mód leállítása"
+
+#: dynamic/dynamic.cpp:257
+msgid "1 Rule"
+msgid_plural "%1 Rules"
+msgstr[0] "1 Szabály"
+msgstr[1] "%1 Szabályok"
+
+#: dynamic/dynamic.cpp:396
+msgid ""
+"You need to install \"perl\" on your system in order for Cantata's dynamic "
+"mode to function."
+msgstr ""
+"Telepítened kell a  \"perl\"-t a rendszeredre, a Cantata dinamikus módjának "
+"működéséhez."
+
+#: dynamic/dynamic.cpp:403
+msgid "Failed to locate rules file - %1"
+msgstr "Nem találom a szabályok fájlt - %1"
+
+#: dynamic/dynamic.cpp:411
+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
+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
+msgid "Dynamizer has been terminated."
+msgstr "A dinamizáló befejeződött."
+
+#: dynamic/dynamic.cpp:816
+msgid "Uknown"
+msgstr "Ismeretlen"
+
+#: dynamic/dynamic.cpp:818
+msgid "Loading list of rules"
+msgstr "Szabálylista betöltése"
+
+#: dynamic/dynamic.cpp:819
+msgid "Saving rule"
+msgstr "Szabályok mentése"
+
+#: dynamic/dynamic.cpp:820
+msgid "Deleting rule"
+msgstr "Szabályok törlése"
+
+#: dynamic/dynamic.cpp:821
+msgid "Setting active rule"
+msgstr "Aktív szabályok beállítása"
+
+#: dynamic/dynamic.cpp:822
+msgid "Stopping dynamizer"
+msgstr "Dinamizáló leállítása"
+
+#: dynamic/dynamic.cpp:823
+msgid "Requesting ID details"
+msgstr "Azonosító-részletek bekérése"
+
+#: dynamic/dynamic.cpp:826
+msgid "Awaiting response for previous command. (%1)"
+msgstr "Választ vár a korábbi parancshoz. (%1) "
+
+#: dynamic/dynamic.cpp:981
+msgid "Dynamizer is not active"
+msgstr "Dinamizáló nem aktív"
+
+#: dynamic/dynamic.cpp:989
+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
+msgid "Failed to delete rules file. (%1)"
+msgstr "Nem sikerült törölni a dinamika szabálylistát. (%1) "
+
+#: dynamic/dynamic.cpp:1027
+msgid "Failed to control dynamizer state. (%1)"
+msgstr "Nem sikerült ellenőrizni a dinamizáló állapotát. (%1) "
+
+#: dynamic/dynamic.cpp:1036
+msgid "Failed to set the current dynamic rules. (%1)"
+msgstr "Nem sikerült helyreállítani jelenlegi dinamika-szabályokat. (%1) "
+
+#: dynamic/dynamicpage.cpp:40
+msgid "Refresh Dynamic Rules"
+msgstr "Dinamikaszabályok frissítése"
+
+#: dynamic/dynamicpage.cpp:41
+msgid "Add Dynamic Rules"
+msgstr "Dinamikaszabályok hozzáadása"
+
+#: dynamic/dynamicpage.cpp:42
+msgid "Edit Dynamic Rules"
+msgstr "Dinamikaszabályok szerkesztése"
+
+#: dynamic/dynamicpage.cpp:43 dynamic/dynamicpage.cpp:151
+msgid "Remove Dynamic Rules"
+msgstr "Dinamikaszabályok eltávolítása"
+
+#: dynamic/dynamicpage.cpp:150
+msgid ""
+"Are you sure you wish to remove the selected rules?\n"
+"This cannot be undone."
+msgstr ""
+"Biztosan szeretnéd eltávolítani a kiválasztott szabályokat?\n"
+"Ezt nem lehet visszavonni."
+
+#: dynamic/dynamicruledialog.cpp:41
+msgid "Dynamic Rule"
+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
+msgid "Add"
+msgstr "Hozzáad"
+
+#: dynamic/dynamicruledialog.cpp:202
+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
+msgid ""
+"<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
+msgid "SimilarArtists"
+msgstr "Hasonló előadók"
+
+#: dynamic/dynamicrulesdialog.cpp:70
+msgid "AlbumArtist"
+msgstr "AlbumElőadó"
+
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr "Zeneszerző"
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
+msgid "Album"
+msgstr "Lemez"
+
+#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: ectx: property (text), widget (QPushButton, genre)
+#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
+#. i18n: file: devices/filenameschemedialog.ui:145
+#. i18n: ectx: property (text), widget (QPushButton, genre)
+#. i18n: file: dynamic/dynamicrule.ui:90
+#. 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
+msgid "Genre"
+msgstr "Műfaj"
+
+#: dynamic/dynamicrulesdialog.cpp:80
+msgid "Date"
+msgstr "Dátum"
+
+#: dynamic/dynamicrulesdialog.cpp:92
+msgid "Include"
+msgstr "Befoglal"
+
+#: dynamic/dynamicrulesdialog.cpp:99
+msgid "Exclude"
+msgstr "Kizár"
+
+#: dynamic/dynamicrulesdialog.cpp:122
+msgid " (Exact)"
+msgstr "(Pontosan)"
+
+#: dynamic/dynamicrulesdialog.cpp:139
+msgid "Dynamic Rules"
+msgstr "Dinamikaszabályok"
+
+#: dynamic/dynamicrulesdialog.cpp:290
+msgid ""
+"<p>Cantata will query your library using all of the rules listed. The list "
+"of <i>Include</i> rules will be used to build a set of songs that can be "
+"used. The list of <i>Exclude</i> rules will be used to build a set of songs "
+"that cannot be used. If there are no <i>Include</i> rules, Cantata will "
+"assume that all songs (bar those from <i>Exclude</i>) can be used. <br/>e.g. "
+"to have Cantata look for 'Rock songs by Wibble OR songs by Various Artists', "
+"you would need the following: <ul><li>Include AlbumArtist=Wibble Genre=Rock</"
+"li><li>Include AlbumArtist=Various Artists</li></ul> To have Cantata look "
+"for 'Songs by Wibble but not from album Abc', you would need the following: "
+"<ul><li>Include AlbumArtist=Wibble</li><li>Exclude Album=Abc</li></ul>After "
+"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>A Cantata a felsorolt szabályok szerint végignézi a könyvtáradat. A "
+"<i>Hozzávesz</i> szabályokat a szóba jöhető dalokból összeállítás "
+"készítésére használja. A <i>Kizár</i> szabályokat fel nem használható dalok "
+"összegyűjtésére használja. <i>Hozzávesz</i> szabályok hiányát, a Cantata úgy "
+"értelmezi, hogy az összes dal (a <i>Kizár</i> kivételével) felhasználható. "
+"<br/>pl. hogy a Cantata 'Wibble VAGY Válogatott előadók rock dalokat "
+"gyűjtse', a következők kellenek: <ul><li>Hozzávesz AlbumElőadó=Wibble "
+"Műfaj=Rock</li><li>Hozzávesz AlbumElőadó=Vegyes előadók</li></ul>. Hogy a "
+"Cantata keresse a 'Wibble dalokat, de nem az ABC albumból', a következők "
+"kellenek: <ul><li>Hozzávesz AlbumElőadó=Wibble</li><li>Kizár Album=Abc</li></"
+"ul>. Ezután a használható dalokból készül összeállítás. A Cantata "
+"véletlenszerűen választ ki dalokat lejátszásra, hogy a lejátszó listában "
+"meglegyen a 10 tétel.</p>"
+
+#: dynamic/dynamicrulesdialog.cpp:309
+msgid "Failed to save %1"
+msgstr "Nem sikerült menteni %1"
+
+#: dynamic/dynamicrulesdialog.cpp:327
+msgid ""
+"A set of rules named '%1' already exists!\n"
+"Overwrite?"
+msgstr ""
+"Ezen a néven '%1' már van szabályrendszer!\n"
+"Felülírja?"
+
+#: dynamic/dynamicrulesdialog.cpp:328
+msgid "Overwrite Rules"
+msgstr "Szabályok felülírása"
+
+#: dynamic/dynamicrulesdialog.cpp:353
+msgid "Saving %1"
+msgstr "Mentés %1"
+
+#: gui/cachesettings.cpp:168
+msgid "Deleting..."
+msgstr "Törlés..."
+
+#: gui/cachesettings.cpp:191
+msgid "Name"
+msgstr "Név"
+
+#: gui/cachesettings.cpp:191
+msgid "Item Count"
+msgstr "Elemek számolása"
+
+#: gui/cachesettings.cpp:191
+msgid "Space Used"
+msgstr "Felhasznált hely"
+
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr "Teljes felhasznált terület: %1"
+
+#: gui/cachesettings.cpp:245
+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."
+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 "
+"egy összegzés."
+
+#: gui/cachesettings.cpp:257
+msgid "Covers"
+msgstr "Borítók"
+
+#: gui/cachesettings.cpp:258
+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:264
+msgid "Jamendo"
+msgstr "Jamedo"
+
+#: gui/cachesettings.cpp:265
+msgid "Magnatune"
+msgstr "Magnatune"
+
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr "Podcast-könyvtárak"
+
+#: gui/cachesettings.cpp:273
+msgid "Delete All"
+msgstr "Minden törlése"
+
+#: gui/cachesettings.cpp:312
+msgid "Delete all '%1' items?"
+msgstr "Törli mind a '%1' tételt?"
+
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
+msgid "Delete Cache Items"
+msgstr "Cache tételek törlése"
+
+#: gui/cachesettings.cpp:322
+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
+msgctxt ""
+"name\n"
+"width x height (file size)"
+msgid ""
+"%1\n"
+"%2 x %3 (%4)"
+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
+msgctxt ""
+"Discogs\n"
+"width x height"
+msgid ""
+"Discogs\n"
+"%1 x %2"
+msgstr ""
+"Discogs\n"
+"%1 x %2"
+
+#: 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:256
+msgid "Image"
+msgstr "Kép"
+
+#: gui/coverdialog.cpp:259
+msgid "Downloading..."
+msgstr "Letöltés..."
+
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
+msgctxt "Image (width x height zoom%)"
+msgid "Image (%1 x %2 %3%)"
+msgstr "Kép (%1 x %2 %3%)"
+
+#: gui/coverdialog.cpp:432
+msgid ""
+"<p>An image already exists for this artist, and the file is not writeable."
+"<p></p><i>%1</i></p>"
+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
+msgid ""
+"<p>A cover already exists for this album, and the file is not writeable.<p></"
+"p><i>%1</i></p>"
+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:579
+msgid ""
+"Failed to set cover!\n"
+"Could not download to temporary file!"
+msgstr ""
+"Nem sikerült a borítót beállítani\n"
+"Nem tudtam átmeneti fájlba tölteni!"
+
+#: gui/coverdialog.cpp:607
+msgid "Failed to download image!"
+msgstr "A képet nem tudtam letölteni!"
+
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
+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
+msgid "File is already in list!"
+msgstr "A fájl már szerepel a listában!"
+
+#: gui/coverdialog.cpp:804
+msgid "Failed to read image!"
+msgstr "Nem tudtam olvasni a képet!"
+
+#: gui/coverdialog.cpp:817
+msgid "Display"
+msgstr "Mutatás"
+
+#. 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)
+#. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
+msgid "Remove"
+msgstr "Eltávolítás"
+
+#: gui/coverdialog.cpp:1181
+msgid ""
+"Failed to set cover!\n"
+"Could not make copy!"
+msgstr ""
+"A borító beállítása sikertelen!\n"
+"Nem tudtam másolatot készíteni!"
+
+#: gui/coverdialog.cpp:1190
+msgid ""
+"Failed to set cover!\n"
+"Could not backup original!"
+msgstr ""
+"A borító beállítása sikertelen!\n"
+"Nem tudtam menteni az eredetit!"
+
+#: gui/coverdialog.cpp:1239
+msgid ""
+"Failed to set cover!\n"
+"Could not copy file to '%1'!"
+msgstr ""
+"A borító beállítása sikertelen!\n"
+"Nem tudtam másolni a fájlt ide '%1'!"
+
+#: gui/folderpage.cpp:45
+msgid "Open In File Manager"
+msgstr "Megnyitás fájlkezelőben"
+
+#: gui/initialsettingswizard.cpp:140
+msgid "Connection Established"
+msgstr "Kapcsolat felállt"
+
+#: gui/initialsettingswizard.cpp:140
+msgid "Connection Failed"
+msgstr "Csatlakozás sikertelen"
+
+#. 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
+msgid "None"
+msgstr "Nincs"
+
+#: gui/interfacesettings.cpp:40
+msgid "Small"
+msgstr "Kicsi"
+
+#: gui/interfacesettings.cpp:41
+msgid "Medium"
+msgstr "Közepes"
+
+#: gui/interfacesettings.cpp:42
+msgid "Large"
+msgstr "Nagy"
+
+#: gui/interfacesettings.cpp:43
+msgid "Extra Large"
+msgstr "Nagyon nagy"
+
+#: gui/interfacesettings.cpp:48
+msgid "Simple Tree"
+msgstr "Egyszerű fa"
+
+#: gui/interfacesettings.cpp:49
+msgid "Detailed Tree"
+msgstr "Részletes fa"
+
+#. i18n: file: gui/interfacesettings.ui:329
+#. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
+msgid "Grouped Albums"
+msgstr "Csoportosított lemezek"
+
+#: gui/interfacesettings.cpp:53
+msgid "List"
+msgstr "Lista"
+
+#: gui/interfacesettings.cpp:55
+msgid "Icon/List"
+msgstr "Ikon, vagy lista"
+
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+msgstr "Könyvtárak"
+
+#. 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)
+#: 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
+msgid "Style:"
+msgstr "Stílus:"
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr "Online"
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr "Eszközök"
+
+#: gui/interfacesettings.cpp:178
+msgid "Grouped by 'Album Artist'"
+msgstr "'Album Előadó' szerint csoportosítva"
+
+#: gui/interfacesettings.cpp:179
+msgid "Grouped under 'Various Artists'"
+msgstr "'Vegyes előadók' alatt csoportosítva"
+
+#: 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
+msgid "Cantata"
+msgstr "Cantata"
+
+#: gui/main.cpp:214
+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:220
+msgid "Craig Drummond"
+msgstr "Craig Drummond"
+
+#: gui/main.cpp:220
+msgid "Maintainer"
+msgstr "Karban tartó"
+
+#: gui/main.cpp:221
+msgid "Piotr Wicijowski"
+msgstr "Piotr Wicijowski"
+
+#: gui/main.cpp:221
+msgid "UI Improvements"
+msgstr "UI fejlesztések"
+
+#: gui/main.cpp:222
+msgid "Sander Knopper"
+msgstr "Sander Knopper"
+
+#: gui/main.cpp:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
+msgid "QtMPC author"
+msgstr "QtMPC készítője"
+
+#: gui/main.cpp:223
+msgid "Roeland Douma"
+msgstr "Roeland Douma"
+
+#: gui/main.cpp:224
+msgid "Daniel Selinger"
+msgstr "Daniel Selinger"
+
+#: gui/main.cpp:225
+msgid "Armin Walland"
+msgstr "Armin Walland"
+
+#: gui/main.cpp:229
+msgid "FanArt.tv"
+msgstr "FanArt.tv"
+
+#: gui/main.cpp:229
+msgid ""
+"Context view backdrops (please consider uploading your own music fan-art to "
+"fanart.tv)"
+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
+msgid "Wikipedia"
+msgstr "Wikipédia"
+
+#: gui/main.cpp:230 gui/main.cpp:231
+msgid "Context view metadata"
+msgstr "A metaadatok tartalmi nézete"
+
+#: gui/main.cpp:235
+msgid "URL to open"
+msgstr "URL megnyitásra"
+
+#: gui/mainwindow.cpp:238
+msgid "Quit"
+msgstr "Megszakít"
+
+#: gui/mainwindow.cpp:242
+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
+msgid "Connect"
+msgstr "Csatlakozás"
+
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
+msgid "Collection"
+msgstr "Gyűjtemény"
+
+#: gui/mainwindow.cpp:247
+msgid "Outputs"
+msgstr "Kimenetek"
+
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
+msgid "Stop After Track"
+msgstr "A szám után leáll"
+
+#: gui/mainwindow.cpp:249
+msgid "Add To Stored Playlist"
+msgstr "A tárolt lejátszási listához hozzáad"
+
+#: gui/mainwindow.cpp:250
+msgid "Remove From Play Queue"
+msgstr "A lejátszási sorból töröl"
+
+#: gui/mainwindow.cpp:251
+msgid "Copy Track Info"
+msgstr "Száminformációk másolása"
+
+#: gui/mainwindow.cpp:252
+msgid "Crop"
+msgstr "Vágás"
+
+#: gui/mainwindow.cpp:253
+msgid "Shuffle Tracks"
+msgstr "Számok keverése"
+
+#: gui/mainwindow.cpp:254
+msgid "Shuffle Albums"
+msgstr "Albumok keverése"
+
+#: gui/mainwindow.cpp:255
+msgid "Add Stream URL"
+msgstr "Stream URL hozzáadása"
+
+#: gui/mainwindow.cpp:256
+msgid "Clear"
+msgstr "Töröl"
+
+#: gui/mainwindow.cpp:257
+msgid "Expanded Interface"
+msgstr "Lejátszó kinyitása"
+
+#: gui/mainwindow.cpp:258
+msgid "Show Current Song Information"
+msgstr "A lejátszó kibontása"
+
+#: gui/mainwindow.cpp:261
+msgid "Full Screen"
+msgstr "Teljes képernyő"
+
+#: gui/mainwindow.cpp:263
+msgid "Random"
+msgstr "Véletlenszerűen"
+
+#: gui/mainwindow.cpp:264
+msgid "Repeat"
+msgstr "Ismétlés"
+
+#: gui/mainwindow.cpp:265
+msgid "Single"
+msgstr "Egyszeri"
+
+#: gui/mainwindow.cpp:265
+msgid ""
+"When 'Single' is activated, playback is stopped after current song, or song "
+"is repeated if 'Repeat' is enabled."
+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
+msgid "Consume"
+msgstr "Elhasznál"
+
+#: gui/mainwindow.cpp:266
+msgid ""
+"When consume is activated, a song is removed from the play queue after it "
+"has been played."
+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
+msgid "Set Priority"
+msgstr "Prioritás beállítása"
+
+#: gui/mainwindow.cpp:271
+msgid "Play Stream"
+msgstr "Hangfolyam (stream) lejátszása"
+
+#: gui/mainwindow.cpp:273
+msgid "Locate In Library"
+msgstr "Könyvtárban megkeres"
+
+#: gui/mainwindow.cpp:275
+msgid "Edit Song Tags"
+msgstr "Dal címkéjének szerkesztése"
+
+#. i18n: file: gui/interfacesettings.ui:304
+#. i18n: ectx: attribute (title), widget (QWidget, tab_5)
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
+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
+msgid "Dynamic"
+msgstr "Dinamikus"
+
+#: gui/mainwindow.cpp:288
+msgid "Expand All"
+msgstr "Mind kibontása"
+
+#: gui/mainwindow.cpp:289
+msgid "Collapse All"
+msgstr "Mind elrejtése"
+
+#: gui/mainwindow.cpp:290
+msgid "Remove All Songs"
+msgstr "Összes dal eltávolítása"
+
+#: gui/mainwindow.cpp:398
+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
+msgid "Server information..."
+msgstr "Kiszolgáló-információk"
+
+#: gui/mainwindow.cpp:552
+msgid "Configure Cantata..."
+msgstr "Cantata beállítása..."
+
+#: gui/mainwindow.cpp:559
+msgctxt "Qt-only"
+msgid "About Cantata..."
+msgstr "Cantata névjegye..."
+
+#: gui/mainwindow.cpp:571
+msgid "&File"
+msgstr "&Fájl"
+
+#: gui/mainwindow.cpp:574
+msgid "&Settings"
+msgstr "Beállítások"
+
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
+msgid "&Help"
+msgstr "Segítség"
+
+#: gui/mainwindow.cpp:948
+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
+msgid "Connecting to %1"
+msgstr "Csatlakozás ehhez %1"
+
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+"Podcast-ok  letöltése folyik\n"
+"\n"
+"A kilépés az összes letöltést megszakítja."
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr "Letöltés megszakítása és kilépés"
+
+#: gui/mainwindow.cpp:1447
+msgctxt "Qt-only"
+msgid "About Cantata"
+msgstr "Cantata névjegye"
+
+#: gui/mainwindow.cpp:1448
+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 kliens.<br/><br/>(c) Craig Drummond 2011-2013."
+"<br/>Kiadva <a href=\"http://www.gnu.org/licenses/gpl.html\">GPLv3 alatt</a>"
+
+#: gui/mainwindow.cpp:1450
+msgid ""
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
+"QtMPC Authors<br/>"
+msgstr ""
+"Ezen alapul <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
+"QtMPC Authors<br/>"
+
+#: gui/mainwindow.cpp:1451
+msgctxt "Qt-only"
+msgid ""
+"Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
+"tv</a>"
+msgstr ""
+"A tartalmi nézet háttere innen származik <a href=\"http://www.fanart.tv"
+"\">FanArt.tv</a>"
+
+#: gui/mainwindow.cpp:1452
+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 ""
+"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
+msgid ""
+"Please consider uploading your own music fan-art to <a href=\"http://www."
+"fanart.tv\">FanArt.tv</a>"
+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
+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>"
+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>"
+
+#: gui/mainwindow.cpp:1472
+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>"
+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
+msgid "Server Information"
+msgstr "Szerver-információk"
+
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
+msgid "Cantata (%1)"
+msgstr "Cantata (%1)"
+
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
+msgctxt "track :: Cantata (connection)"
+msgid "%1 :: Cantata (%2)"
+msgstr "%1 :: Cantata (%2)"
+
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
+msgctxt "track :: Cantata"
+msgid "%1 :: Cantata"
+msgstr "%1 :: Cantata"
+
+#: gui/mainwindow.cpp:1728
+msgctxt "track - artist :: Cantata (connection)"
+msgid "%1 - %2 :: Cantata (%3)"
+msgstr "%1 - %2 :: Cantata (%3)"
+
+#: gui/mainwindow.cpp:1730
+msgctxt "track - artist :: Cantata"
+msgid "%1 - %2 :: Cantata"
+msgstr "%1 - %2 :: Cantata"
+
+#: gui/mainwindow.cpp:1773
+msgid "(Stream)"
+msgstr "(Stream)"
+
+#: gui/mainwindow.cpp:1775
+msgctxt "title - artist"
+msgid "%1 - %2"
+msgstr "%1 - %2"
+
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
+msgctxt "artist - album"
+msgid "%1 - %2"
+msgstr "%1 - %2"
+
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
+msgstr "Az MPD a következő hibát jelezte: %1"
+
+#: gui/mainwindow.cpp:1990
+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
+msgid "Priority"
+msgstr "Prioritás"
+
+#: gui/mainwindow.cpp:2080
+msgid "Enter priority (0..255):"
+msgstr "Add meg a prioritást (0-255):"
+
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+msgid "Playlist Name"
+msgstr "Lejátszási lista neve"
+
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
+msgid "Enter a name for the playlist:"
+msgstr "Írj be egy nevet a lejátszási listának:"
+
+#: gui/mainwindow.cpp:2106
+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
+msgid "Existing Playlist"
+msgstr "Létező lejátszási lista"
+
+#: gui/playbacksettings.cpp:42
+msgid "Do not fadeout"
+msgstr "Nem úsztasson ki"
+
+#: gui/playbacksettings.cpp:43
+msgid " ms"
+msgstr " ms"
+
+#. i18n: file: devices/albumdetails.ui:165
+#. i18n: ectx: property (text), widget (QTreeWidget, tracks)
+#: gui/playbacksettings.cpp:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
+msgid "Track"
+msgstr "Szám"
+
+#: gui/playbacksettings.cpp:51
+msgid "Auto"
+msgstr "Automatikus"
+
+#: gui/playbacksettings.cpp:164
+msgid ""
+"<i>Connected to %1<br/>The entries below apply to the currently connected "
+"MPD collection.</i>"
+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: ectx: property (text), widget (QLabel, messageLabel)
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
+msgid ""
+"<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
+"not connected to MPD.</i>"
+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
+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 "
+"works on a track/album basis, and is now supported in a growing number of "
+"players.</p><p>The following ReplayGain settings may be used:"
+"<ul><li><i>None</i> - No ReplayGain is applied.</li><li><i>Track</i> - "
+"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 activated, otherwise the album's tags will be used.</"
+"li></ul></p>"
+msgstr ""
+"<p>A Replay Gain (lejátszási szint) 2001-ben kiadott szabványosítási "
+"javaslat, hogy az MP3 és Ogg Vorbis-hoz hasonló számítógépes hangok "
+"lejátszási hangerejét normalizálja. Ez szám/album alapon működik, és "
+"mostanra már a lejátszók nagy száma támogatja. </p><p>A következő Lejátszási "
+"szint beállítások használhatók:<ul><li><i>Semmi</i> - Nincs beállítva szint."
+"</li><li><i>Szám</i> - A hangerőt a számok ReplayGain címkéi alapján állítja "
+"be.</li><li><i>Album</i> - A hangerőt az albumok  ReplayGain címkéi alapján "
+"állítja be.</li><li><i>Automatikus</i> - A lejátszás hangerejét, ha a "
+"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
+msgid "Rename"
+msgstr "Átnevezés"
+
+#: gui/playlistspage.cpp:190
+msgid ""
+"Are you sure you wish to remove the selected playlists?\n"
+"This cannot be undone."
+msgstr ""
+"Biztosan eltávolítod a kijelölt lejátszási listát?\n"
+"Nem vonható vissza."
+
+#: gui/playlistspage.cpp:191
+msgid "Remove Playlists"
+msgstr "Lejátszási lista eltávolítása"
+
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
+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
+msgid "Overwrite Playlist"
+msgstr "Lejátszási lista felülírása"
+
+#: gui/playlistspage.cpp:230
+msgid "Rename Playlist"
+msgstr "Lejátszási lista eltávolítása"
+
+#: gui/playlistspage.cpp:230
+msgid "Enter new name for playlist:"
+msgstr "Adj új nevet a lejátszási listának:"
+
+#: gui/preferencesdialog.cpp:80
+msgid "Collection Settings"
+msgstr "Gyűjtemény beállításai"
+
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
+msgid "Playback"
+msgstr "Lejátszás"
+
+#: gui/preferencesdialog.cpp:81
+msgid "Playback Settings"
+msgstr "Lejátszás beállításai"
+
+#: gui/preferencesdialog.cpp:82
+msgid "Files"
+msgstr "Fájlok"
+
+#: gui/preferencesdialog.cpp:82
+msgid "File Settings"
+msgstr "Fájl-beállítások"
+
+#: gui/preferencesdialog.cpp:83
+msgid "Interface"
+msgstr "Felület"
+
+#: gui/preferencesdialog.cpp:83
+msgid "Interface Settings"
+msgstr "A felület beállításai"
+
+#: gui/preferencesdialog.cpp:85
+msgid "Streams Settings"
+msgstr "Hangfolyam beállításai"
+
+#: gui/preferencesdialog.cpp:89
+msgid "Online Providers"
+msgstr "Online szolgáltatók"
+
+#: gui/preferencesdialog.cpp:92
+msgid "Context"
+msgstr "Tartalom"
+
+#: gui/preferencesdialog.cpp:92
+msgid "Context View Settings"
+msgstr "Tartalmi nézet beállításai"
+
+#: gui/preferencesdialog.cpp:95
+msgid "HTTP Server"
+msgstr "HTTP Szerver"
+
+#: gui/preferencesdialog.cpp:95
+msgid "HTTP Server Settings"
+msgstr "HTTP Szerver beállításai"
+
+#: gui/preferencesdialog.cpp:103
+msgid "Audio CD Settings"
+msgstr "Hang CD beállításai"
+
+#: gui/preferencesdialog.cpp:108
+msgid "Proxy"
+msgstr "Proxy"
+
+#: gui/preferencesdialog.cpp:108
+msgctxt "Qt-only"
+msgid "Proxy Settings"
+msgstr "Proxybeállítások"
+
+#: gui/preferencesdialog.cpp:112
+msgctxt "Qt-only"
+msgid "Shortcuts"
+msgstr "Gyorsbillentyűk"
+
+#: gui/preferencesdialog.cpp:112
+msgctxt "Qt-only"
+msgid "Keyboard Shortcut Settings"
+msgstr "Gyorsbillentyűk beállításai"
+
+#: gui/preferencesdialog.cpp:115
+msgid "Cache"
+msgstr "Cache"
+
+#: gui/preferencesdialog.cpp:115
+msgid "Cached Items"
+msgstr "Cache elemei"
+
+#: gui/preferencesdialog.cpp:116
+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: ectx: property (text), widget (BuddyLabel, hostLabel)
+#. i18n: file: network/proxysettings.ui:63
+#. i18n: ectx: property (text), widget (BuddyLabel, proxyHostLabel)
+#. 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)
+#: 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
+msgid "Host:"
+msgstr "Elhelyező:"
+
+#: 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 "
+"'dynamic playlists'. In order to function, the <code>cantata-dynamic</code> "
+"application <b>must</b> already have been installed, and started, on the "
+"relevant host - Cantata itself cannot control the starting/stopping of this "
+"service.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> 'Dinamizáló port' csak akkor releváns, ha a 'dinamikus "
+"lejátszási listát' akarod használni. A működtetéshez a <code>cantata-"
+"dynamic</code> alkalmazás telepítve és elindítva <b>kell</b> legyen a "
+"megfelelő host-on - a Cantata maga nem tudja vezérelni a szolgáltatás "
+"elindítását/leállítását.</i>"
+
+#: 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 "
+"function, the <code>cantata-dynamic</code> application <b>must</b> already "
+"have been installed, and started, on the relevant host - Cantata itself "
+"cannot control the starting/stopping of this service. If this is not set, "
+"then Cantata will use a per-user instance of the dynamizer to facilitate "
+"dynamic playlists.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> a 'Dinamizáló port' csak akkor számít, ha rendszer-, "
+"vagy nem helyi szinten üzemelteted a Cantatat dinamizáló példányát. Ehhez a "
+"funkcióhoz a <code>cantata-dynamic</code> alkalmazás telepítve és elindítva "
+"<b>kell</b> legyen a megfelelő host-on - a Cantata önmaga nem tudja "
+"vezérelni a szolgáltatás elindítását/leállítását. Ha nincs beállítva, akkor "
+"a Cantata a dinamizáló felhasználói változatát fogja használni a a dinamikus "
+"fájllista eléréséhez.</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 "
+"artist of the current song, and %album% will be replaced with the album name."
+"</i></p>"
+msgstr ""
+"<p>Fájlnév (kiterjesztés nélkül) lementi a borítót aszerint.<br/>Ha üresen "
+"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
+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 ""
+"Milyen gyűjteménytípushoz akarsz csatlakozni? <br/><ul><li>Standard - "
+"zenegyűjtemény már megosztva másik gépen, vagy már be van állítva </"
+"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
+msgid "Add Collection"
+msgstr "Gyűjteményt hozzáad"
+
+#: gui/serversettings.cpp:255
+msgid "Standard"
+msgstr "Szabványos"
+
+#: gui/serversettings.cpp:255
+msgid "Basic"
+msgstr "Alap"
+
+#: gui/serversettings.cpp:297
+msgid "Delete <b>%1</b>?"
+msgstr "Törlöd <b>%1</b>?"
+
+#: gui/serversettings.cpp:298
+msgid "Delete"
+msgstr "Törlés"
+
+#: gui/serversettings.cpp:336
+msgid "New Collection %1"
+msgstr "Új gyűjtemény %1"
+
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
+msgid "Default"
+msgstr "Alapbeállítás"
+
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
+msgstr "Multimédia-gombok"
+
+#: gui/shortcutssettingspage.cpp:80
+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
+msgid "Use media keys to control Cantata"
+msgstr "A médiagombok használata a Cantata vezérlésére"
+
+#: gui/shortcutssettingspage.cpp:84
+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
+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
+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"
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr "Következő szám"
+
+#: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr "Lejátszás/Szünet"
+
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr "A mostani szám után leáll"
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr "Hangerő növelése"
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr "Hangerő csökkentése"
+
+#: gui/stdactions.cpp:63
+msgid "Save As"
+msgstr "Mentés mint..."
+
+#: gui/stdactions.cpp:64
+msgid "Add To Play Queue"
+msgstr "Lejátszási listához hozzáad"
+
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr "Albumok hozzáadása véletlenszerű sorrendben."
+
+#: gui/stdactions.cpp:66
+msgid "Replace Play Queue"
+msgstr "Lejátszási lista lecserélése"
+
+#: gui/stdactions.cpp:67
+msgid "Add With Priority"
+msgstr "Hozzáad prioritással"
+
+#: gui/stdactions.cpp:68
+msgid "Highest Priority (255)"
+msgstr "Legmagasabb prioritás (255)"
+
+#: gui/stdactions.cpp:69
+msgid "High Priority (200)"
+msgstr "Magas prioritás (200)"
+
+#: gui/stdactions.cpp:70
+msgid "Medium Priority (125)"
+msgstr "Közepes prioritás (125)"
+
+#: gui/stdactions.cpp:71
+msgid "Low Priority (50)"
+msgstr "Alacsony prioritás (50)"
+
+#: gui/stdactions.cpp:72
+msgid "Default Priority (0)"
+msgstr "Alap prioritás (0)"
+
+#: gui/stdactions.cpp:73
+msgid "Custom Priority..."
+msgstr "Tetszőleges prioritás..."
+
+#: gui/stdactions.cpp:74
+msgid "Add To Playlist"
+msgstr "Lejátszási listához ad"
+
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
+msgid "Organize Files"
+msgstr "Fájlok rendezése"
+
+#: gui/stdactions.cpp:77
+msgid "Edit Tags"
+msgstr "Címkék szerkesztése"
+
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
+msgid "ReplayGain"
+msgstr "Lejátszási szint"
+
+#: gui/stdactions.cpp:83
+msgid "Copy Songs To Device"
+msgstr "Számok másolása az eszközre"
+
+#: gui/stdactions.cpp:87
+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
+msgctxt "Song on Album"
+msgid "%1 on %2"
+msgstr "%1 ezen %2"
+
+#: gui/trayitem.cpp:193
+msgctxt "Song on Album (track duration)"
+msgid "%1 on %2 (%3)"
+msgstr "%1 ezen %2 (%3)"
+
+#: gui/trayitem.cpp:195
+msgctxt "Song by Artist on Album"
+msgid "%1 by %2 on %3"
+msgstr "%1 előadja %2 ezen %3"
+
+#: gui/trayitem.cpp:196
+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
+msgid "Now playing"
+msgstr "Most megy"
+
+#: http/httpserversettings.cpp:40
+msgid "Local loopback (%1)"
+msgstr "Helyi visszacsatolás (%1)"
+
+#: http/httpserversettings.cpp:43
+msgid "Wired (%1)"
+msgstr "Vezetékes (%1)"
+
+#: http/httpserversettings.cpp:46
+msgid "Wireless (%1)"
+msgstr "Vezeték nélküli (%1)"
+
+#: http/httpserversettings.cpp:53
+msgid "First active interface"
+msgstr "Az első aktív interfész"
+
+#: http/httpserversettings.cpp:98
+msgid "Inactive"
+msgstr "Inaktív"
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr "Kulcslap"
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr "Lejátszási lista"
+
+#: models/devicesmodel.cpp:108
+msgid "Configure Device"
+msgstr "Eszköz beállítása"
+
+#: models/devicesmodel.cpp:109
+msgid "Refresh Device"
+msgstr "Eszköz frissítése"
+
+#: models/devicesmodel.cpp:110
+msgid "Connect Device"
+msgstr "Eszköz csatlakoztatása"
+
+#: models/devicesmodel.cpp:111
+msgid "Disconnect Device"
+msgstr "Eszköz leválasztása"
+
+#: models/devicesmodel.cpp:113
+msgid "Edit CD Details"
+msgstr "CD-adatok szerkesztése"
+
+#: models/devicesmodel.cpp:690
+msgid "No Devices Attached"
+msgstr "Nincs csatlakoztatott eszköz"
+
+#: models/digitallyimported.cpp:117
+msgid "Not logged in"
+msgstr "Nincs bejelentkezve"
+
+#: models/digitallyimported.cpp:126
+msgid "Logged in"
+msgstr "Bejelentkezve"
+
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
+msgid "Unknown error"
+msgstr "Ismeretlen hiba"
+
+#: models/digitallyimported.cpp:198
+msgid "No subscriptions"
+msgstr "Nincs előfizetés"
+
+#: models/digitallyimported.cpp:205
+msgid "You do not have an active subscription"
+msgstr "Nincs aktív előfizetésed"
+
+#: models/digitallyimported.cpp:224
+msgid "Logged in (expiry:%1)"
+msgstr "Bejelentkezve (lejárat:%1) "
+
+#: models/digitallyimported.cpp:232
+msgid "Session expired"
+msgstr "Munkamenet lejárt"
+
+#: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
+msgid "1 Entry"
+msgid_plural "%1 Entries"
+msgstr[0] "1 elem"
+msgstr[1] "%1 elemek"
+
+#: models/dirviewmodel.cpp:190
+msgid "Audio File"
+msgstr "Hangfájl"
+
+#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
+msgid "Single Tracks"
+msgstr "Egyedüli számok"
+
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
+msgid "1 Track"
+msgid_plural "%1 Tracks"
+msgstr[0] "1 Szám"
+msgstr[1] "%1 Számok"
+
+#: models/musicmodel.cpp:185
+msgid "1 Artist"
+msgid_plural "%1 Artists"
+msgstr[0] "1 Előadó"
+msgstr[1] "%1 Előadók"
+
+#: models/musicmodel.cpp:192
+msgid "1 Album"
+msgid_plural "%1 Albums"
+msgstr[0] "1 Album"
+msgstr[1] "%1 Albumok"
+
+#: models/musicmodel.cpp:198
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] "1 Rész"
+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
+msgid "Configure Service"
+msgstr "Szolgáltatás beállítása"
+
+#: models/onlineservicesmodel.cpp:84
+msgid "Refresh Service"
+msgstr "Szolgáltatás frissítése"
+
+#: models/onlineservicesmodel.cpp:85
+msgid "Add Subscription"
+msgstr "Előfizetés hozzáadása"
+
+#: models/onlineservicesmodel.cpp:86
+msgid "Remove Subscription"
+msgstr "Előfizetés eltávolítása"
+
+#: models/onlineservicesmodel.cpp:87
+msgid "Refresh Subscription"
+msgstr "Előfizetés frissítése"
+
+#: models/onlineservicesmodel.cpp:137
+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
+msgid "Not Loaded"
+msgstr "Nincs betöltve"
+
+#: models/onlineservicesmodel.cpp:155
+msgid "Use search to locate tracks"
+msgstr "Számok előkerítésére használd a keresést "
+
+#: models/onlineservicesmodel.cpp:166
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] "1 Podcast"
+msgstr[1] "%1 Pocast-ok"
+
+#: models/onlineservicesmodel.cpp:177
+msgid "(Downloading: %1%)"
+msgstr "(Letölt: %1%)"
+
+#: models/onlineservicesmodel.cpp:235
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: models/playlistsmodel.cpp:77
+msgid "New Playlist..."
+msgstr "Új lejátszási lista..."
+
+#: models/playqueuemodel.cpp:102
+msgctxt "Track Number (#)"
+msgid "#"
+msgstr "#"
+
+#: models/playqueuemodel.cpp:103
+msgid "Length"
+msgstr "Időtartam"
+
+#: models/playqueuemodel.cpp:104
+msgid "Disc"
+msgstr "Lemez"
+
+#. i18n: file: devices/filenameschemedialog.ui:138
+#. i18n: ectx: property (text), widget (QPushButton, year)
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
+msgid "Year"
+msgstr "Év"
+
+#: models/playqueuemodel.cpp:360
+msgid "<b>(Priority: %1)</b>"
+msgstr "<b>(Prioritás: %1)</b>"
+
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
+msgid "Loading..."
+msgstr "Betöltés..."
+
+#: models/streamsmodel.cpp:286
+msgid "Bookmarks"
+msgstr "Könyvjelzők"
+
+#: models/streamsmodel.cpp:560
+msgid "TuneIn"
+msgstr "TuneIn"
+
+#: models/streamsmodel.cpp:563
+msgid "IceCast"
+msgstr "IceCast"
+
+#: models/streamsmodel.cpp:564
+msgid "ShoutCast"
+msgstr "ShoutCast"
+
+#: models/streamsmodel.cpp:567
+msgid "SomaFM"
+msgstr "SomaFM"
+
+#: models/streamsmodel.cpp:568
+msgid "Digitally Imported"
+msgstr "Digitally Imported"
+
+#: models/streamsmodel.cpp:569
+msgid "JazzRadio.com"
+msgstr "JazzRadio.com"
+
+#: models/streamsmodel.cpp:570
+msgid "RockRadio.com"
+msgstr "RockRadio.com"
+
+#: models/streamsmodel.cpp:571
+msgid "Sky.fm"
+msgstr "Sky.fm"
+
+#: models/streamsmodel.cpp:572
+msgid "Favorites"
+msgstr "Kedvencek"
+
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr "Hallgatás élőben"
+
+#: models/streamsmodel.cpp:578
+msgid "Bookmark Category"
+msgstr "Könyvjelző-kategóriák"
+
+#: models/streamsmodel.cpp:579
+msgid "Add Stream To Favorites"
+msgstr "Hangfolyam hozzáadása a kedvencekhez"
+
+#: models/streamsmodel.cpp:580
+msgid "Configure Streams"
+msgstr "Hangfolyam beállítása"
+
+#: models/streamsmodel.cpp:660
+msgid "%1 (Read-Only)"
+msgstr "%1 (Csak olvasható)"
+
+#: models/streamsmodel.cpp:1241
+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
+msgid "All"
+msgstr "Mindet"
+
+#: mpd/mpdconnection.cpp:154
+msgctxt "name (host)"
+msgid "\"%1\""
+msgstr "\"%1\""
+
+#: mpd/mpdconnection.cpp:156
+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
+msgid "Connection to %1 failed"
+msgstr "Csatlakozás ehhez %1 sikertelen"
+
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
+msgid "Connection to %1 failed - incorrect password"
+msgstr "Csatlakozás ehhez %1 sikertelen - hibás jelszó"
+
+#: mpd/mpdconnection.cpp:455
+msgid "Failed to send command to %1 - not connected"
+msgstr "Csatlakozás ehhez %1 sikertelen - nincs csatlakozva"
+
+#: mpd/mpdconnection.cpp:491
+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
+msgid ""
+"Failed to load. MPD can only play local files if connected via a local "
+"socket."
+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
+msgid "Failed to send command. Disconnected from %1"
+msgstr "Sikertelen parancsküldés. Leválasztva innen: %1"
+
+#: mpd/mpdconnection.cpp:1171
+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
+msgid "Failed to save <b>%1</b>"
+msgstr "Sikertelen mentés"
+
+#: mpd/mpdconnection.cpp:1196
+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
+msgid "You cannot add a playlist to another playlist!"
+msgstr "Nem adhatsz lejátszási listát másik listához!"
+
+#: mpd/mpduser.cpp:56
+msgid "Personal"
+msgstr "Személyes"
+
+#: mpd/song.cpp:343
+msgctxt ""
+"Song\n"
+"Artist\n"
+"Album"
+msgid ""
+"%1\n"
+"%2\n"
+"%3"
+msgstr ""
+"%1\n"
+"%2\n"
+"%3"
+
+#: network/proxysettings.cpp:33
+msgid "No proxy"
+msgstr "Nincs proxy"
+
+#: network/proxysettings.cpp:34
+msgid "Use the system proxy settings"
+msgstr "Rendszer proxybeállításainak használata"
+
+#: network/proxysettings.cpp:35
+msgid "Manual proxy configuration"
+msgstr "Kézi proxybeállítás"
+
+#: online/jamendosettingsdialog.cpp:33
+msgid "Jamendo Settings"
+msgstr "Jamendo beállítás"
+
+#: online/jamendosettingsdialog.cpp:37
+msgid "MP3"
+msgstr "MP3"
+
+#: online/jamendosettingsdialog.cpp:38
+msgid "Ogg"
+msgstr "Ogg"
+
+#: online/jamendosettingsdialog.cpp:39
+msgid "Streaming format:"
+msgstr "A hangfolyam formátuma:"
+
+#: online/magnatuneservice.cpp:160
+msgid "Streaming"
+msgstr "Hangfolyam"
+
+#: online/magnatuneservice.cpp:179
+msgid "MP3 128k"
+msgstr "MP3 128k"
+
+#: online/magnatuneservice.cpp:180
+msgid "MP3 VBR"
+msgstr "MP3 VBR"
+
+#: online/magnatuneservice.cpp:183
+msgid "WAV"
+msgstr "WAV"
+
+#: online/magnatunesettingsdialog.cpp:34
+msgid "Magnatune Settings"
+msgstr "Magnatune-beállítások"
+
+#. i18n: file: network/proxysettings.ui:96
+#. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
+#. i18n: file: streams/digitallyimportedsettings.ui:48
+#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
+#. i18n: file: network/proxysettings.ui:96
+#. 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
+msgid "Username:"
+msgstr "Felhasználónév:"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:131
+#. 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:408
+#. i18n: ectx: property (text), widget (BuddyLabel, passwordLabel)
+#. i18n: file: gui/serversettings.ui:112
+#. i18n: ectx: property (text), widget (BuddyLabel, passwordLabel)
+#. i18n: file: network/proxysettings.ui:109
+#. i18n: ectx: property (text), widget (BuddyLabel, proxyPasswordLabel)
+#. i18n: file: streams/digitallyimportedsettings.ui:61
+#. i18n: ectx: property (text), widget (BuddyLabel, label_3)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:131
+#. 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:408
+#. i18n: ectx: property (text), widget (BuddyLabel, passwordLabel)
+#. i18n: file: gui/serversettings.ui:112
+#. i18n: ectx: property (text), widget (BuddyLabel, passwordLabel)
+#. i18n: file: network/proxysettings.ui:109
+#. 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
+msgid "Password:"
+msgstr "Jelszó:"
+
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr "Tagság:"
+
+#: online/magnatunesettingsdialog.cpp:57
+msgid "Downloads:"
+msgstr "Letöltések:"
+
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
+msgid "Dowloading"
+msgstr "Letöltés"
+
+#: online/onlineservice.cpp:98
+msgid "Updating display"
+msgstr "Képernyőfrissítés"
+
+#: online/onlineservice.cpp:109
+msgid "Grouping tracks"
+msgstr "Számok csoportosítása"
+
+#: online/onlineservice.cpp:132
+msgid "Parsing response"
+msgstr "Válaszok elemzése"
+
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
+msgid "Failed to parse"
+msgstr "Elemzés sikertelen"
+
+#: online/onlineservice.cpp:150
+msgid "Failed to download"
+msgstr "Letöltés sikertelen"
+
+#: online/onlineservicespage.cpp:61
+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
+msgid "Download Podcast Episodes"
+msgstr "Podcast részek letöltése"
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr "A letöltött podcast részek törlése"
+
+#: online/onlineservicespage.cpp:329
+msgctxt "Search ServiceName:"
+msgid "Search %1:"
+msgstr "Keresés %1:"
+
+#: online/onlineservicespage.cpp:464
+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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr "Leiratkozik innen <b>%1</b>?"
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr "Az összes podcast-listát frissíti?"
+
+#: online/onlineservicespage.cpp:621
+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
+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
+msgid "Do you wish to download the following podcast episode?"
+msgstr "Letöltenéd a következő podcast részt?"
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr "Letöltenéd a következő podcast részeket?"
+
+#: online/onlineservicespage.cpp:705
+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
+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
+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
+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
+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
+msgid "RSS:"
+msgstr "RSS:"
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr "Weblap:"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Podcast details"
+msgstr "A podcast részletei"
+
+#: online/podcastsearchdialog.cpp:252
+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
+msgid "Enter search term..."
+msgstr "Írd be a keresett kifejezést..."
+
+#: online/podcastsearchdialog.cpp:372
+msgid "Failed to fetch podcasts from %1"
+msgstr "Nem sikerült podcast-ot letölteni erről %1"
+
+#: online/podcastsearchdialog.cpp:378
+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
+msgid "Failed to download directory listing"
+msgstr "A könyvtárlistát nem sikerült letölteni"
+
+#: online/podcastsearchdialog.cpp:447
+msgid "Failed to parse directory listing"
+msgstr "Könyvtárlista elemzése sikertelen"
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr "Feliratkozás"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search %1"
+msgstr "Keresés %1"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr "Podcast keresése itt: %1"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr "Böngészés %1"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr "A(z) %1 podcast-ok böngészése"
+
+#: online/podcastsearchdialog.cpp:602
+msgid "Subscription added"
+msgstr "Előfizetés hozzáadva"
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr "Már feliratkoztál erre a podcsat-ra!"
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr "Podcast-ok"
+
+#: online/podcastservice.cpp:284
+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
+msgid "Failed to parse %1"
+msgstr "Elemzés sikertelen %1"
+
+#: online/podcastservice.cpp:290
+msgid "Failed to download %1"
+msgstr "Letöltés sikertelen %1"
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr "Új részek keresése:"
+
+#: online/podcastsettingsdialog.cpp:59
+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:82
+msgid "Podcast Settings"
+msgstr "Podcast beállítások"
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr "Kézzel"
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr "Minden 15. percben"
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr "Minden 30. percben"
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr "Minden órában"
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr "Minden 2. órában"
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr "Minden 6. órában"
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr "Minden 12. órában"
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr "Minden nap"
+
+#: online/podcastsettingsdialog.cpp:92
+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:32
+#. i18n: ectx: property (text), widget (BuddyLabel, contextDarkBackgroundLabel)
+#: po/rc.cpp:6 rc.cpp:6
+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: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>"
+msgstr ""
+"<i><b>Megjegyzés:</b> a Cantata nem jeleníti meg a teljes Wikipédia "
+"oldalakat (képekkel, hivatkozásokkal stb.) hanem csökkentett verzióját. A "
+"csökkentett változat nem mindig 100%-osan pontos, mivel a Cantata alapból az "
+"egyes cikkeknek csak a felvezetőt jeleníti meg. Ha a teljes cikk "
+"megjelenítését választod, beolvasási hibák léphetnek fel. Emellett el kell "
+"távolítanod a pillanatnyilag cache-ba tárolt cikkeket (a 'Cache' lap "
+"használatával).</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 "Elérhető:"
+
+#. i18n: file: context/togglelist.ui:24
+#. i18n: ectx: property (text), widget (QLabel, label_3)
+#: po/rc.cpp:19 rc.cpp:19
+msgid "Selected:"
+msgstr "Kiválasztva:"
+
+#. 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 "Dalok másolása innen:"
+
+#. 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:744 rc.cpp:25 rc.cpp:31
+#: rc.cpp:49 rc.cpp:744
+msgid "TextLabel"
+msgstr "Szövegcímke"
+
+#. i18n: file: devices/actiondialog.ui:58
+#. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
+#. i18n: file: devices/actiondialog.ui:101
+#. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
+#. i18n: file: devices/actiondialog.ui:58
+#. i18n: ectx: property (text), widget (QLabel, configureSourceLabel)
+#. i18n: file: devices/actiondialog.ui:101
+#. i18n: ectx: property (text), widget (QLabel, configureDestLabel)
+#: po/rc.cpp:28 po/rc.cpp:34 rc.cpp:28 rc.cpp:34
+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: ectx: property (text), widget (QLabel, label_3)
+#: po/rc.cpp:40 rc.cpp:40
+msgid "Copy songs to:"
+msgstr "Dalok másolása ide:"
+
+#. i18n: file: devices/actiondialog.ui:157
+#. i18n: ectx: property (text), widget (QLabel, codecLabel)
+#: po/rc.cpp:43 rc.cpp:43
+msgid "Destination format:"
+msgstr "Célformátum:"
+
+#. i18n: file: devices/actiondialog.ui:171
+#. i18n: ectx: property (text), widget (QLabel, songCountLabel)
+#: po/rc.cpp:46 rc.cpp:46
+msgid "To copy:"
+msgstr "Másolandó:"
+
+#. i18n: file: devices/albumdetails.ui:26
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:52 rc.cpp:52
+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: 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: 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
+msgid "Year:"
+msgstr "Év:"
+
+#. i18n: file: devices/albumdetails.ui:99
+#. i18n: ectx: property (text), widget (BuddyLabel, label_6)
+#: po/rc.cpp:70 rc.cpp:70
+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/audiocdsettings.ui:20
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:88 rc.cpp:88
+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: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
+#: po/rc.cpp:94 rc.cpp:94
+msgid "Initially look up via:"
+msgstr "Elsőként evvel keressen:"
+
+#. i18n: file: devices/audiocdsettings.ui:52
+#. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
+#: po/rc.cpp:97 rc.cpp:97
+msgid "CDDB Host:"
+msgstr "CDDB Host:"
+
+#. i18n: file: devices/audiocdsettings.ui:65
+#. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
+#: po/rc.cpp:100 rc.cpp:100
+msgid "CDDB Port:"
+msgstr "CDDB Port:"
+
+#. i18n: file: devices/audiocdsettings.ui:88
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
+#: po/rc.cpp:103 rc.cpp:103
+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: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: file: devices/devicepropertieswidget.ui:20
+#. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
+#: po/rc.cpp:112 rc.cpp:112
+msgid ""
+"<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
+"is connected.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> Ezek a beállítások csak akkor érvényesek és "
+"szerkeszthetők, ha az eszköz csatlakozik.</i>"
+
+#. i18n: file: devices/devicepropertieswidget.ui:35
+#. i18n: ectx: property (text), widget (BuddyLabel, musicFolderLabel)
+#. i18n: file: gui/initialsettingswizard.ui:425
+#. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
+#. 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: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:425
+#. i18n: ectx: property (text), widget (BuddyLabel, dirLabel)
+#. 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: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
+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
+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
+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: ectx: property (text), widget (QLabel, defaultVolumeLabel)
+#: po/rc.cpp:133 rc.cpp:133
+msgid "Default volume:"
+msgstr "Alaphangerő:"
+
+#. i18n: file: devices/devicepropertieswidget.ui:133
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#. 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: 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
+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: 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: 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
+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: ectx: property (title), widget (QGroupBox, transcoderFrame)
+#: po/rc.cpp:154 rc.cpp:154
+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/filenameschemedialog.ui:29
+#. i18n: ectx: property (text), widget (QLabel, label_album_example)
+#: po/rc.cpp:160 rc.cpp:160
+msgid "Example:"
+msgstr "Példa:"
+
+#. i18n: file: devices/filenameschemedialog.ui:58
+#. i18n: ectx: property (text), widget (UrlLabel, help)
+#: po/rc.cpp:163 rc.cpp:163
+msgid "About filename schemes"
+msgstr "A fájlnév-sémákról"
+
+#. i18n: file: devices/filenameschemedialog.ui:70
+#. i18n: ectx: property (text), widget (QPushButton, albumArtist)
+#: po/rc.cpp:166 rc.cpp:166
+msgid "Album Artist"
+msgstr "Album előadója"
+
+#. i18n: file: devices/filenameschemedialog.ui:77
+#. i18n: ectx: property (text), widget (QPushButton, albumTitle)
+#: po/rc.cpp:169 rc.cpp:169
+msgid "Album Title"
+msgstr "Album címe"
+
+#. i18n: file: devices/filenameschemedialog.ui:91
+#. i18n: ectx: property (text), widget (QPushButton, trackArtist)
+#: po/rc.cpp:175 rc.cpp:175
+msgid "Track Artist"
+msgstr "Szám előadója"
+
+#. i18n: file: devices/filenameschemedialog.ui:98
+#. i18n: ectx: property (text), widget (QPushButton, trackTitle)
+#: po/rc.cpp:178 rc.cpp:178
+msgid "Track Title"
+msgstr "Szám címe"
+
+#. i18n: file: devices/filenameschemedialog.ui:117
+#. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
+#: po/rc.cpp:181 rc.cpp:181
+msgid "Track Title (+Artist)"
+msgstr "Szám címe (+Artist)"
+
+#. i18n: file: devices/filenameschemedialog.ui:124
+#. i18n: ectx: property (text), widget (QPushButton, trackNo)
+#: po/rc.cpp:184 rc.cpp:184
+msgid "Track #"
+msgstr "Szám #"
+
+#. i18n: file: devices/filenameschemedialog.ui:131
+#. i18n: ectx: property (text), widget (QPushButton, cdNo)
+#: po/rc.cpp:187 rc.cpp:187
+msgid "CD #"
+msgstr "CD #"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:17
+#. i18n: ectx: property (text), widget (QLabel, connectionNote)
+#: po/rc.cpp:196 rc.cpp:196
+msgid ""
+"<i><b>NOTE:</b> These settings are only editable when the device is not "
+"connected.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> Ezek a beállítások csak akkor szerkeszthetők, ha az "
+"eszköz nincs csatlakoztatva.</i>"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:32
+#. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
+#. i18n: file: dynamic/dynamicrule.ui:162
+#. 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: 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
+msgid "Type:"
+msgstr "Típus:"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:45
+#. i18n: ectx: property (text), widget (BuddyLabel, nameLabel)
+#. i18n: file: gui/serversettings.ui:63
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:45
+#. 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
+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
+msgid "Options"
+msgstr "Opciók"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:88
+#. 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: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)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:88
+#. 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: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: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
+msgid "Port:"
+msgstr "Port:"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:105
+#. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:205
+#. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2x)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:322
+#. i18n: ectx: property (text), widget (BuddyLabel, userLabel)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:105
+#. i18n: ectx: property (text), widget (BuddyLabel, userLabel_2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:205
+#. 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
+msgid "User:"
+msgstr "Felhasználó:"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:118
+#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:218
+#. i18n: ectx: property (text), widget (BuddyLabel, label_2x)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:118
+#. 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
+msgid "Domain:"
+msgstr "Kiszolgáló:"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:148
+#. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:248
+#. i18n: ectx: property (text), widget (BuddyLabel, folderLabel_x2)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:148
+#. 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
+msgid "Share:"
+msgstr "Megosztás:"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:163
+#. i18n: ectx: property (text), widget (QLabel, label_4)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:263
+#. i18n: ectx: property (text), widget (QLabel, label_4x)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:163
+#. 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
+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>Megjegyzés:</b> az itt megadott jelszó <b>nyíltan</b> kerül mentésre a "
+"Cantata beállító fájljába. Hogy a Cantata a megosztás eléréséhez jelszót "
+"kérjen, a jelszót állítsd '-'-re.</i>"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:192
+#. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
+#: po/rc.cpp:229 rc.cpp:229
+msgid "Service name:"
+msgstr "Szolgáltatás neve:"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:335
+#. i18n: ectx: property (text), widget (BuddyLabel, folderLabel)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:390
+#. i18n: ectx: property (text), widget (BuddyLabel, label)
+#. i18n: file: devices/remotedevicepropertieswidget.ui:335
+#. 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
+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
+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
+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>Megjegyzés:</b> az sshfs futási módja miatt, megfelelő ssh "
+"jelszóbekérő alkalmazás (ksshaskpass, ssh-askpass-gnome, stb.) kell jelszó "
+"beviteléhez.</i>"
+
+#. i18n: file: devices/remotedevicepropertieswidget.ui:416
+#. i18n: ectx: property (text), widget (QLabel, infoLabel)
+#: po/rc.cpp:268 rc.cpp:268
+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>Megjegyzés:</b> ez a párbeszéd csak távoli eszközök csatlakozására "
+"(pl. Samba-n keresztül), vagy helyileg csatolt eszközök elérésére  szolgál. "
+"Egyszerű, USB-n csatlakoztatott médialejátszókat a Cantata "
+"csatlakoztatásukkor automatikusan megjeleníti.</i>"
+
+#. i18n: file: dynamic/dynamicpage.ui:26
+#. i18n: ectx: property (text), widget (StatusLabel, infoLabel)
+#: po/rc.cpp:271 rc.cpp:271
+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
+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
+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
+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
+msgid "About Rules"
+msgstr "Szabályokról"
+
+#. i18n: file: dynamic/dynamicrule.ui:38
+#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
+#: po/rc.cpp:295 rc.cpp:295
+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: ectx: property (text), widget (BuddyLabel, label_6)
+#: po/rc.cpp:310 rc.cpp:310
+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
+msgid "Any"
+msgstr "Akármi"
+
+#. 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 "É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: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: ectx: property (text), widget (QLabel, label_7)
+#: po/rc.cpp:337 rc.cpp:337
+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: ectx: property (text), widget (QLabel, label_7x)
+#: po/rc.cpp:340 rc.cpp:340
+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>Megjegyzés:</b> ha többféle műfajra akarsz keresni a karaktersort "
+"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: 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
+#. i18n: ectx: property (text), widget (QLabel, label_2)
+#: po/rc.cpp:364 rc.cpp:364
+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 "
+"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>Megjegyzés:</b> ha azt választod, hogy a Cantata tárolja a borítókat, "
+"vagy dalszövegeket a zenekönyvtárban és nincs írási jogod ahhoz a "
+"könyvtárhoz, akkor a Cantata visszaléptet a személyes könyvtáradba a fájlok "
+"mentésére. Ugyanakkor a hangfolyamoknál, ha nincs írási jogod, akkor a "
+"zenekönyvtárban csak láthatod (és lejátszhatod) a stream-eket, de nem "
+"adhatsz hozzá (vagy szerkeszthetsz) stream-et. Ha úgy állítod be, hogy "
+"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: ectx: property (text), widget (StateLabel, streamLocationNote)
+#: po/rc.cpp:367 rc.cpp:367
+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>Megjegyzés:</b> ha megváltoztatod a stream-ek tárolási helyét (pl. "
+"átváltasz a 'Kedvenc stream-ek mentése a zenekönyvtárba' opcióra), akkor a "
+"Cantata csak azokat a stream-eket jeleníti meg, amik az adott könyvtárban "
+"találhatók. Vagyis, ezen beállítások változtatása előtt ajánlott a létező "
+"stream-jeid exportálása. Később azokat vissza importálhatod az új helyre (a "
+"beállítások átállítását követően).</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:14
+#. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
+#: po/rc.cpp:370 rc.cpp:370
+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
+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
+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 "
+"to play music.</p><p>For more information on MPD itself, please refer to the "
+"MPD website <a href=\"http://www.musicpd.org\"><span style=\" text-"
+"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
+"p><p>This 'wizard' will guide you through the basic settings required for "
+"Cantata to function correctly.</p></body></html>"
+msgstr ""
+"<html><head/><body><p>A Cantata egy sokoldalú, felhasználóbarát alkalmazás "
+"Music Player Daemon (MPD) részére. Az MPD  zene lejátszására alkalmas "
+"háttéralkalmazás. </p><p>Az MPD-vel kapcsolatos további információkért "
+"fordulj az MPD honlapjához <a href=\"http://www.musicpd.org\">span style=\" "
+"text-decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></"
+"a></p><p> Ez a varázsló átvezet a Cantata megfelelő működéséhez szükséges "
+"alapbeállításokon.<</p></body></html>"
+
+#. i18n: file: gui/initialsettingswizard.ui:105
+#. i18n: ectx: property (text), widget (QLabel, label_7)
+#: po/rc.cpp:379 rc.cpp:379
+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
+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 "
+"to play music. MPD may be started either system-wide, or on a per-user "
+"basis. Please select how you would like to have Cantata initially connect to "
+"(or startup) MPD:</p></body></html>"
+msgstr ""
+"<html><head/><body><p>A Cantata egy funkciókban gazdag és felhasználóbarát "
+"kliens Music Player Daemon (MPD) számára. Az MPD egy zenék lejátszására "
+"alkalmas háttéralkalmazás. Az MPD akár rendszerszinten, vagy felhasználói "
+"alapon indítható. Kérem, válaszd ki, hogy a Cantata miként csatlakozzon az "
+"MPD-hez induláskor (vagy rendszer indításkor):</p></body></html>"
+
+#. i18n: file: gui/initialsettingswizard.ui:166
+#. i18n: ectx: property (text), widget (QRadioButton, advanced)
+#: po/rc.cpp:385 rc.cpp:385
+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
+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 "
+"MPD setup. If you select this option then Cantata itself cannot control the "
+"starting and stopping of the MPD server. You will therfore need to ensure "
+"that MPD is already configured and running.</i>"
+msgstr ""
+"<i>Ezt az opciót akkor válaszd, ha a zenegyűjteményedet megosztod "
+"felhasználók között, az MPD példányod egy másik gépről fut , vagy már van "
+"egyéni MPD beállításod. Ha ezt az opciót választod, akkor a Cantata maga nem "
+"lesz képes vezérelni az MPD kiszolgáló indítását és leállítását. Ezért, "
+"neked meg kell győződnöd arról, hogy az MPD már be van állítva és fut.</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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>Válaszd ezt az opciót, ha a zenegyűjteményedet nem osztod meg másokkal, "
+"és szeretnéd, hogy a Cantata állítsa be és vezérelje az MPD eszközt.</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:259
+#. i18n: ectx: property (text), widget (QLabel, label_11)
+#: po/rc.cpp:397 rc.cpp:397
+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-"
+"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
+"p><p>This 'wizard' will guide you through the basic settings required for "
+"Cantata to function correctly.</p></body></html>"
+msgstr ""
+"<html><head/><body><p>Az MPD-vel ,magával kapcsolatos információkért fordulj "
+"az MPD honlapjához <a href=\"http://www.musicpd.org\"><span style=\" text-"
+"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
+"p><p>Ez a varázsló át vezet a Cantata normális működéséhez szükséges "
+"beállításokon.</p></body></html>"
+
+#. i18n: file: gui/initialsettingswizard.ui:318
+#. i18n: ectx: property (text), widget (QLabel, label_3)
+#: po/rc.cpp:400 rc.cpp:400
+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
+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 ""
+"Az alábbiak a Cantata által megkívánt alapvető beállítások. Kérlek add meg a "
+"megfelelő adatokat és a 'Csatlakozás' gombbal ellenőrizd a kapcsolatot."
+
+#. 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:372
+#. 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
+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
+msgid ""
+"<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
+"lyrics, etc.</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>"
+
+#. i18n: file: gui/initialsettingswizard.ui:520
+#. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
+#. i18n: file: gui/serversettings.ui:225
+#. i18n: ectx: property (text), widget (QLabel, socketNoteLabel)
+#. i18n: file: gui/initialsettingswizard.ui:520
+#. 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
+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>Megjegyzés:</b> helyi csatlakozó használatakor a csatlakozó teljes, "
+"abszolút elérési útvonalát kell beállítani. (Portszám nem kell.)</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:553
+#. i18n: ectx: property (text), widget (QLabel, label_13)
+#: po/rc.cpp:427 rc.cpp:427
+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
+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
+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
+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 "
+"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>"
+msgstr ""
+"<p>A Cantata letölti a hiányzó borítókat és dalszövegeket az Internetről. A "
+"Cantata lehetővé teszi olyan stream-listák lementését is (pl. "
+"rádióállomások), amik lejátszására képe szeretnél lenni. </p><p>Ezek "
+"mindegyikére nyugtáznod kell, hogy szeretnéd a Cantata-tól a vonatkozó "
+"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: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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>Megjegyzés:</b> ha azt választod, hogy a Cantata tárolja a borítókat, "
+"vagy dalszövegeket a zenekönyvtárban és nincs írási jogod ahhoz a "
+"könyvtárhoz, akkor a Cantata visszalép a személyes könyvtáradba a fájlok "
+"mentésére. Ugyanakkor a hangfolyamoknál, ha nincs írási jogod, akkor a "
+"zenekönyvtárban csak láthatod (és lejátszhatod) a stream-eket, de nem "
+"adhatsz hozzá (vagy szerkeszthetsz) stream-et. Ha úgy állítod be, hogy a "
+"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
+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>"
+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>"
+
+#. i18n: file: gui/initialsettingswizard.ui:857
+#. i18n: ectx: property (text), widget (QLabel, label_6)
+#: po/rc.cpp:460 rc.cpp:460
+msgid "Finished!"
+msgstr "Befejezve!"
+
+#. i18n: file: gui/initialsettingswizard.ui:880
+#. i18n: ectx: property (text), widget (QLabel, label_5)
+#: po/rc.cpp:463 rc.cpp:463
+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 ""
+"A Cantata beállítása kész. Ha a Cantata beállításait tovább finomítanád "
+"(további MPD host-okat adnál hozzá, stb.), akkor a Cantata beállító "
+"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: ectx: property (text), widget (QLabel, groupWarningLabel)
+#: po/rc.cpp:466 rc.cpp:466
+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 "
+"permissions) if you (or your administrator) add yourself to this group. If "
+"you do add yourself you will need to logout and back in for this to take "
+"effect."
+msgstr ""
+"<b>Figyelmeztetés: jelenleg a felhasználói csoport tagja vagy. A Cantata "
+"jobban fog működni (album borítók, dalszövegek stb. mentésében megfelelő "
+"jogosultságok mellett), ha te (vagy a rendszergazdád) hozzá ad(od magad) "
+"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: ectx: property (text), widget (BuddyLabel, label_5b)
+#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
+#. i18n: file: gui/interfacesettings.ui:51
+#. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
+#. i18n: file: gui/interfacesettings.ui:159
+#. i18n: ectx: property (text), widget (BuddyLabel, label_5c)
+#: po/rc.cpp:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
+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: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:123
+#. i18n: ectx: property (text), widget (QLabel, label_8)
+#: po/rc.cpp:484 rc.cpp:484
+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>"
+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"
+"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>"
+
+#. i18n: file: gui/interfacesettings.ui:172
+#. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
+#: po/rc.cpp:497 rc.cpp:497
+msgid "Sort albums:"
+msgstr "Albumok rendezése:"
+
+#. i18n: file: gui/interfacesettings.ui:183
+#. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
+#: po/rc.cpp:500 rc.cpp:500
+msgid "Album/Artist"
+msgstr "Album/Előadó"
+
+#. i18n: file: gui/interfacesettings.ui:188
+#. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
+#: po/rc.cpp:503 rc.cpp:503
+msgid "Artist/Album"
+msgstr "Előadó/Album"
+
+#. i18n: file: gui/interfacesettings.ui:193
+#. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
+#: po/rc.cpp:506 rc.cpp:506
+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: ectx: attribute (title), widget (QWidget, tab_3)
+#: po/rc.cpp:518 rc.cpp:518
+msgid "Other Views"
+msgstr "Egyéb nézetek"
+
+#. i18n: file: gui/interfacesettings.ui:251
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
+msgid "Folder view style:"
+msgstr "Könyvtárnézet stílusa"
+
+#. i18n: file: gui/interfacesettings.ui:264
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
+msgid "Streams view style:"
+msgstr "Hangfolyam-nézet stílusa:"
+
+#. i18n: file: gui/interfacesettings.ui:277
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
+msgid "Online view style:"
+msgstr "Online-nézet stílusa:"
+
+#. i18n: file: gui/interfacesettings.ui:290
+#. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
+#: po/rc.cpp:530 rc.cpp:530
+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: ectx: attribute (title), widget (QWidget, tab_7)
+#: po/rc.cpp:560 rc.cpp:560
+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: ectx: attribute (title), widget (QWidget, tab_4)
+#: po/rc.cpp:572 rc.cpp:572
+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: ectx: property (text), widget (StateLabel, singleClickLabel)
+#: po/rc.cpp:590 rc.cpp:590
+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>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: ectx: property (text), widget (QLabel, dynamicLabel)
+#: po/rc.cpp:593 rc.cpp:593
+msgid "[Dynamic]"
+msgstr "[Dinamikus]"
+
+#. i18n: file: gui/playbacksettings.ui:20
+#. i18n: ectx: property (title), widget (QGroupBox, outputBox)
+#: po/rc.cpp:596 rc.cpp:596
+msgid "Output"
+msgstr "Kimenet"
+
+#. i18n: file: gui/playbacksettings.ui:41
+#. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
+#: po/rc.cpp:602 rc.cpp:602
+msgid "Crossfading:"
+msgstr "Kereszt-átúsztatás:"
+
+#. 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:61
+#. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
+#: po/rc.cpp:608 rc.cpp:608
+msgid "Replay gain:"
+msgstr "Lejátszási szint:"
+
+#. 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 "A lejátszási szintről"
+
+#. i18n: file: gui/playbacksettings.ui:104
+#. 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>"
+
+#. i18n: file: gui/serversettings.ui:35
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: po/rc.cpp:635 rc.cpp:635
+msgid "Collection:"
+msgstr "Gyűjtemény:"
+
+#. i18n: file: gui/serversettings.ui:142
+#. i18n: ectx: property (text), widget (BuddyLabel, coverNameLabel)
+#. 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:338
+#. i18n: ectx: property (text), widget (BuddyLabel, basicCoverNameLabel)
+#: po/rc.cpp:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
+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
+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
+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
+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 "
+"not set). 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>Megjegyzés:</b> a 'Zenekönyvtár' beállításait használja borítóképek "
+"keresésére (akár a fenti érték lett beállítva, vagy <code>borító.jpg / "
+"borító.png</code> ha nincs beállítva). Ha az adott könyvtárra (és "
+"alkönyvtáraira) írási jogod van, akkor a Cantata a letöltött borítókat a "
+"megfelelő album könyvtárába lementi.</i>"
+
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+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>Megjegyzés:</b> a HTTP stream URL-je akkor kerül alkalmazásra, ha az "
+"MPD kimenete a beállítások szerint HTTP stream-re megy, és szeretnéd, hogy a "
+"Cantata képes legyen azt a stream-et lejátszani.</i>"
+
+#. i18n: file: gui/serversettings.ui:353
+#. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
+#: po/rc.cpp:677 rc.cpp:677
+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>Megjegyzés:</b> Ha 'Zenekönyvtár' beállításait változtatod, akkor "
+"kézzel kell frissítened a zenei adatbázist. Végrehajtható 'Előadó-', vagy "
+"'Albumnézetben' az 'Adatbázis frissítése' gomb lenyomásával.</i>"
+
+#. i18n: file: gui/serversettings.ui:379
+#. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel_2)
+#: po/rc.cpp:680 rc.cpp:680
+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>Megjegyzés:</b> Ha a 'Borító fájlneve' nincs meghatározva, akkor a "
+"Cantata a <code>borító</code> alapbeállítást használja</i>"
+
+#. i18n: file: http/httpserversettings.ui:25
+#. i18n: ectx: property (text), widget (BuddyLabel, label_5)
+#: po/rc.cpp:683 rc.cpp:683
+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: ectx: property (text), widget (QLabel, label_4)
+#: po/rc.cpp:689 rc.cpp:689
+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 "
+"other files to MPD. This, however, will only work whilst Cantata is running."
+"<br/><br/>\n"
+"<b>NOTE:</b> If you choose 'Local loopback' for 'Network interface', then "
+"MPD <b>must</b> also be on this computer.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> az MPD általában csak a könyvtáraiban tárolt dalokat "
+"játssza le. A Cantata rendelkezik egy alap HTTP szerverrel, ami használható "
+"az MPD más fájlokkal való kiszolgálására. Azonban ez csak akkor működik, "
+"amikor a Cantata fut.<br/><br/>\n"
+"<b>Megjegyzés:</b> ha a hálózati interfésznek a 'helyi visszacsatolást' "
+"választod, akkor az MPD-nek is ezen a gépen <b>kell </b>lennie.</i>"
+
+#. i18n: file: network/proxysettings.ui:26
+#. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
+#: po/rc.cpp:693 rc.cpp:693
+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
+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
+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 ""
+"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."
+
+#. i18n: file: streams/digitallyimportedsettings.ui:29
+#. i18n: ectx: property (text), widget (QLabel, label)
+#: po/rc.cpp:723 rc.cpp:723
+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 ""
+"Előfizetés nélkül, ingyen hallgathatsz zenéket, de a Prémium-tagok sokkal "
+"jobb minőségű stream-eket hallgathatnak, hirdetések nélkül. Látogasd meg <a "
+"href=\"http://www.di.fm/premium/\">http://www.di.fm/premium/</a>, hogy "
+"prémium tagságra frissíts."
+
+#. i18n: file: streams/digitallyimportedsettings.ui:42
+#. i18n: ectx: property (title), widget (QGroupBox, groupBox)
+#: po/rc.cpp:726 rc.cpp:726
+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
+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
+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
+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
+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
+msgid ""
+"<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
+"RockRadio.com, and Sky.fm</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> a beállítások ezekre érvényesek: Digitally Imported, "
+"JazzRadio.com, RockRadio.com és Sky.fm.</i>"
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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>Megjegyzés:</b> ha beírod a fiók adatait, akkor egy 'DI' állapotjelző "
+"megjelenik a stream-ek listája alatt jelezvén, hogy be vagy-e jelentkezve, "
+"vagy sem.</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."
+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."
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+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
+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
+msgid ""
+"<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
+"removed.</i>"
+msgstr ""
+"<i><b>Megjegyzés:</b> a dőlt betűsek beépített beállítások, és nem lehet "
+"eltávolítani őket.</i>"
+
+#. i18n: file: support/shortcutssettingswidget.ui:22
+#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
+#: po/rc.cpp:771 rc.cpp:771
+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
+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
+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
+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
+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
+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
+msgid "Disc number:"
+msgstr "Lemez száma:"
+
+#. i18n: file: tags/trackorganiser.ui:155
+#. i18n: ectx: property (text), widget (QTreeWidget, files)
+#: po/rc.cpp:834 rc.cpp:834
+msgid "Original Name"
+msgstr "Eredeti név"
+
+#. i18n: file: tags/trackorganiser.ui:160
+#. i18n: ectx: property (text), widget (QTreeWidget, files)
+#: po/rc.cpp:837 rc.cpp:837
+msgid "New Name"
+msgstr "Új név"
+
+#: po/rc.cpp:838 rc.cpp:838
+msgctxt "NAME OF TRANSLATORS"
+msgid "Your names"
+msgstr "Török Árpád"
+
+#: po/rc.cpp:839 rc.cpp:839
+msgctxt "EMAIL OF TRANSLATORS"
+msgid "Your emails"
+msgstr "torar at freemail.hu"
+
+#: replaygain/rgdialog.cpp:121
+msgid "Show All Tracks"
+msgstr "Összes szám mutatása"
+
+#: replaygain/rgdialog.cpp:122
+msgid "Show Untagged Tracks"
+msgstr "A címke nélküli számok mutatása"
+
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
+msgid "Remove From List"
+msgstr "Listából eltávolít"
+
+#: replaygain/rgdialog.cpp:136
+msgid "Album Gain"
+msgstr "Album hangereje"
+
+#: replaygain/rgdialog.cpp:137
+msgid "Track Gain"
+msgstr "Szám hangereje"
+
+#: replaygain/rgdialog.cpp:138
+msgid "Album Peak"
+msgstr "Album csúcs"
+
+#: replaygain/rgdialog.cpp:139
+msgid "Track Peak"
+msgstr "Szám csúcs"
+
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
+msgid "Scan"
+msgstr "Átnéz"
+
+#: replaygain/rgdialog.cpp:238
+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
+msgid "Update Tags"
+msgstr "Címkék frissítése"
+
+#: replaygain/rgdialog.cpp:252
+msgid "Abort scanning of tracks?"
+msgstr "Számok átnézését felfüggeszted?"
+
+#: replaygain/rgdialog.cpp:261
+msgid "Abort reading of existing tags?"
+msgstr "A beállított címkék beolvasását beszakítod?"
+
+#: replaygain/rgdialog.cpp:287
+msgid ""
+"Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
+"tags.</i>"
+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
+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
+msgid "Untagged Tracks"
+msgstr "Címke nélküli számok"
+
+#: replaygain/rgdialog.cpp:290
+msgid "All Tracks"
+msgstr "Minden szám"
+
+#: replaygain/rgdialog.cpp:300
+msgid "Scanning tracks..."
+msgstr "Számok átnézése..."
+
+#: replaygain/rgdialog.cpp:367
+msgid "Reading existing tags..."
+msgstr "Létező címkék beolvasása..."
+
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr "%1 (Időtúllépés)"
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr "%1 (Hibás címkék?)"
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
+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
+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
+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
+msgid "Failed"
+msgstr "Sikertelen"
+
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
+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
+msgid "Remove Tracks"
+msgstr "Számok eltávolítása"
+
+#: streams/digitallyimportedsettings.cpp:36
+msgid "Digitally Imported Settings"
+msgstr "Digitally Imported beállításai"
+
+#: streams/digitallyimportedsettings.cpp:41
+msgid "MP3 256k"
+msgstr "MP3 256k"
+
+#: streams/digitallyimportedsettings.cpp:42
+msgid "AAC 64k"
+msgstr "AAC 64k"
+
+#: streams/digitallyimportedsettings.cpp:43
+msgid "AAC 128k"
+msgstr "AAC 128k"
+
+#: streams/digitallyimportedsettings.cpp:109
+msgid "Logged out"
+msgstr "Kijelentkezve"
+
+#: streams/digitallyimportedsettings.cpp:112
+msgid "Logging in..."
+msgstr "Bejelentkezés..."
+
+#: streams/digitallyimportedsettings.cpp:136
+msgid "Logout"
+msgstr "Kijelentkezés"
+
+#: streams/streamdialog.cpp:71
+msgid "URL:"
+msgstr "URL:"
+
+#: streams/streamdialog.cpp:76
+msgid "Just add to play queue, do not save"
+msgstr "Csak fűzd a lejátszási sorhoz, ne mentsd"
+
+#: streams/streamdialog.cpp:77
+msgid "Add to play queue, and save to favorites"
+msgstr "Fűzd a lejátszási sorhoz és mentsd a kedvencek közé"
+
+#: streams/streamdialog.cpp:94
+msgid "Add Stream"
+msgstr "Stream hozzáadása"
+
+#: streams/streamdialog.cpp:110
+msgid "Edit Stream"
+msgstr "Stream szerkesztése"
+
+#: streams/streamdialog.cpp:146
+msgid "<i><b>ERROR:</b> Invalid protocol</i>"
+msgstr "<i><b>Hiba:</b> érvénytelen protokoll</i>"
+
+#: streams/streamfetcher.cpp:205
+msgid "Fetching %1"
+msgstr "Leszedés %1"
+
+#: streams/streamspage.cpp:59
+msgid "Import Streams Into Favorites"
+msgstr "Stream importálása kedvencek közé"
+
+#: streams/streamspage.cpp:60
+msgid "Export Favorite Streams"
+msgstr "Kedvenc stream-ek exportálása"
+
+#: streams/streamspage.cpp:61
+msgid "Add New Stream To Favorites"
+msgstr "Új stream hozzáadása a kedvencekhez"
+
+#: streams/streamspage.cpp:124
+msgctxt "Service name"
+msgid "Digitally Imported"
+msgstr "Digitally Imported"
+
+#: streams/streamspage.cpp:242
+msgid "*.xml *.xml.gz *.cantata|XML Streams"
+msgstr "*.xml *.xml.gz *.cantata|XML Stream-ek"
+
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
+msgid "Import Streams"
+msgstr "Stream-ek importálása"
+
+#: streams/streamspage.cpp:245
+msgid "XML Streams (*.xml *.xml.gz *.cantata)"
+msgstr "XML stream-ek (*.xml *.xml.gz *.cantata)"
+
+#: streams/streamspage.cpp:253
+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
+msgid "*.xml|XML Streams"
+msgstr "*.xml|XML Stream-ek"
+
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
+msgid "Export Streams"
+msgstr "Stream-ek exportálása"
+
+#: streams/streamspage.cpp:267
+msgid "XML Streams (*.xml)"
+msgstr "XML Stream-ek (*.xml)"
+
+#: streams/streamspage.cpp:279
+msgid "Failed to create <b>%1</b>!"
+msgstr "Létrehozás sikertelen <b>%1</b>!"
+
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
+msgid "Stream already exists!<br/><b>%1</b>"
+msgstr "Létező stream!<br/><b>%1</b>"
+
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
+msgid "A stream named <b>%1</b> already exists!"
+msgstr "A nevezett stream <b>%1</b> már létezik!"
+
+#: streams/streamspage.cpp:318
+msgid "Bookmark added"
+msgstr "Könyvjelző hozzáadva"
+
+#: streams/streamspage.cpp:320
+msgid "Already bookmarked"
+msgstr "Már van könyvjelzője"
+
+#: streams/streamspage.cpp:366
+msgid "Added to favorites"
+msgstr "Kedvencekhez hozzáadva"
+
+#: streams/streamspage.cpp:368
+msgid "Already in favorites"
+msgstr "Már szerepel a kedvencek között"
+
+#: streams/streamspage.cpp:393
+msgid "Reload <b>%1</b> streams?"
+msgstr "<b>%1</b> stream-ek újratöltése?"
+
+#: streams/streamspage.cpp:411
+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
+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
+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
+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
+msgid "Search %1:"
+msgstr "Keresés %1:"
+
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr "*.streams|Cantata hangfolyamok"
+
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+msgid "Install Streams"
+msgstr "Stream-ek telelpítése"
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
+msgstr "Cantata stream-ek (*.streams)"
+
+#: streams/streamssettings.cpp:144
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr "Már van <b>%1</b> nevű lejátszási lista!<br/>Felülírjam?"
+
+#: streams/streamssettings.cpp:150
+msgid "Failed top open %1"
+msgstr "Nem sikerült megnyitni %1"
+
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr "Érvénytelen fájlformátum!"
+
+#: streams/streamssettings.cpp:170
+msgid "Failed to create stream category folder!"
+msgstr "Nem sikerült létrehozni a steram-kategória könyvtárát!<br/>%1"
+
+#: streams/streamssettings.cpp:176
+msgid "Failed to save stream list!"
+msgstr "Nem sikerült menteni a stream-ek litáját!"
+
+#: streams/streamssettings.cpp:227
+msgid "Failed to remove streams folder!"
+msgstr "Nem sikerült eltávolítani a stream-ek könyvtárát"
+
+#: support/dialog.cpp:89
+msgid "&OK"
+msgstr "&Ok"
+
+#: support/dialog.cpp:90
+msgid "&Cancel"
+msgstr "Elvet"
+
+#: support/dialog.cpp:91
+msgid "&Yes"
+msgstr "Igen"
+
+#: support/dialog.cpp:92
+msgid "&No"
+msgstr "&Nem"
+
+#: support/dialog.cpp:93
+msgid "&Discard"
+msgstr "Visszavon"
+
+#: support/dialog.cpp:94
+msgid "&Save"
+msgstr "Ment"
+
+#: support/dialog.cpp:95
+msgid "&Apply"
+msgstr "&Alkalmaz"
+
+#: support/dialog.cpp:96
+msgid "&Close"
+msgstr "Bezár"
+
+#: support/dialog.cpp:98
+msgid "&Overwrite"
+msgstr "Felülír"
+
+#: support/dialog.cpp:99
+msgid "&Reset"
+msgstr "&Reset"
+
+#: support/dialog.cpp:100
+msgid "&Continue"
+msgstr "Folytat"
+
+#: support/dialog.cpp:101
+msgid "&Delete"
+msgstr "Töröl"
+
+#: support/dialog.cpp:102
+msgid "&Stop"
+msgstr "Állj"
+
+#: support/dialog.cpp:103
+msgid "&Remove"
+msgstr "Eltávolít"
+
+#: support/dialog.cpp:104
+msgid "&Previous"
+msgstr "Előző"
+
+#: support/dialog.cpp:105
+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
+msgid "Password"
+msgstr "Jelszó"
+
+#: support/inputdialog.h:47
+msgid "Please enter password:"
+msgstr "Kérem a jelszót:"
+
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
+msgid "Warning"
+msgstr "Figyelem"
+
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
+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"
+
+#: support/pathrequester.cpp:51
+msgid "Select File"
+msgstr "Fájl-választás"
+
+#: support/utils.cpp:390 support/utils.cpp:398
+msgid "%1 B"
+msgstr "%1 B"
+
+#: support/utils.cpp:391
+msgid "%1 kB"
+msgstr "%1 kB"
+
+#: support/utils.cpp:392
+msgid "%1 MB"
+msgstr "%1 MB"
+
+#: support/utils.cpp:394
+msgid "%1 GB"
+msgstr "%1 GB"
+
+#: support/utils.cpp:399
+msgid "%1 KiB"
+msgstr "%1 KiB"
+
+#: support/utils.cpp:400
+msgid "%1 MiB"
+msgstr "%1 MiB"
+
+#: support/utils.cpp:402
+msgid "%1 GiB"
+msgstr "%1 GiB"
+
+#: support/utils.cpp:602
+msgid "1 day %2"
+msgid_plural "%1 days %2"
+msgstr[0] "1 nap %2"
+msgstr[1] "%1 napok %2"
+
+#: tags/tageditor.cpp:134
+msgid "Tags"
+msgstr "Címkék"
+
+#: tags/tageditor.cpp:147
+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
+msgid "All tracks"
+msgstr "Minden szám"
+
+#: tags/tageditor.cpp:295
+msgid "(Various)"
+msgstr "(Vegyes)"
+
+#: tags/tageditor.cpp:336
+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
+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
+msgid ""
+"Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
+"tracks?"
+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
+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
+msgid "Album Artist from Artist"
+msgstr "Album Előadó-ról Előadóra"
+
+#: tags/tageditor.cpp:463
+msgid ""
+"Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
+"'Album' of <b>all</b> tracks?"
+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
+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
+msgid "All tracks [modified]"
+msgstr "Minden szám [módosítva]"
+
+#: tags/tageditor.cpp:556
+msgid "%1 [modified]"
+msgstr "%1 [módosítva]"
+
+#: tags/tageditor.cpp:783
+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
+msgid "Rename Files"
+msgstr "Fájlok átnevezése"
+
+#: tags/trackorganiser.cpp:150
+msgid "Abort renaming of files?"
+msgstr "Fájlátnevezés megszakítása?"
+
+#: tags/trackorganiser.cpp:263
+msgid "Source file does not exist!<br/>%1"
+msgstr "Forrásfájl nem létezik!<br/>%1"
+
+#: tags/trackorganiser.cpp:282
+msgid "Destination file already exists!<br/>%1"
+msgstr "A célfájl már létezik! <br/>"
+
+#: tags/trackorganiser.cpp:304
+msgid "Failed to create destination folder!<br/>%1"
+msgstr "Nem sikerült létrehozni a könyvtárat!<br/>%1"
+
+#: tags/trackorganiser.cpp:325
+msgid "Failed to rename %1 to %2"
+msgstr "Nem sikerült %1 átnevezése %2-re"
+
+#: widgets/coverwidget.cpp:267
+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
+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 ""
+"<tr><td align=\"right\"><b>Előadó:</b></td><td>%1</td></tr><tr><td align="
+"\"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
+msgid "All Genres"
+msgstr "Minden műfaj"
+
+#: widgets/groupedview.cpp:267
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: widgets/groupedview.cpp:269
+msgctxt "artist - album (albumYear)"
+msgid "%1 - %2 (%3)"
+msgstr "%1 - %2 (%3)"
+
+#: widgets/itemview.cpp:480
+msgid "Go Back"
+msgstr "Visszalépés"
+
+#: widgets/itemview.cpp:485
+msgid "Go Home"
+msgstr "Vissza a kiinduláshoz"
+
+#: widgets/menubutton.cpp:36
+msgid "Menu"
+msgstr "Menü"
+
+#: widgets/searchwidget.cpp:62
+msgid "Search..."
+msgstr "Keresés..."
+
+#: widgets/searchwidget.cpp:66
+msgid "Close Search Bar"
+msgstr "Keresősáv bezárása"
+
+#: widgets/servicestatuslabel.cpp:43
+msgid "Logged into %1"
+msgstr "Bejelentkezve ide: %1"
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr "<b>NEM VAGY</b> bejelentkezve a ide: %1"
+
+#: widgets/songdialog.cpp:48
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
+"\" setting, and MPD's \"music_directory\" setting.</p>"
+msgstr ""
+"<p>Nem tudom elérni a dalok fájljait!<br/><br/>Ellenőrizd a Cantata "
+"\"Zenekönyvtárát\" és az MPD \"music_directory\" (zenekönyvtár) beállításait."
+"</p>"
+
+#: widgets/songdialog.cpp:51
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check that the device is still "
+"attached.</p>"
+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
+msgid "Mute"
+msgstr "Némít"
+
+#: widgets/volumeslider.cpp:199
+msgid "Muted"
+msgstr "Némítva"
+
+#: widgets/volumeslider.cpp:238
+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
+msgid "Volume %1% (Muted)"
+msgstr "Hangerő %1% (Némítva)"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr "Hangerő %1%"
+
+#: ../gui/qtplural.h:30
+msgctxt "Singular"
+msgid "1 Track"
+msgstr "1 Szám"
+
+#: ../gui/qtplural.h:31
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Tracks"
+msgstr "%1 Számok"
+
+#: ../gui/qtplural.h:34
+#, qt-format
+msgctxt "Singular"
+msgid "1 Track (%1)"
+msgstr "1 Szám (%1)"
+
+#: ../gui/qtplural.h:35
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Tracks (%2)"
+msgstr "%1 Számok (%2)"
+
+#: ../gui/qtplural.h:38
+msgctxt "Singular"
+msgid "1 Album"
+msgstr "1 Album"
+
+#: ../gui/qtplural.h:39
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Albums"
+msgstr "%1 Album"
+
+#: ../gui/qtplural.h:42
+msgctxt "Singular"
+msgid "1 Artist"
+msgstr "1 Előadó"
+
+#: ../gui/qtplural.h:43
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Artists"
+msgstr "%1 Előadók"
+
+#: ../gui/qtplural.h:46
+msgctxt "Singular"
+msgid "1 Stream"
+msgstr "1 Stream"
+
+#: ../gui/qtplural.h:47
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Streams"
+msgstr "%1 Stream-ek"
+
+#: ../gui/qtplural.h:50
+msgctxt "Singular"
+msgid "1 Entry"
+msgstr "1 Tétel"
+
+#: ../gui/qtplural.h:51
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Entries"
+msgstr "%1 Tételek"
+
+#: ../gui/qtplural.h:54
+msgctxt "Singular"
+msgid "1 Rule"
+msgstr "1 Szabály"
+
+#: ../gui/qtplural.h:55
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Rules"
+msgstr "%1 Szabályok"
+
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr "1 Podcast"
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr "%1 Podcast"
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr "1 Rész"
+
+#: ../gui/qtplural.h:63
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr "%1 Részek"
+
+#~ msgid ""
+#~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
+#~ msgstr ""
+#~ "Nem sikerült letölteni a számot - túl sok átirányításba ütközött.<br/><br/"
+#~ "<hr/>%1"
+
+#~ 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>A következő változók le lesznek cserélve a jelentésüknek megfelelően "
+#~ "minden szám nevében</p><p><table border=\"1\"><tr><th><em>Gomb</em></"
+#~ "th><th><em>Változó</em></th><th><em>Leírás</em></th></tr><tr><td>"
+#~ "%albumartist%</td><td>%1</td><td>Az album előadója. A legtöbb album "
+#~ "esetén ez meg fog egyezni a <i>Szám Előadóval.</i> A válogatások esetén "
+#~ "ez többnyire <i>Válogatott előadók</i> lesz. </td></tr><tr><td>%album%</"
+#~ "td><td>%2</td><td>Az album neve.</td></tr><tr><td>%artist%</td><td>%3</"
+#~ "td><td>A számok előadója.</td></tr><tr><td>%title%</td><td>%4</td><td>A "
+#~ "szám címe (<i>Szám Előadó</i> nélkül).</td></tr><tr><td>%artistandtitle%</"
+#~ "td><td>%5</td><td>A szám címe (<i>Szám Előadó</i>-val, Ha eltér az "
+#~ "<i>Album Előadótól</i>).</td></tr><tr><td>%track%</td><td>%6</td><td>A "
+#~ "szám sorszáma.</td></tr><tr><td>%discnumber%</td><td>%7</"
+#~ "td><td>Többlemezes album esetén a lemez száma. A válogatások általában "
+#~ "több lemezből állnak </td></tr><tr><td>%year%</td><td>%8</td><td>Az album "
+#~ "kiadásának éve. </td></tr><tr><td>%genre%</td><td>%9</td><td>Az album "
+#~ "műfaja.</td></tr></table></p>"
+
+#~ msgid "Configure Online Service"
+#~ msgstr "Online szolgáltatás beállítása"
+
+#~ msgid "Refresh Online Service"
+#~ msgstr "Online szolgáltatás frissítése"
+
+#~ msgid "Support media keys under GNOME/Unity:"
+#~ msgstr "Médiabillentyűk támogatása GNOME és Unity alatt:"
+
+#~ msgid "Stopping Playback"
+#~ msgstr "Lejátszás leállítása"
+
+#~ msgid "Search TuneIn:"
+#~ msgstr "Tunein keresés:"
+
+#~ msgid "Logged into Digitally Imported"
+#~ msgstr "Bejelentkezve ide: Digitally Imported"
+
+#~ msgid "Other Actions"
+#~ msgstr "Más műveletek"
diff --git a/po/ko.po b/po/ko.po
index c9a9018..4033505 100644
--- a/po/ko.po
+++ b/po/ko.po
@@ -5,9 +5,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Cantata 1.1.0\n"
+"Project-Id-Version: Cantata 1.2.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-20 19:42+0100\n"
+"POT-Creation-Date: 2013-11-14 20:26+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,37 +21,37 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "음반정보 새로 읽기"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
 msgid "Album Information"
 msgstr "음반정보"
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:143
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
 msgid "Tracks"
 msgstr "곡"
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 msgid "Refresh Artist Information"
 msgstr "연주자정보 새로 읽기"
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 context/contextwidget.cpp:306
+#: gui/cachesettings.cpp:260
 msgid "Artist Information"
 msgstr "연주자정보"
 
 #. i18n: file: gui/interfacesettings.ui:137
 #. 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:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
 msgid "Albums"
 msgstr "음반"
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:333
 msgid "Web Links"
 msgstr "웹 연결"
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:419
 msgid "Similar Artists"
 msgstr "비슷한 연주자"
 
@@ -63,21 +63,21 @@ msgstr "가사 제공"
 msgid "Wikipedia Languages"
 msgstr "위키피디아 언어"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
-#: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
 msgid "Other"
 msgstr "기타"
 
 #: context/contextwidget.cpp:98
 msgid "Reset Spacing"
-msgstr "간격 다시 맞추기"
+msgstr "간격 새로 맞추기"
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
 msgid "Lyrics"
 msgstr "가사"
 
-#: context/lastfmengine.cpp:65
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr "last.fm에서 더 읽기"
 
@@ -98,20 +98,20 @@ msgstr ""
 "만약 이 검색이 새로운 가사를 찾는다면, 원곡 이름이나 연주자와 여전히 연관이 "
 "있을 수 있습니다."
 
-#. i18n: file: devices/albumdetails.ui:47
+#. i18n: file: devices/albumdetails.ui:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
+#: rc.cpp:61 rc.cpp:304 rc.cpp:789
 msgid "Title:"
 msgstr "제목:"
 
@@ -119,16 +119,16 @@ msgstr "제목:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
+#: rc.cpp:55 rc.cpp:292 rc.cpp:792
 msgid "Artist:"
 msgstr "연주자:"
 
@@ -136,111 +136,112 @@ msgstr "연주자:"
 msgid "Search For Lyrics"
 msgstr "가사 찾기"
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "가사를 찾을 때 사용할 웹사이트를 선택합니다."
 
-#: context/lyricsettings.cpp:46
+#: context/lyricsettings.cpp:66
 msgid "(Polish Translations)"
 msgstr "(폴란드어 번역)"
 
-#: context/lyricsettings.cpp:47
+#: context/lyricsettings.cpp:67
 msgid "(Portuguese Translations)"
 msgstr "(포르투갈어 번역)"
 
-#: context/songview.cpp:74
+#: context/songview.cpp:89
 msgid "Refresh Lyrics"
 msgstr "가사 새로 읽기"
 
-#: context/songview.cpp:75
+#: context/songview.cpp:90
 msgid "Edit Lyrics"
-msgstr "가사 수정"
+msgstr "가사수정"
 
-#: context/songview.cpp:76
+#: context/songview.cpp:91
 msgid "Save Lyrics"
-msgstr "가사 저장"
+msgstr "가사저장"
 
-#: context/songview.cpp:77
+#: context/songview.cpp:92
 msgid "Cancel Editing Lyrics"
-msgstr "가사 수정 취소"
+msgstr "가사수정 취소"
 
-#: context/songview.cpp:78
+#: context/songview.cpp:93
 msgid "Delete Lyrics File"
-msgstr "가사 파일 지우기"
+msgstr "가사파일 지우기"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort editing of lyrics?"
-msgstr "가사 수정을 취소할까요?"
+msgstr "가사수정을 취소할까요?"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort Editing"
 msgstr "수정 취소"
 
-#: 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: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
 msgid "Abort"
 msgstr "취소"
 
-#: context/songview.cpp:106
+#: context/songview.cpp:121
 msgid "Delete saved copy of lyrics, and re-download?"
-msgstr "저장된 가사를 지우고 새로 받을까요?"
+msgstr "저장된 가사를 지우고 다시 받을까요?"
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:121 context/songview.cpp:122
+#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
 msgid "Re-download"
 msgstr "다시 내려받기"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Current playing song has changed, still perform search?"
 msgstr "지금 연주되는 곡이 바뀌었는데도 여전히 찾을까요?"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Song Changed"
 msgstr "곡 바뀜"
 
-#: context/songview.cpp:133
+#: context/songview.cpp:148
 msgid "Perform Search"
 msgstr "찾기"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save updated lyrics?"
 msgstr "업데이트된 가사를 저장할까요?"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save"
 msgstr "저장"
 
-#: context/songview.cpp:170
+#: context/songview.cpp:185
 msgid "Failed to save lyrics."
 msgstr "가사를 저장할 수 없음."
 
-#: context/songview.cpp:192
+#: context/songview.cpp:207
 msgid "Delete lyrics file?"
 msgstr "가사를 지울까요?"
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
+#: context/songview.cpp:207 gui/mainwindow.cpp:292
+#: widgets/messageoverlay.cpp:43
 msgid "Cancel"
 msgstr "취소"
 
-#: context/songview.cpp:416
+#: context/songview.cpp:431
 msgid "Fetching lyrics via %1"
 msgstr "%1에서 가사 가져옴"
 
-#: context/wikipediaengine.cpp:250
+#: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "곡 목록"
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr "위키피디아에서 더 읽기"
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr "브라우저에서 열기"
 
-#: 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 "연주자|밴드|가수|보컬리스트|음악가"
@@ -250,47 +251,52 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "음반|평점|사운드트랙"
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:99
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr "연주자와 음반정보를 찾을 때 사용할 언어를 선택합니다."
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
+#: online/podcastsearchdialog.cpp:393
 msgid "Reload"
 msgstr "다시 읽기"
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr "칸타타가 곡을 연주하고 있습니다"
+
+#: devices/actiondialog.cpp:76
 msgid "Songs To Be Copied"
 msgstr "복사할 곡"
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:146
 msgid "<b>INVALID</b>"
 msgstr "<b>무효</b>"
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
 msgid "<i>(When different)</i>"
 msgstr "<i>(다를 때)</i>"
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "연주자:%1, 음반:%2, 곡:%3"
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
+#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
 #: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
 msgid "%1 free"
 msgstr "%1 남음"
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
 msgid "Local Music Library"
 msgstr "로컬 음악라이브러리"
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
+#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
 msgid "Audio CD"
 msgstr "오디오 CD"
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:293
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -301,7 +307,7 @@ msgstr ""
 "선택된 곡에 필요한 공간은 %1이지만, 남은 공간은 %2입니다.\n"
 "선택된 곡을 복사하려면, 더 작은 파일 크기로 변환해야 합니다."
 
-#: devices/actiondialog.cpp:285
+#: devices/actiondialog.cpp:300
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -309,251 +315,248 @@ msgstr ""
 "사용하고자 하는 장치에 여유 공간이 부족합니다.\n"
 "선택된 곡에 필요한 공간은 %1이지만, 남은 공간은 %2입니다."
 
-#: devices/actiondialog.cpp:334
+#: devices/actiondialog.cpp:349
 msgid "Copy Songs"
 msgstr "곡 복사"
 
-#: 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:349 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "곡 지우기"
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:380
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr "<p>대상 장치가 설정되지 않았습니다.<br/>기본 설정으로 계속할까요?</p>"
 
-#: devices/actiondialog.cpp:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
 msgid "Not Configured"
 msgstr "설정 안 됨"
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
 msgid "Use Defaults"
 msgstr "기본값 사용"
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:384
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr "<p>원본 장치가 설정되지 않았습니다.<br/>기본 설정으로 계속할까요?</p>"
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:446
 msgid "Are you sure you wish to stop?"
 msgstr "정지할까요?"
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "정지"
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
+#: tags/trackorganiser.cpp:446
 msgid "Device has been removed!"
 msgstr "장치가 제거되었습니다!"
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:491
 msgid "Device is not connected!"
 msgstr "장치가 연결되지 않았습니다!"
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
+#: tags/trackorganiser.cpp:456
 msgid "Device is busy?"
 msgstr "장치가 사용 중입니까?"
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "장치가 바뀌었습니까?"
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:562
 msgid "Clearing unused folders"
 msgstr "사용되지 않는 폴더 지우기"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "리핑된 곡의 리플레이게인을 계산할까요?"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "ReplyGain"
 msgstr "리플레이게인"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:578
 msgid "Calculate"
 msgstr "계산"
 
-#: devices/actiondialog.cpp:618
+#: devices/actiondialog.cpp:634
 msgid "The destination filename already exists!<hr/>%1"
 msgstr "대상 파일이름이 이미 있습니다!<hr/>%1"
 
-#: devices/actiondialog.cpp:621
+#: devices/actiondialog.cpp:637
 msgid "Song already exists!<hr/>%1"
 msgstr "곡이 이미 있습니다!<hr/>%1"
 
-#: devices/actiondialog.cpp:624
+#: devices/actiondialog.cpp:640
 msgid "Song does not exist!<hr/>%1"
 msgstr "곡이 없습니다!<hr/>%1"
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:643
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
 "permissions.<hr/>%1"
 msgstr "대상 폴더를 만들 수 없음!<br/>권한이 있는지 확인 바랍니다.<hr/>%1"
 
-#: devices/actiondialog.cpp:630
+#: devices/actiondialog.cpp:646
 msgid "Source file no longer exists?<br/><br/<hr/>%1"
 msgstr "원본 파일이 더 이상 존재하지 않습니까?<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:633
+#: devices/actiondialog.cpp:649
 msgid "Failed to copy.<hr/>%1"
 msgstr "복사할 수 없음.<hr/>%1"
 
-#: devices/actiondialog.cpp:634
+#: devices/actiondialog.cpp:650
 msgid "Failed to delete.<hr/>%1"
 msgstr "지울 수 없음.<hr/>%1"
 
-#: devices/actiondialog.cpp:637
+#: devices/actiondialog.cpp:653
 msgid "Not connected to device.<hr/>%1"
 msgstr "장치에 연결되어 있지 않음.<hr/>%1"
 
-#: devices/actiondialog.cpp:640
+#: devices/actiondialog.cpp:656
 msgid "Selected codec is not available.<hr/>%1"
 msgstr "선택된 코덱을 사용할 수 없습니다.<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:659
 msgid "Transcoding failed.<br/><br/<hr/>%1"
 msgstr "변환할 수 없음.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:646
+#: devices/actiondialog.cpp:662
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
 "devices.)<hr/>%1"
 msgstr "임시 파일을 만들 수 없음.<br/>(MTP 장치로 변환에 필요)<hr/>%1"
 
-#: devices/actiondialog.cpp:649
+#: devices/actiondialog.cpp:665
 msgid "Failed to read source file.<br/><br/<hr/>%1"
 msgstr "원본 파일을 읽을 수 없음.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:652
+#: devices/actiondialog.cpp:668
 msgid "Failed to write to destination file.<br/><br/<hr/>%1"
 msgstr "대상 파일을 쓸 수 없음.<br/>%1"
 
-#: devices/actiondialog.cpp:655
+#: devices/actiondialog.cpp:671
 msgid "No space left on device.<br/><br/<hr/>%1"
 msgstr "장치에 여유 공간이 없음.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:658
+#: devices/actiondialog.cpp:674
 msgid "Failed to update metadata.<br/><br/<hr/>%1"
 msgstr "메타데이터를 업데이트할 수 없음.<hr/>%1"
 
-#: devices/actiondialog.cpp:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr "곡을 내려받을 수 없음 - 너무 많은 재전송.<br/><br/<hr/>%1"
-
-#: devices/actiondialog.cpp:664
+#: devices/actiondialog.cpp:677
 msgid "Failed to download track.<br/><br/<hr/>%1"
 msgstr "곡을 내려받을 수 없음.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:667
+#: devices/actiondialog.cpp:680
 msgid "Failed to lock device.<hr/>%1"
 msgstr "장치를 잠글 수 없음.<hr/>%1"
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:709
 msgid "Local Music Library Properties"
 msgstr "로컬 음악라이브러리 속성"
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
+#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
 msgid "<b>Error</b><br/>"
 msgstr "<b>오류</b><br/>"
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Skip"
 msgstr "건너뜀"
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Auto Skip"
 msgstr "자동 건너뜀"
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:759
 msgid "Retry"
 msgstr "다시 시도"
 
-#: devices/actiondialog.cpp:761
+#: 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>"
+"<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>"
 
-#: devices/actiondialog.cpp:768
+#: 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>"
+"<tr><td align=\"right\">원본 파일:</td><td>%1</td></tr><tr><td align=\"right"
+"\">대상 파일:</td><td>%2</td></tr>"
 
-#: devices/actiondialog.cpp:773
+#: 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:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
 msgid "Calculating..."
 msgstr "계산 중..."
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:799
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (예상)"
 
-#: devices/actiondialog.cpp:789
+#: 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:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "캐시 저장"
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
+#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "\"여러 연주자\" 해결 적용"
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
+#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "\"여러 연주자\" 해결 되돌리기"
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
+#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
 msgid "Capitalize"
 msgstr "대문자로"
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
 msgid "Adjust Track Numbers"
 msgstr "곡 번호 조정"
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
 msgid "Tools"
 msgstr "도구"
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "\"여러 연주자\" 해결을 적용할까요?"
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -561,11 +564,11 @@ msgstr ""
 "<i>'음반연주자'와 '연주자'를 \"여러 연주자\"로 설정하고, '제목'을 \"곡 연주"
 "자 - 곡 제목\"으로 바꿉니다.</i>"
 
-#: devices/albumdetailsdialog.cpp:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
 msgid "Revert \"Various Artists\" workaround"
 msgstr "\"여러 연주자\" 해결을 되돌림"
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
 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' "
@@ -578,36 +581,36 @@ msgstr ""
 "><br/>'제목'이 \"유재하 - 내 마음에 비친 내 모습\"이고 '연주자'가 \"유재하"
 "\"로 설정되면, '제목'은 \"내 마음에 비친 내 모습\"이 됩니다.</i>"
 
-#: devices/albumdetailsdialog.cpp:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
 msgid "Revert"
 msgstr "되돌림"
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr "'제목', '연주자', '음반연주자', '음반'의 첫 글자를 대문자로 만듬"
 
-#: devices/albumdetailsdialog.cpp:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
 msgid "Adjust track number by:"
 msgstr "곡 번호 조정:"
 
-#: 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
+#: 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:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "디스크 읽음"
 
-#: 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:353 gui/mainwindow.cpp:2199
+#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
+#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "한 곡 (%2)"
@@ -625,24 +628,24 @@ msgstr "MusicBrainz"
 msgid "Data Track"
 msgstr "자료 수록"
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr "CD 장치를 읽을 수 없음"
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
 #: devices/musicbrainz.cpp:217
 msgid "Track %1"
 msgstr "곡 %1"
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr "CDDB 연결 안 됨"
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr "CDDB에 자료 없음"
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr "CDDB 오류: %1"
 
@@ -650,19 +653,19 @@ msgstr "CDDB 오류: %1"
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr "여러 자료가 있으니, 아래에서 하나를 고르시기 바랍니다:"
 
-#. i18n: file: devices/albumdetails.ui:157
+#. i18n: file: devices/albumdetails.ui:170
 #. 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:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
+#: rc.cpp:82
 msgid "Artist"
 msgstr "연주자"
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:175
 #. 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:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
+#: rc.cpp:85
 msgid "Title"
 msgstr "제목"
 
@@ -680,10 +683,14 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr "업데이트 중 (%1)..."
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr "업데이트 중 (%1%)..."
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -743,12 +750,12 @@ 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>이 설정을 사용하면 장치의 음악라이브러리에 캐시를 만듭니다. 모든 파일의 "
-"라이브러리를 읽는 대신에 캐시 파일을 이용하므로 라이브러리 검색을 빠르게 하"
-"는 데에 도움이 됩니다.<hr/><b>참고:</b> 만약 장치의 라이브러리를 업데이트하"
-"는 데에 다른 응용 프로그램을 사용하면, 이 캐시는 쓸모 없어질 수 있습니다. 이"
-"를 해결하려면, 장치 리스트의 새로 읽기 단추를 눌러 캐시 파일을 지우고 장치를 "
-"새로 읽습니다.</p>"
+"<p>이 설정을 사용하면 장치의 음악라이브러리에 캐시를 만듭니다. 모든 파일의 라"
+"이브러리를 읽는 대신에 캐시 파일을 이용하므로 라이브러리 검색을 빠르게 하는 "
+"데에 도움이 됩니다.<hr/><b>참고:</b> 만약 장치의 라이브러리를 업데이트하는 데"
+"에 다른 응용 프로그램을 사용하면, 이 캐시는 쓸모 없어질 수 있습니다. 이를 해"
+"결하려면, 장치 리스트의 새로 읽기 단추를 눌러 캐시 파일을 지우고 장치를 다시 "
+"읽습니다.</p>"
 
 #: devices/devicepropertieswidget.cpp:204
 msgid "Do not transcode"
@@ -783,42 +790,42 @@ msgstr "장치 잃음"
 msgid "Add Device"
 msgstr "장치 추가"
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
 msgstr "음반과 곡의 상세정보를 찾습니까?"
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455
 msgid "Refresh"
 msgstr "새로 읽기"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr "CDDB 사용"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr "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>어떻게 새로 읽을까요?<ul><li>부분 - 새 음악만 읽기 <i>(빠름)</i></li><li>"
-"전체 - 모든 음악 새로 읽기 <i>(느림)</i></li></ul></p>"
+"전체 - 모든 음악 다시 읽기 <i>(느림)</i></li></ul></p>"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr "부분"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr "전체"
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -826,31 +833,31 @@ msgstr ""
 "선택된 곡을 지울까요?\n"
 "되돌릴 수 없습니다."
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr "<b>%1</b>을 무시할까요?"
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr "오디오 CD <b>%1 - %2</b>을 뺄까요?"
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr "빼기"
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr "<b>%1</b>을 끊을까요?"
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr "연결 끊음"
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
 msgid "Please close other dialogs first."
 msgstr "다른 대화창을 먼저 닫으시기 바랍니다."
 
-#: devices/encoders.cpp:78
+#: devices/encoders.cpp:77
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -865,7 +872,7 @@ msgstr ""
 "은 손실 코덱입니다.<br>AAC는 일반적으로 비슷한 비트레이트에서 MP3보다 나은 음"
 "질을 들려줍니다. iPod나 다른 휴대용 음악 연주기에서는 좋은 선택입니다."
 
-#: devices/encoders.cpp:83
+#: devices/encoders.cpp:82
 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 "
@@ -894,21 +901,21 @@ msgstr ""
 "><b>120kb/s 이하</b>는 음악이 만족스럽지 않을 수 있습니다. <b>200kb/s</b>는 "
 "너무 높을 수 있습니다."
 
-#: devices/encoders.cpp:101 devices/encoders.cpp:141
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr "가변 비트레이트 인코딩에서의 평균 기댓값"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
+#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
 msgid "Smaller file"
 msgstr "더 작은 파일"
 
-#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:329
 msgid "Better sound quality"
 msgstr "더 좋은 음악 품질"
 
-#: devices/encoders.cpp:120
+#: devices/encoders.cpp:119
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -923,7 +930,7 @@ msgstr ""
 "에도 불구하고, 소비자 오디오의 범용 저장 포맷으로 휴대용 음악 연주기에 널리 "
 "쓰입니다."
 
-#: devices/encoders.cpp:124
+#: devices/encoders.cpp:123
 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 "
@@ -948,11 +955,11 @@ msgstr ""
 "생기에서 음악 듣기에 좋은 선택입니다.<br/><b>120kb/s 이하</b>는 음악이 불만족"
 "스러울 수 있습니다.<b>205kb/s 이상</b>은 너무 높을 수 있습니다."
 
-#: devices/encoders.cpp:156 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:159
+#: devices/encoders.cpp:158
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -967,7 +974,7 @@ msgstr ""
 "서 MP3보다 더 작은 파일을 만듭니다. Ogg Vorbis는 전반적으로, 특히 지원하는 휴"
 "대용 음악 연주기에는 아주 좋은 선택입니다."
 
-#: devices/encoders.cpp:164
+#: devices/encoders.cpp:163
 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 "
@@ -997,15 +1004,61 @@ msgstr ""
 "이하</b>는 음악이 불만족스러울 수 있습니다.<b>8이상</b>은 너무 높을 수 있습니"
 "다."
 
-#: devices/encoders.cpp:184
+#: devices/encoders.cpp:183
 msgid "Quality rating"
 msgstr "품질 순위"
 
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr "오푸스(Opus)"
+
+#: devices/encoders.cpp:203
+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 ""
+"<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>는 손실 데이터 "
+"압축을 이용하는 사용료가 없는 오디오 코덱입니다."
+
 #: devices/encoders.cpp:205
+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 ""
+"비트레이트는 오디오 트랙의 초당 데이터를 나타내는 양을 수치화한 것입니다.<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>은 너무 높을 수 있습니다."
+
+#: devices/encoders.cpp:222 devices/encoders.cpp:319
+msgid "Bitrate"
+msgstr "비트레이트"
+
+#: devices/encoders.cpp:241
 msgid "Apple Lossless"
 msgstr "애플 무손실"
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:244
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1019,11 +1072,11 @@ msgstr ""
 "%8B%A4>애플 무손실</a> (ALAC)은 디지털 음악의 무손실 압축을 위한 오디오 코덱"
 "입니다.<br>애플 제품이나 FLAC을 지원하지 않는 연주기에서만 추천합니다."
 
-#: devices/encoders.cpp:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:262
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1037,7 +1090,7 @@ msgstr ""
 "(FLAC)은 무손실 디지털 음악을 위해서 공개된, 사용료가 없는 코덱입니다.<br>오"
 "디오 품질을 손상시키지 않고 음악을 저장하려면, FLAC은 훌륭한 선택입니다."
 
-#: devices/encoders.cpp:230
+#: devices/encoders.cpp:266
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1059,19 +1112,19 @@ msgstr ""
 "므로 압축률에 상관없이 음악 출력품질은 동일합니다.<br/>또한, <b>5</b>이상의 "
 "값은 압축 시간을 늘이지만 파일 크기는 약간만 작아지므로 추천하지 않습니다."
 
-#: devices/encoders.cpp:245
+#: devices/encoders.cpp:281
 msgid "Compression level"
 msgstr "압축률"
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:291
 msgid "Faster compression"
 msgstr "더 빠른 압축"
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:298
 msgid "Windows Media Audio"
 msgstr "윈도 미디어 오디오 (WMA)"
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:301
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1086,7 +1139,7 @@ msgstr ""
 "을 위해 마이크로소프트에 의해 개발된 독점 코덱입니다.<br>Ogg Vorbis를 지원하"
 "지 않는 휴대용 음악 연주기에만 추천됩니다."
 
-#: devices/encoders.cpp:268
+#: devices/encoders.cpp:305
 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> "
@@ -1108,84 +1161,122 @@ msgstr ""
 "><b>112kb/s 이하</b>는 음악이 불만족스러울 수 있습니다.<b>182kb/s 이상</b>은 "
 "너무 높을 수 있습니다."
 
-#: devices/encoders.cpp:282
-msgid "Bitrate"
-msgstr "비트레이트"
-
 #: devices/filenameschemedialog.cpp:33
 msgid "Filename Scheme"
 msgstr "파일이름 구성"
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:52
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "유재하"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:53
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "유재하"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr "유재하"
+
+#: devices/filenameschemedialog.cpp:55
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "사랑하기 때문에"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:56
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "내 마음에 비친 내 모습"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:57
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Ballad"
 
-#: devices/filenameschemedialog.cpp:99
+#: devices/filenameschemedialog.cpp:101
 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>아래 변수는 각 곡명의 해당되는 의미에 따라 바뀝니다.</p>"
+
+#: devices/filenameschemedialog.cpp:103
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</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 ""
-"<p>다음 변수는 의미에 따라 각 곡 이름이 됩니다."
-"</p><p><table border=\"1\"><tr><th><em>단추</em></"
-"th><th><em>변수</em></th><th><em>설명</em></th></tr><tr><td>"
-"%albumartist%</td><td>%1</td><td>음반연주자. 대부분의 음반은 "
-"<i>곡 연주자</i>와 같습니다. 컴필레이션은 많은 경우에 "
-"<i>여러 연주자</i>입니다. </td></tr><tr><td>%album%</td><td>%2</"
-"td><td>음반명.</td></tr><tr><td>%artist%</td><td>%3</"
-"td><td>각각의 곡 연주자.</td></tr><tr><td>%title%</td><td>%4</"
-"td><td>곡명 (<i>곡 연주자</i>없이).</td></tr><tr><td>"
-"%artistandtitle%</td><td>%5</td><td>곡명 (<i>곡 연주자</i>포함, "
-"<i>음반연주자</i>와 다르다면).</td></tr><tr><td>%track%</td><td>"
-"%6</td><td>곡 번호.</td></tr><tr><td>%discnumber%</td><td>%7</"
-"td><td>여러 음반의 장수. 컴필레이션은 종종 서너장의 음반으로 되어 있습니다."
-"</td></tr><tr><td>%year%</td><td>%8</td><td>음반 발매 연도."
-"</td></tr><tr><td>%genre%</td><td>%9</td><td>음반 장르.</td></tr></table></p>"
-
-#: devices/fsdevice.cpp:678
+"<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
 msgid "Updating..."
 msgstr "업데이트 중..."
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "캐시 읽음"
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
@@ -1219,16 +1310,15 @@ msgstr "파일 업데이트 중..."
 msgid "Updating tracks..."
 msgstr "곡 업데이트 중..."
 
-#: 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
+#: 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:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
+#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
+#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
 #: models/devicesmodel.cpp:140
 msgid "Not Connected"
 msgstr "연결 안 됨"
@@ -1245,7 +1335,7 @@ msgstr "MusicBrainz에서 찾을 수 없음"
 msgid "Connection"
 msgstr "연결"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
 msgid "Music Library"
 msgstr "음악라이브러리"
 
@@ -1334,8 +1424,8 @@ msgstr "용량을 알 수 없음"
 
 #. i18n: file: gui/coverdialog.ui:30
 #. 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:53 gui/stdactions.cpp:92
+#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
 msgid "Search"
 msgstr "찾기"
 
@@ -1379,91 +1469,91 @@ msgstr "검색 안 됨"
 msgid " (recommended)"
 msgstr " (추천)"
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:208
 msgid "Start Dynamic Playlist"
 msgstr "동적 연주목록 시작"
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:209
 msgid "Stop Dynamic Mode"
 msgstr "동적 방식 중지"
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:257
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "한 규정"
 msgstr[1] "%1 규정"
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:396
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr "칸타타의 동적 모드를 작동하려면 \"perl\"을 시스템에 설치해야 합니다."
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:403
 msgid "Failed to locate rules file - %1"
 msgstr "규정 파일을 찾을 수 없음 - %1"
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:411
 msgid "Failed to remove previous rules file - %1"
 msgstr "이전 규정 파일을 지울 수 없음 - %1"
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:416
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "규정 파일을 설치할 수 없음 - %1 -> %2"
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:729
 msgid "Dynamizer has been terminated."
 msgstr "활동이 중지됨."
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:816
 msgid "Uknown"
 msgstr "알 수 없음"
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:818
 msgid "Loading list of rules"
 msgstr "규정 리스트를 읽음"
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:819
 msgid "Saving rule"
 msgstr "규정 저장"
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:820
 msgid "Deleting rule"
 msgstr "규정 지우기"
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:821
 msgid "Setting active rule"
 msgstr "활성화 규정 설정"
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:822
 msgid "Stopping dynamizer"
 msgstr "활동 중지"
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:823
 msgid "Requesting ID details"
 msgstr "ID 상세정보 요청 중"
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:826
 msgid "Awaiting response for previous command. (%1)"
 msgstr "이전 명령어 응답 대기 중. (%1)"
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:981
 msgid "Dynamizer is not active"
 msgstr "활동 활성화 안 됨"
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:989
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "동적 규정 리스트 읽기 안 됨. (%1)"
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1020
 msgid "Failed to delete rules file. (%1)"
 msgstr "규정 파일 지워지지 않음. (%1)"
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "활동 활성화 상태 관리 안 됨. (%1)"
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1036
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "현재 동적 규정 설정 안 됨. (%1)"
 
@@ -1497,15 +1587,15 @@ msgstr "동적 규정"
 
 #. 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:136 po/rc.cpp:280 rc.cpp:280
 msgid "Add"
 msgstr "추가"
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:202
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr "<i><b>오류</b>: '시작 연도'는 '마지막 연도'보다 작아야 합니다</i>"
 
-#: dynamic/dynamicruledialog.cpp:194
+#: dynamic/dynamicruledialog.cpp:205
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1520,45 +1610,51 @@ msgstr "비슷한 연주자"
 msgid "AlbumArtist"
 msgstr "음반연주자"
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr "작곡가"
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
 msgid "Album"
 msgstr "음반"
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. 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:106
+#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
 msgid "Genre"
 msgstr "장르"
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr "날짜"
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr "포함"
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr "제외"
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr " (정확)"
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr "동적 규정"
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
 "of <i>Include</i> rules will be used to build a set of songs that can be "
@@ -1583,11 +1679,11 @@ msgstr ""
 "함 음반연주자=유재하</li><li>제외 음반=미련</li></ul>사용할 곡들이 만들어지"
 "면 칸타타는 무작위로 곡들을 선택하여 연주순서에 10개 항목을 유지합니다.</p>"
 
-#: dynamic/dynamicrulesdialog.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr "%1 저장 안 됨"
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
@@ -1595,31 +1691,35 @@ msgstr ""
 "규정 이름인 '%1'는 이미 있음!\n"
 "덮어쓸까요?"
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 msgid "Overwrite Rules"
 msgstr "규정 덮어쓰기"
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr "%1로 저장함"
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:168
 msgid "Deleting..."
 msgstr "지우는 중..."
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Name"
 msgstr "이름"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Item Count"
 msgstr "항목 수"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Space Used"
 msgstr "사용 공간"
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr "전체사용공간: %1"
+
+#: gui/cachesettings.cpp:245
 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 "
@@ -1632,48 +1732,53 @@ msgstr ""
 "MPD 폴더에 저장되지 않은 경우입니다 (이것은 접근할 수 없거나, MPD 폴더에 저장"
 "하지 않도록 설정한 경우입니다). 아래는 캐시를 사용한 내역입니다."
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:257
 msgid "Covers"
 msgstr "음반표지"
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:258
 msgid "Backdrops"
 msgstr "배경"
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
+#: 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:246
+#: gui/cachesettings.cpp:264
 msgid "Jamendo"
 msgstr "자멘도(Jamendo)"
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:265
 msgid "Magnatune"
 msgstr "매그나튠(Magnatune)"
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr "팟캐스트 디렉터리"
+
+#: gui/cachesettings.cpp:273
 msgid "Delete All"
 msgstr "모두 지우기"
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:312
 msgid "Delete all '%1' items?"
 msgstr "'%1' 항목을 모두 지울까요?"
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
 msgid "Delete Cache Items"
-msgstr "캐시 항목을 지웁니다"
+msgstr "캐시항목을 지웁니다"
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:322
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>아래 전부를 지웁니까?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:150 gui/main.cpp:169
+#: gui/coverdialog.cpp:151 gui/main.cpp:231
 msgid "Last.fm"
 msgstr "Last.fm"
 
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:165
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1684,7 +1789,7 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:183
+#: gui/coverdialog.cpp:184
 msgctxt ""
 "Google\n"
 "width x height (file size)"
@@ -1695,7 +1800,7 @@ msgstr ""
 "Google\n"
 "%1 x %2 (%3)"
 
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:204
 msgctxt ""
 "Discogs\n"
 "width x height"
@@ -1706,7 +1811,7 @@ msgstr ""
 "Discogs\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:237
+#: gui/coverdialog.cpp:238
 msgctxt ""
 "Current Cover\n"
 "width x height"
@@ -1717,40 +1822,41 @@ msgstr ""
 "현재 표지\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:256
 msgid "Image"
 msgstr "이미지"
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:259
 msgid "Downloading..."
 msgstr "내려받는 중..."
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "이미지 (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:432
 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>"
+"<p>이 연주자의 이미지가 이미 존재하므로 파일 쓰기가 되지 않습니다.<p></p><i>"
+"%1</i></p>"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:433
 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:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
+#: 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:613
+#: gui/coverdialog.cpp:579
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1758,37 +1864,44 @@ msgstr ""
 "표지 설정에 실패함!\n"
 "임시 파일에 내려받을 수 없음!"
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:607
 msgid "Failed to download image!"
 msgstr "이미지를 내려받을 수 없음!"
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
 msgid "Load Local Cover"
 msgstr "로컬 표지 읽음"
 
-#: gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:795
 msgid "Images (*.png *.jpg)"
 msgstr "이미지 (*.png *.jpg)"
 
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:800
 msgid "File is already in list!"
 msgstr "파일이 이미 목록에 있음!"
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:804
 msgid "Failed to read image!"
 msgstr "이미지를 읽을 수 없음!"
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:817
 msgid "Display"
 msgstr "보이기"
 
 #. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
 msgid "Remove"
 msgstr "지우기"
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1181
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1796,7 +1909,7 @@ msgstr ""
 "표지를 설정할 수 없음!\n"
 "복사할 수 수 없음!"
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1190
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1804,7 +1917,7 @@ msgstr ""
 "표지를 설정할 수 없음!\n"
 "원본을 백업할 수 없음!"
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1239
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1814,249 +1927,261 @@ msgstr ""
 
 #: gui/folderpage.cpp:45
 msgid "Open In File Manager"
-msgstr "파일 관리자 열기"
+msgstr "파일관리자 열기"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Established"
 msgstr "연결됨"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Failed"
 msgstr "연결 안 됨"
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. 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
+#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
+#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
 msgid "None"
 msgstr "없음"
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:40
 msgid "Small"
 msgstr "작게"
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:41
 msgid "Medium"
 msgstr "보통"
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:42
 msgid "Large"
 msgstr "크게"
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:43
 msgid "Extra Large"
 msgstr "아주 크게"
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:48
 msgid "Simple Tree"
 msgstr "단순 나무 모양"
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:49
 msgid "Detailed Tree"
 msgstr "상세 나무 모양"
 
 #. i18n: file: gui/interfacesettings.ui:329
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
 msgid "Grouped Albums"
 msgstr "앨범으로 묶음"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:53
 msgid "List"
 msgstr "목록"
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:55
 msgid "Icon/List"
 msgstr "아이콘/목록"
 
-#: gui/interfacesettings.cpp:85
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+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)
+#: 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
+msgid "Style:"
+msgstr "방식:"
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr "온라인"
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr "장치"
+
+#: gui/interfacesettings.cpp:178
 msgid "Grouped by 'Album Artist'"
 msgstr "'음반연주자'로 묶음"
 
-#: gui/interfacesettings.cpp:86
+#: gui/interfacesettings.cpp:179
 msgid "Grouped under 'Various Artists'"
 msgstr "'여러 연주자'로 묶음"
 
-#: 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/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
 msgid "Cantata"
 msgstr "칸타타"
 
-#: gui/main.cpp:152
+#: gui/main.cpp:214
 msgid "A KDE client for MPD"
 msgstr "MPD의 KDE 클라이언트"
 
-#: gui/main.cpp:154
-msgid "Copyright (C) 2011-2013 Craig Drummond"
-msgstr "Copyright (C) 2011-2013 Craig Drummond"
+#: gui/main.cpp:216
+msgid "Copyright (c) 2011–2013 Craig Drummond"
+msgstr "Copyright (c) 2011–2013 Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Maintainer"
 msgstr "유지"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "UI Improvements"
 msgstr "사용자 인터페이스 개선"
 
-#: gui/main.cpp:160
+#: gui/main.cpp:222
 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:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
 msgid "QtMPC author"
 msgstr "QtMPC 개발자"
 
-#: gui/main.cpp:161
+#: gui/main.cpp:223
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:162
+#: gui/main.cpp:224
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:163
+#: gui/main.cpp:225
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr "찾아보기 배경 (나만의 음악 팬아트를 fanart.tv에 올려주셔요)"
 
-#: gui/main.cpp:168
+#: gui/main.cpp:230
 msgid "Wikipedia"
 msgstr "위키피디아"
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:230 gui/main.cpp:231
 msgid "Context view metadata"
 msgstr "찾아보기 자료"
 
-#: gui/main.cpp:173
+#: gui/main.cpp:235
 msgid "URL to open"
 msgstr "URL 열기"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:238
 msgid "Quit"
 msgstr "나가기"
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:242
 msgid "Show Window"
 msgstr "창 보기"
 
-#. 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:245 po/rc.cpp:418 rc.cpp:418
 msgid "Connect"
 msgstr "연결"
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
 msgid "Collection"
 msgstr "음원"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:247
 msgid "Outputs"
 msgstr "출력"
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr "이전 곡"
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr "다음 곡"
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr "연주/멈춤"
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr "지금 곡 다음 정지"
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "곡 다음 정지"
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr "음량 올림"
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr "음량 내림"
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr "음 소거"
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:249
 msgid "Add To Stored Playlist"
 msgstr "저장된 연주목록에 추가"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:250
 msgid "Remove From Play Queue"
 msgstr "연주순서 지우기"
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:251
 msgid "Copy Track Info"
-msgstr "곡 정보 복사"
+msgstr "곡 정보복사"
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:252
 msgid "Crop"
 msgstr "잘라내기"
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
-msgstr "뒤섞기"
+#: gui/mainwindow.cpp:253
+msgid "Shuffle Tracks"
+msgstr "곡 섞기"
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:254
+msgid "Shuffle Albums"
+msgstr "음반 섞기"
+
+#: gui/mainwindow.cpp:255
 msgid "Add Stream URL"
 msgstr "스트림 URL 추가"
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:256
 msgid "Clear"
 msgstr "지우기"
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:257
 msgid "Expanded Interface"
 msgstr "넓게 보기"
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:258
 msgid "Show Current Song Information"
-msgstr "지금 곡 정보 보기"
+msgstr "지금 곡 정보보기"
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:261
 msgid "Full Screen"
-msgstr "전체 화면"
+msgstr "전체화면"
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:263
 msgid "Random"
 msgstr "무작위"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:264
 msgid "Repeat"
 msgstr "반복"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid "Single"
 msgstr "단일"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2064,129 +2189,135 @@ msgstr ""
 "'단일'이 선택되면, 지금 곡 다음에 연주를 멈춥니다. '반복'이 선택되면, 곡은 반"
 "복됩니다."
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid "Consume"
 msgstr "소비"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr "소비가 활성화되면, 곡은 연주 후에 연주순서에서 없어집니다."
 
-#: gui/mainwindow.cpp:291
+#: gui/mainwindow.cpp:267
 msgid "Search Play Queue"
 msgstr "연주순서 찾기"
 
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:269
 msgid "Set Priority"
 msgstr "우선순위 설정"
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:271
 msgid "Play Stream"
 msgstr "스트림 연주"
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:273
 msgid "Locate In Library"
 msgstr "라이브러리 위치 찾기"
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:275
 msgid "Edit Song Tags"
-msgstr "곡 태그 수정"
+msgstr "곡 태그수정"
 
 #. i18n: file: gui/interfacesettings.ui:304
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
 msgid "Play Queue"
 msgstr "연주순서"
 
 #. i18n: file: gui/interfacesettings.ui:27
 #. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:302 po/rc.cpp:455 rc.cpp:455
+#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
 msgid "Artists"
 msgstr "연주자"
 
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr "폴더"
-
 #. 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
+#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
 msgid "Playlists"
 msgstr "연주목록"
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:282
 msgid "Dynamic"
 msgstr "동적"
 
-#: gui/mainwindow.cpp:308
-msgid "Online"
-msgstr "온라인"
-
-#: gui/mainwindow.cpp:310
-msgid "Devices"
-msgstr "장치"
-
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:288
 msgid "Expand All"
-msgstr "전체 확장"
+msgstr "전체확장"
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:289
 msgid "Collapse All"
-msgstr "전체 축소"
+msgstr "전체축소"
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:290
+msgid "Remove All Songs"
+msgstr "모든 곡을 지움"
+
+#: gui/mainwindow.cpp:398
 msgid "Info"
 msgstr "정보"
 
-#: gui/mainwindow.cpp:435
+#: gui/mainwindow.cpp:405
 msgid "Auto Hide"
 msgstr "자동 숨김"
 
-#: gui/mainwindow.cpp:441
+#: gui/mainwindow.cpp:411
 msgid "Monochrome Icons"
 msgstr "단색 아이콘"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:541
 msgid "Server information..."
-msgstr "서버 정보..."
+msgstr "서버정보..."
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:552
 msgid "Configure Cantata..."
 msgstr "칸타타 설정..."
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:559
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "칸타타에 대하여..."
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:571
 msgid "&File"
 msgstr "파일(&F)"
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:574
 msgid "&Settings"
 msgstr "설정(&S)"
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
 msgid "&Help"
 msgstr "도움말(&H)"
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:948
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr "동적 연주목록 규정에 맞는 음악을 찾지 못했습니다."
 
-#: gui/mainwindow.cpp:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
 msgid "Connecting to %1"
 msgstr "%1에 연결"
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+"팟캐스트를 내려받고 있습니다\n"
+"\n"
+"지금 취소하면 모든 내려받기를 그만둡니다."
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr "내려받기를 그만두고 취소"
+
+#: gui/mainwindow.cpp:1447
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "칸타타에 대하여"
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1448
 msgctxt "Qt-only"
 msgid ""
 "<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
@@ -2194,25 +2325,25 @@ msgid ""
 "\">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>에 따라 배포"
+"2011-2013.<br/><a href=\"http://www.gnu.org/licenses/gpl.html\">GPLv3</a>에 "
+"따라 배포"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1450
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 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> 기반 - (c) 2007-2010 QtMPC 개발자"
+"<br/>"
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1451
 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>"
+msgstr "찾아보기 배경 도움은 <a href=\"http://www.fanart.tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1452
 msgctxt "Qt-only"
 msgid ""
 "Context view metadata courtesy of <a href=\"http://www.wikipedia.org"
@@ -2221,25 +2352,25 @@ msgstr ""
 "찾아보기 자료 도움은 <a href=\"http://www.wikipedia.org\">위키피디아</a> 와 "
 "<a href=\"http://www.last.fm\">Last.fm</a>"
 
-#: gui/mainwindow.cpp:1468
+#: gui/mainwindow.cpp:1453
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
-"나만의 음악 팬아트를 올려주실 곳은 <a href=\"http://www.fanart.tv\">FanArt.tv</a>"
-
+"나만의 음악 팬아트를 올려주실 곳은 <a href=\"http://www.fanart.tv\">FanArt."
+"tv</a>"
 
-#: gui/mainwindow.cpp:1479
+#: gui/mainwindow.cpp:1464
 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>"
 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><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:1487
+#: gui/mainwindow.cpp:1472
 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</"
@@ -2248,88 +2379,84 @@ msgid ""
 "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:1496
+"<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
 msgid "Server Information"
-msgstr "서버 정보"
+msgstr "서버정보"
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
 msgid "Cantata (%1)"
 msgstr "칸타타 (%1)"
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: 칸타타 (%2)"
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: 칸타타"
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1728
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: 칸타타 (%3)"
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1730
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: 칸타타"
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1773
 msgid "(Stream)"
 msgstr "(스트림)"
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1775
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr "음량사용 안 함"
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1% (Muted)"
-msgstr "음량 %1% (무음)"
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
+msgstr "MPD가 다음 오류를 보고함: %1"
 
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
-msgstr "음량 %1%"
+#: gui/mainwindow.cpp:1990
+msgid "Remove all songs from play queue?"
+msgstr "연주순서의 모든 곡을 지울까요?"
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
 msgid "Priority"
 msgstr "우선순위"
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2080
 msgid "Enter priority (0..255):"
 msgstr "우선순위 입력 (0..255):"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Playlist Name"
 msgstr "연주목록 이름"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Enter a name for the playlist:"
 msgstr "연주목록 이름을 입력합니다:"
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2106
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr "연주목록 이름 <b>%1</b>이 이미 있습니다!<br/>연주목록에 추가할까요?"
 
-#: gui/mainwindow.cpp:2146
+#: gui/mainwindow.cpp:2107
 msgid "Existing Playlist"
 msgstr "이미 있는 연주목록"
 
@@ -2341,10 +2468,10 @@ msgstr "페이드아웃 안 함"
 msgid " ms"
 msgstr " ms"
 
-#. i18n: file: devices/albumdetails.ui:152
+#. i18n: file: devices/albumdetails.ui:165
 #. 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:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
 msgid "Track"
 msgstr "곡"
 
@@ -2352,7 +2479,7 @@ msgstr "곡"
 msgid "Auto"
 msgstr "자동"
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:164
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2361,7 +2488,7 @@ msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:26
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2369,7 +2496,7 @@ msgstr ""
 "<i><b>연결 안 됨!</b><br/>칸타타가 MPD에 연결되지 않았으므로 아래 목록은 수정"
 "되지 않습니다.</i>"
 
-#: gui/playbacksettings.cpp:153
+#: gui/playbacksettings.cpp:174
 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 "
@@ -2379,22 +2506,22 @@ 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>리플레이게인은 MP3나 Ogg Vorbis 같은 오디오 포맷의 소리 크기를 맞추기 위하여 "
-"2001년에 제안된 표준입니다. 곡이나 음반 단위로 작동하며 이제는 점점 더 많은 "
-"연주기가 지원합니다.</p><p>아래 설정이 사용될 수 있습니다:<ul><li><i>안 함</i> - "
-"리플레이게인을 적용 안 함.</li><li><i>곡</i> - 곡의 리플레이게인 태그를 이용하여 "
-"음량을 조정함.</li><li><i>음반</i> - 음반의 리플레이게인 태그를 이용하여 음량을 "
-"조정함.</li><li><i>자동</i> - 무작위연주는 곡의 리플레이게인 태그를, 그 밖은 "
-"음반의 태그를 이용하여 음량을 조정함.</li></ul></p>"
-
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:759 tags/trackorganiser.cpp:65
+"<p>리플레이게인은 MP3나 Ogg Vorbis 같은 오디오 포맷의 소리 크기를 맞추기 위하"
+"여 2001년에 제안된 표준입니다. 곡이나 음반 단위로 작동하며 이제는 점점 더 많"
+"은 연주기가 지원합니다.</p><p>아래 설정이 사용될 수 있습니다:<ul><li><i>안 함"
+"</i> - 리플레이게인을 적용 안 함.</li><li><i>곡</i> - 곡의 리플레이게인 태그"
+"를 이용하여 음량을 조정함.</li><li><i>음반</i> - 음반의 리플레이게인 태그를 "
+"이용하여 음량을 조정함.</li><li><i>자동</i> - 무작위연주는 곡의 리플레이게인 "
+"태그를, 그 밖은 음반의 태그를 이용하여 음량을 조정함.</li></ul></p>"
+
+#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
 msgid "Rename"
 msgstr "이름 바꾸기"
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:190
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2402,113 +2529,123 @@ msgstr ""
 "선택된 연주목록을 지울까요?\n"
 "돌이킬 수 없습니다."
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:191
 msgid "Remove Playlists"
 msgstr "연주목록 지움"
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "연주목록 이름 <b>%1</b>은 이미 있습니다!<br/>덮어쓸까요?"
 
-#: gui/playlistspage.cpp:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
 msgid "Overwrite Playlist"
 msgstr "연주목록을 덮어씀"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Rename Playlist"
 msgstr "연주목록 이름 바꾸기"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Enter new name for playlist:"
 msgstr "새로운 연주목록을 입력합니다:"
 
-#: gui/preferencesdialog.cpp:77
+#: gui/preferencesdialog.cpp:80
 msgid "Collection Settings"
 msgstr "음원 설정"
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
 msgid "Playback"
 msgstr "연주"
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:81
 msgid "Playback Settings"
 msgstr "연주 설정"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "Files"
 msgstr "파일"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "File Settings"
 msgstr "파일 설정"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface"
 msgstr "인터페이스"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface Settings"
 msgstr "인터페이스 설정"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:85
+msgid "Streams Settings"
+msgstr "스트림 설정"
+
+#: gui/preferencesdialog.cpp:89
+msgid "Online Providers"
+msgstr "온라인제공자"
+
+#: gui/preferencesdialog.cpp:92
 msgid "Context"
 msgstr "찾아보기"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:92
 msgid "Context View Settings"
 msgstr "찾아보기 설정"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server"
 msgstr "HTTP 서버"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server Settings"
 msgstr "HTTP 서버 설정"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:103
 msgid "Audio CD Settings"
 msgstr "오디오 CD 설정"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgid "Proxy"
 msgstr "프락시"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "프락시 설정"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "단축키"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "키보드 단축키 설정"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cache"
 msgstr "캐시"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cached Items"
-msgstr "캐시 항목"
+msgstr "캐시항목"
 
-#: gui/preferencesdialog.cpp:118
+#: gui/preferencesdialog.cpp:116
 msgid "Configure"
 msgstr "설정"
 
-#: gui/serversettings.cpp:75
+#: 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:88
+#: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr "사용 안 됨"
 
@@ -2524,12 +2661,12 @@ msgstr "사용 안 됨"
 #. 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:208 po/rc.cpp:247 po/rc.cpp:705
+#: rc.cpp:208 rc.cpp:247 rc.cpp:705
 msgid "Host:"
 msgstr "호스트:"
 
-#: 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 "
@@ -2543,7 +2680,7 @@ msgstr ""
 "호스트에서 실행되어야 합니다. 칸타타 자체로는 이 서비스를 시작하거나 정지할 "
 "수 없습니다.</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 "
@@ -2559,147 +2696,216 @@ msgstr ""
 "체로는 이 서비스를 시작하거나 정지할 수 없습니다. 만약 설정되어있지 않으면, "
 "칸타타는 사용자 기반의 동적 연주목록을 운용합니다.</i>"
 
-#: gui/serversettings.cpp:109
+#: 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 "
 "artist of the current song, and %album% will be replaced with the album name."
 "</i></p>"
 msgstr ""
-"<p>내려받은 표지를 저장할 확장자없는 파일이름.<br/>비어있으면 'cover'가 사용됩니다."
-"<br/><br/><i>%artist%은 지금 곡의 음반연주자로, %album%은 음반명으로 바뀝니다.</i></p>"
+"<p>내려받은 표지를 저장할 확장자없는 파일이름.<br/>비어있으면 'cover'가 사용"
+"됩니다.<br/><br/><i>%artist%은 지금 곡의 음반연주자로, %album%은 음반명으로 "
+"바뀝니다.</i></p>"
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:252
 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 ""
-"어떤 형식의 음원에 연결할까요?<br/><ul><li>표준 - 다른 컴퓨터에 연결되거나 이미 설정되어, "
-"음원을 공유할 수 있음</li><li>기본 - 음원이 공유되지 않고 MPD만 설정하고 관리함</li></ul>"
+"어떤 형식의 음원에 연결할까요?<br/><ul><li>표준 - 다른 컴퓨터에 연결되거나 이"
+"미 설정되어, 음원을 공유할 수 있음</li><li>기본 - 음원이 공유되지 않고 MPD만 "
+"설정하고 관리함</li></ul>"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Add Collection"
 msgstr "음원 추가"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Standard"
 msgstr "표준"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Basic"
 msgstr "기본"
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:297
 msgid "Delete <b>%1</b>?"
 msgstr "%1을 지울까요?"
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:298
 msgid "Delete"
 msgstr "지우기"
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:336
 msgid "New Collection %1"
 msgstr "새로운 음원 %1"
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
 msgid "Default"
 msgstr "기본값"
 
-#: gui/stdactions.cpp:55
-msgid "Save As"
-msgstr "다른 이름으로 저장"
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
+msgstr "멀티미디어 키"
 
-#: gui/stdactions.cpp:56
-msgid "Add To Play Queue"
-msgstr "연주순서 추가"
+#: gui/shortcutssettingspage.cpp:80
+msgid "Do not use media keys to control Cantata"
+msgstr "미디어 키 사용 안 함"
 
-#: gui/stdactions.cpp:57
-msgid "Replace Play Queue"
-msgstr "연주순서 교체"
+#: gui/shortcutssettingspage.cpp:81
+msgid "Use media keys to control Cantata"
+msgstr "미디어 키 사용함"
 
-#: gui/stdactions.cpp:58
-msgid "Add With Priority"
-msgstr "우선순위 추가"
+#: gui/shortcutssettingspage.cpp:84
+msgid "Use media keys, as configured in desktop settings, to control Cantata"
+msgstr "데스크톱 환경에서 설정된 미디어 키 사용함"
 
-#: gui/stdactions.cpp:59
-msgid "Highest Priority (255)"
-msgstr "최고 우선순위 (255)"
+#: gui/shortcutssettingspage.cpp:85
+msgid ""
+"Use media keys, as configured in GNOME/Unity settings, to control Cantata"
+msgstr "그놈/유니티에서 설정된 미디어 키 사용함"
 
-#: gui/stdactions.cpp:60
-msgid "High Priority (200)"
-msgstr "높은 우선순위 (200)"
+#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
+#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+msgid "Configure..."
+msgstr "설정..."
 
-#: gui/stdactions.cpp:61
-msgid "Medium Priority (125)"
-msgstr "중간 우선순위 (125)"
+#: 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 "이전 곡"
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr "다음 곡"
+
+#: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr "연주/멈춤"
+
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr "지금 곡 다음 정지"
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr "음량 올림"
 
 #: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr "음량 내림"
+
+#: gui/stdactions.cpp:63
+msgid "Save As"
+msgstr "다른 이름으로 저장"
+
+#: gui/stdactions.cpp:64
+msgid "Add To Play Queue"
+msgstr "연주순서 추가"
+
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr "무작위로 음반 추가"
+
+#: gui/stdactions.cpp:66
+msgid "Replace Play Queue"
+msgstr "연주순서 교체"
+
+#: gui/stdactions.cpp:67
+msgid "Add With Priority"
+msgstr "우선순위 추가"
+
+#: gui/stdactions.cpp:68
+msgid "Highest Priority (255)"
+msgstr "최고 우선순위 (255)"
+
+#: gui/stdactions.cpp:69
+msgid "High Priority (200)"
+msgstr "높은 우선순위 (200)"
+
+#: gui/stdactions.cpp:70
+msgid "Medium Priority (125)"
+msgstr "중간 우선순위 (125)"
+
+#: gui/stdactions.cpp:71
 msgid "Low Priority (50)"
 msgstr "낮은 우선순위 (50)"
 
-#: gui/stdactions.cpp:63
+#: gui/stdactions.cpp:72
 msgid "Default Priority (0)"
 msgstr "기본 우선순위 (0)"
 
-#: gui/stdactions.cpp:64
+#: gui/stdactions.cpp:73
 msgid "Custom Priority..."
 msgstr "사용자 우선순위..."
 
-#: gui/stdactions.cpp:65
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr "연주목록 추가"
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
 msgid "Organize Files"
-msgstr "파일 구성"
+msgstr "파일구성"
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
-msgstr "태그 수정"
+msgstr "태그수정"
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
 msgid "ReplayGain"
 msgstr "리플레이게인"
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 msgid "Copy Songs To Device"
 msgstr "장치로 곡 복사"
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 msgid "Set Image"
 msgstr "이미지 설정"
 
-#: gui/stdactions.cpp:79
+#: gui/stdactions.cpp:88
 msgid "Refresh Database"
 msgstr "데이터베이스 새로 읽기"
 
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "돌아가기"
 
-#: gui/trayitem.cpp:165
+#: gui/trayitem.cpp:192
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%2의 %1"
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:193
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%2의 %1 (%3)"
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:195
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%3에서 %2의 %1"
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:196
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%3에서 %2의 %1 (%4)"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:223
 msgid "Now playing"
 msgstr "지금 연주 중"
 
@@ -2723,6 +2929,16 @@ msgstr "우선 사용되는 연결"
 msgid "Inactive"
 msgstr "사용되지 않음"
 
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr "Cue 시트"
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr "연주목록"
+
 #: models/devicesmodel.cpp:108
 msgid "Configure Device"
 msgstr "장치 설정"
@@ -2743,7 +2959,7 @@ msgstr "장치 분리"
 msgid "Edit CD Details"
 msgstr "CD 상세정보 수정"
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:690
 msgid "No Devices Attached"
 msgstr "장치 연결 안 됨"
 
@@ -2755,28 +2971,28 @@ msgstr "로그인 안 됨"
 msgid "Logged in"
 msgstr "로그인 됨"
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 msgid "Unknown error"
 msgstr "알 수 없는 오류"
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr "가입 안 됨"
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr "가입이 되지 않았음"
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr "로그인 됨 (만기:%1)"
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr "세션 닫힘"
 
 #: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "한 항목"
@@ -2786,227 +3002,248 @@ msgstr[1] "%1 항목"
 msgid "Audio File"
 msgstr "음악파일"
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr "연주목록"
-
-#: models/dirviewmodel.cpp:192 models/musicmodel.cpp:120
-msgid "Cue Sheet"
-msgstr "Cue 시트"
-
-#: models/musiclibraryitemartist.cpp:218 models/musiclibraryitemartist.cpp:231
-#: models/musiclibraryitemroot.cpp:798
+#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
 msgid "Single Tracks"
 msgstr "한 곡들"
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "한 곡"
 msgstr[1] "%1 곡"
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:185
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "한 연주자"
 msgstr[1] "%1 연주자"
 
-#: models/musicmodel.cpp:172
+#: models/musicmodel.cpp:192
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "한 음반"
 msgstr[1] "%1 음반"
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
-msgstr "온라인서비스 설정"
+#: models/musicmodel.cpp:198
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] "한 에피소드"
+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
+msgid "Configure Service"
+msgstr "서비스설정"
 
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
-msgstr "온라인서비스 새로 읽기"
+#: models/onlineservicesmodel.cpp:84
+msgid "Refresh Service"
+msgstr "서비스 새로 읽기"
 
-#: models/onlineservicesmodel.cpp:125
+#: models/onlineservicesmodel.cpp:85
+msgid "Add Subscription"
+msgstr "구독 추가"
+
+#: models/onlineservicesmodel.cpp:86
+msgid "Remove Subscription"
+msgstr "구독 삭제"
+
+#: models/onlineservicesmodel.cpp:87
+msgid "Refresh Subscription"
+msgstr "구독 새로 읽기"
+
+#: models/onlineservicesmodel.cpp:137
 msgid "Last Search:%1"
 msgstr "최근 찾기:%1"
 
-#: models/onlineservicesmodel.cpp:136
+#: models/onlineservicesmodel.cpp:149
 msgid "Searching..."
 msgstr "찾기..."
 
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:670
 msgid "Not Loaded"
 msgstr "읽지 않음"
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:155
 msgid "Use search to locate tracks"
 msgstr "곡의 위치는 찾기를 사용"
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:166
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] "한 팟캐스트"
+msgstr[1] "%1 팟캐스트"
+
+#: models/onlineservicesmodel.cpp:177
+msgid "(Downloading: %1%)"
+msgstr "(내려받는 중: %1%)"
+
+#: models/onlineservicesmodel.cpp:235
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: models/playlistsmodel.cpp:77
 msgid "New Playlist..."
 msgstr "새로운 연주목록..."
 
-#: models/playqueuemodel.cpp:105
+#: models/playqueuemodel.cpp:102
 msgctxt "Track Number (#)"
 msgid "#"
 msgstr "#"
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:103
 msgid "Length"
 msgstr "길이"
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:104
 msgid "Disc"
 msgstr "디스크"
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:138
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
 msgid "Year"
 msgstr "연도"
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:360
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(우선순위: %1)</b>"
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
 msgid "Loading..."
 msgstr "읽는 중..."
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:286
 msgid "Bookmarks"
 msgstr "책갈피"
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:560
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:563
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:564
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:567
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:568
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:569
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:570
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:571
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:572
 msgid "Favorites"
 msgstr "즐겨찾기"
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr "Listen Live"
+
+#: models/streamsmodel.cpp:578
 msgid "Bookmark Category"
-msgstr "책갈피 카테고리"
+msgstr "카테고리를 책갈피에 추가"
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:579
 msgid "Add Stream To Favorites"
 msgstr "스트림을 즐겨찾기에 추가"
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:580
 msgid "Configure Streams"
 msgstr "스트림 설정"
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:660
 msgid "%1 (Read-Only)"
 msgstr "%1 (읽기만)"
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1241
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr "스트림 항목을 저장할 수 없음. %1에 쓸 수 있는지 확인 바랍니다."
 
-#: models/streamsmodel.cpp:1455
+#: models/streamsmodel.cpp:1639
 msgid "All"
 msgstr "전체"
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr "Listen Live"
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:154
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:156
 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:372 mpd/mpdconnection.cpp:415
+#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
+#: mpd/mpdconnection.cpp:1036
 msgid "Connection to %1 failed"
 msgstr "%1에 연결 안 됨"
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
 msgid "Connection to %1 failed - incorrect password"
 msgstr "%1에 연결 안 됨 - 틀린 암호"
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:455
 msgid "Failed to send command to %1 - not connected"
 msgstr "%1에 명령어 전달 안 됨 - 연결 안 됨"
 
-#: mpd/mpdconnection.cpp:472
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "연결 안 됨. \"mpd\" 사용자가 읽기 권한이 있는지 확인해야 합니다."
 
-#: mpd/mpdconnection.cpp:474
+#: mpd/mpdconnection.cpp:493
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr "불러오기 안 됨. MPD는 로컬에 연결된 파일만 불러올 수 있습니다."
 
-#: mpd/mpdconnection.cpp:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
 msgid "Failed to send command. Disconnected from %1"
 msgstr "명령어 전달 안 됨. %1 연결 해제"
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1171
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "<b>%1</b>에서 <b>%2</b>로 이름 바꾸기 안 됨"
 
-#: mpd/mpdconnection.cpp:1158
+#: mpd/mpdconnection.cpp:1183
 msgid "Failed to save <b>%1</b>"
 msgstr "<b>%1</b> 저장 안 됨"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1196
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr "큐시트의 일부를 연주목록에 추가할 수 없습니다!"
 
-#: mpd/mpdconnection.cpp:1174
+#: mpd/mpdconnection.cpp:1199
 msgid "You cannot add a playlist to another playlist!"
 msgstr "연주목록을 다른 연주목록에 추가할 수 없습니다!"
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] "하루 %2"
-msgstr[1] "%1일 %2"
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr "개인"
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:343
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3048,19 +3285,19 @@ msgstr "Ogg"
 msgid "Streaming format:"
 msgstr "스트림 형식:"
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr "스트림"
 
-#: 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"
 
@@ -3068,10 +3305,6 @@ msgstr "WAV"
 msgid "Magnatune Settings"
 msgstr "Magnatune 설정"
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr "회원:"
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -3080,8 +3313,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:51 po/rc.cpp:694 po/rc.cpp:706
-#: rc.cpp:694 rc.cpp:706
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
+#: rc.cpp:711 rc.cpp:729
 msgid "Username:"
 msgstr "사용자:"
 
@@ -3089,7 +3322,7 @@ msgstr "사용자:"
 #. 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)
@@ -3101,7 +3334,7 @@ msgstr "사용자:"
 #. 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)
@@ -3109,53 +3342,268 @@ 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: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: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
 msgid "Password:"
 msgstr "비밀번호:"
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr "회원:"
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr "내려받기:"
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr "내려받는 중"
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr "화면 업데이트"
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr "곡 묶음"
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr "응답 분석"
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr "분석 안 됨"
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr "내려받을 수 없음"
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
-msgstr "라이브러리로 복사"
+msgstr "라이브러리로 내려받기"
+
+#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
+msgid "Search For Podcasts"
+msgstr "팟캐스트 찾기"
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:63
+msgid "Download Podcast Episodes"
+msgstr "팟캐스트 에피소드 내려받기"
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr "내려받은 팟캐스트 에피소드 지우기"
+
+#: online/onlineservicespage.cpp:329
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "찾기 %1:"
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:464
 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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr "<b>%1</b>을 구독 취소할까요?"
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr "모든 팟캐스트를 새로 읽을까요?"
+
+#: online/onlineservicespage.cpp:621
+msgid "Refresh episode listing from <b>%1</b>?"
+msgstr "<b>%1</b>의 팟캐스트 항목을 새로 읽을까요?"
+
+#: online/onlineservicespage.cpp:695
+msgid "All selected podcasts have already been downloaded!"
+msgstr "이미 선택된 모든 팟캐스트를 내려받았습니다!"
+
+#: online/onlineservicespage.cpp:699
+msgid "Do you wish to download the following podcast episode?"
+msgstr "아래 팟캐스트의 한 에피소드를 내려받을까요?"
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr "아래 팟캐스트의 여러 에피소드를 내려받을까요? "
+
+#: online/onlineservicespage.cpp:705
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr "선택된 팟캐스트 에피소드를 내려받을까요?"
+
+#: online/onlineservicespage.cpp:753
+msgid "All selected downloaded podcast episodes have already been deleted!"
+msgstr "이미 선택된 모든 팟캐스트를 지웠습니다!"
+
+#: online/onlineservicespage.cpp:757
+msgid ""
+"Do you wish to delete the downloaded file of the following podcast episode?"
+msgstr "아래 팟캐스트 에피소드에서 내려받은 한 파일을 지울까요?"
+
+#: online/onlineservicespage.cpp:760
+msgid ""
+"Do you wish to the delete downloaded files of the following podcast episodes?"
+msgstr "아래 팟캐스트 에피소드에서 내려받은 여러 파일을 지울까요?"
+
+#: online/onlineservicespage.cpp:763
+msgid ""
+"Do you wish to the delete downloaded files of the selected podcast episodes?"
+msgstr "선택된 팟캐스트 에피소드에서 내려받은 여러 파일을 지울까요?"
+
+#: online/podcastsearchdialog.cpp:243
+msgid "RSS:"
+msgstr "RSS:"
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr "웹사이트:"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Podcast details"
+msgstr "팟캐스트 상세정보"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Select a podcast to display its details"
+msgstr "상세정보를 보여줄 팟캐스트를 선택하셔요"
+
+#: online/podcastsearchdialog.cpp:322
+msgid "Enter search term..."
+msgstr "검색단어입력..."
+
+#: online/podcastsearchdialog.cpp:372
+msgid "Failed to fetch podcasts from %1"
+msgstr "%1의 팟캐스트를 가져올 수 없음"
+
+#: online/podcastsearchdialog.cpp:378
+msgid "There was a problem parsing the response from %1"
+msgstr "%1의 응답을 분석할 수 없습니다"
+
+#: online/podcastsearchdialog.cpp:439
+msgid "Failed to download directory listing"
+msgstr "디렉터리 항목을 내려받을 수 없음"
+
+#: online/podcastsearchdialog.cpp:447
+msgid "Failed to parse directory listing"
+msgstr "디렉터리 항목을 분석할 수 없음"
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr "구독"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search %1"
+msgstr "찾기 %1"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr "팟캐스트에서 %1을 찾기"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr "%1 둘러보기"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr "%1 팟캐스트 둘러보기"
+
+#: online/podcastsearchdialog.cpp:602
+msgid "Subscription added"
+msgstr "구독 추가됨"
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr "이미 이 팟캐스트를 구독하고 있습니다!"
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr "팟캐스트"
+
+#: online/podcastservice.cpp:284
+msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
+msgstr "오디오 팟캐스트만 지원합니다! %1은 비디오를 포함하고 있습니다."
+
+#: online/podcastservice.cpp:286
+msgid "Failed to parse %1"
+msgstr "%1 분석 안 됨"
+
+#: online/podcastservice.cpp:290
+msgid "Failed to download %1"
+msgstr "%1을 내려받을 수 없음"
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr "새로운 에피소드 확인:"
+
+#: online/podcastsettingsdialog.cpp:59
+msgid "Download episodes to:"
+msgstr "에피소드 내려받기:"
+
+#: online/podcastsettingsdialog.cpp:60
+msgid "Automatically download new episodes:"
+msgstr "새로운 에피소드 자동 내려받기:"
+
+#: online/podcastsettingsdialog.cpp:82
+msgid "Podcast Settings"
+msgstr "팟캐스트 설정"
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr "수동"
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr "15분마다"
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr "30분마다"
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr "1시간마다"
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr "2시간마다"
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr "6시간마다"
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr "12시간마다"
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr "매일"
+
+#: online/podcastsettingsdialog.cpp:92
+msgid "Every week"
+msgstr "매주"
+
 #. i18n: file: context/othersettings.ui:19
 #. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
 #: po/rc.cpp:3 rc.cpp:3
@@ -3186,10 +3634,10 @@ msgid ""
 "there may be parsing errors. You will also need to remove any currently "
 "cached articles (using the 'Cache' page).</i>"
 msgstr ""
-"<i><b>참고:</b> 칸타타는 위키피디아의 이미지나 링크가 포함된 전체 페이지가 아니라, "
-"이를 단순화해서 보여줍니다. 이 단순화는 항상 100% 정확하지는 않아서, 기본 본문을 "
-"보여주게 됩니다. 전체 본문에서는 오류가 있을 수 있습니다. 또한 '캐시' 설정을 "
-"이용하여 저장된 기본 본문을 지워야 합니다.</i>"
+"<i><b>참고:</b> 칸타타는 위키피디아의 이미지나 링크가 포함된 전체 페이지가 아"
+"니라, 이를 단순화해서 보여줍니다. 이 단순화는 항상 100% 정확하지는 않아서, 기"
+"본 본문을 보여주게 됩니다. 전체 본문에서는 오류가 있을 수 있습니다. 또한 '캐"
+"시' 설정을 이용하여 저장된 기본 본문을 지워야 합니다.</i>"
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
@@ -3225,8 +3673,8 @@ msgstr "복사해오기:"
 #. 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
-#: rc.cpp:49 rc.cpp:721
+#: 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
 msgid "TextLabel"
 msgstr "문자표"
 
@@ -3272,93 +3720,109 @@ msgstr "복사하기:"
 msgid "Album Details"
 msgstr "음반 상세정보"
 
-#. i18n: file: devices/albumdetails.ui:60
+#. 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:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:73
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
+#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
 msgid "Genre:"
 msgstr "장르:"
 
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:86
 #. 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:86
 #. 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:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
 msgid "Year:"
 msgstr "연도:"
 
-#. 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 "한 연주자:"
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:99
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #: po/rc.cpp:70 rc.cpp:70
 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/audiocdsettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:88 rc.cpp:88
 msgid "Album and Track Information Retrieval"
-msgstr "음반과 곡 정보 검색"
+msgstr "음반과 곡 정보검색"
 
 #. i18n: file: devices/audiocdsettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:91 rc.cpp:91
 msgid "Automatically lookup:"
-msgstr "자동 찾기:"
+msgstr "자동찾기:"
 
 #. i18n: file: devices/audiocdsettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:94 rc.cpp:94
 msgid "Initially look up via:"
 msgstr "처음 찾기:"
 
 #. i18n: file: devices/audiocdsettings.ui:52
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:97 rc.cpp:97
 msgid "CDDB Host:"
 msgstr "CDDB 호스트:"
 
 #. i18n: file: devices/audiocdsettings.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:100 rc.cpp:100
 msgid "CDDB Port:"
 msgstr "CDDB 포트:"
 
 #. i18n: file: devices/audiocdsettings.ui:88
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:103 rc.cpp:103
 msgid "Audio Extraction"
-msgstr "오디오 추출"
+msgstr "오디오추출"
 
 #. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:106 rc.cpp:106
 msgid "Full paranoia mode (best quality):"
-msgstr "전체 Paranoia 모드 (최고 품질):"
+msgstr "Paranoia 완전 기능 (최고품질):"
 
 #. i18n: file: devices/audiocdsettings.ui:107
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:106 rc.cpp:106
+#: po/rc.cpp:109 rc.cpp:109
 msgid "Never skip on read error:"
-msgstr "읽기 오류 건너뛰지 않음:"
+msgstr "읽기오류 건너뛰지 않음:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:109 rc.cpp:109
+#: po/rc.cpp:112 rc.cpp:112
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3368,62 +3832,62 @@ 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: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
 msgid "Music folder:"
 msgstr "음악 폴더:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:118 rc.cpp:118
 msgid "Copy album covers as:"
 msgstr "음반표지 저장하기:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:121 rc.cpp:121
 msgid "Maximum cover size:"
 msgstr "최대 표지 크기:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:82
 #. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: 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:124 rc.cpp:124
+#: 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:127 rc.cpp:127
+#: po/rc.cpp:130 rc.cpp:130
 msgid "Use cache:"
 msgstr "캐시 사용:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:121
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:133 rc.cpp:133
 msgid "Default volume:"
 msgstr "기본 음량:"
 
@@ -3435,7 +3899,7 @@ msgstr "기본 음량:"
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
 #. 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:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
 msgid "Filenames"
 msgstr "파일이름"
 
@@ -3447,7 +3911,7 @@ msgstr "파일이름"
 #. 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
+#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
 msgid "Use only ASCII characters:"
 msgstr "ASCII 문자만 표시:"
 
@@ -3459,7 +3923,7 @@ msgstr "ASCII 문자만 표시:"
 #. 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
+#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
 msgid "Replace spaces with underscores:"
 msgstr "빈칸을 밑줄로 바꿈:"
 
@@ -3471,7 +3935,7 @@ msgstr "빈칸을 밑줄로 바꿈:"
 #. 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
+#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
 msgid "Ignore 'The' in artist names:"
 msgstr "연주자 이름에 'The' 무시:"
 
@@ -3483,7 +3947,7 @@ msgstr "연주자 이름에 'The' 무시:"
 #. 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:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
 msgid "Filename scheme:"
 msgstr "파일이름 구성:"
 
@@ -3495,79 +3959,79 @@ msgstr "파일이름 구성:"
 #. 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
+#: 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: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:154 rc.cpp:154
 msgid "Transcoding"
 msgstr "변환"
 
 #. i18n: file: devices/devicepropertieswidget.ui:261
 #. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:157 rc.cpp:157
 msgid "Only transcode if source file is of a different format:"
 msgstr "원본 파일이 다른 포맷일 때만 변환:"
 
 #. i18n: file: devices/filenameschemedialog.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:160 rc.cpp:160
 msgid "Example:"
 msgstr "예:"
 
 #. i18n: file: devices/filenameschemedialog.ui:58
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:163 rc.cpp:163
 msgid "About filename schemes"
 msgstr "파일이름 구성에 대하여"
 
-#. i18n: file: devices/filenameschemedialog.ui:82
+#. i18n: file: devices/filenameschemedialog.ui:70
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:166 rc.cpp:166
 msgid "Album Artist"
 msgstr "음반연주자"
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:77
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:169 rc.cpp:169
 msgid "Album Title"
 msgstr "음반제목"
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:91
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:175 rc.cpp:175
 msgid "Track Artist"
 msgstr "곡 연주자"
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:98
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:178 rc.cpp:178
 msgid "Track Title"
 msgstr "곡 제목"
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:117
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:181 rc.cpp:181
 msgid "Track Title (+Artist)"
 msgstr "곡 제목 (+연주자)"
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:124
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:184 rc.cpp:184
 msgid "Track #"
 msgstr "곡 #"
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:131
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:187 rc.cpp:187
 msgid "CD #"
 msgstr "CD #"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:196 rc.cpp:196
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3577,17 +4041,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:162
 #. 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:162
 #. 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:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
 msgid "Type:"
 msgstr "형태:"
 
@@ -3599,14 +4063,14 @@ 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:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
+#: rc.cpp:638
 msgid "Name:"
 msgstr "이름:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#: po/rc.cpp:205 rc.cpp:205
 msgid "Options"
 msgstr "옵션"
 
@@ -3614,7 +4078,7 @@ msgstr "옵션"
 #. 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)
@@ -3624,14 +4088,14 @@ msgstr "옵션"
 #. 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: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
 msgid "Port:"
 msgstr "포트:"
 
@@ -3647,7 +4111,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:208 po/rc.cpp:226 po/rc.cpp:247 rc.cpp:208 rc.cpp:226 rc.cpp:247
+#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
 msgid "User:"
 msgstr "사용자:"
 
@@ -3659,7 +4123,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:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
 msgid "Domain:"
 msgstr "도메인:"
 
@@ -3671,7 +4135,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:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
 msgid "Share:"
 msgstr "공유:"
 
@@ -3683,7 +4147,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:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
 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 "
@@ -3695,7 +4159,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:223 rc.cpp:223
+#: po/rc.cpp:229 rc.cpp:229
 msgid "Service name:"
 msgstr "서비스 이름:"
 
@@ -3707,19 +4171,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:250 po/rc.cpp:259 rc.cpp:250 rc.cpp:259
+#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
 msgid "Folder:"
 msgstr "폴더:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:259 rc.cpp:259
 msgid "Extra Options:"
 msgstr "기타 옵션:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:262 rc.cpp:262
 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 "
@@ -3730,7 +4194,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:268 rc.cpp:268
 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, "
@@ -3741,112 +4205,112 @@ msgstr ""
 "운트된 폴더에 연결할 때만 사용됩니다. 일반적인 미디어 연주기나 USB 장치는 연"
 "결되면 자동으로 표시됩니다.</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:271 rc.cpp:271
 msgid "No dynamizer port defined in server settings."
 msgstr "서버 설정에 활동 포트가 없습니다."
 
-#. 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:274 rc.cpp:274
 msgid "Remote dynamizer is not running."
 msgstr "원격 활성화가 실행 중이 아님."
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:277 rc.cpp:277
 msgid "Name of Dynamic Rules"
 msgstr "새로운 동적 규정"
 
 #. 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:283 streams/streamspage.cpp:62 rc.cpp:283
 msgid "Edit"
 msgstr "수정"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:289 rc.cpp:289
 msgid "About Rules"
 msgstr "규정에 대하여"
 
 #. i18n: file: dynamic/dynamicrule.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:295 rc.cpp:295
 msgid "Album Artist:"
 msgstr "음반연주자:"
 
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
+#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
 msgid "Album:"
 msgstr "음반:"
 
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:103
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:310 rc.cpp:310
 msgid "From Year:"
 msgstr "시작 연도:"
 
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
 msgid "Any"
 msgstr "모두"
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:126
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:316 rc.cpp:316
 msgid "To Year:"
 msgstr "마지막 연도:"
 
-#. i18n: file: dynamic/dynamicrule.ui:136
+#. i18n: file: dynamic/dynamicrule.ui:149
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
+#: po/rc.cpp:322 rc.cpp:322
 msgid "Exact match:"
 msgstr "정확한 맞춤:"
 
-#. i18n: file: dynamic/dynamicrule.ui:160
+#. i18n: file: dynamic/dynamicrule.ui:173
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
+#: po/rc.cpp:328 rc.cpp:328
 msgid "Include songs that match the following:"
 msgstr "아래와 맞는 음악 포함:"
 
-#. i18n: file: dynamic/dynamicrule.ui:165
+#. i18n: file: dynamic/dynamicrule.ui:178
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
+#: po/rc.cpp:331 rc.cpp:331
 msgid "Exclude songs that match the following:"
 msgstr "아래와 맞는 음악 제외:"
 
-#. i18n: file: dynamic/dynamicrule.ui:173
+#. i18n: file: dynamic/dynamicrule.ui:186
 #. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
+#: po/rc.cpp:334 rc.cpp:334
 msgid "Artists similar to:"
 msgstr "비슷한 연주자:"
 
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:236
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:337 rc.cpp:337
 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:249
+#. i18n: file: dynamic/dynamicrule.ui:262
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:340 rc.cpp:340
 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>"
@@ -3856,108 +4320,114 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
+#: 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: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
+#: 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:717
+#. 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:717
+#. i18n: file: gui/initialsettingswizard.ui:716
 #. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
+#: 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:730
+#. 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:730
+#. i18n: file: gui/initialsettingswizard.ui:729
 #. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
+#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
 msgid "Save downloaded lyrics in music folder:"
-msgstr "음악 폴더에 내려받은 가사 저장:"
+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:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
+#. i18n: file: gui/filesettings.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
+#: 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: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:110
 #. 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:364 rc.cpp:364
 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>참고:</b> 칸타타에서 쓰기 권한이 없는 음악 폴더에 음반 표지를 저장하"
-"면, 개인 캐시 폴더에 대신 저장하게 됩니다. 하지만 스트림은 쓰기 권한이 없다"
-"면, 음악 폴더에 저장된 스트림을 보고 연주할 수만 있으며 추가하거나 수정할 수"
-"는 없습니다. 스트림을 음악 폴더에 저장하지 않으면, 로컬 설정 폴더에 저장되며 "
-"해당 사용자만 접근할 수 있습니다.</i>"
+"<i><b>참고:</b> 칸타타에서 쓰기 권한이 없는 음악 폴더에 음반 표지, 가사 또는 "
+"배경을 저장하면, 개인 캐시 폴더에 대신 저장하게 됩니다. 하지만 스트림은 쓰기 "
+"권한이 없다면, 음악 폴더에 저장된 스트림을 보고 연주할 수만 있으며 추가하거나"
+" 수정할 수는 없습니다. 스트림을 음악 폴더에 저장하지 않으면, 로컬 설정 폴더에"
+" 저장되며 해당 사용자만 접근할 수 있습니다.</i>"
 
-#. i18n: file: gui/filesettings.ui:128
+#. i18n: file: gui/filesettings.ui:145
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:367 rc.cpp:367
 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>"
+"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>참고:</b> 스트림을 저장할 위치를 바꾸면 (즉, '음악 폴더에 즐겨찾기 스트림 "
-"항목 저장' 설정), 해당 폴더에 저장된 스트림만 보여줍니다. 따라서 이 설정을 바꾸기 "
-"전에, 현재 스트림을 내보내기를 권장합니다. 설정을 바꾼 다음 스트림을 새로운 위치로 "
-"가져올 수 있습니다.</i>"
+"<i><b>참고:</b> 스트림을 저장할 위치를 바꾸면 (즉, '음악 폴더에 즐겨찾기 스트"
+"림 항목 저장' 설정), 해당 폴더에 저장된 스트림만 보여줍니다. 따라서 이 설정"
+"을 바꾸기 전에, 현재 스트림을 내보내기를 권장합니다. 설정을 바꾼 다음 스트림"
+"을 새로운 위치로 가져올 수 있습니다.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:370 rc.cpp:370
 msgid "Cantata First Run"
 msgstr "처음으로 칸타타 실행"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:361 rc.cpp:361
+#: po/rc.cpp:373 rc.cpp:373
 msgid "Welcome to Cantata"
 msgstr "칸타타로 맞이합니다"
 
 #. i18n: file: gui/initialsettingswizard.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label_2)
-#: po/rc.cpp:364 rc.cpp:364
+#: po/rc.cpp:376 rc.cpp:376
 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 "
@@ -3967,22 +4437,23 @@ msgid ""
 "p><p>This 'wizard' will guide you through the basic settings required for "
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
-"<html><head/><body><p>칸타타는 기능이 다양하고 사용하기가 편리한 Music Player "
-"Daemon (MPD) 클라이언트 입니다. MPD는 음악 연주에 사용되는 백그라운드 어플입니다."
-"</p><p>MPD에 대한 더 많은 정보는, 다음 웹사이트를 참조 바랍니다. "
-"<a href=\"http://www.musicpd.org\"><span style=\" text-decoration: underline; "
-"color:#0000ff;\">http://www.musicpd.org</span></a></p><p>이 '마법사'는 칸타타가 "
-"제대로 동작하기 위한 사용자의 기본 설정을 돕습니다.</p></body></html>"
+"<html><head/><body><p>칸타타는 기능이 다양하고 사용하기가 편리한 Music "
+"Player Daemon (MPD) 클라이언트 입니다. MPD는 음악 연주에 사용되는 백그라운드 "
+"어플입니다.</p><p>MPD에 대한 더 많은 정보는, 다음 웹사이트를 참조 바랍니다. "
+"<a href=\"http://www.musicpd.org\"><span style=\" text-decoration: "
+"underline; color:#0000ff;\">http://www.musicpd.org</span></a></p><p>이 '마법"
+"사'는 칸타타가 제대로 동작하기 위한 사용자의 기본 설정을 돕습니다.</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:379 rc.cpp:379
 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:370 rc.cpp:370
+#: po/rc.cpp:382 rc.cpp:382
 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 "
@@ -3990,36 +4461,20 @@ msgid ""
 "basis. Please select how you would like to have Cantata initially connect to "
 "(or startup) MPD:</p></body></html>"
 msgstr ""
-"<html><head/><body><p>칸타타는 기능이 다양하고 사용하기가 편리한 Music Player "
-"Daemon (MPD) 클라이언트 입니다. MPD는 음악 연주에 사용되는 백그라운드 어플입니다. "
-"MPD는 시스템이나 사용자 기반에서 시작할 수 있습니다. 칸타타가 처음에 어떻게 MPD에 "
-"연결되고 시작할 지를 선택합니다:</p></body></html>"
+"<html><head/><body><p>칸타타는 기능이 다양하고 사용하기가 편리한 Music "
+"Player Daemon (MPD) 클라이언트 입니다. MPD는 음악 연주에 사용되는 백그라운드 "
+"어플입니다. MPD는 시스템이나 사용자 기반에서 시작할 수 있습니다. 칸타타가 처"
+"음에 어떻게 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 "기본 단일 사용자 설정"
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:385 rc.cpp:385
 msgid "Standard multi-user/server setup"
 msgstr "표준 다수 사용자/서버 설정"
 
-#. 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>음원을 다른 사용자와 공유하지 않고 칸타타가 MPD를 설정하고 관리하려면, "
-"이 옵션을 선택합니다.</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:388 rc.cpp:388
 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 "
@@ -4027,13 +4482,29 @@ msgid ""
 "starting and stopping of the MPD server. You will therfore need to ensure "
 "that MPD is already configured and running.</i>"
 msgstr ""
-"<i>음원을 다른 사용자와 공유하고 MPD가 다른 컴퓨터에서 실행되거나 이미 개인 설정이 "
-"되어 있다면, 이 옵션을 선택합니다. 따라서 MPD가 이미 설정이 되고 가동 중인 것을 "
-"확인해야 합니다.</i>"
+"<i>음원을 다른 사용자와 공유하고 MPD가 다른 컴퓨터에서 실행되거나 이미 개인 "
+"설정이 되어 있다면, 이 옵션을 선택합니다. 따라서 MPD가 이미 설정이 되고 가동 "
+"중인 것을 확인해야 합니다.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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>"
+
+#. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:386 rc.cpp:386
+#: po/rc.cpp:397 rc.cpp:397
 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-"
@@ -4041,21 +4512,21 @@ msgid ""
 "p><p>This 'wizard' will guide you through the basic settings required for "
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
-"<html><head/><body><p>MPD에 대한 더 많은 정보는, 다음 사이트를 참조 바랍니다. "
-"<a href=\"http://www.musicpd.org\"><span style=\" text-"
-"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
-"p><p>이 '마법사'는 칸타타가 제대로 동작하기 위한 사용자의 기본 설정을 돕습니다."
-"</p></body></html>"
+"<html><head/><body><p>MPD에 대한 더 많은 정보는, 다음 사이트를 참조 바랍니"
+"다. <a href=\"http://www.musicpd.org\"><span style=\" text-decoration: "
+"underline; color:#0000ff;\">http://www.musicpd.org</span></a></p><p>이 '마법"
+"사'는 칸타타가 제대로 동작하기 위한 사용자의 기본 설정을 돕습니다.</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:400 rc.cpp:400
 msgid "Connection details"
 msgstr "연결 상세정보"
 
-#. 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:403 rc.cpp:403
 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."
@@ -4063,21 +4534,21 @@ msgstr ""
 "아래 설정은 칸타타에서 기본적으로 필요한 정보입니다. 관련 상세정보를 입력해 "
 "주시고, 연결해 보려면 '연결' 단추를 누릅니다."
 
-#. 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:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
 msgid "Host (or local socket):"
-msgstr "호스트 (또는 로컬 소켓):"
+msgstr "호스트 (또는 로컬소켓):"
 
-#. 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:421 rc.cpp:421
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
@@ -4085,43 +4556,43 @@ msgstr ""
 "<i><b>참고:</b> '음악 폴더' 설정은 음반표지나 가사 등을 찾기 위해 사용됩니다."
 "</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:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
 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><b>참고:</b> 로컬소켓을 사용할 때는 절대경로로 설정되어야 합니다 (포트번"
 "호는 필요 없음).</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:427 rc.cpp:427
 msgid "Music folder"
 msgstr "음악 폴더"
 
-#. 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:430 rc.cpp:430
 msgid "Please choose the folder containing your music collection."
 msgstr "음악 폴더를 선택합니다."
 
-#. 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:436 rc.cpp:436
 msgid "Covers, Lyrics, and Streams"
 msgstr "음반표지, 가사와 스트림"
 
-#. 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:439 rc.cpp:439
 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 "
@@ -4133,9 +4604,28 @@ msgstr ""
 "라디오등 스트림 항목을 저장할 수도 있습니다.</p><p>이를 위해서, 관련 파일을 "
 "음악 폴더나 개인 캐시/설정 폴더에 저장할지를 확인해 주시기 바랍니다.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:808
+#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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>참고:</b> 칸타타에서 쓰기 권한이 없는 음악 폴더에 음반 표지를 저장하"
+"면, 개인 캐시 폴더에 대신 저장하게 됩니다. 하지만 스트림은 쓰기 권한이 없다"
+"면, 음악 폴더에 저장된 스트림을 보고 연주할 수만 있으며 추가하거나 수정할 수"
+"는 없습니다. 스트림을 음악 폴더에 저장하지 않으면, 로컬 설정 폴더에 저장되며 "
+"해당 사용자만 접근할 수 있습니다.</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:824
 #. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:443 rc.cpp:443
+#: po/rc.cpp:457 rc.cpp:457
 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 "
@@ -4144,26 +4634,26 @@ msgstr ""
 "<i><b>참고:</b> '음악 폴더'가 HTTP 주소로 지정되어, 외부 HTTP 서버에 파일을 "
 "올릴 수 없습니다. 따라서 위의 설정은 사용하지 않도록 해야 합니다.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:841
+#. i18n: file: gui/initialsettingswizard.ui:857
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:460 rc.cpp:460
 msgid "Finished!"
 msgstr "완료!"
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:880
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:463 rc.cpp:463
 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 ""
-"이제 칸타타가 설정되었습니다! MPD 서버를 추가하는 등의 설정을 더 하려면, 칸타타 메인"
-"화면의 오른쪽 위에 있는 단추를 선택하면 설정 대화상자가 나옵니다."
+"이제 칸타타가 설정되었습니다! MPD 서버를 추가하는 등의 설정을 더 하려면, 칸타"
+"타 메인화면의 오른쪽 위에 있는 단추를 선택하면 설정 대화상자가 나옵니다."
 
-#. i18n: file: gui/initialsettingswizard.ui:902
+#. i18n: file: gui/initialsettingswizard.ui:918
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:466 rc.cpp:466
 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 "
@@ -4175,27 +4665,6 @@ 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 "방식:"
-
 #. i18n: file: gui/interfacesettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
@@ -4204,25 +4673,25 @@ msgstr "방식:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
 #. 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:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
 msgid "Covers:"
 msgstr "표지:"
 
 #. i18n: file: gui/interfacesettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
+#: po/rc.cpp:478 rc.cpp:478
 msgid "Show artist images:"
 msgstr "연주자이미지 보기:"
 
 #. i18n: file: gui/interfacesettings.ui:81
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:467 rc.cpp:467
+#: po/rc.cpp:481 rc.cpp:481
 msgid "Show album year:"
 msgstr "앨범연도 보기:"
 
 #. i18n: file: gui/interfacesettings.ui:123
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:484 rc.cpp:484
 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"
@@ -4238,25 +4707,25 @@ msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:172
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:497 rc.cpp:497
 msgid "Sort albums:"
 msgstr "음반 정렬:"
 
 #. i18n: file: gui/interfacesettings.ui:183
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Album/Artist"
 msgstr "음반/연주자"
 
 #. i18n: file: gui/interfacesettings.ui:188
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:503 rc.cpp:503
 msgid "Artist/Album"
 msgstr "연주자/음반"
 
 #. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:506 rc.cpp:506
 msgid "Artist/Year/Album"
 msgstr "연주자/연도/음반"
 
@@ -4268,258 +4737,249 @@ msgstr "연주자/연도/음반"
 #. 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
+#: po/rc.cpp:515 po/rc.cpp:545 rc.cpp:515 rc.cpp:545
 msgid "Initially collapse albums:"
-msgstr "처음에 음반 펼치지 않음:"
+msgstr "처음에 음반 펼치지 않기:"
 
 #. i18n: file: gui/interfacesettings.ui:242
 #. i18n: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:518 rc.cpp:518
 msgid "Other Views"
 msgstr "다른 보기"
 
 #. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
 msgid "Folder view style:"
 msgstr "폴더 보기:"
 
 #. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
 msgid "Streams view style:"
 msgstr "스트림 보기:"
 
 #. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Online view style:"
 msgstr "온라인 보기:"
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:530 rc.cpp:530
 msgid "Devices view style:"
 msgstr "장치 보기:"
 
 #. i18n: file: gui/interfacesettings.ui:324
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:525 rc.cpp:525
+#: 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:534 rc.cpp:534
+#: po/rc.cpp:548 rc.cpp:548
 msgid "Automatically expand current album:"
-msgstr "지금 음반 자동으로 펼침:"
+msgstr "지금 음반을 자동으로 펼치기:"
 
 #. i18n: file: gui/interfacesettings.ui:371
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueScrollLabel)
-#: po/rc.cpp:537 rc.cpp:537
+#: 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:540 rc.cpp:540
+#: po/rc.cpp:554 rc.cpp:554
 msgid "Use current album cover as background:"
 msgstr "지금 음반 표지를 배경으로 사용:"
 
-#. i18n: file: gui/interfacesettings.ui:398
+#. 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: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:560 rc.cpp:560
 msgid "External"
 msgstr "외부"
 
-#. i18n: file: gui/interfacesettings.ui:404
+#. i18n: file: gui/interfacesettings.ui:417
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
+#: po/rc.cpp:563 rc.cpp:563
 msgid "Show icon in notification area:"
 msgstr "알림 영역에 아이콘 보이기:"
 
-#. i18n: file: gui/interfacesettings.ui:424
+#. i18n: file: gui/interfacesettings.ui:437
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
+#: po/rc.cpp:566 rc.cpp:566
 msgid "Minimize to notification area when closed:"
 msgstr "닫으면 알림 영역으로 최소화:"
 
-#. i18n: file: gui/interfacesettings.ui:444
+#. i18n: file: gui/interfacesettings.ui:457
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
+#: po/rc.cpp:569 rc.cpp:569
 msgid "Show popup messages when changing tracks:"
 msgstr "곡이 바뀌면 팝업 표시:"
 
-#. 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 "그놈/유니티에서 미디어 키 지원:"
-
 #. i18n: file: gui/interfacesettings.ui:475
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
+#: po/rc.cpp:572 rc.cpp:572
 msgid "General"
 msgstr "일반"
 
 #. i18n: file: gui/interfacesettings.ui:486
 #. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
+#: po/rc.cpp:575 rc.cpp:575
 msgid "Group single track albums:"
-msgstr "한 곡 음반들을 묶음:"
+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:564 rc.cpp:564
+#: po/rc.cpp:581 rc.cpp:581
 msgid "Multiple artist albums:"
 msgstr "여러 연주자 음반:"
 
-#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: file: gui/interfacesettings.ui:533
 #. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
+#: po/rc.cpp:584 rc.cpp:584
 msgid "Show delete action in context menus:"
-msgstr "메뉴에 지우기 보임:"
+msgstr "메뉴에 지우기 보이기:"
 
-#. i18n: file: gui/interfacesettings.ui:533
+#. i18n: file: gui/interfacesettings.ui:550
 #. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
+#: po/rc.cpp:587 rc.cpp:587
 msgid "Enforce single-click activation of items:"
 msgstr "한 번 클릭 사용:"
 
-#. i18n: file: gui/interfacesettings.ui:574
+#. i18n: file: gui/interfacesettings.ui:591
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
+#: po/rc.cpp:590 rc.cpp:590
 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>"
+msgstr ""
+"<i><b>참고:</b> '한 번 클릭 사용' 설정을 바꾸면 다시 시작해야 합니다.</i>"
 
-#. i18n: file: gui/mainwindow.ui:244
+#. i18n: file: gui/mainwindow.ui:287
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
+#: po/rc.cpp:593 rc.cpp:593
 msgid "[Dynamic]"
 msgstr "[동적]"
 
 #. i18n: file: gui/playbacksettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
+#: po/rc.cpp:596 rc.cpp:596
 msgid "Output"
 msgstr "출력"
 
 #. i18n: file: gui/playbacksettings.ui:41
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:585 rc.cpp:585
+#: 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:588 rc.cpp:588
+#: po/rc.cpp:605 rc.cpp:605
 msgid " seconds"
 msgstr " 초"
 
 #. i18n: file: gui/playbacksettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:591 rc.cpp:591
+#: po/rc.cpp:608 rc.cpp:608
 msgid "Replay gain:"
 msgstr "리플레이게인:"
 
 #. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:594 rc.cpp:594
+#: po/rc.cpp:611 rc.cpp:611
 msgid "About replay gain"
 msgstr "리플레이게인에 대하여"
 
 #. i18n: file: gui/playbacksettings.ui:104
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:597 rc.cpp:597
+#: po/rc.cpp:614 rc.cpp:614
 msgid "Devices:"
 msgstr "장치:"
 
-#. 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 스트림"
-
 #. 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/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
-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>"
-msgstr ""
-"<i><b>참고:</b> 이것은 MPD가 HTTP 스트림으로 출력하도록 설정되어있고, 칸타타로 "
-"그 스트림을 연주할 때에만 의미가 있습니다.</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 "연주 정지"
-
-#. i18n: file: gui/playbacksettings.ui:176
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:620 rc.cpp:620
 msgid "Fadeout on stop:"
 msgstr "정지할 때 페이드아웃:"
 
-#. i18n: file: gui/playbacksettings.ui:189
+#. i18n: file: gui/playbacksettings.ui:154
 #. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
+#: po/rc.cpp:623 rc.cpp:623
 msgid "Stop playback on exit:"
 msgstr "빠져나가면 연주 정지:"
 
-#. i18n: file: gui/playbacksettings.ui:202
+#. i18n: file: gui/playbacksettings.ui:167
 #. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
+#: po/rc.cpp:626 rc.cpp:626
 msgid "Stop dynamizer on exit:"
 msgstr "빠져나가면 활동 정지:"
 
-#. i18n: file: gui/playbacksettings.ui:219
+#. 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:621 rc.cpp:621
+#: 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>"
+"<i><b>참고:</b> 정지 단추를 누르고 있으면, 바로 정지할지 지금 곡 다음에 정지"
+"할지를 선택하는 메뉴가 보입니다.</i>"
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:635 rc.cpp:635
 msgid "Collection:"
 msgstr "음원:"
 
 #. 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:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
 msgid "Cover filename:"
 msgstr "표지 파일이름:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:645 rc.cpp:645
+#: po/rc.cpp:656 rc.cpp:656
 msgid "Dynamizer port:"
 msgstr "활동 포트:"
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:659 rc.cpp:659
+msgid "HTTP stream URL:"
+msgstr "HTTP 스트림 URL:"
+
+#. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:648 rc.cpp:648
+#: po/rc.cpp:662 rc.cpp:662
 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 "
@@ -4531,42 +4991,54 @@ msgstr ""
 "정된 값 또는 설정되지 않았다면 <code>cover.jpg/cover.png</code>). 이 폴더에 "
 "쓰기 권한이 있다면 내려받은 표지를 각각의 음반 폴더에 저장합니다.</i>"
 
-#. i18n: file: gui/serversettings.ui:314
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+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 스트림 URL'은 MPD가 HTTP 스트림으로 출력하도록 설정되어"
+"있고, 칸타타로 그 스트림을 연주할 때에만 의미가 있습니다.</i>"
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:677 rc.cpp:677
 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>참고:</b> '음악폴더' 설정을 바꾸면, 음악데이터베이스를 직접 업데이트해야 "
-"합니다. 이는 '연주자'나 '음반' 보기의 '데이터베이스 다시 읽기' 단추를 누르면 됩니다.</i>"
+"<i><b>참고:</b> '음악폴더' 설정을 바꾸면, 음악데이터베이스를 직접 업데이트해"
+"야 합니다. 이는 '연주자'나 '음반' 보기의 '데이터베이스 새로 읽기' 단추를 누르"
+"면 됩니다.</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:680 rc.cpp:680
 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:666 rc.cpp:666
+#: po/rc.cpp:683 rc.cpp:683
 msgid "Network interface:"
-msgstr "네트워크 인터페이스:"
+msgstr "네트워크 연결:"
 
 #. i18n: file: http/httpserversettings.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
+#: po/rc.cpp:686 rc.cpp:686
 msgid "Current URL:"
 msgstr "현재 URL:"
 
 #. i18n: file: http/httpserversettings.ui:73
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:689 rc.cpp:689
 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 "
@@ -4575,243 +5047,318 @@ msgid ""
 "<b>NOTE:</b> If you choose 'Local loopback' for 'Network interface', then "
 "MPD <b>must</b> also be on this computer.</i>"
 msgstr ""
-"<i><b>참고:</b> MPD는 주로 음악 폴더에 저장된 음악만 연주합니다. "
-"칸타타는 파일을 MPD로 서비스하는 최소한의 HTTP서버 역할을 합니다. "
-"다만, 칸타타가 실행되는 한에서만 작동합니다.<br/><br/>\n"
-"<b>참고:</b> 만약 '네트워크 연결'에 '로컬 루프백'을 선택한다면, MPD가 이 컴퓨터에 "
-"<b>반드시</b> 있어야 합니다.</i>"
+"<i><b>참고:</b> MPD는 주로 음악 폴더에 저장된 음악만 연주합니다. 칸타타는 파"
+"일을 MPD로 서비스하는 최소한의 HTTP 서버 역할을 합니다. 다만, 칸타타가 실행되"
+"는 한에서만 작동합니다.<br/><br/>\n"
+"<b>참고:</b> 만약 '네트워크 연결'에 '로컬 루프백'을 선택한다면, MPD가 이 컴퓨"
+"터에 <b>반드시</b> 있어야 합니다.</i>"
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:693 rc.cpp:693
 msgid "Mode:"
 msgstr "모드:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:699 rc.cpp:699
 msgid "HTTP Proxy"
 msgstr "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:702 rc.cpp:702
 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 "아래는 온라인제공자로, 해당 카테고리를 숨기려면 아래 항목에서 선택"
+"하지 않습니다."
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:723 rc.cpp:723
 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 ""
-"계정이 없이 무료로 사용할 수 있으나, 프리미엄 회원은 광고 없이 고품질 스트림을 들을 수 "
-"있습니다. 프리미엄 계정으로 업그레이드하려면 <a href=\"http://www.di.fm/premium/\">"
-"http://www.di.fm/premium/</a> 을 방문하셔요."
+"계정이 없이 무료로 사용할 수 있으나, 프리미엄 회원은 광고 없이 고품질 스트림"
+"을 들을 수 있습니다. 프리미엄 계정으로 업그레이드하려면 <a href=\"http://www."
+"di.fm/premium/\">http://www.di.fm/premium/</a> 을 방문하셔요."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:726 rc.cpp:726
 msgid "Premium Account"
 msgstr "프리미엄 계정"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:735 rc.cpp:735
 msgid "Stream type:"
 msgstr "스트림 형식:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:738 rc.cpp:738
 msgid "Status:"
 msgstr "상태:"
 
 #. 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:741 streams/digitallyimportedsettings.cpp:130
+#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
 msgid "Login"
 msgstr "로그인"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:747 rc.cpp:747
 msgid "Session expiry:"
 msgstr "세션 만료:"
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:750 rc.cpp:750
+msgid ""
+"<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
+"RockRadio.com, and Sky.fm</i>"
+msgstr ""
+"<i><b>참고:</b> 이 설정은 Digitally Imported, JazzRadio.com, RockRadio.com, "
+"Sky.fm에만 적용됩니다.</i>"
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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>"
+
+#. 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 ""
+"아래는 상위 스트림 카테고리로, 해당 카테고리를 숨기려면 아래 항목에서 "
+"선택하지 않습니다."
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+msgid "Configure Provider"
+msgstr "제공자 설정"
+
+#. i18n: file: streams/streamssettings.ui:60
+#. i18n: ectx: property (text), widget (QPushButton, installButton)
+#: po/rc.cpp:762 rc.cpp:762
+msgid "Install"
+msgstr "설치"
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:768 rc.cpp:768
+msgid ""
+"<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
+"removed.</i>"
+msgstr ""
+"<i><b>참고:</b> 기본 설치된 카테고리는 기울어져 보이는데, 이는 삭제할 수 없습"
+"니다.</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:771 rc.cpp:771
 msgid "Search:"
 msgstr "찾기:"
 
-#. 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:774 rc.cpp:774
 msgid "Shortcut for Selected Action"
 msgstr "선택된 기능 단축키"
 
-#. 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:777 rc.cpp:777
 msgid "Default:"
 msgstr "기본:"
 
-#. 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:783 rc.cpp:783
 msgid "Custom:"
 msgstr "개인:"
 
-#. i18n: file: tags/tageditor.ui:22
+#. i18n: file: tags/tageditor.ui:25
 #. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
+#: po/rc.cpp:786 rc.cpp:786
 msgid "Track:"
 msgstr "곡:"
 
-#. 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:795 rc.cpp:795
 msgid "Album artist:"
 msgstr "음반연주자:"
 
-#. 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:804 rc.cpp:804
 msgid "Track number:"
 msgstr "곡 번호:"
 
-#. 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:807 rc.cpp:807
 msgid "Disc number:"
 msgstr "디스크 번호:"
 
 #. i18n: file: tags/trackorganiser.ui:155
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:834 rc.cpp:834
 msgid "Original Name"
 msgstr "원래 이름"
 
 #. i18n: file: tags/trackorganiser.ui:160
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:837 rc.cpp:837
 msgid "New Name"
 msgstr "새 이름"
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:838 rc.cpp:838
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "이름"
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:839 rc.cpp:839
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "이메일"
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:121
 msgid "Show All Tracks"
 msgstr "전곡 보기"
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:122
 msgid "Show Untagged Tracks"
 msgstr "태그가 없는 곡 보기"
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
 msgid "Remove From List"
 msgstr "항목에서 지웁니다"
 
-#: replaygain/rgdialog.cpp:140
+#: replaygain/rgdialog.cpp:136
 msgid "Album Gain"
 msgstr "음반 게인"
 
-#: replaygain/rgdialog.cpp:141
+#: replaygain/rgdialog.cpp:137
 msgid "Track Gain"
 msgstr "곡 게인"
 
-#: replaygain/rgdialog.cpp:142
+#: replaygain/rgdialog.cpp:138
 msgid "Album Peak"
 msgstr "음반 피크"
 
-#: replaygain/rgdialog.cpp:143
+#: replaygain/rgdialog.cpp:139
 msgid "Track Peak"
 msgstr "곡 피크"
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
 msgid "Scan"
 msgstr "검색"
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:238
 msgid "Update ReplayGain tags in tracks?"
 msgstr "곡의 리플레이게인 태그를 업데이트할까요?"
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
 msgid "Update Tags"
 msgstr "태그 업데이트"
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:252
 msgid "Abort scanning of tracks?"
 msgstr "곡 검색을 취소할까요?"
 
-#: replaygain/rgdialog.cpp:257
-#, fuz
+#: replaygain/rgdialog.cpp:261
 msgid "Abort reading of existing tags?"
 msgstr "기존 태그 읽기를 취소할까요?"
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:287
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
-"<b>전</b>곡을 검색할까요?<br><br><i>참고: 전곡은 기존 리플레이게인을 가지고 있습니다.</i>"
+"<b>전</b>곡을 검색할까요?<br><br><i>참고: 전곡은 기존 리플레이게인을 가지고 "
+"있습니다.</i>"
 
-#: replaygain/rgdialog.cpp:285
+#: replaygain/rgdialog.cpp:289
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "전곡이나 기존 태그가 없는 곡만 검색할까요?"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "Untagged Tracks"
 msgstr "태그가 없는 곡"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "All Tracks"
 msgstr "전곡"
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:300
 msgid "Scanning tracks..."
 msgstr "곡 검색 중..."
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:367
 msgid "Reading existing tags..."
 msgstr "기존 태그 읽는 중..."
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr "%1 (종료)"
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr "%1 (태그 오류?)"
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
 msgid "Failed to update the tags of the following tracks:"
 msgstr "다음 곡들의 태그를 업데이트할 수 없음:"
 
-#: replaygain/rgdialog.cpp:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
+#: tags/trackorganiser.cpp:451
 msgid "Device is not connected."
 msgstr "장치가 연결되지 않았음."
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: 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
 msgid "Failed"
 msgstr "실패"
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
 msgid "Remove the selected tracks from the list?"
 msgstr "항목의 선택된 곡을 지울까요?"
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
 msgid "Remove Tracks"
 msgstr "곡을 지움"
 
@@ -4843,6 +5390,10 @@ msgstr "로그인 중..."
 msgid "Logout"
 msgstr "로그아웃"
 
+#: streams/streamdialog.cpp:71
+msgid "URL:"
+msgstr "URL:"
+
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
 msgstr "연주순서에 추가하고 저장하지 않음"
@@ -4863,113 +5414,146 @@ msgstr "스트림 수정"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>오류:</b> 무효 프로토콜</i>"
 
-#: streams/streamfetcher.cpp:198
+#: streams/streamfetcher.cpp:205
 msgid "Fetching %1"
 msgstr "%1 가져옴"
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 msgid "Import Streams Into Favorites"
 msgstr "스트림을 즐겨찾기로 가져오기"
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 msgid "Export Favorite Streams"
 msgstr "즐겨찾기 스트림을 내보내기"
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr "새로운 스트림을 즐겨찾기에 추가"
 
-#: streams/streamspage.cpp:123
-msgid "Search TuneIn:"
-msgstr "TuneIn 찾기:"
+#: streams/streamspage.cpp:124
+msgctxt "Service name"
+msgid "Digitally Imported"
+msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:242
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|XML 스트림"
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
 msgid "Import Streams"
 msgstr "스트림 불러오기"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:245
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "XML 스트림 (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:253
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr "<b>%1</b>을 불러올 수 없음!<br/>정확한지 확인 바랍니다."
 
-#: streams/streamspage.cpp:262
+#: streams/streamspage.cpp:265
 msgid "*.xml|XML Streams"
 msgstr "*.xml|XML 스트림"
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
 msgid "Export Streams"
 msgstr "스트림 내보내기"
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:267
 msgid "XML Streams (*.xml)"
 msgstr "XML 스트림 (*.xml)"
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:279
 msgid "Failed to create <b>%1</b>!"
 msgstr "<b>%1</b>을 만들 수 없음!"
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "이미 있는 스트림! <br/><b>%1</b>"
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "스트림 <b>%1</b>은 이미 있습니다!"
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:318
 msgid "Bookmark added"
 msgstr "책갈피 추가됨"
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:320
 msgid "Already bookmarked"
-msgstr "책갈피 있음"
+msgstr "책갈피 이미 있음"
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:366
 msgid "Added to favorites"
 msgstr "즐겨찾기에 추가"
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:368
 msgid "Already in favorites"
 msgstr "즐겨찾기에 있음"
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:393
 msgid "Reload <b>%1</b> streams?"
-msgstr "<b>%1</b> 스트림을 새로 읽을까요?"
+msgstr "<b>%1</b> 스트림을 다시 읽을까요?"
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:411
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
-msgstr "책갈치 <b>%1</b>을 지울까요?"
+msgstr "<b>%1</b>의 책갈피를 지울까요?"
 
-#: streams/streamspage.cpp:414
+#: streams/streamspage.cpp:417
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
-msgstr "책갈피 전체 <b>%1</b>을 지울까요?"
+msgstr "<b>%1</b>의 모든 책갈피를 지울까요?"
 
-#: streams/streamspage.cpp:442
+#: streams/streamspage.cpp:445
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "선택된 %1 스트림을 지울까요?"
 
-#: streams/streamspage.cpp:446
+#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "<b>%1</b>을 지울까요?"
 
-#: streams/streamspage.cpp:609
-msgid "Logged into Digitally Imported"
-msgstr "Digitally Imported에 로그인됨"
+#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+msgid "Search %1:"
+msgstr "찾기 %1:"
+
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr "*.streams|칸타타 스트림"
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
-msgstr "Digitally Imported에 로그인 <b>안</b> 됨"
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+msgid "Install Streams"
+msgstr "스트림 설치"
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
+msgstr "칸타타 스트림 (*.streams)"
+
+#: streams/streamssettings.cpp:144
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr "카테고리 <b>%1</b>은 이미 있습니다!<br/>덮어쓸까요?"
+
+#: streams/streamssettings.cpp:150
+msgid "Failed top open %1"
+msgstr "%1 열 수 없음"
+
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr "파일 포맷 오류!"
+
+#: streams/streamssettings.cpp:170
+msgid "Failed to create stream category folder!"
+msgstr "카테고리 폴더를 만들 수 없음!"
+
+#: streams/streamssettings.cpp:176
+msgid "Failed to save stream list!"
+msgstr "스트림 항목을 저장할 수 없음!"
+
+#: streams/streamssettings.cpp:227
+msgid "Failed to remove streams folder!"
+msgstr "스트림 폴더를 지울 수 없음!"
 
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr "확인(&O)"
 
 #: support/dialog.cpp:90
@@ -5032,39 +5616,39 @@ msgstr "이전(&P)"
 msgid "&Next"
 msgstr "다음(&N)"
 
-#: support/fancytabwidget.cpp:952
+#: support/fancytabwidget.cpp:957
 msgid "Icons Only"
 msgstr "아이콘만"
 
-#: support/fancytabwidget.cpp:953
+#: support/fancytabwidget.cpp:958
 msgid "Style"
 msgstr "형식"
 
-#: support/fancytabwidget.cpp:954
+#: support/fancytabwidget.cpp:959
 msgid "Large Sidebar"
 msgstr "큰 옆 막대"
 
-#: support/fancytabwidget.cpp:955
+#: support/fancytabwidget.cpp:960
 msgid "Small Sidebar"
 msgstr "작은 옆 막대"
 
-#: support/fancytabwidget.cpp:956
+#: support/fancytabwidget.cpp:961
 msgid "Top Bar"
 msgstr "위 막대"
 
-#: support/fancytabwidget.cpp:957
+#: support/fancytabwidget.cpp:962
 msgid "Bottom Bar"
 msgstr "아래 막대"
 
-#: support/fancytabwidget.cpp:958
+#: support/fancytabwidget.cpp:963
 msgid "Tabs On Side"
 msgstr "옆 꼬리표"
 
-#: support/fancytabwidget.cpp:959
+#: support/fancytabwidget.cpp:964
 msgid "Tabs On Top"
 msgstr "위 꼬리표"
 
-#: support/fancytabwidget.cpp:960
+#: support/fancytabwidget.cpp:965
 msgid "Tabs On Bottom"
 msgstr "아래 꼬리표"
 
@@ -5076,19 +5660,20 @@ msgstr "비밀번호"
 msgid "Please enter password:"
 msgstr "비밀번호 입력:"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
 msgid "Warning"
 msgstr "주의"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
 msgid "Question"
 msgstr "질문"
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
+#: support/messagebox.cpp:107 support/messagebox.cpp:113
+#: support/messagebox.h:62
 msgid "Error"
 msgstr "오류"
 
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr "정보"
 
@@ -5108,59 +5693,65 @@ msgstr "폴더 선택"
 msgid "Select File"
 msgstr "파일 선택"
 
-#: 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] "하루 %2"
+msgstr[1] "%1일 %2"
+
+#: tags/tageditor.cpp:134
 msgid "Tags"
 msgstr "태그"
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:147
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "'연주자'에서 '음반연주자' 설정"
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
 msgid "All tracks"
 msgstr "전곡"
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:295
 msgid "(Various)"
 msgstr "(여러)"
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:336
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr "\"여러 연주자\" 해결을 <b>전</b>곡에 적용할까요?"
 
-#: tags/tageditor.cpp:367
+#: tags/tageditor.cpp:378
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr "\"여러 연주자\" 해결을 <b>전</b>곡에 되돌릴까요?"
 
-#: tags/tageditor.cpp:417
+#: tags/tageditor.cpp:428
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5168,15 +5759,15 @@ msgstr ""
 "만약 음반연주자가 비어있다면, '연주자'에서 '음반연주자'를 설정하는 것을 <b>전"
 "</b>곡에 적용할까요?"
 
-#: tags/tageditor.cpp:418
+#: tags/tageditor.cpp:429
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr "만약 음반연주자가 비어있다면, '연주자'에서 '음반연주자'를 설정할까요?"
 
-#: tags/tageditor.cpp:419
+#: tags/tageditor.cpp:430
 msgid "Album Artist from Artist"
 msgstr "연주자에서 음반연주자"
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:463
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5184,44 +5775,52 @@ msgstr ""
 "<b>전</b>곡의 '제목', '연주자', '음반연주자', '음반'의 첫 글자를 대문자로 할"
 "까요?"
 
-#: tags/tageditor.cpp:485
+#: tags/tageditor.cpp:496
 msgid "Adjust the value of each track number by:"
 msgstr "각 곡 순서를 값대로 늘여갑니다:"
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:554
 msgid "All tracks [modified]"
 msgstr "전곡 [수정됨]"
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:556
 msgid "%1 [modified]"
 msgstr "%1 [수정됨]"
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:783
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr "태그에 맞추기 위해서, 곡들의 이름을 바꾸겠습니까?"
 
-#: tags/tageditor.cpp:759
+#: tags/tageditor.cpp:784
 msgid "Rename Files"
 msgstr "파일이름 바꾸기"
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:150
 msgid "Abort renaming of files?"
 msgstr "파일 이름 바꾸기를 취소할까요?"
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:263
+msgid "Source file does not exist!<br/>%1"
+msgstr "원본 파일이 없습니다!<hr/>%1"
+
+#: tags/trackorganiser.cpp:282
 msgid "Destination file already exists!<br/>%1"
 msgstr "대상 파일이 이미 있음!<br/>%1"
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:304
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "대상 폴더를 만들 수 없음!<br/>%1"
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:325
 msgid "Failed to rename %1 to %2"
 msgstr "%1을 %2로 이름을 바꿀 수 없음"
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:267
+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
 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:"
@@ -5231,26 +5830,31 @@ msgstr ""
 "\"right\"><b>음반:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>연도:</"
 "b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:59
+#: widgets/genrecombo.cpp:54
 msgid "All Genres"
 msgstr "모든 장르"
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:267
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: widgets/groupedview.cpp:269
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:480
 msgid "Go Back"
 msgstr "돌아가기"
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:485
 msgid "Go Home"
 msgstr "홈으로"
 
 #: widgets/menubutton.cpp:36
-msgid "Other Actions"
-msgstr "다른 기능"
+msgid "Menu"
+msgstr "메뉴"
 
 #: widgets/searchwidget.cpp:62
 msgid "Search..."
@@ -5260,6 +5864,55 @@ msgstr "찾기..."
 msgid "Close Search Bar"
 msgstr "검색막대 닫기"
 
+#: widgets/servicestatuslabel.cpp:43
+msgid "Logged into %1"
+msgstr "%1로 로그인됨"
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr "%1로 로그인 <b>안</b>됨"
+
+#: widgets/songdialog.cpp:48
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
+"\" setting, and MPD's \"music_directory\" setting.</p>"
+msgstr ""
+"<p>음악 파일에 접근할 수 없음!<br/><br/>칸타타의 \"Music folder\"와 MPD의 "
+"\"music_directory\" 설정을 확인하셔요.</p>"
+
+#: widgets/songdialog.cpp:51
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check that the device is still "
+"attached.</p>"
+msgstr ""
+"<p>음악 파일에 접근할 수 없음!<br/><br/>장치가 아직 연결되어 있는지 확인하셔"
+"요.</p>"
+
+#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
+#: widgets/volumeslider.cpp:238
+msgid "Mute"
+msgstr "음 소거"
+
+#: widgets/volumeslider.cpp:199
+msgid "Muted"
+msgstr "음 소거됨"
+
+#: widgets/volumeslider.cpp:238
+msgid "Unmute"
+msgstr "음 소거 취소"
+
+#: widgets/volumeslider.cpp:276
+msgid "Volume Disabled"
+msgstr "음량사용 안 함"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1% (Muted)"
+msgstr "음량 %1% (무음)"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr "음량 %1%"
+
 #: ../gui/qtplural.h:30
 msgctxt "Singular"
 msgid "1 Track"
@@ -5338,6 +5991,85 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr "%1 규정"
 
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr "한 팟캐스트"
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr "%1 팟캐스트"
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr "한 에피소드"
+
+#: ../gui/qtplural.h:63
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr "%1 에피소드"
+
+#~ msgid ""
+#~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
+#~ msgstr "곡을 내려받을 수 없음 - 너무 많은 재전송.<br/><br/<hr/>%1"
+
+#~ 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>다음 변수는 의미에 따라 각 곡 이름이 됩니다.</p><p><table border="
+#~ "\"1\"><tr><th><em>단추</em></th><th><em>변수</em></th><th><em>설명</em></"
+#~ "th></tr><tr><td>%albumartist%</td><td>%1</td><td>음반연주자. 대부분의 음반"
+#~ "은 <i>곡 연주자</i>와 같습니다. 컴필레이션은 많은 경우에 <i>여러 연주자</"
+#~ "i>입니다. </td></tr><tr><td>%album%</td><td>%2</td><td>음반명.</td></"
+#~ "tr><tr><td>%artist%</td><td>%3</td><td>각각의 곡 연주자.</td></tr><tr><td>"
+#~ "%title%</td><td>%4</td><td>곡명 (<i>곡 연주자</i>없이).</td></tr><tr><td>"
+#~ "%artistandtitle%</td><td>%5</td><td>곡명 (<i>곡 연주자</i>포함, <i>음반연"
+#~ "주자</i>와 다르다면).</td></tr><tr><td>%track%</td><td>%6</td><td>곡 번호."
+#~ "</td></tr><tr><td>%discnumber%</td><td>%7</td><td>여러 음반의 장수. 컴필레"
+#~ "이션은 종종 서너장의 음반으로 되어 있습니다.</td></tr><tr><td>%year%</"
+#~ "td><td>%8</td><td>음반 발매 연도.</td></tr><tr><td>%genre%</td><td>%9</"
+#~ "td><td>음반 장르.</td></tr></table></p>"
+
+#~ msgid "Configure Online Service"
+#~ msgstr "온라인서비스설정"
+
+#~ msgid "Refresh Online Service"
+#~ msgstr "온라인서비스 새로 읽기"
+
+#~ msgid "Support media keys under GNOME/Unity:"
+#~ msgstr "그놈/유니티에서 미디어 키 지원:"
+
+#~ msgid "Stopping Playback"
+#~ msgstr "연주 정지"
+
+#~ msgid "Search TuneIn:"
+#~ msgstr "TuneIn 찾기:"
+
+#~ msgid "Logged into Digitally Imported"
+#~ msgstr "Digitally Imported에 로그인됨"
+
+#~ msgid "Other Actions"
+#~ msgstr "다른 기능"
+
 #~ msgid "Disc %1"
 #~ msgstr "디스크 %1"
 
@@ -5426,19 +6158,9 @@ msgstr "%1 규정"
 #~ msgid "Disconnect Online Service"
 #~ msgstr "온라인서비스 연결 닫기"
 
-#~ msgid "Failed to parse downloaded stream list."
-#~ msgstr "내려받은 스트림 항목을 분석할 수 없음."
-
 #~ msgid "Failed to read downloaded stream list."
 #~ msgstr "내려받은 스트림 항목을 읽을 수 없음."
 
-#~ msgid "Failed to download stream list."
-#~ msgstr "스트림 항목을 내려받을 수 없음."
-
-#~ msgctxt "name (host)"
-#~ msgid "%1 (%2)"
-#~ msgstr "%1 (%2)"
-
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "%1에 재연결 안 됨"
 
@@ -5518,17 +6240,17 @@ msgstr "%1 규정"
 #~ "active interface.<br/><br/><b>NOTE:</b> Leave port set to 'Dynamic' to "
 #~ "have Cantata choose a random port number.</i>"
 #~ msgstr ""
-#~ "<i><b>참고:</b> MPD는 주로 음악 폴더에 저장된 음악만 연주합니다.로컬 소켓"
-#~ "에 연결되면 파일시스템의 파일을 연주할 수 있습니다. 로컬 소켓을 사용하지 "
+#~ "<i><b>참고:</b> MPD는 주로 음악 폴더에 저장된 음악만 연주합니다.로컬소켓"
+#~ "에 연결되면 파일시스템의 파일을 연주할 수 있습니다. 로컬소켓을 사용하지 "
 #~ "않는다면 (예로 '서버' 설정페이지의 '호스트' 입력란에 호스트 이름이나 IP주"
-#~ "소를 입력했다면) 칸타타는 파일을 MPD로 서비스하는 최소한의 HTTP서버 역할"
+#~ "소를 입력했다면) 칸타타는 파일을 MPD로 서비스하는 최소한의 HTTP 서버 역할"
 #~ "을 합니다. 다만, 칸타타가 실행되는 한에서만 작동합니다. '항상 서버 사"
-#~ "용'을 선택하면 칸타타는 로컬 소켓에 연결되었더라도 항상 서버 URL을 MPD 파"
+#~ "용'을 선택하면 칸타타는 로컬소켓에 연결되었더라도 항상 서버 URL을 MPD 파"
 #~ "일로 전달합니다.<br/><br/>\n"
 #~ "<b>참고:</b>'주소/인터페이스'는 연결을 원하는 IP주소나 eth0등 인터페이스"
-#~ "를 포함할 수 있습니다. 로컬 루프백 주소 (127.0.0.1)을 쓰려면 비워두시기 "
-#~ "바랍니다.<br/><br/><b>참고:</b> 포트를 '동적'으로 두면 칸타타가 포트 번호"
-#~ "를 임의로 선택합니다.</i>"
+#~ "를 포함할 수 있습니다. 로컬 루프백 주소 (127.0.0.1)을 쓰려면 비워두시기 바"
+#~ "랍니다.<br/><br/><b>참고:</b> 포트를 '동적'으로 두면 칸타타가 포트 번호를 "
+#~ "임의로 선택합니다.</i>"
 
 #~ msgid "Move Up"
 #~ msgstr "위로 이동"
@@ -5579,9 +6301,6 @@ msgstr "%1 규정"
 #~ msgid "Music folder not writeable."
 #~ msgstr "음악 폴더에 쓸 수 없습니다."
 
-#~ msgid "*.cantata|Cantata Streams"
-#~ msgstr "*.cantata|칸타타 스트림"
-
 #~ msgid "Are you sure you wish to remove the selected categories &streams?"
 #~ msgstr "선택된 카테고리와 스트림을 지울까요?"
 
@@ -5616,9 +6335,6 @@ msgstr "%1 규정"
 #~ msgid "Download streams from %1?"
 #~ msgstr "%1에서 스트림을 내려받을까요?"
 
-#~ msgid "Download %1"
-#~ msgstr "%1 내려받기"
-
 #~ msgctxt ""
 #~ "message \n"
 #~ " url"
@@ -5744,9 +6460,6 @@ msgstr "%1 규정"
 #~ msgid "Failed to update the tags of some tracks."
 #~ msgstr "곡에 대한 태그 업데이트 안 됨."
 
-#~ msgid "Are you sure you wish to forget the selected device?"
-#~ msgstr "선택된 장치를 무시할까요?"
-
 #~ msgid "Select Music Folder"
 #~ msgstr "음악 폴더 선택"
 
diff --git a/po/pl.po b/po/pl.po
index 9aa6fed..9ba2257 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -7,8 +7,8 @@ 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-07-31 18:13+0200\n"
+"POT-Creation-Date: 2013-11-14 20:26+0000\n"
+"PO-Revision-Date: 2013-11-27 20:30+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,37 +23,37 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Odśwież informacje o albumie"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
 msgid "Album Information"
 msgstr "Informacje o albumie"
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:143
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
 msgid "Tracks"
 msgstr "Utwory"
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 msgid "Refresh Artist Information"
 msgstr "Odśwież informacje o artyście"
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 context/contextwidget.cpp:306
+#: gui/cachesettings.cpp:260
 msgid "Artist Information"
 msgstr "Informacje o artyście"
 
 #. i18n: file: gui/interfacesettings.ui:137
 #. 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:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
 msgid "Albums"
 msgstr "Albumy"
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:333
 msgid "Web Links"
 msgstr "Linki sieciowe"
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:419
 msgid "Similar Artists"
 msgstr "Podobni Artyści"
 
@@ -65,8 +65,8 @@ msgstr "Dostawcy tekstów"
 msgid "Wikipedia Languages"
 msgstr "Język Wikipedii"
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
-#: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
 msgid "Other"
 msgstr "Inne"
 
@@ -74,12 +74,12 @@ msgstr "Inne"
 msgid "Reset Spacing"
 msgstr "Resetuj odstępy"
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
 msgid "Lyrics"
 msgstr "Teksty"
 
-#: context/lastfmengine.cpp:65
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr "Czytaj więcej na last.fm"
 
@@ -101,20 +101,20 @@ 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:47
+#. i18n: file: devices/albumdetails.ui:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
+#: rc.cpp:61 rc.cpp:304 rc.cpp:789
 msgid "Title:"
 msgstr "Tytuł:"
 
@@ -122,16 +122,16 @@ msgstr "Tytuł:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
+#: rc.cpp:55 rc.cpp:292 rc.cpp:792
 msgid "Artist:"
 msgstr "Artysta:"
 
@@ -139,112 +139,113 @@ msgstr "Artysta:"
 msgid "Search For Lyrics"
 msgstr "Szukaj tekstów"
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "Proszę wybrać strony z tekstami."
 
-#: context/lyricsettings.cpp:46
+#: context/lyricsettings.cpp:66
 msgid "(Polish Translations)"
 msgstr "(Polskie tłumaczenia)"
 
-#: context/lyricsettings.cpp:47
+#: context/lyricsettings.cpp:67
 msgid "(Portuguese Translations)"
 msgstr "(Portugalskie tłumaczenia)"
 
-#: context/songview.cpp:74
+#: context/songview.cpp:89
 msgid "Refresh Lyrics"
 msgstr "Odśwież teksty"
 
-#: context/songview.cpp:75
+#: context/songview.cpp:90
 msgid "Edit Lyrics"
 msgstr "Edytuj teksty"
 
-#: context/songview.cpp:76
+#: context/songview.cpp:91
 msgid "Save Lyrics"
 msgstr "Zapisz teksty"
 
-#: context/songview.cpp:77
+#: context/songview.cpp:92
 msgid "Cancel Editing Lyrics"
 msgstr "Anuluj edycję tekstów"
 
-#: context/songview.cpp:78
+#: context/songview.cpp:93
 msgid "Delete Lyrics File"
 msgstr "Usuń plik z tekstami"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort editing of lyrics?"
 msgstr "Przerwać edycję tekstów?"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort Editing"
 msgstr "Przerwij edycję"
 
-#: 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: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
 msgid "Abort"
 msgstr "Przerwij"
 
-#: context/songview.cpp:106
+#: context/songview.cpp:121
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "Usunąć zapisaną kopię tekstów i pobrać ponownie?"
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:121 context/songview.cpp:122
+#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
 msgid "Re-download"
 msgstr "Pobierz ponownie"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Current playing song has changed, still perform search?"
 msgstr ""
 "Obecnie odtwarzany utwór uległ zmianie. Czy nadal wykonać wyszukiwanie?"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Song Changed"
 msgstr "Zmieniono utwór"
 
-#: context/songview.cpp:133
+#: context/songview.cpp:148
 msgid "Perform Search"
 msgstr "Szukaj"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save updated lyrics?"
 msgstr "Zapisać uaktualnione teksty?"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save"
 msgstr "Zapisz"
 
-#: context/songview.cpp:170
+#: context/songview.cpp:185
 msgid "Failed to save lyrics."
 msgstr "Zapisanie tekstów nie powiodło się."
 
-#: context/songview.cpp:192
+#: context/songview.cpp:207
 msgid "Delete lyrics file?"
 msgstr "Usunąć plik z tekstami?"
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
+#: context/songview.cpp:207 gui/mainwindow.cpp:292
+#: widgets/messageoverlay.cpp:43
 msgid "Cancel"
 msgstr "Anuluj"
 
-#: context/songview.cpp:416
+#: context/songview.cpp:431
 msgid "Fetching lyrics via %1"
 msgstr "Pobieranie tekstów z %1"
 
-#: context/wikipediaengine.cpp:250
+#: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Listing utworów"
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr "Czytaj więcej na Wikipedii"
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr "Otwórz w przeglądarce"
 
-#: 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 "artysta|zespół|piosenkarz|wokalista|muzyk"
@@ -254,7 +255,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "album|ścieżka dźwiękowa|kompozycja"
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:99
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -262,41 +263,46 @@ msgstr ""
 "Proszę wybrać języki Wikipedii, które mają być użyte przy wyszukiwaniu "
 "informacji o artyście i albumie."
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
+#: online/podcastsearchdialog.cpp:393
 msgid "Reload"
 msgstr "Odśwież"
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr ""
+
+#: devices/actiondialog.cpp:76
 msgid "Songs To Be Copied"
 msgstr "Utwory do skopiowania"
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:146
 msgid "<b>INVALID</b>"
 msgstr "<b>NIEWŁAŚCIWY</b>"
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
 msgid "<i>(When different)</i>"
 msgstr "<i>(Gdy różne)</i>"
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Artyści:%1, Albumy:%2, Utwory:%3"
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
+#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
 #: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
 msgid "%1 free"
 msgstr "%1 wolnego miejsca"
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
 msgid "Local Music Library"
 msgstr "Lokalna biblioteka muzyki"
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
+#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
 msgid "Audio CD"
 msgstr "Płyta audio"
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:293
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -308,7 +314,7 @@ msgstr ""
 "Aby utwory mogły zostać skopiowane, będą musiały zostać skonwertowane do "
 "plików o mniejszych rozmiarach."
 
-#: devices/actiondialog.cpp:285
+#: devices/actiondialog.cpp:300
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -316,17 +322,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:334
+#: devices/actiondialog.cpp:349
 msgid "Copy Songs"
 msgstr "Skopiuj utwory"
 
-#: 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:349 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Usuń utwory"
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:380
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
@@ -334,15 +340,15 @@ msgstr ""
 "<p>Urządzenie docelowe nie zostało skonfigurowane.<br/>Czy kontynuować z "
 "domyślnymi ustawieniami?</p>"
 
-#: devices/actiondialog.cpp:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
 msgid "Not Configured"
 msgstr "Nie skonfigurowano"
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
 msgid "Use Defaults"
 msgstr "Użyj domyślnych"
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:384
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
@@ -350,63 +356,63 @@ msgstr ""
 "<p>Urządzenie źródłowe nie zostało skonfigurowane.<br/>Czy kontynuować z "
 "domyślnymi ustawieniami?</p>"
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:446
 msgid "Are you sure you wish to stop?"
 msgstr "Czy na pewno zatrzymać?"
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Stop"
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
+#: tags/trackorganiser.cpp:446
 msgid "Device has been removed!"
 msgstr "Urządzenie zostało usunięte!"
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:491
 msgid "Device is not connected!"
 msgstr "Urządzenie nie jest podłączone!"
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
+#: tags/trackorganiser.cpp:456
 msgid "Device is busy?"
 msgstr "Urządzenie jest zajęte?"
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "Urządzenie zostało zmienione?"
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:562
 msgid "Clearing unused folders"
 msgstr "Czyszczenie nieużywanych katalogów"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "Obliczyć ReplayGain zgranych utworów?"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "ReplyGain"
 msgstr "ReplayGain"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:578
 msgid "Calculate"
 msgstr "Oblicz"
 
-#: devices/actiondialog.cpp:618
+#: devices/actiondialog.cpp:634
 msgid "The destination filename already exists!<hr/>%1"
 msgstr "Istnieje plik o nazwie docelowej!<hr/>%1"
 
-#: devices/actiondialog.cpp:621
+#: devices/actiondialog.cpp:637
 msgid "Song already exists!<hr/>%1"
 msgstr "Utwór już istnieje!<hr/>%1"
 
-#: devices/actiondialog.cpp:624
+#: devices/actiondialog.cpp:640
 msgid "Song does not exist!<hr/>%1"
 msgstr "Utwór nie istnieje!<hr/>%1"
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:643
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
 "permissions.<hr/>%1"
@@ -414,31 +420,31 @@ msgstr ""
 "Tworzenie katalogu docelowego nie powiodło się!<br/>Proszę upewnić się, że "
 "ustawione są odpowiednie prawa dostępu.<hr/>%1"
 
-#: devices/actiondialog.cpp:630
+#: 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:633
+#: devices/actiondialog.cpp:649
 msgid "Failed to copy.<hr/>%1"
 msgstr "Kopiowanie nie powiodło się.<hr/>%1"
 
-#: devices/actiondialog.cpp:634
+#: devices/actiondialog.cpp:650
 msgid "Failed to delete.<hr/>%1"
 msgstr "Usuwanie nie powiodło się.<hr/>%1"
 
-#: devices/actiondialog.cpp:637
+#: devices/actiondialog.cpp:653
 msgid "Not connected to device.<hr/>%1"
 msgstr "Brak połączenia z urządzeniem.<hr/>%1"
 
-#: devices/actiondialog.cpp:640
+#: devices/actiondialog.cpp:656
 msgid "Selected codec is not available.<hr/>%1"
 msgstr "Wybrany kodek nie jest dostępny.<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:659
 msgid "Transcoding failed.<br/><br/<hr/>%1"
 msgstr "Konwertowanie nie powiodło się.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:646
+#: devices/actiondialog.cpp:662
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
 "devices.)<hr/>%1"
@@ -446,60 +452,55 @@ msgstr ""
 "Stworzenie pliku tymczasowego nie powiodło się.<br/>(Wymagane przy "
 "konwertowaniu do urządzeń MTP.)<hr/>%1"
 
-#: devices/actiondialog.cpp:649
+#: 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:652
+#: 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:655
+#: 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:658
+#: 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:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr ""
-"Pobieranie pliku nie powiodło się - napotkano na zbyt dużo przekierowań.<br/"
-"><br/<hr/>%1"
-
-#: devices/actiondialog.cpp:664
+#: 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:667
+#: devices/actiondialog.cpp:680
 msgid "Failed to lock device.<hr/>%1"
 msgstr "Zablokowanie urządzenia nie powiodło się.<hr/>%1"
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:709
 msgid "Local Music Library Properties"
 msgstr "Ustawienia lokalnej biblioteki muzyki"
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
+#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
 msgid "<b>Error</b><br/>"
 msgstr "<b>Błąd</b><br/>"
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Skip"
 msgstr "Pomiń"
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Auto Skip"
 msgstr "Automatycznie pomiń"
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:759
 msgid "Retry"
 msgstr "Spróbuj ponownie"
 
-#: devices/actiondialog.cpp:761
+#: 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</"
@@ -509,7 +510,7 @@ msgstr ""
 "\">Album:</td><td>%2</td></tr><tr><td align=\"right\">Numer:</td><td>%3</"
 "td></tr>"
 
-#: devices/actiondialog.cpp:768
+#: 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>"
@@ -517,20 +518,21 @@ 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>"
 
-#: devices/actiondialog.cpp:773
+#: 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:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
 msgid "Calculating..."
 msgstr "Obliczanie..."
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:799
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (Szacunkowo)"
 
-#: devices/actiondialog.cpp:789
+#: devices/actiondialog.cpp:802
 msgid ""
 "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
 "i></tr>"
@@ -538,40 +540,40 @@ msgstr ""
 "<tr><i><td align=\"right\"><i>Pozostały czas:</i></td><td><i>%5</i></td></"
 "i></tr>"
 
-#: devices/actiondialog.cpp:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Zapisywanie pamięci podręcznej"
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
+#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Zastosuj obejście dla 'Various Artists'"
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
+#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Cofnij obejście dla 'Various Artists'"
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
+#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
 msgid "Capitalize"
 msgstr "Duża pierwsza litera"
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
 msgid "Adjust Track Numbers"
 msgstr "Dostosuj numery utworów"
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
 msgid "Tools"
 msgstr "Narzędzia"
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "Zastosować obejście dla 'Various Artists'?"
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -579,11 +581,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:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Cofnij obejście dla 'Various Artists'"
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
 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' "
@@ -598,37 +600,37 @@ msgstr ""
 "\"Wibble - Wobble\", wtedy 'Artysta' zostanie ustawiony na \"Wibble\" "
 "natomiast 'Title' będzie miał wartość \"Wobble\"</i>"
 
-#: devices/albumdetailsdialog.cpp:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
 msgid "Revert"
 msgstr "Odwróć"
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
 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:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
 msgid "Adjust track number by:"
 msgstr "Zmień numery utworów o:"
 
-#: 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
+#: 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:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Odczyt płyty"
 
-#: 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:353 gui/mainwindow.cpp:2199
+#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
+#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "1 Utwór (%2)"
@@ -647,24 +649,24 @@ msgstr "MusicBrainz"
 msgid "Data Track"
 msgstr "Ścieżka danych"
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr "Otwarcie urządzenia CD nie powiodło się"
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
 #: devices/musicbrainz.cpp:217
 msgid "Track %1"
 msgstr "Utwór %1"
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr "Nawiązanie połączenia z CDDB nie powiodło się"
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr "Nie znaleziono psujących wyników w CDDB"
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr "Błąd CDDB: %1"
 
@@ -672,19 +674,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:157
+#. i18n: file: devices/albumdetails.ui:170
 #. 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:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
+#: rc.cpp:82
 msgid "Artist"
 msgstr "Artysta"
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:175
 #. 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:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
+#: rc.cpp:85
 msgid "Title"
 msgstr "Tytuł"
 
@@ -702,10 +704,14 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr "Uaktualnianie (%1)..."
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr "Uaktualnianie (%1%)..."
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -810,24 +816,24 @@ msgstr "Zapomnij o urządzeniu"
 msgid "Add Device"
 msgstr "Dodaj urządzenie"
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
 msgstr "Czy wyszukać szczegóły albumu i utworów?"
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455
 msgid "Refresh"
 msgstr "Odśwież"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr "Za pośrednictwem CDDB"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr "Za pośrednictwem 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>"
@@ -837,16 +843,16 @@ msgstr ""
 "utwory zostaną przeskanowane <i>(szybki)</i></li><li>Pełny - Wszystkie "
 "utwory zostaną przeskanowane <i>(wolny)</i></li></ul></p>"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr "Częściowy"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr "Pełny"
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -854,31 +860,31 @@ msgstr ""
 "Czy jesteś pewien, że chcesz usunąć zaznaczone utwory?\n"
 "Ta operacja nie może zostać cofnięta."
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr "Czy na pewno zapomnieć <b>%1</b>?"
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr "Czy na pewno wysunąć płytę audio <b>%1 - %2</b>?"
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr "Wysuń"
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr "Czy na pewno rozłączyć się z <b>%1</b>?"
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr "Rozłącz"
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
 msgid "Please close other dialogs first."
 msgstr "Proszę najpierw zamknąć inne okna dialogowe."
 
-#: devices/encoders.cpp:78
+#: devices/encoders.cpp:77
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -896,7 +902,7 @@ msgstr ""
 
 # Nie jestem pewien, czy "przesadzone" nie jest zbyt kolokwialne.
 # Było "nadmiarowe".
-#: devices/encoders.cpp:83
+#: devices/encoders.cpp:82
 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 "
@@ -927,21 +933,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:101 devices/encoders.cpp:141
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr "Szacowany średni bitrate przy kodowaniu ze zmiennym bitrate"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
+#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
 msgid "Smaller file"
 msgstr "Mniejszy plik"
 
-#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:329
 msgid "Better sound quality"
 msgstr "Lepsza jakość dźwięku"
 
-#: devices/encoders.cpp:120
+#: devices/encoders.cpp:119
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -959,7 +965,7 @@ msgstr ""
 
 # nadmiarowe → przesadzone
 # patrz też komentarz do devices/encoders.cpp:62
-#: devices/encoders.cpp:124
+#: devices/encoders.cpp:123
 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 "
@@ -987,11 +993,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:156 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:159
+#: devices/encoders.cpp:158
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1009,7 +1015,7 @@ msgstr ""
 
 # nadmiarowe → przesadzone
 # patrz też komentarz do devices/encoders.cpp:62
-#: devices/encoders.cpp:164
+#: devices/encoders.cpp:163
 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 "
@@ -1044,15 +1050,64 @@ msgstr ""
 "b> mogą nie być satysfakcjonujące dla muzyki, a wszystko powyżej <b>8</b> "
 "jest prawdopodobnie przesadzone."
 
-#: devices/encoders.cpp:184
+#: devices/encoders.cpp:183
 msgid "Quality rating"
 msgstr "Wskaźnik jakości"
 
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr "Opus"
+
+#: devices/encoders.cpp:203
+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 ""
+"<a href=http://pl.wikipedia.org/wiki/Opus_(format)>Opus</a> jest wolnym od "
+"patentów kodekiem audio używającym stratnej kompresji danych."
+
+# nadmiarowe → przesadzone
+# patrz też komentarz do devices/encoders.cpp:62
 #: devices/encoders.cpp:205
+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 ""
+"Bitrate jest miarą ilości danych używanych do reprezentacji sekundy ścieżki "
+"muzycznej.<br>Kodek <b>Opus</b> używany przez program Cantata obsługuje <a "
+"href=http://pl.wikipedia.org/wiki/VBR>zmienny bitrate (VBR)</a> wartość "
+"bitrate waha się w trakcie utworu w zależności od stopnia skomplikowania "
+"zawartości pliku. Bardziej skomplikowane fragmenty kodowane są przy użyciu "
+"większej ilości danych niż fragmenty mniej skomplikowane; takie podejście "
+"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, "
+"a wszystko powyżej <b>256kb/s</b> jest prawdopodobnie przesadzone."
+
+#: devices/encoders.cpp:222 devices/encoders.cpp:319
+msgid "Bitrate"
+msgstr "Bitrate"
+
+#: devices/encoders.cpp:241
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:244
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1067,11 +1122,11 @@ msgstr ""
 "<br>Polecany jedynie dla odtwarzaczy muzycznych firmy Apple oraz odtwarzaczy "
 "nie obsługujących formatu FLAC."
 
-#: devices/encoders.cpp:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:262
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1086,7 +1141,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:230
+#: devices/encoders.cpp:266
 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 +1167,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:245
+#: devices/encoders.cpp:281
 msgid "Compression level"
 msgstr "Poziom kompresji"
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:291
 msgid "Faster compression"
 msgstr "Szybsza kompresja"
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:298
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:301
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1141,7 +1196,7 @@ msgstr ""
 
 # nadmiarowe → przesadzone
 # patrz też komentarz do devices/encoders.cpp:62
-#: devices/encoders.cpp:268
+#: devices/encoders.cpp:305
 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> "
@@ -1165,85 +1220,125 @@ msgstr ""
 "być satysfakcjonujące dla muzyki, a wszystko powyżej <b>182kb/s</b> jest "
 "prawdopodobnie przesadzone."
 
-#: devices/encoders.cpp:282
-msgid "Bitrate"
-msgstr "Bitrate"
-
 #: devices/filenameschemedialog.cpp:33
 msgid "Filename Scheme"
 msgstr "Schemat nazwy pliku"
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:52
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Various Artists"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:53
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr "Vivaldi"
+
+#: devices/filenameschemedialog.cpp:55
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Now 5001"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:56
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Wobble"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:57
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Dance"
 
-#: devices/filenameschemedialog.cpp:99
+#: devices/filenameschemedialog.cpp:101
 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>Następujące zmienne zostaną zastąpione wartościami odpowiadającymi "
-"właściwościom każdego utworu.</p><p><table border=\"1\"><tr><th><em>Guzik</em>"
-"</th><th><em>Zmienna</em></th><th><em>Opis</em></th></tr><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> W przypadku kompilacji "
-"będzie to często <i>Various Artists.</i> </td></tr><tr><td>%album%</td><td>%"
-"2</td><td>Nazwa albumu.</td></tr><tr><td>%artist%</td><td>%3</"
-"td><td>Artysta każdego utworu.</td></tr><tr><td>%title%</td><td>%4</td><td>"
-"Tytuł utworu (bez <i>Artysty utworu</i>).</td></tr><tr><td>"
-"%artistandtitle%</td><td>%5</td><td>Tytuł utworu (z <i>Artystą utworu</i>, "
-"jeśli inny niż <i>Artysta albumu</i>).</td></tr><tr><td>%track%</td><td>"
-"%6</td><td>Numer utworu.</td></tr><tr><td>%discnumber%</td><td>%7</td><td>"
-"Numer albumu dla albumów wielo-albumowych. Najczęściej kompilacje składają "
-"się z wielu albumów.</td></tr><tr><td>%year%</td><td>%8</td><td>Rok wydania "
-"albumu.</td></tr><tr><td>%genre%</td><td>%9</td><td>Gatunek albumu.</td></tr>"
-"</table></p>"
-
-#: devices/fsdevice.cpp:678
+"for each track name.</p>"
+msgstr ""
+"<p>Następujące zmienne zostaną zastąpione ich wartościami dla każdego pliku.<"
+"/p>"
+
+#: devices/filenameschemedialog.cpp:103
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</em></th><th><em>Description</"
+"em></th></tr>"
+msgstr ""
+"<tr><th><em>Przycisk</em></th><th><em>Zmienna</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
 msgid "Updating..."
 msgstr "Uaktualnianie...."
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Odczytywanie pamięci podręcznej"
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
@@ -1277,16 +1372,15 @@ msgstr "Uaktualniania plików..."
 msgid "Updating tracks..."
 msgstr "Uaktualnianie utworów..."
 
-#: 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
+#: 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:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
+#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
+#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
 #: models/devicesmodel.cpp:140
 msgid "Not Connected"
 msgstr "Nie połączono"
@@ -1303,7 +1397,7 @@ msgstr "Nie znaleziono pasujących wyników w MusicBrainz"
 msgid "Connection"
 msgstr "Połączenie"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
 msgid "Music Library"
 msgstr "Biblioteka muzyki"
 
@@ -1394,8 +1488,8 @@ msgstr "Pojemność nieznana"
 
 #. i18n: file: gui/coverdialog.ui:30
 #. 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:53 gui/stdactions.cpp:92
+#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
 msgid "Search"
 msgstr "Szukaj"
 
@@ -1439,94 +1533,94 @@ msgstr "Nie przeskanowano"
 msgid " (recommended)"
 msgstr " (zalecane)"
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:208
 msgid "Start Dynamic Playlist"
 msgstr "Uruchom playlistę dynamiczną"
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:209
 msgid "Stop Dynamic Mode"
 msgstr "Zatrzymaj tryb dynamiczny"
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:257
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "1 reguła"
 msgstr[1] "%1 reguły"
 msgstr[2] "%1 reguł"
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:396
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr ""
-"Należy w systemie zainstalować narzędzie \"perl\" aby tryb dynamiczny Cantaty "
-"mógł działać."
+"Należy w systemie zainstalować narzędzie \"perl\" aby tryb dynamiczny "
+"Cantaty mógł działać."
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:403
 msgid "Failed to locate rules file - %1"
 msgstr "Odnalezienie pliku z regułami nie powiodło się - %1"
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:411
 msgid "Failed to remove previous rules file - %1"
 msgstr "Usunięcie poprzedniego pliku z regułami nie powiodło się - %1"
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:416
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "Instalacja pliku z regułami nie powiodła się - %1 -> %2"
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:729
 msgid "Dynamizer has been terminated."
 msgstr "Dynamizer został wyłączony."
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:816
 msgid "Uknown"
 msgstr "Nieznany"
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:818
 msgid "Loading list of rules"
 msgstr "Ładowanie listy reguł"
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:819
 msgid "Saving rule"
 msgstr "Zapisywanie reguły"
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:820
 msgid "Deleting rule"
 msgstr "Usuwanie reguły"
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:821
 msgid "Setting active rule"
 msgstr "Ustawianie aktywnej reguły"
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:822
 msgid "Stopping dynamizer"
 msgstr "Zatrzymywanie dynamizera"
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:823
 msgid "Requesting ID details"
 msgstr "Pobieranie szczegółów ID"
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:826
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Oczekiwanie na odpowiedź dla poprzedniej komendy. (%1)"
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:981
 msgid "Dynamizer is not active"
 msgstr "Dynamizer nie jest aktywny"
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:989
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Odczyt dynamicznych reguł nie powiódł się. (%1)"
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1020
 msgid "Failed to delete rules file. (%1)"
 msgstr "Usunięcie pliku z regułami nie powiodło się. (%1)"
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Kontrola stanu dynamizera nie powiodła się. (%1)"
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1036
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Ustawianie dynamicznych reguł nie powiodło się. (%1)"
 
@@ -1560,16 +1654,16 @@ msgstr "Dynamiczna reguła"
 
 #. 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:136 po/rc.cpp:280 rc.cpp:280
 msgid "Add"
 msgstr "Dodaj"
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:202
 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:194
+#: dynamic/dynamicruledialog.cpp:205
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1585,45 +1679,51 @@ msgstr "PodobniArtyści"
 msgid "AlbumArtist"
 msgstr "ArtystaAlbumu"
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr "Kompozytor"
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
 msgid "Album"
 msgstr "Album"
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. 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:106
+#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
 msgid "Genre"
 msgstr "Gatunek"
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr "Data"
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr "Zawiera"
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr "Nie zawiera"
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr " (Dokładnie)"
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr "Dynamiczne reguły"
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
 "of <i>Include</i> rules will be used to build a set of songs that can be "
@@ -1653,11 +1753,11 @@ msgstr ""
 "zbioru utworów pasujących do reguł, Cantata losowo będzie wybierać z niej "
 "utwory tak, aby kolejka odtwarzania była wypełniona 10 elementami.</p>"
 
-#: dynamic/dynamicrulesdialog.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr "Nie powiodło się zapisywanie %1"
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
@@ -1665,31 +1765,35 @@ msgstr ""
 "Zestaw reguł o nazwie '%1' już istnieje!\n"
 "Nadpisać?"
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 msgid "Overwrite Rules"
 msgstr "Nadpisz reguły"
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr "Zapisywanie %1"
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:168
 msgid "Deleting..."
 msgstr "Usuwanie..."
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Name"
 msgstr "Nazwa"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Item Count"
 msgstr "Liczba elementów"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Space Used"
 msgstr "Użyta przestrzeń"
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr "Całkowita użyta przestrzeń: %1"
+
+#: gui/cachesettings.cpp:245
 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 "
@@ -1704,48 +1808,53 @@ msgstr ""
 "aby ich tam nie zapisywać). Poniżej przedstawiono podsumowanie użycia "
 "pamięci podręcznej Cantaty."
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:257
 msgid "Covers"
 msgstr "Okładki"
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:258
 msgid "Backdrops"
 msgstr "Tło"
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
+#: 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:246
+#: gui/cachesettings.cpp:264
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:265
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr "Katalogi podcastów"
+
+#: gui/cachesettings.cpp:273
 msgid "Delete All"
 msgstr "Usuń wszystko"
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:312
 msgid "Delete all '%1' items?"
 msgstr "Czy usunąć wszystkie '%1' elementów?"
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
 msgid "Delete Cache Items"
 msgstr "Usuń elementy pamięci podręcznej"
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:322
 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:150 gui/main.cpp:169
+#: gui/coverdialog.cpp:151 gui/main.cpp:231
 msgid "Last.fm"
 msgstr "Last.fm"
 
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:165
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1756,7 +1865,7 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:183
+#: gui/coverdialog.cpp:184
 msgctxt ""
 "Google\n"
 "width x height (file size)"
@@ -1767,7 +1876,7 @@ msgstr ""
 "Google\n"
 "%1 x %2 (%3)"
 
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:204
 msgctxt ""
 "Discogs\n"
 "width x height"
@@ -1778,7 +1887,7 @@ msgstr ""
 "Discogs\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:237
+#: gui/coverdialog.cpp:238
 msgctxt ""
 "Current Cover\n"
 "width x height"
@@ -1789,28 +1898,28 @@ msgstr ""
 "Obecna okładka\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:256
 msgid "Image"
 msgstr "Obraz"
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:259
 msgid "Downloading..."
 msgstr "Pobieranie..."
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Obraz (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:432
 msgid ""
 "<p>An image already exists for this artist, and the file is not writeable."
 "<p></p><i>%1</i></p>"
 msgstr ""
-"<p>Obraz dla tego artysty już istnieje a plik nie jest do zapisu.<p></p><i>%"
-"1</i></p>"
+"<p>Obraz dla tego artysty już istnieje a plik nie jest do zapisu.<p></p><i>"
+"%1</i></p>"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:433
 msgid ""
 "<p>A cover already exists for this album, and the file is not writeable.<p></"
 "p><i>%1</i></p>"
@@ -1818,13 +1927,13 @@ msgstr ""
 "<p>Okładka dla tego albumu już istnieje a plik nie jest do zapisu.<p></p><i>"
 "%1</i></p>"
 
-#: gui/coverdialog.cpp:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
+#: 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:613
+#: gui/coverdialog.cpp:579
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1832,37 +1941,44 @@ msgstr ""
 "Ustawienie okładki nie powiodło się!\n"
 "Nie można pobrać do pliku tymczasowego!"
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:607
 msgid "Failed to download image!"
 msgstr "Pobieranie obrazu nie powiodło się!"
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
 msgid "Load Local Cover"
 msgstr "Załaduj okładkę lokalną"
 
-#: gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:795
 msgid "Images (*.png *.jpg)"
 msgstr "Obrazy (*.png *.jpg)"
 
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:800
 msgid "File is already in list!"
 msgstr "Plik istnieje już na liście!"
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:804
 msgid "Failed to read image!"
 msgstr "Odczyt obrazu nie powiódł się!"
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:817
 msgid "Display"
 msgstr "Wyświetl"
 
 #. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
 msgid "Remove"
 msgstr "Usuń"
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1181
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1870,7 +1986,7 @@ msgstr ""
 "Ustawienie okładki nie powiodło się!\n"
 "Nie można wykonać kopii!"
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1190
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1878,7 +1994,7 @@ msgstr ""
 "Failed to set cover!\n"
 "Nie można zrobić kopii zapasowej oryginału!"
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1239
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1891,123 +2007,159 @@ msgstr ""
 msgid "Open In File Manager"
 msgstr "Otwórz w menedżerze plików"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Established"
 msgstr "Nawiązano połączenie"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Failed"
 msgstr "Połączenie nie powiodło się"
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. 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
+#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
+#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
 msgid "None"
 msgstr "Brak"
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:40
 msgid "Small"
 msgstr "Małe"
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:41
 msgid "Medium"
 msgstr "Średnie"
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:42
 msgid "Large"
 msgstr "Duże"
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:43
 msgid "Extra Large"
 msgstr "Bardzo duże"
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:48
 msgid "Simple Tree"
 msgstr "Proste drzewo"
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:49
 msgid "Detailed Tree"
 msgstr "Szczegółowe drzewo"
 
 #. i18n: file: gui/interfacesettings.ui:329
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
 msgid "Grouped Albums"
 msgstr "Grupuj Albumy"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:53
 msgid "List"
 msgstr "Lista"
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:55
 msgid "Icon/List"
 msgstr "Ikony/Lista"
 
-#: gui/interfacesettings.cpp:85
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+msgstr "Katalogi"
+
+#. 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)
+#: 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
+msgid "Style:"
+msgstr "Styl:"
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr "On-line"
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr "Urządzenia"
+
+#: gui/interfacesettings.cpp:178
 msgid "Grouped by 'Album Artist'"
 msgstr "Pogrupowane według 'Artysta albumu'"
 
-#: gui/interfacesettings.cpp:86
+#: gui/interfacesettings.cpp:179
 msgid "Grouped under 'Various Artists'"
 msgstr "Pogrupowane według 'Various Artists'"
 
-#: 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/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
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:152
+#: gui/main.cpp:214
 msgid "A KDE client for MPD"
 msgstr "Klient KDE dla odtwarzacza MPD "
 
-#: gui/main.cpp:154
-msgid "Copyright (C) 2011-2013 Craig Drummond"
-msgstr "Copyright (C) 2011-2013 Craig Drummond"
+#: gui/main.cpp:216
+msgid "Copyright (c) 2011–2013 Craig Drummond"
+msgstr "Copyright (c) 2011–2013 Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Maintainer"
 msgstr "Opiekun"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "UI Improvements"
 msgstr "Poprawki interfejsu"
 
-#: gui/main.cpp:160
+#: gui/main.cpp:222
 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:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
 msgid "QtMPC author"
 msgstr "Autor QtMPC"
 
-#: gui/main.cpp:161
+#: gui/main.cpp:223
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:162
+#: gui/main.cpp:224
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:163
+#: gui/main.cpp:225
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
@@ -2015,125 +2167,101 @@ msgstr ""
 "Tła widoku kontekstowego (proszę rozpatrzeć przesłanie własnych obrazów na "
 "fanart.tv)"
 
-#: gui/main.cpp:168
+#: gui/main.cpp:230
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:230 gui/main.cpp:231
 msgid "Context view metadata"
 msgstr "Metadane widoku kontekstowego"
 
-#: gui/main.cpp:173
+#: gui/main.cpp:235
 msgid "URL to open"
 msgstr "URL do otwarcia"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:238
 msgid "Quit"
 msgstr "Zamknij"
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:242
 msgid "Show Window"
 msgstr "Pokaż okno"
 
-#. 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:245 po/rc.cpp:418 rc.cpp:418
 msgid "Connect"
 msgstr "Połącz"
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
 msgid "Collection"
 msgstr "Kolekcja"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:247
 msgid "Outputs"
 msgstr "Wyjścia"
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr "Poprzedni utwór"
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr "Następny utwór"
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr "Odtwarzaj/Wstrzymaj"
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr "Zatrzymaj po obecnym utworze"
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Zatrzymaj po utworze"
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr "Zwiększ głośność"
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr "Zmniejsz głośność"
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr "Wycisz"
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:249
 msgid "Add To Stored Playlist"
 msgstr "Dodaj do zapisanej playlisty"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:250
 msgid "Remove From Play Queue"
 msgstr "Usuń z kolejki odtwarzania"
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:251
 msgid "Copy Track Info"
 msgstr "Skopiuj informację o utworze"
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:252
 msgid "Crop"
 msgstr "Usuń wszystkie poza"
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
-msgstr "Wymieszaj"
+#: gui/mainwindow.cpp:253
+msgid "Shuffle Tracks"
+msgstr "Wymieszaj utwory"
+
+#: gui/mainwindow.cpp:254
+msgid "Shuffle Albums"
+msgstr "Wymieszaj albumy"
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:255
 msgid "Add Stream URL"
 msgstr "Dodaj URL strumienia"
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:256
 msgid "Clear"
 msgstr "Wyczyść"
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:257
 msgid "Expanded Interface"
 msgstr "Interfejs rozszerzony"
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:258
 msgid "Show Current Song Information"
 msgstr "Pokaż informacje o obecnym utworze"
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:261
 msgid "Full Screen"
 msgstr "Pełen ekran"
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:263
 msgid "Random"
 msgstr "Losowo"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:264
 msgid "Repeat"
 msgstr "Powtarzaj"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid "Single"
 msgstr "Tryb pojedynczy"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
@@ -2142,11 +2270,11 @@ msgstr ""
 "utworze; utwór jest zapętlany, jeśli dodatkowo jest włączony tryb "
 "'Powtarzaj'."
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid "Consume"
 msgstr "Tryb konsumowania"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
@@ -2154,121 +2282,127 @@ msgstr ""
 "Gdy tryb konsumowania jest aktywny, obecny utwór jest usuwany z kolejki po "
 "jego zakończeniu."
 
-#: gui/mainwindow.cpp:291
+#: gui/mainwindow.cpp:267
 msgid "Search Play Queue"
 msgstr "Szukaj w kolejce odtwarzania"
 
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:269
 msgid "Set Priority"
 msgstr "Ustaw priorytet"
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:271
 msgid "Play Stream"
 msgstr "Odtwarzaj strumień"
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:273
 msgid "Locate In Library"
 msgstr "Znajdź w bibliotece"
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:275
 msgid "Edit Song Tags"
 msgstr "Edytuj tagi utworów"
 
 #. i18n: file: gui/interfacesettings.ui:304
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
 msgid "Play Queue"
 msgstr "Kolejka odtwarzania"
 
 #. i18n: file: gui/interfacesettings.ui:27
 #. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:302 po/rc.cpp:455 rc.cpp:455
+#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
 msgid "Artists"
 msgstr "Artyści"
 
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr "Katalogi"
-
 #. 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
+#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
 msgid "Playlists"
 msgstr "Playlisty"
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:282
 msgid "Dynamic"
 msgstr "Dynamiczny"
 
-#: gui/mainwindow.cpp:308
-msgid "Online"
-msgstr "On-line"
-
-#: gui/mainwindow.cpp:310
-msgid "Devices"
-msgstr "Urządzenia"
-
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:288
 msgid "Expand All"
 msgstr "Rozwiń wszystkie"
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:289
 msgid "Collapse All"
 msgstr "Zwiń wszystkie"
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:290
+msgid "Remove All Songs"
+msgstr "Usuń wszystkie utwory"
+
+#: gui/mainwindow.cpp:398
 msgid "Info"
 msgstr "Informacje"
 
-#: gui/mainwindow.cpp:435
+#: gui/mainwindow.cpp:405
 msgid "Auto Hide"
 msgstr "Automatycznie ukryj"
 
-#: gui/mainwindow.cpp:441
+#: gui/mainwindow.cpp:411
 msgid "Monochrome Icons"
 msgstr "Ikony monochromatyczne"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:541
 msgid "Server information..."
 msgstr "Informacja serwera..."
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:552
 msgid "Configure Cantata..."
 msgstr "Konfiguruj Cantatę..."
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:559
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "O programie Cantata..."
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:571
 msgid "&File"
 msgstr "&Plik"
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:574
 msgid "&Settings"
 msgstr "&Ustawienia"
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
 msgid "&Help"
 msgstr "&Pomoc"
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:948
 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:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
 msgid "Connecting to %1"
 msgstr "Łączenie z %1"
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+"Trwa pobieranie podcastów\n"
+"\n"
+"Zamknięcie programu spowodowałoby przerwanie wszystkich pobrań."
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr "Anuluj pobieranie i zakończ"
+
+#: gui/mainwindow.cpp:1447
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "O programie Cantata"
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1448
 msgctxt "Qt-only"
 msgid ""
 "<b>Cantata %1</b><br/><br/>MPD client.<br/><br/>(c) Craig Drummond 2011-2013."
@@ -2276,57 +2410,54 @@ msgid ""
 "\">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.ht"
-"ml"
-"\">GPLv3</a>"
+"<br/>Wydano na warunkach licencji <a href=\"http://www.gnu.org/licenses/gpl."
+"html\">GPLv3</a>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1450
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 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> - (c) "
 "2007-2010  Autorzy QtMPC "
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1451
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
-"Tło widoku kontekstowego za uprzejmością <a href=\"http://www.fanart.tv\">"
-"FanArt.tv</a>"
+"Tło widoku kontekstowego za uprzejmością <a href=\"http://www.fanart.tv"
+"\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1452
 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 ""
-"Metadane widoku kontekstowego za uprzejmością <a "
-"href=\"http://www.wikipedia.org\">Wikipedii</a> i <a "
-"href=\"http://www.last.fm\">Last.fm</a>"
+"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:1468
+#: gui/mainwindow.cpp:1453
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
-"Proszę rozpatrzeć przesłanie własnych obrazów na <a "
-"href=\"http://www.fanart.tv\">FanArt.tv</a>"
+"Proszę rozpatrzeć przesłanie własnych obrazów na <a href=\"http://www.fanart."
+"tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1479
+#: gui/mainwindow.cpp:1464
 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>"
 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>"
+"</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:1487
+#: gui/mainwindow.cpp:1472
 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</"
@@ -2340,84 +2471,79 @@ msgstr ""
 "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>"
+"aktualizacja:</td><td>%6</td></tr></table></p>"
 
-#: gui/mainwindow.cpp:1496
+#: gui/mainwindow.cpp:1481
 msgid "Server Information"
 msgstr "Informacje serwera"
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1728
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1730
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1773
 msgid "(Stream)"
 msgstr "(Strumień)"
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1775
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr "Głośność wyłączona"
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1% (Muted)"
-msgstr "Głośność %1% (wyciszono)"
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
+msgstr "MPD zgłosił następujący błąd: %1"
 
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
-msgstr "Głośność %1%"
+#: gui/mainwindow.cpp:1990
+msgid "Remove all songs from play queue?"
+msgstr "Usunąć wszystkie utwory z kolejki odtwarzania?"
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
 msgid "Priority"
 msgstr "Priorytet"
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2080
 msgid "Enter priority (0..255):"
 msgstr "Wpisz priorytet (0..255):"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Playlist Name"
 msgstr "Nazwa playlisty"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Enter a name for the playlist:"
 msgstr "Proszę wpisać nazwę dla playlisty:"
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2106
 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:2146
+#: gui/mainwindow.cpp:2107
 msgid "Existing Playlist"
 msgstr "Istniejąca playlista"
 
@@ -2429,10 +2555,10 @@ msgstr "Nie wyciszaj"
 msgid " ms"
 msgstr " ms"
 
-#. i18n: file: devices/albumdetails.ui:152
+#. i18n: file: devices/albumdetails.ui:165
 #. 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:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
 msgid "Track"
 msgstr "Utwór"
 
@@ -2440,7 +2566,7 @@ msgstr "Utwór"
 msgid "Auto"
 msgstr "Automatycznie"
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:164
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2450,7 +2576,7 @@ msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:26
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
@@ -2458,7 +2584,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:153
+#: gui/playbacksettings.cpp:174
 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 "
@@ -2468,26 +2594,26 @@ 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>ReplayGain jest propozycją standardu opublikowaną w 2001, której celem "
 "jest normalizacja odczuwanej głośności komputerowych formatów audio takich "
 "jak MP3 lub Ogg Vorbis. Działa na podstawie utworu/albumu i jest obsługiwany "
 "przez rosnącą liczbę odtwarzaczy.</p><p>Następujące ustawienia ReplayGain "
-"mogą zostać użyte: "
-"<ul><li><i>Brak</i> - ReplayGain nie jest stosowany.</li><li><i>Utwór</i> - "
-"Głośność jest dostosowywana na podstawie tagu ReplayGain utworu.</li><li><i>"
-"Album</i> - Głośność jest dostosowywana na podstawie tagu ReplayGain albumu.<"
-"/li><li><i>Automatycznie</i> - Głośność jest dostosowywana na podstawie tagu "
-"ReplayGain utworu gdy kolejność odtwarzania jest losowa. W przeciwnym wypadku "
-"użyty jest tag albumu.</li></ul></p>"
-
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:759 tags/trackorganiser.cpp:65
+"mogą zostać użyte: <ul><li><i>Brak</i> - ReplayGain nie jest stosowany.</"
+"li><li><i>Utwór</i> - Głośność jest dostosowywana na podstawie tagu "
+"ReplayGain utworu.</li><li><i>Album</i> - Głośność jest dostosowywana na "
+"podstawie tagu ReplayGain albumu.</li><li><i>Automatycznie</i> - Głośność "
+"jest dostosowywana na podstawie tagu ReplayGain utworu gdy kolejność "
+"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
 msgid "Rename"
 msgstr "Zmień nazwę"
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:190
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2495,106 +2621,116 @@ msgstr ""
 "Czy jesteś pewien, że chcesz usunąć zaznaczone playlisty?\n"
 "Ta operacja nie może zostać cofnięta."
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:191
 msgid "Remove Playlists"
 msgstr "Usuń playlisty"
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
 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:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
 msgid "Overwrite Playlist"
 msgstr "Nadpisz playlisty"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Rename Playlist"
 msgstr "Zmiana nazwy playlisty"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Enter new name for playlist:"
 msgstr "Proszę wpisać nową nazwę dla playlisty:"
 
-#: gui/preferencesdialog.cpp:77
+#: gui/preferencesdialog.cpp:80
 msgid "Collection Settings"
 msgstr "Ustawienia kolekcji"
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
 msgid "Playback"
 msgstr "Odtwarzanie"
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:81
 msgid "Playback Settings"
 msgstr "Ustawienia odtwarzania"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "Files"
 msgstr "Pliki"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "File Settings"
 msgstr "Ustawienia pliku"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface"
 msgstr "Interfejs"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface Settings"
 msgstr "Ustawienia interfejsu"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:85
+msgid "Streams Settings"
+msgstr "Ustawienia strumieni"
+
+#: gui/preferencesdialog.cpp:89
+msgid "Online Providers"
+msgstr "Dostawcy online"
+
+#: gui/preferencesdialog.cpp:92
 msgid "Context"
 msgstr "Kontekst"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:92
 msgid "Context View Settings"
 msgstr "Ustawienia widoku kontekstowego"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server"
 msgstr "Serwer HTTP"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server Settings"
 msgstr "Ustawienia serwera HTTP"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:103
 msgid "Audio CD Settings"
 msgstr "Ustawienia płyt audio"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgid "Proxy"
 msgstr "Proxy"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Ustawienia Proxy"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Skróty"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Ustawienia skrótów klawiszowych"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cache"
 msgstr "Pamięć podręczna"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cached Items"
 msgstr "Elementy w pamięci podręcznej"
 
-#: gui/preferencesdialog.cpp:118
+#: gui/preferencesdialog.cpp:116
 msgid "Configure"
 msgstr "Konfiguruj"
 
-#: gui/serversettings.cpp:75
+#: gui/serversettings.cpp:87
 msgid ""
 "<i> This folder will also be used to locate music files for transferring to "
 "(and from) devices.</i>"
@@ -2602,7 +2738,7 @@ 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:88
+#: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr "Nie używany"
 
@@ -2618,12 +2754,12 @@ 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: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:208 po/rc.cpp:247 po/rc.cpp:705
+#: rc.cpp:208 rc.cpp:247 rc.cpp:705
 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 "
@@ -2638,7 +2774,7 @@ msgstr ""
 "na odpowiednim komputerze - Cantata nie jest w stanie kontrolować "
 "uruchamiania i zamykania tej usługi.</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 "
@@ -2656,7 +2792,7 @@ msgstr ""
 "Jeśli nie ustawiono tej opcji, Cantata będzie używała osobnej instancji "
 "dynamizera dla każdego użytkownika.</i>"
 
-#: gui/serversettings.cpp:109
+#: 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 "
@@ -2665,10 +2801,10 @@ msgid ""
 msgstr ""
 "<p>Nazwa pliku (bez rozszerzenia) do zapisu okładek.<br/>Przy pozostawieniu "
 "tego pola pustego, nazwa 'cover' zostanie użyta.<br/><br/><i>%artist% "
-"zostanie zastąpiony przez nazwę artysty albumu obecnego utworu, natomiast %"
-"album% zostanie zastąpiony przez nazwę albumu.</i></p>"
+"zostanie zastąpiony przez nazwę artysty albumu obecnego utworu, natomiast "
+"%album% zostanie zastąpiony przez nazwę albumu.</i></p>"
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:252
 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</"
@@ -2681,127 +2817,202 @@ msgstr ""
 "współdzielona z innymi i Cantata skonfiguruje i będzie kontrolować instancję "
 "MPD</li></ul>"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Add Collection"
 msgstr "Dodaj kolekcję"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Standard"
 msgstr "Standardowa"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Basic"
 msgstr "Podstawowa"
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:297
 msgid "Delete <b>%1</b>?"
 msgstr "Usunąć <b>%1</b>?"
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:298
 msgid "Delete"
 msgstr "Usuń"
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:336
 msgid "New Collection %1"
 msgstr "Nowa kolekcja %1"
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
 msgid "Default"
 msgstr "Domyślne"
 
-#: gui/stdactions.cpp:55
-msgid "Save As"
-msgstr "Zapisz jako"
-
-#: gui/stdactions.cpp:56
-msgid "Add To Play Queue"
-msgstr "Dodaj do kolejki odtwarzania"
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
+msgstr "Klawisze multimedialne"
 
-#: gui/stdactions.cpp:57
-msgid "Replace Play Queue"
-msgstr "Zastąp kolejkę odtwarzania"
+#: gui/shortcutssettingspage.cpp:80
+msgid "Do not use media keys to control Cantata"
+msgstr "Nie używaj klawiszy multimedialnych do kontrolowania Cantaty"
 
-#: gui/stdactions.cpp:58
-msgid "Add With Priority"
-msgstr "Dodaj z priorytetem"
+#: gui/shortcutssettingspage.cpp:81
+msgid "Use media keys to control Cantata"
+msgstr "Użyj klawiszy multimedialnych do kontrolowania Cantaty"
 
-#: gui/stdactions.cpp:59
-msgid "Highest Priority (255)"
-msgstr "Najwyższy priorytet (255)"
+#: gui/shortcutssettingspage.cpp:84
+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/stdactions.cpp:60
+#: gui/shortcutssettingspage.cpp:85
+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
+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"
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr "Następny utwór"
+
+#: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr "Odtwarzaj/Wstrzymaj"
+
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr "Zatrzymaj po obecnym utworze"
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr "Zwiększ głośność"
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr "Zmniejsz głośność"
+
+#: gui/stdactions.cpp:63
+msgid "Save As"
+msgstr "Zapisz jako"
+
+#: gui/stdactions.cpp:64
+msgid "Add To Play Queue"
+msgstr "Dodaj do kolejki odtwarzania"
+
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr "Dodaj albumy w losowej kolejności"
+
+#: gui/stdactions.cpp:66
+msgid "Replace Play Queue"
+msgstr "Zastąp kolejkę odtwarzania"
+
+#: gui/stdactions.cpp:67
+msgid "Add With Priority"
+msgstr "Dodaj z priorytetem"
+
+#: gui/stdactions.cpp:68
+msgid "Highest Priority (255)"
+msgstr "Najwyższy priorytet (255)"
+
+#: gui/stdactions.cpp:69
 msgid "High Priority (200)"
 msgstr "Wysoki priorytet (200)"
 
-#: gui/stdactions.cpp:61
+#: gui/stdactions.cpp:70
 msgid "Medium Priority (125)"
 msgstr "Średni priorytet (125)"
 
-#: gui/stdactions.cpp:62
+#: gui/stdactions.cpp:71
 msgid "Low Priority (50)"
 msgstr "Niski priorytet (50)"
 
-#: gui/stdactions.cpp:63
+#: gui/stdactions.cpp:72
 msgid "Default Priority (0)"
 msgstr "Domyślny priorytet (0)"
 
-#: gui/stdactions.cpp:64
+#: gui/stdactions.cpp:73
 msgid "Custom Priority..."
 msgstr "Inny priorytet..."
 
-#: gui/stdactions.cpp:65
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr "Dodaj do playlisty"
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
 msgid "Organize Files"
 msgstr "Organizuj pliki"
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
 msgstr "Edytuj tagi"
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 msgid "Copy Songs To Device"
 msgstr "Skopiuj utwory do urządzenia"
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 msgid "Set Image"
 msgstr "Ustaw obraz"
 
-#: gui/stdactions.cpp:79
+#: gui/stdactions.cpp:88
 msgid "Refresh Database"
 msgstr "Odśwież bazę danych"
 
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Wstecz"
 
-#: gui/trayitem.cpp:165
+#: gui/trayitem.cpp:192
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 na %2"
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:193
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 na %2 (%3)"
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:195
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 w wykonaniu %2 z %3"
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:196
 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:196
+#: gui/trayitem.cpp:223
 msgid "Now playing"
 msgstr "Teraz odtwarzane"
 
@@ -2825,6 +3036,16 @@ msgstr "Pierwszy aktywny interfejs"
 msgid "Inactive"
 msgstr "Nieaktywny"
 
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr "Plik .cue"
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr "Playlista"
+
 #: models/devicesmodel.cpp:108
 msgid "Configure Device"
 msgstr "Konfiguruj urządzenie"
@@ -2845,7 +3066,7 @@ msgstr "Rozłącz urządzenie"
 msgid "Edit CD Details"
 msgstr "Edytuj szczegóły CD"
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:690
 msgid "No Devices Attached"
 msgstr "Brak podłączonych urządzeń"
 
@@ -2857,28 +3078,28 @@ msgstr "Nie zalogowano"
 msgid "Logged in"
 msgstr "Zalogowano"
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 msgid "Unknown error"
 msgstr "Nieznany błąd"
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr "Brak subskrypcji"
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr "Nie ma aktywnych subskrypcji"
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr "Zalogowano (wygaśnięcie: %1)"
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr "Sesja wygasła"
 
 #: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "1 Element"
@@ -2889,198 +3110,227 @@ msgstr[2] "%1 Elementów"
 msgid "Audio File"
 msgstr "Plik audio"
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr "Playlista"
-
-#: models/dirviewmodel.cpp:192 models/musicmodel.cpp:120
-msgid "Cue Sheet"
-msgstr "Plik .cue"
-
-#: models/musiclibraryitemartist.cpp:218 models/musiclibraryitemartist.cpp:231
-#: models/musiclibraryitemroot.cpp:798
+#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
 msgid "Single Tracks"
 msgstr "Pojedyncze utwory"
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "1 Utwór"
 msgstr[1] "%1 Utwory"
 msgstr[2] "%1 Utworów"
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:185
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "1 Artysta"
 msgstr[1] "%1 Artystów"
 msgstr[2] "%1 Artystów"
 
-#: models/musicmodel.cpp:172
+#: models/musicmodel.cpp:192
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "1 Album"
 msgstr[1] "%1 Albumy"
 msgstr[2] "%1 Albumów"
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
-msgstr "Konfiguruj serwisy on-line"
+#: models/musicmodel.cpp:198
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] "1 Odcinek"
+msgstr[1] "%1 Odcinki"
+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
+msgid "Configure Service"
+msgstr "Konfiguruj serwis"
+
+#: models/onlineservicesmodel.cpp:84
+msgid "Refresh Service"
+msgstr "Odśwież serwis"
+
+#: models/onlineservicesmodel.cpp:85
+msgid "Add Subscription"
+msgstr "Dodaj subskrypcję"
 
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
-msgstr "Odśwież serwis on-line"
+#: models/onlineservicesmodel.cpp:86
+msgid "Remove Subscription"
+msgstr "Usuń subskrypcję"
 
-#: models/onlineservicesmodel.cpp:125
+#: models/onlineservicesmodel.cpp:87
+msgid "Refresh Subscription"
+msgstr "Odśwież subskrypcję"
+
+#: models/onlineservicesmodel.cpp:137
 msgid "Last Search:%1"
 msgstr "Ostatnie wyszukiwanie:%1"
 
-#: models/onlineservicesmodel.cpp:136
+#: models/onlineservicesmodel.cpp:149
 msgid "Searching..."
 msgstr "Szukanie..."
 
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:670
 msgid "Not Loaded"
 msgstr "Nie załadowano"
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:155
 msgid "Use search to locate tracks"
 msgstr "Użyj wyszukiwania do odnalezienia utworów"
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:166
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] "1 Podcast"
+msgstr[1] "%1 Podcasty"
+msgstr[2] "%1 Podcastów"
+
+#: models/onlineservicesmodel.cpp:177
+msgid "(Downloading: %1%)"
+msgstr "(Pobieranie: %1%)"
+
+#: models/onlineservicesmodel.cpp:235
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: models/playlistsmodel.cpp:77
 msgid "New Playlist..."
 msgstr "Nowa playlista..."
 
-#: models/playqueuemodel.cpp:105
+#: models/playqueuemodel.cpp:102
 msgctxt "Track Number (#)"
 msgid "#"
 msgstr "#"
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:103
 msgid "Length"
 msgstr "Długość"
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:104
 msgid "Disc"
 msgstr "Płyta"
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:138
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
 msgid "Year"
 msgstr "Rok"
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:360
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Priorytet: %1)</b>"
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
 msgid "Loading..."
 msgstr "Ładowanie..."
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:286
 msgid "Bookmarks"
 msgstr "Zakładki"
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:560
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:563
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:564
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:567
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:568
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:569
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:570
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:571
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:572
 msgid "Favorites"
 msgstr "Favourites"
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr "Słuchaj na żywo"
+
+#: models/streamsmodel.cpp:578
 msgid "Bookmark Category"
 msgstr "Kategoria zakładek"
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:579
 msgid "Add Stream To Favorites"
 msgstr "Dodaj strumień do ulubionych"
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:580
 msgid "Configure Streams"
 msgstr "Konfiguruj strumienie"
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:660
 msgid "%1 (Read-Only)"
 msgstr "%1 (Tylko do odczytu)"
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1241
 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:1455
+#: models/streamsmodel.cpp:1639
 msgid "All"
 msgstr "Wszystkie"
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr "Słuchaj na żywo"
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:154
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "\"%1\""
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:156
 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:372 mpd/mpdconnection.cpp:415
+#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
+#: mpd/mpdconnection.cpp:1036
 msgid "Connection to %1 failed"
 msgstr "Łączenie się z %1 nie powiodło się"
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Połączenie z %1 nie powiodło się - nieprawidłowe hasło"
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:455
 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:472
+#: mpd/mpdconnection.cpp:491
 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:474
+#: mpd/mpdconnection.cpp:493
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
@@ -3088,38 +3338,31 @@ msgstr ""
 "Załadowanie nie powiodło się. MPD może odtwarzać lokalne pliki tylko gdy "
 "jest połączony poprzez lokalne gniazdo."
 
-#: mpd/mpdconnection.cpp:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Wysyłanie komendy nie powiodło się. Rozłączono z %1"
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1171
 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:1158
+#: mpd/mpdconnection.cpp:1183
 msgid "Failed to save <b>%1</b>"
 msgstr "Zapisanie <b>%1</b> nie powiodło się"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1196
 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:1174
+#: mpd/mpdconnection.cpp:1199
 msgid "You cannot add a playlist to another playlist!"
 msgstr "Nie można dodać playlisty do innej playlisty!"
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] "1 dzień %2"
-msgstr[1] "%1 dni %2"
-msgstr[2] "%1 dni %2"
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr "Osobiste"
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:343
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3161,19 +3404,19 @@ msgstr "Ogg"
 msgid "Streaming format:"
 msgstr "Format strumienia:"
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr "Strumieniowanie"
 
-#: 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"
 
@@ -3181,10 +3424,6 @@ msgstr "WAV"
 msgid "Magnatune Settings"
 msgstr "Ustawienia Magnatune"
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr "Członkostwo:"
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -3193,8 +3432,8 @@ msgstr "Członkostwo:"
 #. 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:711 po/rc.cpp:729
+#: rc.cpp:711 rc.cpp:729
 msgid "Username:"
 msgstr "Użytkownik:"
 
@@ -3202,7 +3441,7 @@ msgstr "Użytkownik:"
 #. 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)
@@ -3214,7 +3453,7 @@ msgstr "Użytkownik:"
 #. 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)
@@ -3222,53 +3461,269 @@ 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: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: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
 msgid "Password:"
 msgstr "Hasło:"
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr "Członkostwo:"
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr "Pobieranie:"
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr "Pobieranie"
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr "Uaktualnianie wyświetlanych elementów"
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr "Grupowanie utworów"
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr "Przetwarzanie odpowiedzi"
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr "Parsowanie nie powiodło się"
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr "Pobieranie nie powiodło się"
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
 msgstr "Pobierz do biblioteki"
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
+msgid "Search For Podcasts"
+msgstr "Szukaj podcastów"
+
+#: online/onlineservicespage.cpp:63
+msgid "Download Podcast Episodes"
+msgstr "Pobierz odcinki podcastu"
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr "Usuń pobrane odcinki podcastu"
+
+#: online/onlineservicespage.cpp:329
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Szukaj %1:"
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:464
 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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr "Usunąć subskrypcję <b>%1</b>?"
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr "Odświeżyć listę podcastów?"
+
+#: online/onlineservicespage.cpp:621
+msgid "Refresh episode listing from <b>%1</b>?"
+msgstr "Odświeżyć listę podcastów z <b>%1</b>?"
+
+#: online/onlineservicespage.cpp:695
+msgid "All selected podcasts have already been downloaded!"
+msgstr "Wszystkie zaznaczone podcasty zostały już pobrane!"
+
+#: online/onlineservicespage.cpp:699
+msgid "Do you wish to download the following podcast episode?"
+msgstr "Czy pobrać następujący odcinek podcastu?"
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr "Czy pobrać następujące odcinki podcastu?"
+
+#: online/onlineservicespage.cpp:705
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr "Czy pobrać zaznaczone odcinki podcastu?"
+
+#: online/onlineservicespage.cpp:753
+msgid "All selected downloaded podcast episodes have already been deleted!"
+msgstr "Wszystkie zaznaczone odcinki zostały już usunięte?"
+
+#: online/onlineservicespage.cpp:757
+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
+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
+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
+msgid "RSS:"
+msgstr "RSS:"
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr "Strona:"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Podcast details"
+msgstr "Szczegóły podcastu"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Select a podcast to display its details"
+msgstr "Zaznacz podcast aby wyświetlić jego szczegóły"
+
+#: online/podcastsearchdialog.cpp:322
+msgid "Enter search term..."
+msgstr "Wprowadź termin do wyszukiwania..."
+
+#: online/podcastsearchdialog.cpp:372
+msgid "Failed to fetch podcasts from %1"
+msgstr "Pobieranie podcastów z %1 nie powiodło się"
+
+#: online/podcastsearchdialog.cpp:378
+msgid "There was a problem parsing the response from %1"
+msgstr "Wystąpił problem podczas parsowania odpowiedzi z %1"
+
+#: online/podcastsearchdialog.cpp:439
+msgid "Failed to download directory listing"
+msgstr "Pobranie listingu katalogów nie powiodło się"
+
+#: online/podcastsearchdialog.cpp:447
+msgid "Failed to parse directory listing"
+msgstr "Parsowanie listingu katalogów nie powiodło się"
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr "Subskrybuj"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search %1"
+msgstr "Szukaj %1"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr "Szukaj podcastów na %1"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr "Przeglądaj %1"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr "Przeglądaj %1 podcastów"
+
+#: online/podcastsearchdialog.cpp:602
+msgid "Subscription added"
+msgstr "Dodano subskrypcję"
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr "Subskrypcja do danego podcastu już istnieje!"
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr "Podcasty"
+
+#: online/podcastservice.cpp:284
+msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
+msgstr ""
+"Cantata obsługuje jedynie podcasty audio! %1 zawiera wyłącznie podcasty wideo."
+
+#: online/podcastservice.cpp:286
+msgid "Failed to parse %1"
+msgstr "Parsowanie %1 nie powiodło się"
+
+#: online/podcastservice.cpp:290
+msgid "Failed to download %1"
+msgstr "Pobieranie %1 nie powiodło się"
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr "Sprawdź w poszukiwaniu nowych odcinków:"
+
+#: online/podcastsettingsdialog.cpp:59
+msgid "Download episodes to:"
+msgstr "Pobierz odcinki do:"
+
+#: online/podcastsettingsdialog.cpp:60
+msgid "Automatically download new episodes:"
+msgstr "Automatycznie pobieraj odcinki:"
+
+#: online/podcastsettingsdialog.cpp:82
+msgid "Podcast Settings"
+msgstr "Ustawienia podcastów"
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr "Ręcznie"
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr "Co 15 minut"
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr "Co 30 minut"
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr "Co godzinę"
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr "Co 2 godziny"
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr "Co 6 godzin"
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr "Co 12 godzin"
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr "Codziennie"
+
+#: online/podcastsettingsdialog.cpp:92
+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
@@ -3304,8 +3759,8 @@ msgstr ""
 "jest zawsze w 100% prawidłowe, dlatego Cantata może wyświetlać tylko "
 "podstawowy wstęp każdego artykułu. W przypadku wybrania wyświetlania pełnego "
 "artykułu mogą pojawiać się błędy parsowania. Wtedy też trzeba usunąć "
-"wszystkie artykuły z pamięci podręcznej (używając strony 'Pamięć "
-"podręczna').<i>"
+"wszystkie artykuły z pamięci podręcznej (używając strony 'Pamięć podręczna')."
+"<i>"
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
@@ -3341,8 +3796,8 @@ msgstr "Kopiuj utwory z:"
 #. 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
-#: rc.cpp:49 rc.cpp:721
+#: 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
 msgid "TextLabel"
 msgstr "TextLabel"
 
@@ -3388,93 +3843,109 @@ msgstr "Do skopiowania:"
 msgid "Album Details"
 msgstr "Szczegóły albumu"
 
-#. i18n: file: devices/albumdetails.ui:60
+#. 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:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:73
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
+#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
 msgid "Genre:"
 msgstr "Gatunek:"
 
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:86
 #. 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:86
 #. 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:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
 msgid "Year:"
 msgstr "Rok:"
 
-#. 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 "Pojedynczy artysta:"
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:99
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #: po/rc.cpp:70 rc.cpp:70
 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/audiocdsettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:88 rc.cpp:88
 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:88 rc.cpp:88
+#: po/rc.cpp:91 rc.cpp:91
 msgid "Automatically lookup:"
 msgstr "Automatycznie wyszukaj w:"
 
 #. i18n: file: devices/audiocdsettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:94 rc.cpp:94
 msgid "Initially look up via:"
 msgstr "Najpierw wyszukaj poprzez:"
 
 #. i18n: file: devices/audiocdsettings.ui:52
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:97 rc.cpp:97
 msgid "CDDB Host:"
 msgstr "Host CDDB:"
 
 #. i18n: file: devices/audiocdsettings.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:100 rc.cpp:100
 msgid "CDDB Port:"
 msgstr "Port CDDB:"
 
 #. i18n: file: devices/audiocdsettings.ui:88
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:103 rc.cpp:103
 msgid "Audio Extraction"
 msgstr "Zgrywanie audio"
 
 #. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:103 rc.cpp:103
+#: 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:107
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:106 rc.cpp:106
+#: po/rc.cpp:109 rc.cpp:109
 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:109 rc.cpp:109
+#: po/rc.cpp:112 rc.cpp:112
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3484,62 +3955,62 @@ 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: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
 msgid "Music folder:"
 msgstr "Katalog z muzyką:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:118 rc.cpp:118
 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:118 rc.cpp:118
+#: po/rc.cpp:121 rc.cpp:121
 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:121 rc.cpp:121
+#: 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:124 rc.cpp:124
+#: 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:127 rc.cpp:127
+#: po/rc.cpp:130 rc.cpp:130
 msgid "Use cache:"
 msgstr "Używaj pamięci podręcznej:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:121
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:133 rc.cpp:133
 msgid "Default volume:"
 msgstr "Domyślny wolumin:"
 
@@ -3551,7 +4022,7 @@ msgstr "Domyślny wolumin:"
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
 #. 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:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
 msgid "Filenames"
 msgstr "Nazwy plików"
 
@@ -3563,7 +4034,7 @@ msgstr "Nazwy plików"
 #. 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
+#: 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:"
 
@@ -3575,7 +4046,7 @@ msgstr "Używaj jedynie znaków ASCII:"
 #. 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
+#: 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:"
 
@@ -3587,7 +4058,7 @@ msgstr "Zastąp spacje znakami podkreślenia:"
 #. 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
+#: 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:"
 
@@ -3599,7 +4070,7 @@ msgstr "Ignoruj 'The' w nazwach artystów:"
 #. 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:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
 msgid "Filename scheme:"
 msgstr "Schemat nazwy pliku:"
 
@@ -3611,79 +4082,79 @@ msgstr "Schemat nazwy pliku:"
 #. 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
+#: 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: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:154 rc.cpp:154
 msgid "Transcoding"
 msgstr "Konwertowanie"
 
 #. i18n: file: devices/devicepropertieswidget.ui:261
 #. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
+#: 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/filenameschemedialog.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:160 rc.cpp:160
 msgid "Example:"
 msgstr "Przykład:"
 
 #. i18n: file: devices/filenameschemedialog.ui:58
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:163 rc.cpp:163
 msgid "About filename schemes"
 msgstr "O schematach nazwy pliku"
 
-#. i18n: file: devices/filenameschemedialog.ui:82
+#. i18n: file: devices/filenameschemedialog.ui:70
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:166 rc.cpp:166
 msgid "Album Artist"
 msgstr "Artysta albumu"
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:77
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:169 rc.cpp:169
 msgid "Album Title"
 msgstr "Tytuł albumu"
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:91
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:175 rc.cpp:175
 msgid "Track Artist"
 msgstr "Artysta utworu"
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:98
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:178 rc.cpp:178
 msgid "Track Title"
 msgstr "Tytuł utworu"
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:117
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:181 rc.cpp:181
 msgid "Track Title (+Artist)"
 msgstr "Tytuł utworu (+Artysta)"
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:124
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:184 rc.cpp:184
 msgid "Track #"
 msgstr "Numer utworu"
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:131
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:187 rc.cpp:187
 msgid "CD #"
 msgstr "Numer CD"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:196 rc.cpp:196
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3693,17 +4164,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:162
 #. 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:162
 #. 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:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
 msgid "Type:"
 msgstr "Typ:"
 
@@ -3715,14 +4186,14 @@ 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:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
+#: rc.cpp:638
 msgid "Name:"
 msgstr "Nazwa:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#: po/rc.cpp:205 rc.cpp:205
 msgid "Options"
 msgstr "Opcje"
 
@@ -3730,7 +4201,7 @@ msgstr "Opcje"
 #. 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)
@@ -3740,14 +4211,14 @@ msgstr "Opcje"
 #. 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: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
 msgid "Port:"
 msgstr "Port:"
 
@@ -3763,7 +4234,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:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
 msgid "User:"
 msgstr "Użytkownik:"
 
@@ -3775,7 +4246,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:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
 msgid "Domain:"
 msgstr "Domena:"
 
@@ -3787,7 +4258,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:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
 msgid "Share:"
 msgstr "Udział:"
 
@@ -3799,7 +4270,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:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
 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 "
@@ -3812,7 +4283,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:223 rc.cpp:223
+#: po/rc.cpp:229 rc.cpp:229
 msgid "Service name:"
 msgstr "Nazwa serwisu:"
 
@@ -3824,19 +4295,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:250 po/rc.cpp:259 rc.cpp:250 rc.cpp:259
+#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
 msgid "Folder:"
 msgstr "Katalog:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:259 rc.cpp:259
 msgid "Extra Options:"
 msgstr "Opcje dodatkowe:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:262 rc.cpp:262
 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 "
@@ -3848,7 +4319,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:268 rc.cpp:268
 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, "
@@ -3860,114 +4331,114 @@ msgstr ""
 "zamontowanych katalogów. Normalne odtwarzacze muzyczne, podłączane przy "
 "użyciu USB, Cantata wyświetli automatycznie gdy zostaną podłączone.</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:271 rc.cpp:271
 msgid "No dynamizer port defined in server settings."
 msgstr "Nie ustawiono portu dynamizera w ustawieniach serwera."
 
-#. 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:274 rc.cpp:274
 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:271 rc.cpp:271
+#: po/rc.cpp:277 rc.cpp:277
 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:277 streams/streamspage.cpp:64 rc.cpp:277
+#: po/rc.cpp:283 streams/streamspage.cpp:62 rc.cpp:283
 msgid "Edit"
 msgstr "Edytuj"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:289 rc.cpp:289
 msgid "About Rules"
 msgstr "O regułach"
 
 #. i18n: file: dynamic/dynamicrule.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:295 rc.cpp:295
 msgid "Album Artist:"
 msgstr "Artysta albumu:"
 
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
+#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
 msgid "Album:"
 msgstr "Album:"
 
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:103
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:310 rc.cpp:310
 msgid "From Year:"
 msgstr "Od roku:"
 
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
 msgid "Any"
 msgstr "Dowolny"
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:126
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:316 rc.cpp:316
 msgid "To Year:"
 msgstr "Do roku:"
 
-#. i18n: file: dynamic/dynamicrule.ui:136
+#. i18n: file: dynamic/dynamicrule.ui:149
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
+#: po/rc.cpp:322 rc.cpp:322
 msgid "Exact match:"
 msgstr "Dokładne dopasowanie:"
 
-#. i18n: file: dynamic/dynamicrule.ui:160
+#. i18n: file: dynamic/dynamicrule.ui:173
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
+#: 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:165
+#. i18n: file: dynamic/dynamicrule.ui:178
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
+#: 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:173
+#. i18n: file: dynamic/dynamicrule.ui:186
 #. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
+#: po/rc.cpp:334 rc.cpp:334
 msgid "Artists similar to:"
 msgstr "Artyści podobni do:"
 
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:236
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:337 rc.cpp:337
 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:249
+#. i18n: file: dynamic/dynamicrule.ui:262
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:340 rc.cpp:340
 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>"
@@ -3977,73 +4448,80 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
+#: 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: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
+#: 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:717
+#. 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:717
+#. i18n: file: gui/initialsettingswizard.ui:716
 #. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
+#: 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:730
+#. 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:730
+#. i18n: file: gui/initialsettingswizard.ui:729
 #. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
+#: 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:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
+#. i18n: file: gui/filesettings.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
+#: 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:93
+#. i18n: file: gui/filesettings.ui:110
 #. 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: 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:364 rc.cpp:364
 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>UWAGA:</b> Jeśli w ustawieniach Cantaty wybrana zostanie opcja zapisu "
-"okładek lub tekstów w katalogu muzyki, a program nie ma dostępu lub "
+"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 "
 "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 "
@@ -4052,16 +4530,16 @@ 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:128
+#. i18n: file: gui/filesettings.ui:145
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:367 rc.cpp:367
 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>"
+"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>UWAGA:</b> Jeśli lokalizacja przechowywania strumieni zostanie "
 "zmieniona (np. przy zmianie opcji 'Zapisz listę ulubionych strumieni w "
@@ -4072,19 +4550,19 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:370 rc.cpp:370
 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:361 rc.cpp:361
+#: po/rc.cpp:373 rc.cpp:373
 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:364 rc.cpp:364
+#: po/rc.cpp:376 rc.cpp:376
 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 "
@@ -4095,24 +4573,23 @@ msgid ""
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
 "<html><head/><body><p>Cantata zaawansowanym i przyjaznym dla użytkownika "
-"klientem dla serwera Music Player Daemon "
-"(MPD). MPD jest aplikacją działającą w tle, która pozwala na odtwarzanie "
-"muzyki.</p><p>W celu uzyskania informacji "
-"na temat MPD prosimy o odwiedzenie strony <a href=\"http://www.musicpd.org\">"
-"<span style=\" text-decoration: underline; color:#0000ff;\">"
-"http://www.musicpd.org</span></a></p><p>Ten 'kreator konfiguracji' pomoże "
-"przy podstawowych ustawieniach potrzebnych do poprawnego działania programu "
-"Cantata.</p></body></html>"
+"klientem dla serwera Music Player Daemon (MPD). MPD jest aplikacją "
+"działającą w tle, która pozwala na odtwarzanie muzyki.</p><p>W celu "
+"uzyskania informacji na temat MPD prosimy o odwiedzenie strony <a href="
+"\"http://www.musicpd.org\"><span style=\" text-decoration: underline; color:"
+"#0000ff;\">http://www.musicpd.org</span></a></p><p>Ten 'kreator "
+"konfiguracji' pomoże przy podstawowych ustawieniach potrzebnych do "
+"poprawnego działania programu Cantata.</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:379 rc.cpp:379
 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:370 rc.cpp:370
+#: po/rc.cpp:382 rc.cpp:382
 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 "
@@ -4121,37 +4598,21 @@ msgid ""
 "(or startup) MPD:</p></body></html>"
 msgstr ""
 "<html><head/><body><p>Cantata zaawansowanym i przyjaznym dla użytkownika "
-"klientem dla serwera Music Player Daemon "
-"(MPD). MPD jest aplikacją działającą w tle, która pozwala na odtwarzanie "
-"muzyki. MPD może zostać uruchomione dla całego systemu lub dla każdego "
-"użytkownika. Proszę wybrać sposób, w jaki Cantata ma łączyć się z MPD podczas "
-"uruchamiania:</p></body></html>"
+"klientem dla serwera Music Player Daemon (MPD). MPD jest aplikacją "
+"działającą w tle, która pozwala na odtwarzanie muzyki. MPD może zostać "
+"uruchomione dla całego systemu lub dla każdego użytkownika. Proszę wybrać "
+"sposób, w jaki Cantata ma łączyć się z MPD podczas uruchamiania:</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 "Podstawowa konfiguracja dla pojedynczego użytkownika"
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:385 rc.cpp:385
 msgid "Standard multi-user/server setup"
 msgstr "Standardowa wielo-użytkownikowa/serwerowa konfiguracja"
 
-#. 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>Proszę wybrać tę opcję jeśli kolekcja muzyczna nie jest współdzielona z "
-"innymi a Cantata ma skonfigurować i kontrolować instancję MPD.</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:388 rc.cpp:388
 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 "
@@ -4166,9 +4627,25 @@ msgstr ""
 "MPD. Dlatego też należy upewnić się że serwer MPD jest skonfigurowany i "
 "działa poprawnie.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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>Proszę wybrać tę opcję jeśli kolekcja muzyczna nie jest współdzielona z "
+"innymi a Cantata ma skonfigurować i kontrolować instancję MPD.</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:397 rc.cpp:397
 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-"
@@ -4177,20 +4654,20 @@ msgid ""
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
 "<html><head/><body><p>W celu uzyskania informacji na temat MPD prosimy o "
-"odwiedzenie strony <a href=\"http://www.musicpd.org\"><span style=\" "
-"text-decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a>"
-"</p><p>Ten 'kreator konfiguracji' pomoże przy podstawowych ustawieniach "
+"odwiedzenie strony <a href=\"http://www.musicpd.org\"><span style=\" text-"
+"decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
+"p><p>Ten 'kreator konfiguracji' pomoże przy podstawowych ustawieniach "
 "potrzebnych do poprawnego działania programu Cantata.</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:400 rc.cpp:400
 msgid "Connection details"
 msgstr "Szczegóły połączenia"
 
-#. 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:403 rc.cpp:403
 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."
@@ -4199,21 +4676,21 @@ msgstr ""
 "Cantata. Proszę wpisać odpowiednie dane i użyć przycisku 'Połącz' aby "
 "przetestować połączenie."
 
-#. 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:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
 msgid "Host (or local socket):"
 msgstr "Host (albo gniazdo lokalne):"
 
-#. 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:421 rc.cpp:421
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
@@ -4222,15 +4699,15 @@ msgstr ""
 "okładek, tekstów, itp.</i>"
 
 # Polskie zasady pisowni wymagają, aby kropkę stawiać za nawiasem
-#. 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:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
 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>"
@@ -4238,27 +4715,27 @@ msgstr ""
 "<i><b>UWAGA:</b> Przy używaniu gniazda lokalnego konieczne jest ustawienie "
 "pełnej absolutnej ścieżki do gniazda. (Numer portu nie jest wymagany).</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:427 rc.cpp:427
 msgid "Music folder"
 msgstr "Katalog z muzyką"
 
-#. 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:430 rc.cpp:430
 msgid "Please choose the folder containing your music collection."
 msgstr "Proszę wybrać katalog zawierający kolekcję z muzyką."
 
-#. 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:436 rc.cpp:436
 msgid "Covers, Lyrics, and Streams"
 msgstr "Okładki, teksty i strumienie"
 
-#. 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:439 rc.cpp:439
 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 "
@@ -4272,9 +4749,32 @@ msgstr ""
 "przechowywać odpowiednie pliki w folderze muzyki, czy w prywatnym folderze "
 "pamięci podręcznej.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:808
+#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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>UWAGA:</b> Jeśli w ustawieniach Cantaty wybrana zostanie opcja zapisu "
+"okładek lub tekstów w katalogu muzyki, a program nie ma dostępu 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 "
+"dodawania lub edycji strumieni. Jeśli nie wybrano opcji zapisu strumieni w "
+"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:443 rc.cpp:443
+#: po/rc.cpp:457 rc.cpp:457
 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 "
@@ -4284,15 +4784,15 @@ msgstr ""
 "obecnie nie potrafi wysyłać plików do zewnętrznych serwerów HTTP. Dlatego "
 "powyższe ustawienie powinno zostać wyłączone.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:841
+#. i18n: file: gui/initialsettingswizard.ui:857
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:460 rc.cpp:460
 msgid "Finished!"
 msgstr "Zakończono!"
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:880
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:463 rc.cpp:463
 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 "
@@ -4303,9 +4803,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:902
+#. i18n: file: gui/initialsettingswizard.ui:918
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:466 rc.cpp:466
 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 "
@@ -4319,27 +4819,6 @@ 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: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 "Styl:"
-
 #. i18n: file: gui/interfacesettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
@@ -4348,25 +4827,25 @@ msgstr "Styl:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
 #. 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:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
 msgid "Covers:"
 msgstr "Okładki:"
 
 #. i18n: file: gui/interfacesettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
+#: po/rc.cpp:478 rc.cpp:478
 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:467 rc.cpp:467
+#: po/rc.cpp:481 rc.cpp:481
 msgid "Show album year:"
 msgstr "Pokaż rok albumu:"
 
 #. i18n: file: gui/interfacesettings.ui:123
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:484 rc.cpp:484
 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"
@@ -4385,25 +4864,25 @@ msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:172
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:497 rc.cpp:497
 msgid "Sort albums:"
 msgstr "Sortuj albumy:"
 
 #. i18n: file: gui/interfacesettings.ui:183
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Album/Artist"
 msgstr "Album/Artysta"
 
 #. i18n: file: gui/interfacesettings.ui:188
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:503 rc.cpp:503
 msgid "Artist/Album"
 msgstr "Artysta/Album"
 
 #. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:506 rc.cpp:506
 msgid "Artist/Year/Album"
 msgstr "Artysta/Rok/Album"
 
@@ -4415,55 +4894,55 @@ msgstr "Artysta/Rok/Album"
 #. 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
+#: 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: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:518 rc.cpp:518
 msgid "Other Views"
 msgstr "Inne widoki"
 
 #. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
 msgid "Folder view style:"
 msgstr "Styl widoku katalogów:"
 
 #. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
 msgid "Streams view style:"
 msgstr "Styl widoku strumieni:"
 
 #. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Online view style:"
 msgstr "Styl widoku serwisów on-line:"
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:530 rc.cpp:530
 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:525 rc.cpp:525
+#: 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:534 rc.cpp:534
+#: 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:537 rc.cpp:537
+#: po/rc.cpp:551 rc.cpp:551
 msgid "Scroll to current track:"
 msgstr "Przewiń do obecnego utworu:"
 
@@ -4471,73 +4950,79 @@ msgstr "Przewiń do obecnego utworu:"
 # (ale nie oryginalne brzmnienie)
 #. i18n: file: gui/interfacesettings.ui:384
 #. i18n: ectx: property (text), widget (BuddyLabel, playQueueBackgroundLabel)
-#: po/rc.cpp:540 rc.cpp:540
+#: 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:398
+#. 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: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:560 rc.cpp:560
 msgid "External"
 msgstr "Zewnętrzne"
 
-#. i18n: file: gui/interfacesettings.ui:404
+#. i18n: file: gui/interfacesettings.ui:417
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
+#: po/rc.cpp:563 rc.cpp:563
 msgid "Show icon in notification area:"
 msgstr "Pokarz ikonę w tacce systemowej:"
 
-#. i18n: file: gui/interfacesettings.ui:424
+#. i18n: file: gui/interfacesettings.ui:437
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
+#: 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:444
+#. i18n: file: gui/interfacesettings.ui:457
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
+#: 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:461
-#. i18n: ectx: property (text), widget (BuddyLabel, gnomeMediaKeysLabel)
-#: po/rc.cpp:555 rc.cpp:555
-msgid "Support media keys under GNOME/Unity:"
-msgstr "Obsługa klawiszy multimedialnych w środowiskach GNOME/Unity:"
-
 #. i18n: file: gui/interfacesettings.ui:475
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
+#: po/rc.cpp:572 rc.cpp:572
 msgid "General"
 msgstr "Ogólne"
 
 #. i18n: file: gui/interfacesettings.ui:486
 #. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
+#: 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:564 rc.cpp:564
+#: po/rc.cpp:581 rc.cpp:581
 msgid "Multiple artist albums:"
 msgstr "Wiele artystów albumu:"
 
-#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: file: gui/interfacesettings.ui:533
 #. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
+#: 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:533
+#. i18n: file: gui/interfacesettings.ui:550
 #. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
+#: 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:574
+#. i18n: file: gui/interfacesettings.ui:591
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
+#: po/rc.cpp:590 rc.cpp:590
 msgid ""
 "<i><b>NOTE:</b> Changing the 'Enforce single-click activation of items' "
 "setting will require a re-start of Cantata.</i>"
@@ -4545,98 +5030,75 @@ msgstr ""
 "<i><b>UWAGA:</b> Zmiana opcji 'Wymuś aktywację elementów przy pojedynczym "
 "kliknięciu' wymaga restartu Cantaty.</i>"
 
-#. i18n: file: gui/mainwindow.ui:244
+#. i18n: file: gui/mainwindow.ui:287
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
+#: po/rc.cpp:593 rc.cpp:593
 msgid "[Dynamic]"
 msgstr "[Dynamiczne]"
 
 #. i18n: file: gui/playbacksettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
+#: po/rc.cpp:596 rc.cpp:596
 msgid "Output"
 msgstr "Wyjście"
 
 #. i18n: file: gui/playbacksettings.ui:41
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:585 rc.cpp:585
+#: po/rc.cpp:602 rc.cpp:602
 msgid "Crossfading:"
 msgstr "Crossfading:"
 
 #. i18n: file: gui/playbacksettings.ui:51
 #. i18n: ectx: property (suffix), widget (SpinBox, crossfading)
-#: po/rc.cpp:588 rc.cpp:588
+#: po/rc.cpp:605 rc.cpp:605
 msgid " seconds"
 msgstr " sekund"
 
 #. i18n: file: gui/playbacksettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:591 rc.cpp:591
+#: po/rc.cpp:608 rc.cpp:608
 msgid "Replay gain:"
 msgstr "Replay gain:"
 
 #. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:594 rc.cpp:594
+#: po/rc.cpp:611 rc.cpp:611
 msgid "About replay gain"
 msgstr "O ReplayGain:"
 
 #. i18n: file: gui/playbacksettings.ui:104
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:597 rc.cpp:597
+#: po/rc.cpp:614 rc.cpp:614
 msgid "Devices:"
 msgstr "Urządzenia:"
 
-#. i18n: file: gui/playbacksettings.ui:132
-#. i18n: ectx: property (title), widget (QGroupBox, streamBox)
-#: po/rc.cpp:600 rc.cpp:600
-msgid "HTTP Stream"
-msgstr "Strumienie HTTP"
-
 #. 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/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
-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>"
-msgstr ""
-"<i><b>UWAGA:</b> Ta opcja używana jest wyłącznie wtedy, gdy wyjściem MPD jest "
-"strumień HTTP, a Cantata ma mieć możliwość jego "
-"odtwarzania.</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 "Zatrzymywanie odtwarzania"
-
-#. i18n: file: gui/playbacksettings.ui:176
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:620 rc.cpp:620
 msgid "Fadeout on stop:"
 msgstr "Wycisz przy zatrzymaniu:"
 
-#. i18n: file: gui/playbacksettings.ui:189
+#. i18n: file: gui/playbacksettings.ui:154
 #. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
+#: po/rc.cpp:623 rc.cpp:623
 msgid "Stop playback on exit:"
 msgstr "Zatrzymaj odtwarzanie przy wyjściu:"
 
-#. i18n: file: gui/playbacksettings.ui:202
+#. i18n: file: gui/playbacksettings.ui:167
 #. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
+#: po/rc.cpp:626 rc.cpp:626
 msgid "Stop dynamizer on exit:"
 msgstr "Zatrzymaj dynamizer przy wyjściu:"
 
-#. i18n: file: gui/playbacksettings.ui:219
+#. 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:621 rc.cpp:621
+#: 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 "
@@ -4648,31 +5110,37 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:635 rc.cpp:635
 msgid "Collection:"
 msgstr "Kolekcja:"
 
 #. 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:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
 msgid "Cover filename:"
 msgstr "Nazwa pliku okładki:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:645 rc.cpp:645
+#: po/rc.cpp:656 rc.cpp:656
 msgid "Dynamizer port:"
 msgstr "Port dynamizera:"
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:659 rc.cpp:659
+msgid "HTTP stream URL:"
+msgstr "URL strumienia HTTP:"
+
+#. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:648 rc.cpp:648
+#: po/rc.cpp:662 rc.cpp:662
 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 "
@@ -4686,9 +5154,21 @@ msgstr ""
 "podkatalogów), to Cantata będzie zapisywała wszystkie pobrane okładki do "
 "odpowiednich katalogów.</i>"
 
-#. i18n: file: gui/serversettings.ui:314
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+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>"
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:677 rc.cpp:677
 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 "
@@ -4696,12 +5176,12 @@ msgid ""
 msgstr ""
 "<i><b>NOTE:</b> Przy zmianie ustawienia \"Katalog z muzyką\" konieczne jest "
 "ręczne uaktualnienie bazy danych z muzyką. Może to zostać wykonane przez "
-"użycie przycisku \"Odśwież bazę danych\" w widoku \"Artyści\" lub "
-"\"Albumy\".</i>"
+"użycie przycisku \"Odśwież bazę danych\" w widoku \"Artyści\" lub \"Albumy\"."
+"</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:680 rc.cpp:680
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4711,19 +5191,19 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:666 rc.cpp:666
+#: po/rc.cpp:683 rc.cpp:683
 msgid "Network interface:"
 msgstr "Interfejs sieciowy:"
 
 #. i18n: file: http/httpserversettings.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
+#: po/rc.cpp:686 rc.cpp:686
 msgid "Current URL:"
 msgstr "Obecny URL:"
 
 #. i18n: file: http/httpserversettings.ui:73
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:689 rc.cpp:689
 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 "
@@ -4733,34 +5213,43 @@ msgid ""
 "MPD <b>must</b> also be on this computer.</i>"
 msgstr ""
 "<i><b>UWAGA:</b> MPD zazwyczaj odtwarza tylko utwory zapisane w jego "
-"katalogach. Cantata zawiera minimalistyczny serwer HTTP, który może być użyty "
-"do przesyłania innych plików do MPD. Ta opcja działa jedynie gdy uruchomiony "
-"jest program Cantata. "
-"<br/><br/>\n"
-"<b>UWAGA:</b> Przy wyborze 'Lokalny loopback' w polu 'Interfejs sieciowy', to "
-"MPD <b>musi</b> też być na tym komputerze.</i>"
+"katalogach. Cantata zawiera minimalistyczny serwer HTTP, który może być "
+"użyty do przesyłania innych plików do MPD. Ta opcja działa jedynie gdy "
+"uruchomiony jest program Cantata. <br/><br/>\n"
+"<b>UWAGA:</b> Przy wyborze 'Lokalny loopback' w polu 'Interfejs sieciowy', "
+"to MPD <b>musi</b> też być na tym komputerze.</i>"
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:693 rc.cpp:693
 msgid "Mode:"
 msgstr "Tryb:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:699 rc.cpp:699
 msgid "HTTP Proxy"
 msgstr "HTTP Proxy"
 
 #. i18n: file: network/proxysettings.ui:55
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:685 rc.cpp:685
+#: po/rc.cpp:702 rc.cpp:702
 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."
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:723 rc.cpp:723
 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."
@@ -4768,211 +5257,278 @@ msgid ""
 "account."
 msgstr ""
 "Można słuchać muzyki za darmo bez posiadania konta, jednak użytkownicy "
-"posiadający konta premium mogą słuchać muzyki o lepszej jakości bez reklam. W "
-"celu założenia konta premium należy odwiedzić stronę <a href=\"http://www."
+"posiadający konta premium mogą słuchać muzyki o lepszej jakości bez reklam. "
+"W celu założenia konta premium należy odwiedzić stronę <a href=\"http://www."
 "di.fm/premium/\">http://www.di.fm/premium/</a>."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:726 rc.cpp:726
 msgid "Premium Account"
 msgstr "Konto premium"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:735 rc.cpp:735
 msgid "Stream type:"
 msgstr "Typ strumienia:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:738 rc.cpp:738
 msgid "Status:"
 msgstr "Stan:"
 
 #. 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:741 streams/digitallyimportedsettings.cpp:130
+#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
 msgid "Login"
 msgstr "Login"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:747 rc.cpp:747
 msgid "Session expiry:"
 msgstr "Wygaśnięcie sesji:"
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:750 rc.cpp:750
+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>"
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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>UWAGA:</b> Po wpisaniu szczegółów konta wyświetlony zostanie status "
+"'DI' pod listą strumieni. Jest to wskaźnik tego, czy jest się zalogowanym, "
+"czy nie.</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."
+msgstr ""
+"Poniżej znajduje się lista głównych kategorii strumieni, aby je ukryć należy "
+"odznaczyć dany wpis na tej liście."
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+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
+msgid "Install"
+msgstr "Instaluj"
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:768 rc.cpp:768
+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>"
+
+#. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:727 rc.cpp:727
+#: po/rc.cpp:771 rc.cpp:771
 msgid "Search:"
 msgstr "Szukaj:"
 
-#. 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:774 rc.cpp:774
 msgid "Shortcut for Selected Action"
 msgstr "Skrót dla zaznaczonej akcji"
 
-#. 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:777 rc.cpp:777
 msgid "Default:"
 msgstr "Domyślny:"
 
-#. 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:783 rc.cpp:783
 msgid "Custom:"
 msgstr "Własny:"
 
-#. i18n: file: tags/tageditor.ui:22
+#. i18n: file: tags/tageditor.ui:25
 #. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
+#: po/rc.cpp:786 rc.cpp:786
 msgid "Track:"
 msgstr "Utwór:"
 
-#. 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:795 rc.cpp:795
 msgid "Album artist:"
 msgstr "Artysta albumu:"
 
-#. 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:804 rc.cpp:804
 msgid "Track number:"
 msgstr "Numer utworu:"
 
-#. 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:807 rc.cpp:807
 msgid "Disc number:"
 msgstr "Numer płyty:"
 
 #. i18n: file: tags/trackorganiser.ui:155
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:834 rc.cpp:834
 msgid "Original Name"
 msgstr "Obecna nazwa"
 
 #. i18n: file: tags/trackorganiser.ui:160
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:837 rc.cpp:837
 msgid "New Name"
 msgstr "Nowa nazwa"
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:838 rc.cpp:838
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Piotr Wicijowski"
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:839 rc.cpp:839
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "piotr[dot]wicijowski[at]gmail[dot]com"
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:121
 msgid "Show All Tracks"
 msgstr "Pokaż wszystkie utwory"
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:122
 msgid "Show Untagged Tracks"
 msgstr "Pokaż utwory bez tagów"
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
 msgid "Remove From List"
 msgstr "Usuń z listy"
 
-#: replaygain/rgdialog.cpp:140
+#: replaygain/rgdialog.cpp:136
 msgid "Album Gain"
 msgstr "Gain albumu"
 
-#: replaygain/rgdialog.cpp:141
+#: replaygain/rgdialog.cpp:137
 msgid "Track Gain"
 msgstr "Gain utworu"
 
-#: replaygain/rgdialog.cpp:142
+#: replaygain/rgdialog.cpp:138
 msgid "Album Peak"
 msgstr "Peak albumu"
 
-#: replaygain/rgdialog.cpp:143
+#: replaygain/rgdialog.cpp:139
 msgid "Track Peak"
 msgstr "Peak utworu"
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
 msgid "Scan"
 msgstr "Skanuj"
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:238
 msgid "Update ReplayGain tags in tracks?"
 msgstr "Uaktualnić tagi ReplayGain w utworach?"
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
 msgid "Update Tags"
 msgstr "Uaktualnij tagi"
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:252
 msgid "Abort scanning of tracks?"
 msgstr "Przerwać skanowanie plików?"
 
-#: replaygain/rgdialog.cpp:257
+#: replaygain/rgdialog.cpp:261
 msgid "Abort reading of existing tags?"
 msgstr "Przerwać czytanie istniejących tagów?"
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:287
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
-"Skanować <b>wszystkie</b> utwory?<br><br><i>UWAGA: Wszystkie utwory posiadają "
-"istniejące tagi ReplayGain.</i>"
+"Skanować <b>wszystkie</b> utwory?<br><br><i>UWAGA: Wszystkie utwory "
+"posiadają istniejące tagi ReplayGain.</i>"
 
-#: replaygain/rgdialog.cpp:285
+#: replaygain/rgdialog.cpp:289
 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:286
+#: replaygain/rgdialog.cpp:290
 msgid "Untagged Tracks"
 msgstr "Utwory bez tagów"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "All Tracks"
 msgstr "Wszystkie utwory"
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:300
 msgid "Scanning tracks..."
 msgstr "Skanowanie utworów..."
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:367
 msgid "Reading existing tags..."
 msgstr "Czytanie istniejących tagów..."
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr "%1 (timeout)"
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr "%1 (Uszkodzone tagi?)"
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
 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:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
+#: tags/trackorganiser.cpp:451
 msgid "Device is not connected."
 msgstr "Urządzenie nie jest podłączone."
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: 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
 msgid "Failed"
 msgstr "Nie powiodło się"
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
 msgid "Remove the selected tracks from the list?"
 msgstr "Usunąć zaznaczone utwory z listy?"
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
 msgid "Remove Tracks"
 msgstr "Usuń utwory"
 
@@ -5004,6 +5560,10 @@ msgstr "Logowanie..."
 msgid "Logout"
 msgstr "Wyloguj"
 
+#: streams/streamdialog.cpp:71
+msgid "URL:"
+msgstr "URL:"
+
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
 msgstr "Tylko dodaj do kolejki odtwarzania, nie zapisuj"
@@ -5024,94 +5584,95 @@ 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:198
+#: streams/streamfetcher.cpp:205
 msgid "Fetching %1"
 msgstr "Pobieranie %1"
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 msgid "Import Streams Into Favorites"
 msgstr "Importuj strumienie do ulubionych"
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 msgid "Export Favorite Streams"
 msgstr "Eksportuj ulubione strumienie"
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr "Dodaj nowy strumień do ulubionych"
 
-#: streams/streamspage.cpp:123
-msgid "Search TuneIn:"
-msgstr "Szukaj w TuneIn:"
+#: streams/streamspage.cpp:124
+msgctxt "Service name"
+msgid "Digitally Imported"
+msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:242
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|strumienie XML"
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
 msgid "Import Streams"
 msgstr "Importuj strumienie"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:245
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Strumienie XML (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:253
 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:262
+#: streams/streamspage.cpp:265
 msgid "*.xml|XML Streams"
 msgstr "*.xml|Strumienie XML"
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
 msgid "Export Streams"
 msgstr "Eksportuj strumienie"
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:267
 msgid "XML Streams (*.xml)"
 msgstr "Strumienie XML (*.xml)"
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:279
 msgid "Failed to create <b>%1</b>!"
 msgstr "Nie powiodło się utworzenie <b>%1</b>!"
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "Strumień już istnieje!<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Strumień o nazwie <b>%1</b> już istnieje!"
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:318
 msgid "Bookmark added"
 msgstr "Dodano zakładkę"
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:320
 msgid "Already bookmarked"
 msgstr "Już w zakładkach"
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:366
 msgid "Added to favorites"
 msgstr "Dodano do ulubionych"
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:368
 msgid "Already in favorites"
 msgstr "Już w ulubionych"
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:393
 msgid "Reload <b>%1</b> streams?"
 msgstr "Przeładować <b>%1</b> strumieni(e)?"
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:411
 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:414
+#: streams/streamspage.cpp:417
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "Czy na pewno usunąć wszystkie <b>%1</b> zakładek?"
 
@@ -5119,24 +5680,56 @@ 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:442
+#: streams/streamspage.cpp:445
 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:446
+#: streams/streamspage.cpp:449 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:609
-msgid "Logged into Digitally Imported"
-msgstr "Zalogowano w Digitally Imported"
+#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+msgid "Search %1:"
+msgstr "Szukaj %1:"
+
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr "*.streams|Strumienie Cantata"
+
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+msgid "Install Streams"
+msgstr "Instaluj strumienie"
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
+msgstr "Strumienie Cantata (*.streams)"
+
+#: streams/streamssettings.cpp:144
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr "Kategoria o nazwie <b>%1</b> już istnieje!<br/>Nadpisać?"
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
-msgstr "<b>NIE</b> zalogowano w Digitally Imported"
+#: streams/streamssettings.cpp:150
+msgid "Failed top open %1"
+msgstr "Nie powiodło się otwieranie %1"
+
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr "Niepoprawny format pliku!"
+
+#: streams/streamssettings.cpp:170
+msgid "Failed to create stream category folder!"
+msgstr "Tworzenie katalogu kategorii strumieni nie powiodło się!"
+
+#: streams/streamssettings.cpp:176
+msgid "Failed to save stream list!"
+msgstr "Zapisanie listy strumieni nie powiodło się!"
+
+#: streams/streamssettings.cpp:227
+msgid "Failed to remove streams folder!"
+msgstr "Usunięcie katalogu strumieni nie powiodło się!"
 
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr "&Ok"
 
 #: support/dialog.cpp:90
@@ -5199,39 +5792,39 @@ msgstr "&Poprzedni"
 msgid "&Next"
 msgstr "&Następny"
 
-#: support/fancytabwidget.cpp:952
+#: support/fancytabwidget.cpp:957
 msgid "Icons Only"
 msgstr "Tylko ikony"
 
-#: support/fancytabwidget.cpp:953
+#: support/fancytabwidget.cpp:958
 msgid "Style"
 msgstr "Styl"
 
-#: support/fancytabwidget.cpp:954
+#: support/fancytabwidget.cpp:959
 msgid "Large Sidebar"
 msgstr "Duży panel boczny"
 
-#: support/fancytabwidget.cpp:955
+#: support/fancytabwidget.cpp:960
 msgid "Small Sidebar"
 msgstr "Mały panel boczny"
 
-#: support/fancytabwidget.cpp:956
+#: support/fancytabwidget.cpp:961
 msgid "Top Bar"
 msgstr "Górny pasek"
 
-#: support/fancytabwidget.cpp:957
+#: support/fancytabwidget.cpp:962
 msgid "Bottom Bar"
 msgstr "Dolny pasek"
 
-#: support/fancytabwidget.cpp:958
+#: support/fancytabwidget.cpp:963
 msgid "Tabs On Side"
 msgstr "Karty z boku"
 
-#: support/fancytabwidget.cpp:959
+#: support/fancytabwidget.cpp:964
 msgid "Tabs On Top"
 msgstr "Kary u góry"
 
-#: support/fancytabwidget.cpp:960
+#: support/fancytabwidget.cpp:965
 msgid "Tabs On Bottom"
 msgstr "Kary u dołu"
 
@@ -5243,19 +5836,20 @@ msgstr "Hasło"
 msgid "Please enter password:"
 msgstr "Proszę podać hasło:"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
 msgid "Warning"
 msgstr "Ostrzeżenie"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
 msgid "Question"
 msgstr "Pytanie"
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
+#: support/messagebox.cpp:107 support/messagebox.cpp:113
+#: support/messagebox.h:62
 msgid "Error"
 msgstr "Błąd"
 
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr "Informacja"
 
@@ -5275,61 +5869,68 @@ msgstr "Wybierz katalog:"
 msgid "Select File"
 msgstr "Wybierz plik"
 
-#: 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] "1 dzień %2"
+msgstr[1] "%1 dni %2"
+msgstr[2] "%1 dni %2"
+
+#: tags/tageditor.cpp:134
 msgid "Tags"
 msgstr "Tagi"
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:147
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr "Ustaw tag 'Artysta Albumu' na podstawie tagu 'Artysta'"
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
 msgid "All tracks"
 msgstr "Wszystkie utwory"
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:295
 msgid "(Various)"
 msgstr "(różne)"
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:336
 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:367
+#: tags/tageditor.cpp:378
 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:417
+#: tags/tageditor.cpp:428
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5337,17 +5938,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:418
+#: tags/tageditor.cpp:429
 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:419
+#: tags/tageditor.cpp:430
 msgid "Album Artist from Artist"
 msgstr "Artysta Albumu na podstawie Artysty"
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:463
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
@@ -5355,44 +5956,52 @@ msgstr ""
 "Czy ustawić pierwszą dużą literę tagów 'Title', 'Artist', 'Album artist', "
 "oraz 'Album' we <b>wszystkich</b> utworach?"
 
-#: tags/tageditor.cpp:485
+#: tags/tageditor.cpp:496
 msgid "Adjust the value of each track number by:"
 msgstr "Zwiększ wartość numeru każdego utworu o:"
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:554
 msgid "All tracks [modified]"
 msgstr "Wszystkie utwory [zmodyfikowano]"
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:556
 msgid "%1 [modified]"
 msgstr "%1 [zmodyfikowano]"
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:783
 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:759
+#: tags/tageditor.cpp:784
 msgid "Rename Files"
 msgstr "Zmień nazwy plików"
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:150
 msgid "Abort renaming of files?"
 msgstr "Przerwać zmianę nazw plików?"
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:263
+msgid "Source file does not exist!<br/>%1"
+msgstr "Plik źródłowy nie istnieje!<br/>%1"
+
+#: tags/trackorganiser.cpp:282
 msgid "Destination file already exists!<br/>%1"
 msgstr "Docelowy plik już istnieje!<br/>%1"
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:304
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Tworzenie katalogu docelowego nie powiodło się!<br/>%1"
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:325
 msgid "Failed to rename %1 to %2"
 msgstr "Nie powiodła się zmiana nazwy z %1 na %2"
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:267
+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
 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:"
@@ -5402,26 +6011,31 @@ 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:59
+#: widgets/genrecombo.cpp:54
 msgid "All Genres"
 msgstr "Wszystkie gatunki"
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:267
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: widgets/groupedview.cpp:269
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:480
 msgid "Go Back"
 msgstr "Idź wstecz"
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:485
 msgid "Go Home"
 msgstr "Idź na samą górę"
 
 #: widgets/menubutton.cpp:36
-msgid "Other Actions"
-msgstr "Inne akcje"
+msgid "Menu"
+msgstr "Menu"
 
 #: widgets/searchwidget.cpp:62
 msgid "Search..."
@@ -5431,6 +6045,55 @@ msgstr "Szukaj..."
 msgid "Close Search Bar"
 msgstr "Zamknij pasek wyszukiwania"
 
+#: widgets/servicestatuslabel.cpp:43
+msgid "Logged into %1"
+msgstr "Zalogowano do %1"
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr "<b>NIE</b> zalogowano do %1"
+
+#: widgets/songdialog.cpp:48
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
+"\" setting, and MPD's \"music_directory\" setting.</p>"
+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
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check that the device is still "
+"attached.</p>"
+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
+msgid "Mute"
+msgstr "Wycisz"
+
+#: widgets/volumeslider.cpp:199
+msgid "Muted"
+msgstr "Wyciszono"
+
+#: widgets/volumeslider.cpp:238
+msgid "Unmute"
+msgstr "Wyłącz wyciszenie"
+
+#: widgets/volumeslider.cpp:276
+msgid "Volume Disabled"
+msgstr "Głośność wyłączona"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1% (Muted)"
+msgstr "Głośność %1% (wyciszono)"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr "Głośność %1%"
+
 #: ../gui/qtplural.h:30
 msgctxt "Singular"
 msgid "1 Track"
@@ -5509,6 +6172,91 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr "Reguły: %1"
 
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr "1 Podcast"
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr "Podcasty: %1"
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr "1 Odcinek"
+
+#: ../gui/qtplural.h:63
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr "Odcinki: %1"
+
+#~ msgid ""
+#~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
+#~ msgstr ""
+#~ "Pobieranie pliku nie powiodło się - napotkano na zbyt dużo przekierowań."
+#~ "<br/><br/<hr/>%1"
+
+#~ 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>Następujące zmienne zostaną zastąpione wartościami odpowiadającymi "
+#~ "właściwościom każdego utworu.</p><p><table border="
+#~ "\"1\"><tr><th><em>Guzik</em></th><th><em>Zmienna</em></th><th><em>Opis</"
+#~ "em></th></tr><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> "
+#~ "W przypadku kompilacji będzie to często <i>Various Artists.</i> </td></"
+#~ "tr><tr><td>%album%</td><td>%2</td><td>Nazwa albumu.</td></tr><tr><td>"
+#~ "%artist%</td><td>%3</td><td>Artysta każdego utworu.</td></tr><tr><td>"
+#~ "%title%</td><td>%4</td><td>Tytuł utworu (bez <i>Artysty utworu</i>).</"
+#~ "td></tr><tr><td>%artistandtitle%</td><td>%5</td><td>Tytuł utworu (z "
+#~ "<i>Artystą utworu</i>, jeśli inny niż <i>Artysta albumu</i>).</td></"
+#~ "tr><tr><td>%track%</td><td>%6</td><td>Numer utworu.</td></tr><tr><td>"
+#~ "%discnumber%</td><td>%7</td><td>Numer albumu dla albumów wielo-"
+#~ "albumowych. Najczęściej kompilacje składają się z wielu albumów.</td></"
+#~ "tr><tr><td>%year%</td><td>%8</td><td>Rok wydania albumu.</td></tr><tr><td>"
+#~ "%genre%</td><td>%9</td><td>Gatunek albumu.</td></tr></table></p>"
+
+#~ msgid "Configure Online Service"
+#~ msgstr "Konfiguruj serwisy on-line"
+
+#~ msgid "Refresh Online Service"
+#~ msgstr "Odśwież serwis on-line"
+
+#~ msgid "Support media keys under GNOME/Unity:"
+#~ msgstr "Obsługa klawiszy multimedialnych w środowiskach GNOME/Unity:"
+
+#~ msgid "Stopping Playback"
+#~ msgstr "Zatrzymywanie odtwarzania"
+
+#~ msgid "Search TuneIn:"
+#~ msgstr "Szukaj w TuneIn:"
+
+#~ msgid "Logged into Digitally Imported"
+#~ msgstr "Zalogowano w Digitally Imported"
+
+#~ msgid "Other Actions"
+#~ msgstr "Inne akcje"
+
 #~ msgid "Disc %1"
 #~ msgstr "Płyta %1"
 
@@ -5600,19 +6348,9 @@ msgstr "Reguły: %1"
 #~ msgid "Disconnect Online Service"
 #~ msgstr "Rozłącz serwis on-line"
 
-#~ msgid "Failed to parse downloaded stream list."
-#~ msgstr "Parsowanie pobranej listy strumieni nie powiodło się."
-
 #~ msgid "Failed to read downloaded stream list."
 #~ msgstr "Odczyt pobranej listy strumieni nie powiódł się."
 
-#~ msgid "Failed to download stream list."
-#~ msgstr "Pobranie listy strumieni nie powiodło się."
-
-#~ msgctxt "name (host)"
-#~ msgid "%1 (%2)"
-#~ msgstr "%1 (%2)"
-
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "Nie powiodło się ponowne łączenie z %1"
 
@@ -5762,9 +6500,6 @@ msgstr "Reguły: %1"
 #~ msgid "Music folder not writeable."
 #~ msgstr "Nie można zapisywać do katalogu z muzyką"
 
-#~ msgid "*.cantata|Cantata Streams"
-#~ msgstr "*.cantata|Strumienie Cantata"
-
 #~ msgid "Are you sure you wish to remove the selected categories &streams?"
 #~ msgstr ""
 #~ "Czy jesteś pewien, że chcesz usunąć zaznaczone kategorie i strumienie?"
@@ -5812,9 +6547,6 @@ msgstr "Reguły: %1"
 #~ msgid "Download streams from %1?"
 #~ msgstr "Czy pobrać strumienie z %1?"
 
-#~ msgid "Download %1"
-#~ msgstr "Pobierz %1"
-
 #~ msgctxt ""
 #~ "message \n"
 #~ " url"
@@ -5936,18 +6668,12 @@ msgstr "Reguły: %1"
 #~ msgid "Failed to update the tags of some tracks."
 #~ msgstr "Uaktualnianie tagów niektórych plików nie powiodło się."
 
-#~ msgid "Are you sure you wish to forget the selected device?"
-#~ msgstr "Czy jesteś pewien, że chcesz zapomnieć o zaznaczonym urządzeniu?"
-
 #~ msgid "Select Music Folder"
 #~ msgstr "Wybierz katalog z muzyką"
 
 #~ msgid "Small Control Buttons"
 #~ msgstr "Małe przyciski sterujące"
 
-#~ msgid "External Settings"
-#~ msgstr "Ustawienia zewnętrzne"
-
 #~ 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"
diff --git a/po/ru.po b/po/ru.po
index 30e605b..043f887 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -6,8 +6,8 @@ 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-09-10 17:41+0400\n"
+"POT-Creation-Date: 2013-11-14 20:26+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"
 "Language: ru\n"
@@ -22,37 +22,37 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "Обновить сведения об альбоме"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
 msgid "Album Information"
 msgstr "Сведения об альбоме"
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:143
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
 msgid "Tracks"
 msgstr "Дорожки"
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 msgid "Refresh Artist Information"
 msgstr "Обновить сведения об исполнителе"
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 context/contextwidget.cpp:306
+#: gui/cachesettings.cpp:260
 msgid "Artist Information"
 msgstr "Сведения об исполнителе"
 
 #. i18n: file: gui/interfacesettings.ui:137
 #. 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:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
 msgid "Albums"
 msgstr "Альбомы"
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:333
 msgid "Web Links"
 msgstr "Ссылки"
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:419
 msgid "Similar Artists"
 msgstr "Похожие исполнители"
 
@@ -64,8 +64,8 @@ msgstr "Источники текстов"
 msgid "Wikipedia Languages"
 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:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
 msgid "Other"
 msgstr "Другое"
 
@@ -73,12 +73,12 @@ msgstr "Другое"
 msgid "Reset Spacing"
 msgstr "Перенастроить отступ"
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
 msgid "Lyrics"
 msgstr "Слова песни"
 
-#: context/lastfmengine.cpp:65
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr "Больше информации см. на last.fm"
 
@@ -100,20 +100,20 @@ msgstr ""
 "Если этот поиск не принесёт новых результатов, слова песни будут привязаны к "
 "названию оригинала и к изначальному артисту, как это показано в Cantata."
 
-#. i18n: file: devices/albumdetails.ui:47
+#. i18n: file: devices/albumdetails.ui:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
+#: rc.cpp:61 rc.cpp:304 rc.cpp:789
 msgid "Title:"
 msgstr "Название:"
 
@@ -121,16 +121,16 @@ msgstr "Название:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
+#: rc.cpp:55 rc.cpp:292 rc.cpp:792
 msgid "Artist:"
 msgstr "Исполнитель:"
 
@@ -138,113 +138,112 @@ msgstr "Исполнитель:"
 msgid "Search For Lyrics"
 msgstr "Искать слова песни"
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "Сайты для поиска текстов песен"
 
-#: context/lyricsettings.cpp:46
+#: context/lyricsettings.cpp:66
 msgid "(Polish Translations)"
 msgstr "(Переводы на польский)"
 
-#: context/lyricsettings.cpp:47
+#: context/lyricsettings.cpp:67
 msgid "(Portuguese Translations)"
 msgstr "(Переводы на португальский)"
 
-#: context/songview.cpp:74
+#: context/songview.cpp:89
 msgid "Refresh Lyrics"
 msgstr "Обновить слова песни"
 
-#: context/songview.cpp:75
+#: context/songview.cpp:90
 msgid "Edit Lyrics"
 msgstr "Изменить слова песни"
 
-#: context/songview.cpp:76
+#: context/songview.cpp:91
 msgid "Save Lyrics"
 msgstr "Сохранить слова песни"
 
-#: context/songview.cpp:77
+#: context/songview.cpp:92
 msgid "Cancel Editing Lyrics"
 msgstr "Отменить изменение слов песни"
 
-#: context/songview.cpp:78
+#: context/songview.cpp:93
 msgid "Delete Lyrics File"
 msgstr "Удалить файл со словами песни"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort editing of lyrics?"
 msgstr "Прервать изменение слов песни?"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort Editing"
 msgstr "Прервать изменение"
 
-#: 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: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
 msgid "Abort"
 msgstr "Прервать"
 
-#: context/songview.cpp:106
+#: context/songview.cpp:121
 msgid "Delete saved copy of lyrics, and re-download?"
-msgstr ""
-"Удалить сохранённый файл со словами песни и снова "
-"загрузить?"
+msgstr "Удалить сохранённый файл со словами песни и снова загрузить?"
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:121 context/songview.cpp:122
+#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
 msgid "Re-download"
 msgstr "Загрузить снова"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Current playing song has changed, still perform search?"
 msgstr "Текущая песня сменилась, произвести поиск всё равно?"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Song Changed"
 msgstr "Песня изменена"
 
-#: context/songview.cpp:133
+#: context/songview.cpp:148
 msgid "Perform Search"
 msgstr "Произвести поиск"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save updated lyrics?"
 msgstr "Сохранить обновлённые слова песни?"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save"
 msgstr "Сохранить"
 
-#: context/songview.cpp:170
+#: context/songview.cpp:185
 msgid "Failed to save lyrics."
 msgstr "Сбой сохранения слов песни"
 
-#: context/songview.cpp:192
+#: context/songview.cpp:207
 msgid "Delete lyrics file?"
 msgstr "Удалить файл со словами песни?"
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
+#: context/songview.cpp:207 gui/mainwindow.cpp:292
+#: widgets/messageoverlay.cpp:43
 msgid "Cancel"
 msgstr "Отмена"
 
-#: context/songview.cpp:416
+#: context/songview.cpp:431
 msgid "Fetching lyrics via %1"
 msgstr "Загрузка слов песни с %1"
 
-#: context/wikipediaengine.cpp:250
+#: context/wikipediaengine.cpp:248
 msgid "Track listing"
 msgstr "Список дорожек"
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr "Доп. информация в Википедии"
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr "Открыть в браузере"
 
-#: 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 "исполнитель|группа|певец|вокалист|музыкант"
@@ -254,7 +253,7 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr "альбом|рейтинг|саундтрек"
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:99
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
@@ -262,41 +261,46 @@ msgstr ""
 "Выбрать языки Википедии, на которых будет искаться информация об исполнителе "
 "и об альбоме."
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
+#: online/podcastsearchdialog.cpp:393
 msgid "Reload"
 msgstr "Обновить"
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr "Cantata проигрывает трек"
+
+#: devices/actiondialog.cpp:76
 msgid "Songs To Be Copied"
 msgstr "Песни, которые нужно скопировать"
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:146
 msgid "<b>INVALID</b>"
 msgstr "<b>НЕДОПУСТИМО</b>"
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
 msgid "<i>(When different)</i>"
 msgstr "<i>(если отличается)</i>"
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr "Исполнители:%1, альбомы:%2, песни:%3"
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
+#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
 #: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
 msgid "%1 free"
 msgstr "%1 свободно"
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
 msgid "Local Music Library"
 msgstr "Локальная музыкальная библиотека"
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
+#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
 msgid "Audio CD"
 msgstr "Аудио-CD"
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:293
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -305,10 +309,10 @@ msgid ""
 msgstr ""
 "На целевом устройстве недостаточно места.\n"
 "Выбранным песням необходимо %1, но доступно всего %2.\n"
-"Чтобы иметь возможность скопировать эти песни, их необходимо "
-"перекодировать в файлы меньшего размера."
+"Чтобы иметь возможность скопировать эти песни, их необходимо перекодировать "
+"в файлы меньшего размера."
 
-#: devices/actiondialog.cpp:285
+#: devices/actiondialog.cpp:300
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -316,196 +320,193 @@ msgstr ""
 "На целевом устройстве недостаточно места.\n"
 "Выбранным песням необходимо %1, но доступно всего %2."
 
-#: devices/actiondialog.cpp:334
+#: devices/actiondialog.cpp:349
 msgid "Copy Songs"
 msgstr "Копировать песни"
 
-#: 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:349 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "Удалить песни"
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:380
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr ""
-"<p>Целевое устройство не настроено.<br/>Продолжить с "
-"настройками по умолчанию?</p>"
+"<p>Целевое устройство не настроено.<br/>Продолжить с настройками по "
+"умолчанию?</p>"
 
-#: devices/actiondialog.cpp:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
 msgid "Not Configured"
 msgstr "Не настроено"
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
 msgid "Use Defaults"
 msgstr "Использовать параметры по умолчанию"
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:384
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr ""
-"<p>Устройство-источник не настроено.<br/>Продолжить с "
-"настройками по умолчанию?</p>"
+"<p>Устройство-источник не настроено.<br/>Продолжить с настройками по "
+"умолчанию?</p>"
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:446
 msgid "Are you sure you wish to stop?"
 msgstr "Точно остановить?"
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "Остановить"
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
+#: tags/trackorganiser.cpp:446
 msgid "Device has been removed!"
 msgstr "Устройство было удалено."
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:491
 msgid "Device is not connected!"
 msgstr "Устройство не подключено."
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
+#: tags/trackorganiser.cpp:456
 msgid "Device is busy?"
 msgstr "Устройство занято?"
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "Устройство было изменено?"
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:562
 msgid "Clearing unused folders"
 msgstr "Очищение неиспользуемых папок"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr "Рассчитать ReplayGain для скопированных с диска треков?"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "ReplyGain"
 msgstr "ReplyGain"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:578
 msgid "Calculate"
 msgstr "Рассчитать"
 
-#: devices/actiondialog.cpp:618
+#: devices/actiondialog.cpp:634
 msgid "The destination filename already exists!<hr/>%1"
 msgstr "Целевой файл уже существует.<hr/>%1"
 
-#: devices/actiondialog.cpp:621
+#: devices/actiondialog.cpp:637
 msgid "Song already exists!<hr/>%1"
 msgstr "Песня уже существует<hr/>%1"
 
-#: devices/actiondialog.cpp:624
+#: devices/actiondialog.cpp:640
 msgid "Song does not exist!<hr/>%1"
 msgstr "Песня не существует<hr/>%1"
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:643
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
 "permissions.<hr/>%1"
 msgstr "Сбой создания целевой папки.<br/>Проверьте необходимые права.<hr/>%1"
 
-#: devices/actiondialog.cpp:630
+#: devices/actiondialog.cpp:646
 msgid "Source file no longer exists?<br/><br/<hr/>%1"
 msgstr "Исходный файл больше не существует?<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:633
+#: devices/actiondialog.cpp:649
 msgid "Failed to copy.<hr/>%1"
 msgstr "Сбой копирования.<hr/>%1"
 
-#: devices/actiondialog.cpp:634
+#: devices/actiondialog.cpp:650
 msgid "Failed to delete.<hr/>%1"
 msgstr "Сбой удаления.<hr/>%1"
 
-#: devices/actiondialog.cpp:637
+#: devices/actiondialog.cpp:653
 msgid "Not connected to device.<hr/>%1"
 msgstr "Не подключено к устройству.<hr/>%1"
 
-#: devices/actiondialog.cpp:640
+#: devices/actiondialog.cpp:656
 msgid "Selected codec is not available.<hr/>%1"
 msgstr "Выбранный кодек недоступен.<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:659
 msgid "Transcoding failed.<br/><br/<hr/>%1"
 msgstr "Сбой перекодирования.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:646
+#: devices/actiondialog.cpp:662
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
 "devices.)<hr/>%1"
 msgstr ""
-"Сбой создания временного файла.<br/>(Требуется для перекодирования на "
-"MTP устройства)<hr/>%1"
+"Сбой создания временного файла.<br/>(Требуется для перекодирования на MTP "
+"устройства)<hr/>%1"
 
-#: devices/actiondialog.cpp:649
+#: devices/actiondialog.cpp:665
 msgid "Failed to read source file.<br/><br/<hr/>%1"
 msgstr "Сбой чтения исходного файла.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:652
+#: devices/actiondialog.cpp:668
 msgid "Failed to write to destination file.<br/><br/<hr/>%1"
 msgstr "Сбой записи в целевой файл.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:655
+#: devices/actiondialog.cpp:671
 msgid "No space left on device.<br/><br/<hr/>%1"
 msgstr "Недостаточно места на устройстве.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:658
+#: devices/actiondialog.cpp:674
 msgid "Failed to update metadata.<br/><br/<hr/>%1"
 msgstr "Сбой обновления метаданных<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr "Сбой загрузки трека — слишком много перенаправлений.<br/><br/<hr/>%1"
-
-#: devices/actiondialog.cpp:664
+#: devices/actiondialog.cpp:677
 msgid "Failed to download track.<br/><br/<hr/>%1"
 msgstr "Сбой загрузки трека.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:667
+#: devices/actiondialog.cpp:680
 msgid "Failed to lock device.<hr/>%1"
 msgstr "Сбой блокирования устройства.<hr/>%1"
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:709
 msgid "Local Music Library Properties"
 msgstr "Свойства локальной музыкальной библиотеки"
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
+#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
 msgid "<b>Error</b><br/>"
 msgstr "<b>Ошибка</b><br/>"
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Skip"
 msgstr "Пропустить"
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Auto Skip"
 msgstr "Авто-пропуск"
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:759
 msgid "Retry"
 msgstr "Повторить"
 
-#: devices/actiondialog.cpp:761
+#: 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>"
+"<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>"
 
-#: devices/actiondialog.cpp:768
+#: 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>"
@@ -513,20 +514,21 @@ msgstr ""
 "<tr><td align=\"right\">Исходный файл:</td><td>%1</td></tr><tr><td align="
 "\"right\">Целевой файл:</td><td>%2</td></tr>"
 
-#: devices/actiondialog.cpp:773
+#: 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:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
 msgid "Calculating..."
 msgstr "Вычисление..."
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:799
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (примерно)"
 
-#: devices/actiondialog.cpp:789
+#: devices/actiondialog.cpp:802
 msgid ""
 "<tr><i><td align=\"right\"><i>Time remaining:</i></td><td><i>%5</i></td></"
 "i></tr>"
@@ -534,53 +536,53 @@ msgstr ""
 "<tr><i><td align=\"right\"><i>Осталось времени:</i></td><td><i>%5</i></td></"
 "i></tr>"
 
-#: devices/actiondialog.cpp:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "Сохранение кеша"
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
+#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "Применить обходное решение «несколько исполнителей»"
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
+#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "Откатить обходное решение «несколько исполнителей»"
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
+#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
 msgid "Capitalize"
 msgstr "Перевести в верхний режим"
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
 msgid "Adjust Track Numbers"
 msgstr "Настроить номера треков"
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
 msgid "Tools"
 msgstr "Инструменты"
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "Применить обходное решение «несколько исполнителей»?"
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
 msgstr ""
 "<i>Эта настройка установит значения «Исполнитель альбома» и «Исполнитель» на "
-"«Несколько исполнителей» и значение «Название» на \"TrackArtist - "
-"TrackTitle\"</i>"
+"«Несколько исполнителей» и значение «Название» на \"TrackArtist - TrackTitle"
+"\"</i>"
 
-#: devices/albumdetailsdialog.cpp:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
 msgid "Revert \"Various Artists\" workaround"
 msgstr "Откатить обходное решение «несколько исполнителей»"
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
 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,46 +590,45 @@ msgid ""
 "is \"Wibble - Wobble\", then 'Artist' will be set to \"Wibble\" and 'Title' "
 "will be set to \"Wobble\"</i>"
 msgstr ""
-"<i>Там, где значение «Исполнитель альбома» равно значению «Исполнитель», "
-"и название имеет формат \"TrackArtist - TrackTitle\", значение «Исполнитель» "
+"<i>Там, где значение «Исполнитель альбома» равно значению «Исполнитель», и "
+"название имеет формат \"TrackArtist - TrackTitle\", значение «Исполнитель» "
 "будет получаться из «Названия», а само значение «Название» будет равно "
-"названию "
-"композиции, т.е. <br/><br/>Скажем, если «Название» имеет формат  \"Wibble - "
-"Wobble\", тогда «Исполнитель» будет иметь значение «Wibble», а «Название» — "
-"«Wobble»</i>"
+"названию композиции, т.е. <br/><br/>Скажем, если «Название» имеет формат  "
+"\"Wibble - Wobble\", тогда «Исполнитель» будет иметь значение «Wibble», а "
+"«Название» — «Wobble»</i>"
 
-#: devices/albumdetailsdialog.cpp:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
 msgid "Revert"
 msgstr "Откатить"
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr ""
-"Первая буква в значениях «Название», «Исполнитель», «Исполнитель альбома» "
-"и «Альбом» будет заглавной."
+"Первая буква в значениях «Название», «Исполнитель», «Исполнитель альбома» и "
+"«Альбом» будет заглавной."
 
-#: devices/albumdetailsdialog.cpp:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
 msgid "Adjust track number by:"
 msgstr "Настроить номера треков по:"
 
-#: 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
+#: 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:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "Чтение диска"
 
-#: 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:353 gui/mainwindow.cpp:2199
+#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
+#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "%1 трек (%2)"
@@ -647,24 +648,24 @@ msgstr "MusicBrainz"
 msgid "Data Track"
 msgstr "Трек с данными"
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr "Сбой открытия устройства CD"
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
 #: devices/musicbrainz.cpp:217
 msgid "Track %1"
 msgstr "Трек %1"
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr "Сбой создания подключения CDDB"
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr "Совпадений в CDDB не найдено."
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr "Ошибка CDDB: %1"
 
@@ -672,19 +673,19 @@ msgstr "Ошибка CDDB: %1"
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr "Найдено несколько совпадений. Выберите релевантный ниже:"
 
-#. i18n: file: devices/albumdetails.ui:157
+#. i18n: file: devices/albumdetails.ui:170
 #. 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:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
+#: rc.cpp:82
 msgid "Artist"
 msgstr "Исполнитель"
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:175
 #. 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:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
+#: rc.cpp:85
 msgid "Title"
 msgstr "Название"
 
@@ -702,10 +703,14 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr "Обновление (%1)..."
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr "Обновление (%1%)..."
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -750,17 +755,14 @@ msgid ""
 "from the 'Title' tag.</p>"
 msgstr ""
 "<p>Во время копирования треков на устройство, и при значении «Исполнитель "
-"альбома»"
-"установленном как «Несколько исполнителей», Cantata установит значение тега "
-"«Исполнитель» для всех треков"
-"на значение «Несколько исполнителей», а тег трека «Название» на 'TrackArtist "
-"- TrackTitle'."
-"<hr/> Во время копирования треков с устройства Cantata проверит настройки "
-"«Исполнитель альбома» и"
-"«Исполнитель», которые должны иметь значение «Несколько исполнителей», и в "
-"этом случае попробует"
-"получить правильные данные исполнителя из тега «Название» и удалить имя "
-"исполнителя из тега «Название»</p>"
+"альбома»установленном как «Несколько исполнителей», Cantata установит "
+"значение тега «Исполнитель» для всех трековна значение «Несколько "
+"исполнителей», а тег трека «Название» на 'TrackArtist - TrackTitle'.<hr/> Во "
+"время копирования треков с устройства Cantata проверит настройки "
+"«Исполнитель альбома» и«Исполнитель», которые должны иметь значение "
+"«Несколько исполнителей», и в этом случае попробуетполучить правильные "
+"данные исполнителя из тега «Название» и удалить имя исполнителя из тега "
+"«Название»</p>"
 
 #: devices/devicepropertieswidget.cpp:99
 msgid ""
@@ -772,15 +774,13 @@ 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>Если активировать этот параметр, Cantata создаст кеш музыкальной библиотеки"
-"устройства, что ускорит последующие сканирования библиотеки (файл кеша будет "
-"использоваться вместо чтения тегов каждого файла)<hr/><b>ВНИМАНИЕ:</b> при "
-"использовании другого приложения для обновления библиотеки устройства, данные "
-"этого кеша станут неактуальными. Для их коррекции нажмите на значок "
-"«обновить» в "
-"списке устройств. Файл кеша буде удалён, а содержимое устройства будет "
-"просканировано "
-"заново.</p>"
+"<p>Если активировать этот параметр, Cantata создаст кеш музыкальной "
+"библиотекиустройства, что ускорит последующие сканирования библиотеки (файл "
+"кеша будет использоваться вместо чтения тегов каждого файла)<hr/><b>ВНИМАНИЕ:"
+"</b> при использовании другого приложения для обновления библиотеки "
+"устройства, данные этого кеша станут неактуальными. Для их коррекции нажмите "
+"на значок «обновить» в списке устройств. Файл кеша буде удалён, а содержимое "
+"устройства будет просканировано заново.</p>"
 
 #: devices/devicepropertieswidget.cpp:204
 msgid "Do not transcode"
@@ -815,45 +815,43 @@ msgstr "Исключить устройство"
 msgid "Add Device"
 msgstr "Добавить устройство"
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
-msgstr ""
-"Произвести поиск подробной информации"
-"для альбома и трека?"
+msgstr "Произвести поиск подробной информациидля альбома и трека?"
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455
 msgid "Refresh"
 msgstr "Обновить"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr "Через CDDB"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr "Через 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>Какой тип обновления необходимо выполнить?<ul><li>Частичное — "
-"сканируются только новые песни<i>(быстрое)</i></li><li>Полное — все песни "
-"сканируются повторно<i>(медленное)</i></li></ul></p>"
+"<p>Какой тип обновления необходимо выполнить?<ul><li>Частичное — сканируются "
+"только новые песни<i>(быстрое)</i></li><li>Полное — все песни сканируются "
+"повторно<i>(медленное)</i></li></ul></p>"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr "Частично"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr "Полностью"
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
 "This cannot be undone."
@@ -861,31 +859,31 @@ msgstr ""
 "Точно удалить выбранные песни?\n"
 "Эту операцию нельзя будет отменить."
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr "Точно исключить <b>%1</b>?"
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr "Точно извлечь аудио- CD <b>%1 - %2</b>?"
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr "Извлечь"
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr "Точно отключить <b>%1</b>?"
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr "Отключить"
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
 msgid "Please close other dialogs first."
 msgstr "Сначала необходимо закрыть другие диалоги."
 
-#: devices/encoders.cpp:78
+#: devices/encoders.cpp:77
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -897,11 +895,11 @@ msgid ""
 msgstr ""
 "<a href=http://ru.wikipedia.org/wiki/Advanced_Audio_Coding>Advanced Audio "
 "Coding</a> (AAC) — это запатентованный  кодек для цифрового аудио, "
-"использующий сжатие с потерями. <br>Как правило, AAC  предоставляет "
-"лучшее качество звука, чем MP3 при аналогичном битрейте. Это разумный "
-"выбор для iPod и некоторых других портативных плееров."
+"использующий сжатие с потерями. <br>Как правило, AAC  предоставляет лучшее "
+"качество звука, чем MP3 при аналогичном битрейте. Это разумный выбор для "
+"iPod и некоторых других портативных плееров."
 
-#: devices/encoders.cpp:83
+#: devices/encoders.cpp:82
 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 "
@@ -919,47 +917,37 @@ msgid ""
 "s</b> is probably overkill."
 msgstr ""
 "Битрейт — это мера количества информации, используемой для представления "
-"одной "
-"секунды звукового трека.<br>Кодировщик <b>AAC</b>, используемый в Cantata, "
-"имеет "
-"поддержку <a href=http://en.wikipedia.org/wiki/Variable_bitrate#Advantages_and"
-"_disadvantages"
-"_of_VBR>переменного битрейта (VBR)</a>, что означает, что битрейт может "
-"колебаться на "
-"протяжении трека в зависимости от сложности звукового содержимого. Более "
-"сложные "
-"временные периоды трека кодируются с бо́льшим битрейтом, чем более простые. "
-"Этот "
-"подход позволяет достигнуть лучшего соотношения качества звука и размера "
-"файла по "
+"одной секунды звукового трека.<br>Кодировщик <b>AAC</b>, используемый в "
+"Cantata, имеет поддержку <a href=http://en.wikipedia.org/wiki/"
+"Variable_bitrate#Advantages_and_disadvantages_of_VBR>переменного битрейта "
+"(VBR)</a>, что означает, что битрейт может колебаться на протяжении трека в "
+"зависимости от сложности звукового содержимого. Более сложные временные "
+"периоды трека кодируются с бо́льшим битрейтом, чем более простые. Этот подход "
+"позволяет достигнуть лучшего соотношения качества звука и размера файла по "
 "сравнению с использованием постоянного битрейта.<br>Поэтому битрейт, "
-"устанавливаемый "
-"этим ползунком — это только оценочное значение <a "
-"href=http://www.ffmpeg.org/faq.html#SEC21>"
-"среднего битрейта</a> кодируемого трека.<br>Битрейт, равный <b>150кбит/с</b>, "
-"— хороший "
-"выбор для прослушивания музыки на портативном плеере.<br/>Значения меньше "
-"<b>120 кбит/с</b> могут приводить к неудовлетворительному качеству. Значения "
-"больше "
+"устанавливаемый этим ползунком — это только оценочное значение <a "
+"href=http://www.ffmpeg.org/faq.html#SEC21>среднего битрейта</a> кодируемого "
+"трека.<br>Битрейт, равный <b>150кбит/с</b>, — хороший выбор для "
+"прослушивания музыки на портативном плеере.<br/>Значения меньше <b>120 кбит/"
+"с</b> могут приводить к неудовлетворительному качеству. Значения больше "
 "<b>200 кбит/с</b> обычно излишни."
 
-#: devices/encoders.cpp:101 devices/encoders.cpp:141
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr ""
-"Ожидаемое среднее значение битрейта для кодирования "
-"переменного битрейта."
+"Ожидаемое среднее значение битрейта для кодирования переменного битрейта."
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
+#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
 msgid "Smaller file"
 msgstr "Меньший размер файла"
 
-#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:329
 msgid "Better sound quality"
 msgstr "Лучшее качество звука"
 
-#: devices/encoders.cpp:120
+#: devices/encoders.cpp:119
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -970,12 +958,12 @@ msgid ""
 "and is widely supported on portable music players."
 msgstr ""
 "<a href=http://ru.wikipedia.org/wiki/MP3>MPEG Audio Layer 3</a> (MP3) — это "
-"запатентованный кодек цифрового аудио, использующий сжатие данных с "
-"потерями.<br>Несмотря на свои недостатки, он является общепризнанным "
-"форматом для любительского хранения аудио, и широко поддерживается "
-"портативными музыкальными плеерами."
+"запатентованный кодек цифрового аудио, использующий сжатие данных с потерями."
+"<br>Несмотря на свои недостатки, он является общепризнанным форматом для "
+"любительского хранения аудио, и широко поддерживается портативными "
+"музыкальными плеерами."
 
-#: devices/encoders.cpp:124
+#: devices/encoders.cpp:123
 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 "
@@ -991,33 +979,25 @@ msgid ""
 "anything above <b>205kb/s</b> is probably overkill."
 msgstr ""
 "Битрейт — это мера количества информации, используемой для представления "
-"одной секунды "
-"звукового трека.<br>Кодер <b>MP3</b>, используемый в Cantata, имеет поддержку "
-"<a href=http://"
-"en.wikipedia.org/wiki/MP3#VBR>переменного битрейта (VBR)</a>, что означает, "
-"что битрейт может "
-"колебаться на протяжении трека в зависимости от сложности звукового "
-"содержимого. Более сложные "
+"одной секунды звукового трека.<br>Кодер <b>MP3</b>, используемый в Cantata, "
+"имеет поддержку <a href=http://en.wikipedia.org/wiki/MP3#VBR>переменного "
+"битрейта (VBR)</a>, что означает, что битрейт может колебаться на протяжении "
+"трека в зависимости от сложности звукового содержимого. Более сложные "
 "временные периоды трека кодируются с бо́льшим битрейтом, чем более простые. "
-"Этот подход "
-"позволяет достигнуть лучшего соотношения качества звука и размера файла по "
-"сравнению с "
-"использованием постоянного битрейта.<br>Поэтому битрейт, устанавливаемый этим "
-"ползунком — это "
-"только оценочное значение <a href=http://www.ffmpeg.org/faq.html#SEC21>"
-"среднего битрейта</a> "
-"кодируемого трека. <br>Битрейт, равный <b>160 кбит/с</b> — хороший выбор для "
-"прослушивания "
-"музыки на портативном плеере.<br/>Значения меньше <b>120 кбит/с</b> могут "
-"приводить к "
-"неудовлетворительному качеству. Значения больше <b>205 кбит/с</b> обычно "
-"излишни."
-
-#: devices/encoders.cpp:156 online/magnatuneservice.cpp:182
+"Этот подход позволяет достигнуть лучшего соотношения качества звука и "
+"размера файла по сравнению с использованием постоянного битрейта.<br>Поэтому "
+"битрейт, устанавливаемый этим ползунком — это только оценочное значение <a "
+"href=http://www.ffmpeg.org/faq.html#SEC21>среднего битрейта</a> кодируемого "
+"трека. <br>Битрейт, равный <b>160 кбит/с</b> — хороший выбор для "
+"прослушивания музыки на портативном плеере.<br/>Значения меньше <b>120 кбит/"
+"с</b> могут приводить к неудовлетворительному качеству. Значения больше "
+"<b>205 кбит/с</b> обычно излишни."
+
+#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:159
+#: devices/encoders.cpp:158
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1027,13 +1007,13 @@ msgid ""
 "files than MP3 at equivalent or higher quality. Ogg Vorbis is an all-around "
 "excellent choice, especially for portable music players that support it."
 msgstr ""
-"<a href=http://ru.wikipedia.org/wiki/Vorbis>Ogg Vorbis</a> — это открытый, не "
-"требующий финансовых отчислений кодек для сжатия аудио с потерями.<br>"
-"Файлы  этом формате имеют меньший размер, чем файлы MP3, при аналогичном"
-"или более высоком качестве.Ogg Vorbis — отличный и универсальный выбор, "
-"особенно для поддерживающих его портативных плееров."
+"<a href=http://ru.wikipedia.org/wiki/Vorbis>Ogg Vorbis</a> — это открытый, "
+"не требующий финансовых отчислений кодек для сжатия аудио с потерями."
+"<br>Файлы  этом формате имеют меньший размер, чем файлы MP3, при "
+"аналогичномили более высоком качестве.Ogg Vorbis — отличный и универсальный "
+"выбор, особенно для поддерживающих его портативных плееров."
 
-#: devices/encoders.cpp:164
+#: devices/encoders.cpp:163
 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 "
@@ -1052,41 +1032,80 @@ msgid ""
 "anything above <b>8</b> is probably overkill."
 msgstr ""
 "Битрейт — это мера количества информации, используемой для представления "
-"одной секунды звукового трека.<br>Кодировщик <b>Vorbis</b>, используемый "
-"в Cantata, имеет поддержку <a href=http://en.wikipedia.org/wiki/Vorbis#Technic"
-"al_details>"
-"переменного битрейта (VBR)</a>, что означает, что битрейт может колебаться на "
-"протяжении трека в зависимости от сложности звукового содержимого. Более "
-"сложные "
-"временные периоды трека кодируются с бо́льшим битрейтом, чем более простые. "
-"Этот "
-"подход позволяет достигнуть лучшего соотношения качества звука и размера "
-"файла по "
-"сравнению с использованием постоянного битрейта.<br> Кодер Vorbis имеет "
-"параметр "
+"одной секунды звукового трека.<br>Кодировщик <b>Vorbis</b>, используемый в "
+"Cantata, имеет поддержку <a href=http://en.wikipedia.org/wiki/"
+"Vorbis#Technical_details>переменного битрейта (VBR)</a>, что означает, что "
+"битрейт может колебаться на протяжении трека в зависимости от сложности "
+"звукового содержимого. Более сложные временные периоды трека кодируются с "
+"бо́льшим битрейтом, чем более простые. Этот подход позволяет достигнуть "
+"лучшего соотношения качества звука и размера файла по сравнению с "
+"использованием постоянного битрейта.<br> Кодер Vorbis имеет параметр "
 "качества «-q», принимающий значения от 1 до 10, который задаёт ожидаемый "
-"уровень "
-"качества звука. Битрейт, устанавливаемый этим параметром — это только "
-"оценочное "
-"значение <a href=http://www.ffmpeg.org/faq.html#SEC21>среднего битрейта</a> "
-"кодируемого "
-"трека. В более новых и более эффективных версиях Vorbis каждому значению "
-"качества "
-"соответствует меньший битрейт.<br>Параметр качества, равный <b>-q5</b> — "
-"хороший "
-"выбор для прослушивания музыки на портативном плеере.<br/>Значения меньше "
-"<b>-q3</b> могут приводить к неудовлетворительному качеству. Значения больше "
-"<b>-q8</b> обычно излишни."
-
-#: devices/encoders.cpp:184
+"уровень качества звука. Битрейт, устанавливаемый этим параметром — это "
+"только оценочное значение <a href=http://www.ffmpeg.org/faq."
+"html#SEC21>среднего битрейта</a> кодируемого трека. В более новых и более "
+"эффективных версиях Vorbis каждому значению качества соответствует меньший "
+"битрейт.<br>Параметр качества, равный <b>-q5</b> — хороший выбор для "
+"прослушивания музыки на портативном плеере.<br/>Значения меньше <b>-q3</b> "
+"могут приводить к неудовлетворительному качеству. Значения больше <b>-q8</b> "
+"обычно излишни."
+
+#: devices/encoders.cpp:183
 msgid "Quality rating"
 msgstr "Рейтинг по качеству"
 
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr ""
+
+#: devices/encoders.cpp:203
+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:205
+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 ""
+"Битрейт — это мера количества информации, используемой для представления "
+"одной секунды звукового трека.<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
+msgid "Bitrate"
+msgstr "Битрейт"
+
+#: devices/encoders.cpp:241
 msgid "Apple Lossless"
 msgstr "Apple Lossless"
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:244
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1097,15 +1116,15 @@ msgid ""
 "FLAC."
 msgstr ""
 "<a href=http://ru.wikipedia.org/wiki/Apple_Lossless>Apple Lossless</a> "
-"(ALAC) — аудио-кодек для сжатия цифрового аудио без потерь."
-"<br>Рекомендуется только для музыкальных плееров компании Apple "
-"и плееров, не поддерживающих формат FLAC."
+"(ALAC) — аудио-кодек для сжатия цифрового аудио без потерь.<br>Рекомендуется "
+"только для музыкальных плееров компании Apple и плееров, не поддерживающих "
+"формат FLAC."
 
-#: devices/encoders.cpp:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:262
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1116,11 +1135,11 @@ msgid ""
 "compromising on audio quality, FLAC is an excellent choice."
 msgstr ""
 "<a href=http://ru.wikipedia.org/wiki/FLAC>Free Lossless Audio Codec</a> "
-"(FLAC) — открытый и не  требующий финансовых отчислений кодек для "
-"сжатия цифрового аудио без потерь.<br>FLAC  — прекрасный выбор для "
-"тех, кто хочет хранить музыку, не экономя на качестве."
+"(FLAC) — открытый и не  требующий финансовых отчислений кодек для сжатия "
+"цифрового аудио без потерь.<br>FLAC  — прекрасный выбор для тех, кто хочет "
+"хранить музыку, не экономя на качестве."
 
-#: devices/encoders.cpp:230
+#: devices/encoders.cpp:266
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1136,34 +1155,30 @@ msgid ""
 msgstr ""
 "<a href=http://flac.sourceforge.net/documentation_tools_flac.html>Уровень "
 "сжатия</a> — это целое число со значением от 0 до 8, представляющее "
-"оптимальное "
-"соотношение между размером файла и скоростью сжатия во время кодирования "
-"в формат <b>FLAC</b>.<br/> Уровень сжатия, равный <b>0</b>, даёт самое "
-"короткое время сжатия, но создаёт относительно большой файл.<br/>С другой "
-"стороны, уровень сжатия <b>8</b> потребует много времени на процесс сжатия, "
-"но размер созданного файла будет самым маленьким.<br/>Поскольку, по "
-"определению, "
-"FLAC — это кодек со сжатием без потерь, то качество аудио на выходе не "
-"изменится, "
-"вне зависимости от уровня сжатия.<br/>Кроме того, уровни сжатия более <b>5</b>"
-" "
-"очень сильно увеличивают время сжатия, но лишь незначительно уменьшают размер "
-"файла по сравнению с более низкими уровнями сжатия, и поэтому не "
-"рекомендуются."
-
-#: devices/encoders.cpp:245
+"оптимальное соотношение между размером файла и скоростью сжатия во время "
+"кодирования в формат <b>FLAC</b>.<br/> Уровень сжатия, равный <b>0</b>, даёт "
+"самое короткое время сжатия, но создаёт относительно большой файл.<br/>С "
+"другой стороны, уровень сжатия <b>8</b> потребует много времени на процесс "
+"сжатия, но размер созданного файла будет самым маленьким.<br/>Поскольку, по "
+"определению, FLAC — это кодек со сжатием без потерь, то качество аудио на "
+"выходе не изменится, вне зависимости от уровня сжатия.<br/>Кроме того, "
+"уровни сжатия более <b>5</b> очень сильно увеличивают время сжатия, но лишь "
+"незначительно уменьшают размер файла по сравнению с более низкими уровнями "
+"сжатия, и поэтому не рекомендуются."
+
+#: devices/encoders.cpp:281
 msgid "Compression level"
 msgstr "Уровень сжатия"
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:291
 msgid "Faster compression"
 msgstr "Быстрое сжатие"
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:298
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:301
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1174,11 +1189,11 @@ msgid ""
 "not support Ogg Vorbis."
 msgstr ""
 "<a href=http://ru.wikipedia.org/wiki/Windows_Media_Audio>Windows Media "
-"Audio</a> (WMA) — это проприетарный кодек, разработанный компанией "
-"Microsoft для сжатия аудио (с потерями).<br>Рекомендуется только для "
-"портативных аудиопроигрывателей, не поддерживающих Ogg Vorbis."
+"Audio</a> (WMA) — это проприетарный кодек, разработанный компанией Microsoft "
+"для сжатия аудио (с потерями).<br>Рекомендуется только для портативных "
+"аудиопроигрывателей, не поддерживающих Ogg Vorbis."
 
-#: devices/encoders.cpp:268
+#: devices/encoders.cpp:305
 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,108 +1207,139 @@ msgid ""
 "probably overkill."
 msgstr ""
 "Битрейт — это мера количества информации, используемой для представления "
-"одной "
-"секунды звукового трека.<br>Из-за ограничений проприетарного формата <b>WMA<"
-"/b> "
-"и трудностей реверс-инжиниринга проприетарного кодировщика, кодировщик WMA, "
-"используемый программой Cantata, имеет настройку <a "
+"одной секунды звукового трека.<br>Из-за ограничений проприетарного формата "
+"<b>WMA</b> и трудностей реверс-инжиниринга проприетарного кодировщика, "
+"кодировщик WMA, используемый программой Cantata, имеет настройку <a "
 "href=http://en.wikipedia.org/wiki/"
-"Windows_Media_Audio#Windows_Media_Audio>постоянный битрейт (CBR)</a>.<br>"
-"Поэтому "
-"битрейт, устанавливаемый этим ползунком — это довольно точное оценочное "
-"значение "
-"битрейта кодируемого трека. Битрейт, равный <br><b>136кбит/с</b> — хороший "
-"выбор "
-"для музыки, прослушиваемой в портативном плеере. <br/>Любые значения меньше <"
-"b> "
-"112кбит/с</b> приведут к неудовлетворительному качеству музыки, а значения <b>"
-"182кбит/с"
-"</b> просто излишни."
-
-#: devices/encoders.cpp:282
-msgid "Bitrate"
-msgstr "Битрейт"
+"Windows_Media_Audio#Windows_Media_Audio>постоянный битрейт (CBR)</a>."
+"<br>Поэтому битрейт, устанавливаемый этим ползунком — это довольно точное "
+"оценочное значение битрейта кодируемого трека. Битрейт, равный "
+"<br><b>136кбит/с</b> — хороший выбор для музыки, прослушиваемой в "
+"портативном плеере. <br/>Любые значения меньше <b> 112кбит/с</b> приведут к "
+"неудовлетворительному качеству музыки, а значения <b>182кбит/с</b> просто "
+"излишни."
 
 #: devices/filenameschemedialog.cpp:33
 msgid "Filename Scheme"
 msgstr "Схема имён файлов"
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:52
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "Несколько исполнителей"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:53
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr "Чайковский"
+
+#: devices/filenameschemedialog.cpp:55
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "Now 5001"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:56
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr "Wobble"
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:57
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "Дэнс"
 
-#: devices/filenameschemedialog.cpp:99
+#: devices/filenameschemedialog.cpp:101
 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>Следующие переменные будут заменены их соответствующими значениями для "
-"каждого "
-"названия трека.</p><p><table border=\"1\"><tr><th><em>Кнопка</em></"
-"th><th><em>Переменная</em></th><th><em>Описание</em></th></tr><tr><td>"
-"%albumartist%</td><td>%1</td><td>Исполнитель альбома. В большинстве случаев "
-"это"
-"значение равно значению <i>Исполнитель трека.</i> Для сборников это часто "
-"будет "
-"значение <i>Несколько исполнителей.</i> </td></tr><tr><td>%album%</td><td>%2</"
-"td><td>Название альбома.</td></tr><tr><td>%artist%</td><td>%3</"
-"td><td>Исполнитель каждого трека.</td></tr><tr><td>%title%</td><td>%4</"
-"td><td>Название трека (без <i>Исполнителя трека</i>).</td></tr><tr><td>"
-"%artistandtitle%</td><td>%5</td><td>Название трека (с <i>Исполнителем трека</"
-"i>, если его значение не равно <i>Исполнителю альбома</i>).</td></tr><tr><td>%"
-"track%</td><td>"
-"%6</td><td>Номер трека.</td></tr><tr><td>%discnumber%</td><td>%7</"
-"td><td>Номер альбома, составленного из нескольких альбомов. Часто в сборники "
-"включают"
-"несколько альбомов.</td></tr><tr><td>%year%</td><td>%8</td><td>Год выхода "
-"альбома.</td>"
-"</tr><tr><td>%genre%</td><td>%9</td><td>Жанр альбома.</td></tr></table></p>"
-
-#: devices/fsdevice.cpp:678
+"for each track name.</p>"
+msgstr ""
+"<p>Следующие переменные будут заменены соответствующими названиями "
+"для каждого трека.</p>"
+
+#: devices/filenameschemedialog.cpp:103
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</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
 msgid "Updating..."
 msgstr "Обновление..."
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "Чтение кеша"
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr "%1 %2%"
@@ -1327,16 +1373,15 @@ msgstr "Обновление файлов..."
 msgid "Updating tracks..."
 msgstr "Обновление треков..."
 
-#: 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
+#: 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:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
+#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
+#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
 #: models/devicesmodel.cpp:140
 msgid "Not Connected"
 msgstr "Не подключено"
@@ -1353,7 +1398,7 @@ msgstr "Совпадений в MusicBrainz не найдено."
 msgid "Connection"
 msgstr "Соединение"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
 msgid "Music Library"
 msgstr "Музыкальная библиотека"
 
@@ -1403,16 +1448,15 @@ msgid ""
 "Password prompting does not work when cantata is started from the "
 "commandline."
 msgstr ""
-"Запрос паролей не работает, если cantata была запущена из "
-"командной строки."
+"Запрос паролей не работает, если cantata была запущена из командной строки."
 
 #: devices/remotefsdevice.cpp:379
 msgid ""
 "No suitable ssh-askpass application installed! This is required for entering "
 "passwords."
 msgstr ""
-"Требуемое приложение ssh-askpass не установлено. Оно необходимо "
-"для ввода паролей."
+"Требуемое приложение ssh-askpass не установлено. Оно необходимо для ввода "
+"паролей."
 
 #: devices/remotefsdevice.cpp:386
 msgid "Mount point (\"%1\") is not empty!"
@@ -1444,8 +1488,8 @@ msgstr "Ёмкость неизвестна"
 
 #. i18n: file: gui/coverdialog.ui:30
 #. 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:53 gui/stdactions.cpp:92
+#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
 msgid "Search"
 msgstr "Поиск"
 
@@ -1489,15 +1533,15 @@ msgstr "Не просканировано"
 msgid " (recommended)"
 msgstr " (рекомендуется)"
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:208
 msgid "Start Dynamic Playlist"
 msgstr "Запустить динамический плейлист"
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:209
 msgid "Stop Dynamic Mode"
 msgstr "Остановить динамический режим"
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:257
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "%1 правило"
@@ -1505,77 +1549,77 @@ msgstr[1] "%1 правила"
 msgstr[2] "%1 правил"
 msgstr[3] "%1 правило"
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:396
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr "Для работы динамического режима необходимо установить «perl»."
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:403
 msgid "Failed to locate rules file - %1"
 msgstr "Сбой нахождения файла правил — %1"
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:411
 msgid "Failed to remove previous rules file - %1"
 msgstr "Сбой удаления предыдущего файла правил — %1"
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:416
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "Сбой установки файла правил — %1 -> %2"
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:729
 msgid "Dynamizer has been terminated."
 msgstr "Dynamizer был завершён"
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:816
 msgid "Uknown"
 msgstr "Неизвестно"
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:818
 msgid "Loading list of rules"
 msgstr "Загрузка списка правил"
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:819
 msgid "Saving rule"
 msgstr "Сохранение правила"
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:820
 msgid "Deleting rule"
 msgstr "Удаление правила"
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:821
 msgid "Setting active rule"
 msgstr "Установка активного правила"
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:822
 msgid "Stopping dynamizer"
 msgstr "Остановка Dynamizer"
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:823
 msgid "Requesting ID details"
 msgstr "Запрос деталей ID"
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:826
 msgid "Awaiting response for previous command. (%1)"
 msgstr "Ожидание ответа на предыдущую команду (%1)"
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:981
 msgid "Dynamizer is not active"
 msgstr "Dynamizer не активен"
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:989
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "Сбой получения списка динамических правил (%1)"
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1020
 msgid "Failed to delete rules file. (%1)"
 msgstr "Сбой удаления файла правил (%1)"
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "Сбой проверки состояния dynamizer. (%1)"
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1036
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "Сбой установки текущих динамических правил (%1)"
 
@@ -1609,22 +1653,21 @@ msgstr "Динамическое правило"
 
 #. 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:136 po/rc.cpp:280 rc.cpp:280
 msgid "Add"
 msgstr "Добавить"
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:202
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr ""
 "<i><b>ОШИБКА</b>: значение «с года» должно быть меньше значения «до года»</i>"
 
-#: dynamic/dynamicruledialog.cpp:194
+#: dynamic/dynamicruledialog.cpp:205
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
 msgstr ""
-"<i><b>ОШИБКА:</b> слишком большой диапазон даты (максимум равен %1 годам)"
-"</i>"
+"<i><b>ОШИБКА:</b> слишком большой диапазон даты (максимум равен %1 годам)</i>"
 
 #: dynamic/dynamicrulesdialog.cpp:68
 msgid "SimilarArtists"
@@ -1634,45 +1677,51 @@ msgstr "SimilarArtists"
 msgid "AlbumArtist"
 msgstr "AlbumArtist"
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr "Автор музыки"
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
 msgid "Album"
 msgstr "Альбом"
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. 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:106
+#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
 msgid "Genre"
 msgstr "Жанр"
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr "Дата"
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr "Включить"
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr "Исключить"
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr " (Точное)"
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr "Динамические правила"
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
 "of <i>Include</i> rules will be used to build a set of songs that can be "
@@ -1688,34 +1737,25 @@ msgid ""
 "to keep the play queue filled with 10 entries.</p>"
 msgstr ""
 "<p>Cantata будет опрашивать вашу библиотеку, используя все перечисленные "
-"правила."
-"Список правил <i>Включить</i> будет применяться для создания списка песен, "
-"которые"
-"можно использовать. Список правил <i>Исключить</i> будет применяться для "
-"создания "
-"списка песен, которые нельзя использовать. Если правил <i>Включить</i> не "
-"существует, "
-"Cantata будет использовать все песни (включая песни из правил <i>Исключить</i>"
-").<br/>"
-"То есть, если вам нужно найти песни в стиле «Rock» исполнителя Петров ИЛИ "
-"нескольких "
-"исполнителей, то правило будет таким: <ul><li>Включить AlbumArtist=Петров "
-"Genre=Rock</"
+"правила.Список правил <i>Включить</i> будет применяться для создания списка "
+"песен, которыеможно использовать. Список правил <i>Исключить</i> будет "
+"применяться для создания списка песен, которые нельзя использовать. Если "
+"правил <i>Включить</i> не существует, Cantata будет использовать все песни "
+"(включая песни из правил <i>Исключить</i>).<br/>То есть, если вам нужно "
+"найти песни в стиле «Rock» исполнителя Петров ИЛИ нескольких исполнителей, "
+"то правило будет таким: <ul><li>Включить AlbumArtist=Петров Genre=Rock</"
 "li><li>Включить AlbumArtist=Несколько исполнителей</li></ul> Чтобы заставить "
-"Cantata "
-"искать песни исполнителя Иванов, не входящие в альбом АБВ, вам понадобится "
-"следующее "
-"правило: <ul><li>Включить AlbumArtist=Иванов</li><li>Исключить Album=АБВ</li>"
-"</ul>После "
-"того, как набор используемых песен будет создан, Cantata сделает случайную "
-"подборку песен, "
-"чтобы в очереди на воспроизведение было заполнено 10 позиций.</p>"
-
-#: dynamic/dynamicrulesdialog.cpp:307
+"Cantata искать песни исполнителя Иванов, не входящие в альбом АБВ, вам "
+"понадобится следующее правило: <ul><li>Включить AlbumArtist=Иванов</"
+"li><li>Исключить Album=АБВ</li></ul>После того, как набор используемых песен "
+"будет создан, Cantata сделает случайную подборку песен, чтобы в очереди на "
+"воспроизведение было заполнено 10 позиций.</p>"
+
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr "Не удалось сохранить %1"
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
@@ -1723,31 +1763,35 @@ msgstr ""
 "Набор правил с именем «%1» уже существует.\n"
 "Перезаписать?"
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 msgid "Overwrite Rules"
 msgstr "Перезаписать правила"
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr "Сохранение %1"
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:168
 msgid "Deleting..."
 msgstr "Удаление..."
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Name"
 msgstr "Имя"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Item Count"
 msgstr "Количество элементов"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Space Used"
 msgstr "Используемое пространство"
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr "Всего использовано места на диске: %1"
+
+#: gui/cachesettings.cpp:245
 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 "
@@ -1759,51 +1803,56 @@ msgstr ""
 "копию реестра MPD. Cantata также может кешировать обложки или слова песен, "
 "если они были когда-то скачаны и не могли быть сохранены в папку MPD (если "
 "Cantata не имеет к ней доступа или если настройки Cantata указывают не "
-"сохранять "
-"там эти элементы). Использование кеша программой Cantata описано ниже."
+"сохранять там эти элементы). Использование кеша программой Cantata описано "
+"ниже."
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:257
 msgid "Covers"
 msgstr "Обложки"
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:258
 msgid "Backdrops"
 msgstr "Художественное оформление"
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
+#: 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:246
+#: gui/cachesettings.cpp:264
 msgid "Jamendo"
 msgstr "Jamendo"
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:265
 msgid "Magnatune"
 msgstr "Magnatune"
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr "Каталоги подкастов"
+
+#: gui/cachesettings.cpp:273
 msgid "Delete All"
 msgstr "Удалить всё"
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:312
 msgid "Delete all '%1' items?"
 msgstr "Удалить все «%1» объектов?"
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
 msgid "Delete Cache Items"
 msgstr "Удалить элементы кеша"
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:322
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>Удалить всё из следующего?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:150 gui/main.cpp:169
+#: gui/coverdialog.cpp:151 gui/main.cpp:231
 msgid "Last.fm"
 msgstr "Last.fm"
 
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:165
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1814,7 +1863,7 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:183
+#: gui/coverdialog.cpp:184
 msgctxt ""
 "Google\n"
 "width x height (file size)"
@@ -1825,7 +1874,7 @@ msgstr ""
 "Google\n"
 "%1 x %2 (%3)"
 
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:204
 msgctxt ""
 "Discogs\n"
 "width x height"
@@ -1836,7 +1885,7 @@ msgstr ""
 "Discogs\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:237
+#: gui/coverdialog.cpp:238
 msgctxt ""
 "Current Cover\n"
 "width x height"
@@ -1847,43 +1896,42 @@ msgstr ""
 "Текущая обложка\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:256
 msgid "Image"
 msgstr "Изображение"
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:259
 msgid "Downloading..."
 msgstr "Загружается..."
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "Изображение (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:432
 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>"
+"<p>Изображение для этого исполнителя уже существует, и файл недоступен для "
+"записи.<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:432
+#: gui/coverdialog.cpp:433
 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>"
+"<p>Обложка для этого альбома уже существует, и файл недоступен для записи."
+"<p></p><i>%1</i></p>"
 
-#: gui/coverdialog.cpp:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
+#: 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:613
+#: gui/coverdialog.cpp:579
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1891,37 +1939,44 @@ msgstr ""
 "Сбой настройки обложки\n"
 "Не удалось сохранить во временный файл."
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:607
 msgid "Failed to download image!"
 msgstr "Сбой загрузки изображения."
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
 msgid "Load Local Cover"
 msgstr "Загрузить локальную обложку"
 
-#: gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:795
 msgid "Images (*.png *.jpg)"
 msgstr "Изображения (*.png *.jpg)"
 
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:800
 msgid "File is already in list!"
 msgstr "Файл уже в списке."
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:804
 msgid "Failed to read image!"
 msgstr "Сбой чтения изображения"
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:817
 msgid "Display"
 msgstr "Экран"
 
 #. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
 msgid "Remove"
 msgstr "Удалить"
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1181
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1929,453 +1984,464 @@ msgstr ""
 "Сбой настройки обложки\n"
 "Не удалось создать копию"
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1190
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
 msgstr ""
 "Сбой настройки обложки\n"
-"Не удалось создать резервную "
-"копию оригинала"
+"Не удалось создать резервную копию оригинала"
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1239
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
 msgstr ""
 "Сбой настройки обложки\n"
-"Не удалось скопировать "
-"файл в «%1»"
+"Не удалось скопировать файл в «%1»"
 
 #: gui/folderpage.cpp:45
 msgid "Open In File Manager"
 msgstr "Открыть в файловом менеджере"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Established"
 msgstr "Соединение установлено"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Failed"
 msgstr "Сбой подключения"
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. 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
+#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
+#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
 msgid "None"
 msgstr "Нет"
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:40
 msgid "Small"
 msgstr "Маленький"
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:41
 msgid "Medium"
 msgstr "Средний"
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:42
 msgid "Large"
 msgstr "Большой"
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:43
 msgid "Extra Large"
 msgstr "Очень большой"
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:48
 msgid "Simple Tree"
 msgstr "Простое дерево"
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:49
 msgid "Detailed Tree"
 msgstr "Подробное дерево"
 
 #. i18n: file: gui/interfacesettings.ui:329
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
 msgid "Grouped Albums"
 msgstr "Отсортированные альбомы"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:53
 msgid "List"
 msgstr "Список"
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:55
 msgid "Icon/List"
 msgstr "Значок/список"
 
-#: gui/interfacesettings.cpp:85
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+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)
+#: 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
+msgid "Style:"
+msgstr "Стиль:"
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr "Онлайн"
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr "Устройства"
+
+#: gui/interfacesettings.cpp:178
 msgid "Grouped by 'Album Artist'"
 msgstr "Отсортировано по «Исполнителю альбома»"
 
-#: gui/interfacesettings.cpp:86
+#: gui/interfacesettings.cpp:179
 msgid "Grouped under 'Various Artists'"
 msgstr "Отсортировано по «Нескольким исполнителям»"
 
-#: 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/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
 msgid "Cantata"
 msgstr "Cantata"
 
-#: gui/main.cpp:152
+#: gui/main.cpp:214
 msgid "A KDE client for MPD"
 msgstr "Клиент KDE для MPD"
 
-#: gui/main.cpp:154
-msgid "Copyright (C) 2011-2013 Craig Drummond"
-msgstr "©Крейг Драммонд (Craig Drummond), 2011-2013"
+#: gui/main.cpp:216
+msgid "Copyright (c) 2011–2013 Craig Drummond"
+msgstr "(c)Крейг Драммонд (Craig Drummond), 2011-2013"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Craig Drummond"
 msgstr "Крейг Драммонд"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Maintainer"
 msgstr "Сопровождающий"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "Piotr Wicijowski"
 msgstr "Пётр Вичиёвски (Piotr Wicijowski)"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "UI Improvements"
 msgstr "Улучшения интерфейса"
 
-#: gui/main.cpp:160
+#: gui/main.cpp:222
 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:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
 msgid "QtMPC author"
 msgstr "Автор QtMPC"
 
-#: gui/main.cpp:161
+#: gui/main.cpp:223
 msgid "Roeland Douma"
 msgstr "Рёленд Доума (Roeland Douma)"
 
-#: gui/main.cpp:162
+#: gui/main.cpp:224
 msgid "Daniel Selinger"
 msgstr "Дэниэль Селинджер (Daniel Selinger)"
 
-#: gui/main.cpp:163
+#: gui/main.cpp:225
 msgid "Armin Walland"
 msgstr "Армин Волленд (Armin Walland)"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid "FanArt.tv"
 msgstr "FanArt.tv"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
-"Художественное оформление контекстного вида (не забудьте выложить "
-"свой фан-арт на музыкальные темы на сайте fanart.tv)."
+"Художественное оформление контекстного вида (не забудьте выложить свой фан-"
+"арт на музыкальные темы на сайте fanart.tv)."
 
-#: gui/main.cpp:168
+#: gui/main.cpp:230
 msgid "Wikipedia"
 msgstr "Wikipedia"
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:230 gui/main.cpp:231
 msgid "Context view metadata"
 msgstr "Метаданные контекстного вида."
 
-#: gui/main.cpp:173
+#: gui/main.cpp:235
 msgid "URL to open"
 msgstr "Адрес URL"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:238
 msgid "Quit"
 msgstr "Выход"
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:242
 msgid "Show Window"
 msgstr "Показать окно"
 
-#. 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:245 po/rc.cpp:418 rc.cpp:418
 msgid "Connect"
 msgstr "Подключиться"
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
 msgid "Collection"
 msgstr "Коллекция"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:247
 msgid "Outputs"
 msgstr "Выводы"
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr "Предыдущий трек"
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr "Следующий трек"
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr "Воспр./Пауза"
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr "Остановить после текущего трека"
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "Остановить после трека"
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr "Увеличить громкость"
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr "Уменьшить громкость"
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr "Заглушить звук"
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:249
 msgid "Add To Stored Playlist"
 msgstr "Добавить в сохраняемый плейлист"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:250
 msgid "Remove From Play Queue"
 msgstr "Удалить из очереди"
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:251
 msgid "Copy Track Info"
 msgstr "Скопировать инфо трека"
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:252
 msgid "Crop"
 msgstr "Обрезать"
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
-msgstr "Случайно"
+#: gui/mainwindow.cpp:253
+msgid "Shuffle Tracks"
+msgstr "Треки в случайном порядке"
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:254
+msgid "Shuffle Albums"
+msgstr "Альбомы в случайном порядке"
+
+#: gui/mainwindow.cpp:255
 msgid "Add Stream URL"
 msgstr "Добавить URL потока"
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:256
 msgid "Clear"
 msgstr "Очистить"
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:257
 msgid "Expanded Interface"
 msgstr "Расширенный интерфейс"
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:258
 msgid "Show Current Song Information"
 msgstr "Показать инфо текущей песни"
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:261
 msgid "Full Screen"
 msgstr "Полный экран"
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:263
 msgid "Random"
 msgstr "Случайно"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:264
 msgid "Repeat"
 msgstr "Повтор"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid "Single"
 msgstr "Одиночный"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
 msgstr ""
-"«Одиночный» режим: воспроизведение останавливается после текущей песни, "
-"или, в случае активного режима «Повтор», текущая песня повторяется"
+"«Одиночный» режим: воспроизведение останавливается после текущей песни, или, "
+"в случае активного режима «Повтор», текущая песня повторяется"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid "Consume"
 msgstr "Поглощение"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr ""
-"Режим «Поглощение»: песня удаляется из очереди после того, как "
-"была проиграна"
+"Режим «Поглощение»: песня удаляется из очереди после того, как была проиграна"
 
-#: gui/mainwindow.cpp:291
+#: gui/mainwindow.cpp:267
 msgid "Search Play Queue"
 msgstr "Искать в очереди"
 
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:269
 msgid "Set Priority"
 msgstr "Настроить приоритет"
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:271
 msgid "Play Stream"
 msgstr "Воспроизводить поток"
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:273
 msgid "Locate In Library"
 msgstr "Найти в библиотеке"
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:275
 msgid "Edit Song Tags"
 msgstr "Редактировать теги"
 
 #. i18n: file: gui/interfacesettings.ui:304
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
 msgid "Play Queue"
 msgstr "Проиграть очередь"
 
 #. i18n: file: gui/interfacesettings.ui:27
 #. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:302 po/rc.cpp:455 rc.cpp:455
+#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
 msgid "Artists"
 msgstr "Исполнители"
 
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr "Папки"
-
 #. 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
+#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
 msgid "Playlists"
 msgstr "Плейлисты"
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:282
 msgid "Dynamic"
 msgstr "Динамический"
 
-#: gui/mainwindow.cpp:308
-msgid "Online"
-msgstr "Онлайн"
-
-#: gui/mainwindow.cpp:310
-msgid "Devices"
-msgstr "Устройства"
-
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:288
 msgid "Expand All"
 msgstr "Развернуть всё"
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:289
 msgid "Collapse All"
 msgstr "Свернуть всё"
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:290
+msgid "Remove All Songs"
+msgstr "Удалить все песни"
+
+#: gui/mainwindow.cpp:398
 msgid "Info"
 msgstr "Инфо"
 
-#: gui/mainwindow.cpp:435
+#: gui/mainwindow.cpp:405
 msgid "Auto Hide"
 msgstr "Автоскрытие"
 
-#: gui/mainwindow.cpp:441
+#: gui/mainwindow.cpp:411
 msgid "Monochrome Icons"
 msgstr "Монохромные значки"
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:541
 msgid "Server information..."
 msgstr "Сведения о сервере..."
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:552
 msgid "Configure Cantata..."
 msgstr "Настроить Cantata..."
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:559
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "О программе Cantata..."
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:571
 msgid "&File"
 msgstr "&Файл"
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:574
 msgid "&Settings"
 msgstr "&Настройки"
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
 msgid "&Help"
 msgstr "&Помощь"
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:948
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr ""
-"Не удалось найти песен, подходящих под правила "
-"динамического плейлиста."
+"Не удалось найти песен, подходящих под правила динамического плейлиста."
 
-#: gui/mainwindow.cpp:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
 msgid "Connecting to %1"
 msgstr "Подключение к %1"
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+"В настоящее время происходит загрузка подкастов\n"
+"\n"
+"Выход из программы отменит все загрузки."
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr "Прервать загрузки и выйти"
+
+#: gui/mainwindow.cpp:1447
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "О программе Cantata"
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1448
 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.<br/><br/>© Крейг Драммонд (Craig "
-"Drummond), 2011-2013."
-"<br/>Выходит  на условиях лицензии <a href=\"http://www.gnu.org/licenses/gpl.h"
-"tml"
-"\">GPLv3</a>"
+"<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>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1450
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
 "QtMPC Authors<br/>"
 msgstr ""
-"На базе <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> — ©авторы QtMPC, "
+"На базе <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> — (c)авторы QtMPC, "
 "2007-2010<br/>"
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1451
 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>"
+"Художественное оформление контекстного вида предоставлено сайтом <a href="
+"\"http://www.fanart.tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1452
 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 ""
-"Метаданные контекстного вида предоставлены сайтами <a "
-"href=\"http://www.wikipedia."
-"org\">Wikipedia</a> и <a href=\"http://www.last.fm\">Last.fm</a>."
+"Метаданные контекстного вида предоставлены сайтами <a href=\"http://www."
+"wikipedia.org\">Wikipedia</a> и <a href=\"http://www.last.fm\">Last.fm</a>."
 
-#: gui/mainwindow.cpp:1468
+#: gui/mainwindow.cpp:1453
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
-"Вы можете выкладывать ваши творческие работы на темы музыкального "
-"фан-арта на сайт <a href=\"http://www.fanart.tv\">FanArt.tv</a>"
+"Вы можете выкладывать ваши творческие работы на темы музыкального фан-арта "
+"на сайт <a href=\"http://www.fanart.tv\">FanArt.tv</a>"
 
-#: gui/mainwindow.cpp:1479
+#: gui/mainwindow.cpp:1464
 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></"
@@ -2385,7 +2451,7 @@ msgstr ""
 "</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:1487
+#: gui/mainwindow.cpp:1472
 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</"
@@ -2395,88 +2461,83 @@ msgid ""
 "%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:1496
+"\">Исполнителей:</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
 msgid "Server Information"
 msgstr "Сведения о сервере"
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
 msgid "Cantata (%1)"
 msgstr "Cantata (%1)"
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1728
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1730
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1773
 msgid "(Stream)"
 msgstr "(Поток)"
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1775
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr "Громкость отключена"
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1% (Muted)"
-msgstr "Громкость %1% (звук отключён)"
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
+msgstr "MPD выдал следующую ошибку: %1"
 
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
-msgstr "Громкость %1%"
+#: gui/mainwindow.cpp:1990
+msgid "Remove all songs from play queue?"
+msgstr "Удалить все песни из очереди?"
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
 msgid "Priority"
 msgstr "Приоритет"
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2080
 msgid "Enter priority (0..255):"
 msgstr "Введите приоритет (0..255):"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Playlist Name"
 msgstr "Имя плейлиста"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Enter a name for the playlist:"
 msgstr "Введите имя плейлиста:"
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2106
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr "Плейлист с именем <b>%1</b> уже существует<br/>Добавить к нему?"
 
-#: gui/mainwindow.cpp:2146
+#: gui/mainwindow.cpp:2107
 msgid "Existing Playlist"
 msgstr "Существующие плейлисты"
 
@@ -2488,10 +2549,10 @@ msgstr "Без затухания"
 msgid " ms"
 msgstr " мс"
 
-#. i18n: file: devices/albumdetails.ui:152
+#. i18n: file: devices/albumdetails.ui:165
 #. 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:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
 msgid "Track"
 msgstr "Трек"
 
@@ -2499,7 +2560,7 @@ msgstr "Трек"
 msgid "Auto"
 msgstr "Авто"
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:164
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
 "MPD collection.</i>"
@@ -2509,15 +2570,15 @@ msgstr ""
 
 #. i18n: file: gui/playbacksettings.ui:26
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
 msgid ""
 "<i>Not Connected!<br/>The entries below cannot be modified, as Cantata is "
 "not connected to MPD.</i>"
 msgstr ""
-"<i>Не подключено.<br/>Элементы ниже нельзя изменять, т.к. Cantata "
-"не подключена к MPD.</i>"
+"<i>Не подключено.<br/>Элементы ниже нельзя изменять, т.к. Cantata не "
+"подключена к MPD.</i>"
 
-#: gui/playbacksettings.cpp:153
+#: gui/playbacksettings.cpp:174
 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 "
@@ -2527,28 +2588,25 @@ 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 — это стандарт, предложенный в 2001 году для выравнивания "
 "уровня громкости компьютерных аудио-форматов, таких, как MP3 и Ogg Vorbis. "
 "Он функционирует на базе принципа трек/альбом, и на сегодня поддерживается "
 "большим числом плееров.</p><p>Для ReplayGain можно использовать следующие "
-"настройки: <ul><li><i>Нет</i> — ReplayGain не используется</li><li><i>Трек</i>"
-" "
-"— громкость будет настроена с использованием тегов ReplayGain данного трека<"
-"/li>"
-"<li><i>Альбом</i> — громкость будет настроена с использованием тегов "
-"ReplayGain данного альбома</li><li><i>Авто</i> — в случае случайного режима "
-"воспроизведения громкость будет настроена с использованием тегов ReplayGain "
-"данного трека, "
-"иначе — используются теги альбома.</li></ul></p>"
-
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:759 tags/trackorganiser.cpp:65
+"настройки: <ul><li><i>Нет</i> — ReplayGain не используется</li><li><i>Трек</"
+"i> — громкость будет настроена с использованием тегов ReplayGain данного "
+"трека</li><li><i>Альбом</i> — громкость будет настроена с использованием "
+"тегов ReplayGain данного альбома</li><li><i>Авто</i> — в случае случайного "
+"режима воспроизведения громкость будет настроена с использованием тегов "
+"ReplayGain данного трека, иначе — используются теги альбома.</li></ul></p>"
+
+#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
 msgid "Rename"
 msgstr "Переименовывать"
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:190
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2556,114 +2614,124 @@ msgstr ""
 "Точно удалить выбранный плейлист?\n"
 "Эту операцию нельзя будет отменить."
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:191
 msgid "Remove Playlists"
 msgstr "Удалить плейлист"
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "Плейлист с именем <b>%1</b> уже существует.<br/>Перезаписать?"
 
-#: gui/playlistspage.cpp:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
 msgid "Overwrite Playlist"
 msgstr "Перезаписать плейлист"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Rename Playlist"
 msgstr "Переименовать плейлист"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Enter new name for playlist:"
 msgstr "Новое имя плейлиста:"
 
-#: gui/preferencesdialog.cpp:77
+#: gui/preferencesdialog.cpp:80
 msgid "Collection Settings"
 msgstr "Настройки коллекции"
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
 msgid "Playback"
 msgstr "Воспроизведение"
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:81
 msgid "Playback Settings"
 msgstr "Настройки воспроизведения"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "Files"
 msgstr "Файлы"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "File Settings"
 msgstr "Настройки файлов"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface"
 msgstr "Интерфейс"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface Settings"
 msgstr "Настройки интерфейса"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:85
+msgid "Streams Settings"
+msgstr "Настройки потоков"
+
+#: gui/preferencesdialog.cpp:89
+msgid "Online Providers"
+msgstr "Источники в сети"
+
+#: gui/preferencesdialog.cpp:92
 msgid "Context"
 msgstr "Контекст"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:92
 msgid "Context View Settings"
 msgstr "Настройки внешнего вида контекста"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server"
 msgstr "Сервер HTTP"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server Settings"
 msgstr "Настройки сервера HTTP"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:103
 msgid "Audio CD Settings"
 msgstr "Настройки аудио-CD"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgid "Proxy"
 msgstr "Прокси"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "Настройки прокси"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "Комбинации клавиш"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "Настройки комбинаций клавиш"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cache"
 msgstr "Кеш"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cached Items"
 msgstr "Кешированные элементы"
 
-#: gui/preferencesdialog.cpp:118
+#: gui/preferencesdialog.cpp:116
 msgid "Configure"
 msgstr "Настройка"
 
-#: gui/serversettings.cpp:75
+#: 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>"
+"<i> Эта папка также будет использоваться для хранения музыкальных файлов, "
+"переносимых с/на устройства.</i>"
 
-#: gui/serversettings.cpp:88
+#: gui/serversettings.cpp:100
 msgid "Not used"
 msgstr "Не используется"
 
@@ -2679,12 +2747,12 @@ msgstr "Не используется"
 #. 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:208 po/rc.cpp:247 po/rc.cpp:705
+#: rc.cpp:208 rc.cpp:247 rc.cpp:705
 msgid "Host:"
 msgstr "Хост:"
 
-#: 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 "
@@ -2694,14 +2762,12 @@ msgid ""
 "service.</i>"
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> настройка «порт Dynamizer» имеет смысл только в том "
-"случае, "
-"если вы хотите использовать «динамические плейлисты». Для нормальной работы, "
-"приложение с функционалом <code>cantata-dynamic</code> <b>должно</b> уже быть "
-"установлено и запущено на соответствующем хосте — Cantata не может "
-"контролировать "
-"запуск/останов этой службы самостоятельно.</i>"
+"случае, если вы хотите использовать «динамические плейлисты». Для нормальной "
+"работы, приложение с функционалом <code>cantata-dynamic</code> <b>должно</b> "
+"уже быть установлено и запущено на соответствующем хосте — Cantata не может "
+"контролировать запуск/останов этой службы самостоятельно.</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 "
@@ -2712,28 +2778,27 @@ msgid ""
 "dynamic playlists.</i>"
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> «Порт Dynamizer» имеет значение только тогда, когда "
-"используется общесистемный или нелокальный экземпляр Cantata dynamizer. Чтобы "
-"он работал, "
-"приложение <code>cantata-dynamic</code> <b>должно</b> быть предварительно "
-"установлено и "
-"запущено на соответствующем порту, поскольку Cantata не может самостоятельно "
-"контролировать запуск/останов этого сервиса. Если такой настройки нет, то "
-"Cantata будет использовать "
-"отдельный пользовательский экземпляр dynamizer для облегчения работы с "
-"динамическими плейлистами.</i>"
-
-#: gui/serversettings.cpp:109
+"используется общесистемный или нелокальный экземпляр Cantata dynamizer. "
+"Чтобы он работал, приложение <code>cantata-dynamic</code> <b>должно</b> быть "
+"предварительно установлено и запущено на соответствующем порту, поскольку "
+"Cantata не может самостоятельно контролировать запуск/останов этого сервиса. "
+"Если такой настройки нет, то Cantata будет использовать отдельный "
+"пользовательский экземпляр dynamizer для облегчения работы с динамическими "
+"плейлистами.</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 "
 "artist of the current song, and %album% will be replaced with the album name."
 "</i></p>"
 msgstr ""
-"<p>Имя файла (без расширения) для сохранения скаченных обложек.<br/>Если "
-"поле незаполнено, используется 'cover'.<br/><br/><i>%artist% будет заменён на "
-"значение исполнителя текущей песни, а %album% — на название альбома.</i></p>"
+"<p>Имя файла (без расширения) для сохранения загруженных обложек.<br/>Если "
+"поле не заполнено, используется 'cover'.<br/><br/><i>%artist% будет заменён "
+"на значение исполнителя текущей песни, а %album% — на название альбома.</i><"
+"/p>"
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:252
 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</"
@@ -2742,132 +2807,205 @@ msgid ""
 msgstr ""
 "К какому типу коллекции вы хотите подключиться?<br/><ul><li>Стандартный — "
 "коллекцию можно сделать общим ресурсом, она находится на другой машине или "
-"уже настроена</"
-"li><li>Базовый — коллекция не является общим ресурсом, и Cantata настроит и "
-"будет управлять"
-"экземпляром MPD.</li></ul>"
+"уже настроена</li><li>Базовый — коллекция не является общим ресурсом, и "
+"Cantata настроит и будет управлятьэкземпляром MPD.</li></ul>"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Add Collection"
 msgstr "Добавить коллекцию"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Standard"
 msgstr "Стандартный"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Basic"
 msgstr "Базовый"
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:297
 msgid "Delete <b>%1</b>?"
 msgstr "Удалить <b>%1</b>?"
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:298
 msgid "Delete"
 msgstr "Удалить"
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:336
 msgid "New Collection %1"
 msgstr "Новая коллекция %1"
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
 msgid "Default"
 msgstr "По умолчанию"
 
-#: gui/stdactions.cpp:55
-msgid "Save As"
-msgstr "Сохранить как"
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
+msgstr "Мультимедиа-клавиши"
 
-#: gui/stdactions.cpp:56
-msgid "Add To Play Queue"
-msgstr "Добавить в очередь воспроизведения"
+#: gui/shortcutssettingspage.cpp:80
+msgid "Do not use media keys to control Cantata"
+msgstr "Не использовать мультимедиа-клавиши для управления Cantata"
 
-#: gui/stdactions.cpp:57
-msgid "Replace Play Queue"
-msgstr "Заменить очередь воспроизведения"
+#: gui/shortcutssettingspage.cpp:81
+msgid "Use media keys to control Cantata"
+msgstr "Использовать мультимедиа-клавиши для управления Cantata"
 
-#: gui/stdactions.cpp:58
-msgid "Add With Priority"
-msgstr "Добавить с приоритетом"
+#: gui/shortcutssettingspage.cpp:84
+msgid "Use media keys, as configured in desktop settings, to control Cantata"
+msgstr ""
+"Использовать мультимедиа-клавиши для управления Cantata, согласно "
+"настройкам рабочего стола"
+
+#: gui/shortcutssettingspage.cpp:85
+msgid ""
+"Use media keys, as configured in GNOME/Unity settings, to control Cantata"
+msgstr ""
+"Использовать мультимедиа-клавиши для управления Cantata, согласно "
+"настройкам GNOME/Unity"
+
+#: gui/shortcutssettingspage.cpp:88 gui/shortcutssettingspage.cpp:110
+#: online/onlineservicespage.cpp:102 streams/streamspage.cpp:99
+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 "Предыдущий трек"
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr "Следующий трек"
+
+#: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr "Воспр./Пауза"
 
 #: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr "Остановить после текущего трека"
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr "Увеличить громкость"
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr "Уменьшить громкость"
+
+#: gui/stdactions.cpp:63
+msgid "Save As"
+msgstr "Сохранить как"
+
+#: gui/stdactions.cpp:64
+msgid "Add To Play Queue"
+msgstr "Добавить в очередь воспроизведения"
+
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr "Добавить альбомы в случайном порядке"
+
+#: gui/stdactions.cpp:66
+msgid "Replace Play Queue"
+msgstr "Заменить очередь воспроизведения"
+
+#: gui/stdactions.cpp:67
+msgid "Add With Priority"
+msgstr "Добавить с приоритетом"
+
+#: gui/stdactions.cpp:68
 msgid "Highest Priority (255)"
 msgstr "Высший приоритет (255)"
 
-#: gui/stdactions.cpp:60
+#: gui/stdactions.cpp:69
 msgid "High Priority (200)"
 msgstr "Высокий  приоритет (200)"
 
-#: gui/stdactions.cpp:61
+#: gui/stdactions.cpp:70
 msgid "Medium Priority (125)"
 msgstr "Средний приоритет (125)"
 
-#: gui/stdactions.cpp:62
+#: gui/stdactions.cpp:71
 msgid "Low Priority (50)"
 msgstr "Низкий приоритет (50)"
 
-#: gui/stdactions.cpp:63
+#: gui/stdactions.cpp:72
 msgid "Default Priority (0)"
 msgstr "Приоритет по умолчанию (0)"
 
-#: gui/stdactions.cpp:64
+#: gui/stdactions.cpp:73
 msgid "Custom Priority..."
 msgstr "Пользовательское значение приоритета..."
 
-#: gui/stdactions.cpp:65
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr "Добавить в плейлист"
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
 msgid "Organize Files"
 msgstr "Систематизировать файлы"
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
 msgstr "Редактировать теги"
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
 msgid "ReplayGain"
 msgstr "ReplayGain"
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 msgid "Copy Songs To Device"
 msgstr "Копировать песни на устройство"
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 msgid "Set Image"
 msgstr "Указать изображение"
 
-#: gui/stdactions.cpp:79
+#: gui/stdactions.cpp:88
 msgid "Refresh Database"
 msgstr "Обновить базу данных"
 
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "Назад"
 
-#: gui/trayitem.cpp:165
+#: gui/trayitem.cpp:192
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%1 на %2"
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:193
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
 msgstr "%1 на %2 (%3)"
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:195
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%1 исполняет %2 на %3"
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:196
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%1 исполняет %2 на %3 (%4)"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:223
 msgid "Now playing"
 msgstr "Проигрывается"
 
@@ -2891,6 +3029,16 @@ msgstr "Первый активный интерфейс"
 msgid "Inactive"
 msgstr "Неактивно"
 
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr "Cue Sheet"
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr "Плейлист"
+
 #: models/devicesmodel.cpp:108
 msgid "Configure Device"
 msgstr "Настройка устройства"
@@ -2911,7 +3059,7 @@ msgstr "Отключить устройство"
 msgid "Edit CD Details"
 msgstr "Редактировать подробности CD"
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:690
 msgid "No Devices Attached"
 msgstr "Нет подключённых устройств"
 
@@ -2923,28 +3071,28 @@ msgstr "Вход не выполнен"
 msgid "Logged in"
 msgstr "Вход выполнен"
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 msgid "Unknown error"
 msgstr "Неизвестная ошибка"
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr "Нет подписок"
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr "У вас нет активных подписок"
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr "Вход выполнен (истекает: %1)"
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr "Время сеанса истекло"
 
 #: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "1 элемент"
@@ -2956,21 +3104,13 @@ msgstr[3] "%1 элемент"
 msgid "Audio File"
 msgstr "Аудио-файл"
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr "Плейлист"
-
-#: 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:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
 msgid "Single Tracks"
 msgstr "Отдельные треки"
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "%1 трек"
@@ -2978,7 +3118,7 @@ msgstr[1] "%1 трека"
 msgstr[2] "%1 треков"
 msgstr[3] "%1 трек"
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:185
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "%1 исполнитель"
@@ -2986,7 +3126,7 @@ msgstr[1] "%1 исполнителя"
 msgstr[2] "%1 исполнителей"
 msgstr[3] "%1 исполнитель"
 
-#: models/musicmodel.cpp:172
+#: models/musicmodel.cpp:192
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "%1 альбом"
@@ -2994,201 +3134,230 @@ msgstr[1] "%1 альбома"
 msgstr[2] "%1 альбомов"
 msgstr[3] "%1 альбом"
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
-msgstr "Настроить он-лайн сервис"
-
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
-msgstr "Обновить он-лайн сервис"
-
-#: models/onlineservicesmodel.cpp:125
+#: models/musicmodel.cpp:198
+msgid "1 Episode"
+msgid_plural "%1 Episodes"
+msgstr[0] "%1 эпизод"
+msgstr[1] "%1 эпизода"
+msgstr[2] "%1 эпизодов"
+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
+msgid "Configure Service"
+msgstr "Настройка сервиса"
+
+#: models/onlineservicesmodel.cpp:84
+msgid "Refresh Service"
+msgstr "Обновить сервис"
+
+#: models/onlineservicesmodel.cpp:85
+msgid "Add Subscription"
+msgstr "Добавить подписку"
+
+#: models/onlineservicesmodel.cpp:86
+msgid "Remove Subscription"
+msgstr "Удалить подписку"
+
+#: models/onlineservicesmodel.cpp:87
+msgid "Refresh Subscription"
+msgstr "Обновить подписку"
+
+#: models/onlineservicesmodel.cpp:137
 msgid "Last Search:%1"
 msgstr "Последний поисковый запрос:%1"
 
-#: models/onlineservicesmodel.cpp:136
+#: models/onlineservicesmodel.cpp:149
 msgid "Searching..."
 msgstr "Идёт поиск..."
 
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:670
 msgid "Not Loaded"
 msgstr "Не загружено"
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:155
 msgid "Use search to locate tracks"
 msgstr "Искать треки через поиск"
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:166
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] "%1 подкаст"
+msgstr[1] "%1 подкаста"
+msgstr[2] "%1 подкастов"
+msgstr[3] "%1 подкаст"
+
+#: models/onlineservicesmodel.cpp:177
+msgid "(Downloading: %1%)"
+msgstr "(Идёт загрузка: %1%)"
+
+#: models/onlineservicesmodel.cpp:235
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: models/playlistsmodel.cpp:77
 msgid "New Playlist..."
 msgstr "Новый плейлист..."
 
-#: models/playqueuemodel.cpp:105
+#: models/playqueuemodel.cpp:102
 msgctxt "Track Number (#)"
 msgid "#"
 msgstr "#"
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:103
 msgid "Length"
 msgstr "Длина"
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:104
 msgid "Disc"
 msgstr "Диск"
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:138
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
 msgid "Year"
 msgstr "Год"
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:360
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(Приоритет: %1)</b>"
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
 msgid "Loading..."
 msgstr "Загрузка..."
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:286
 msgid "Bookmarks"
 msgstr "Закладки"
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:560
 msgid "TuneIn"
 msgstr "TuneIn"
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:563
 msgid "IceCast"
 msgstr "IceCast"
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:564
 msgid "ShoutCast"
 msgstr "ShoutCast"
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:567
 msgid "SomaFM"
 msgstr "SomaFM"
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:568
 msgid "Digitally Imported"
 msgstr "Digitally Imported"
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:569
 msgid "JazzRadio.com"
 msgstr "JazzRadio.com"
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:570
 msgid "RockRadio.com"
 msgstr "RockRadio.com"
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:571
 msgid "Sky.fm"
 msgstr "Sky.fm"
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:572
 msgid "Favorites"
 msgstr "Избранное"
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr "Слушать трансляцию"
+
+#: models/streamsmodel.cpp:578
 msgid "Bookmark Category"
 msgstr "Категория закладки"
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:579
 msgid "Add Stream To Favorites"
 msgstr "Добавить поток в Избранное"
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:580
 msgid "Configure Streams"
 msgstr "Настройка потоков"
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:660
 msgid "%1 (Read-Only)"
 msgstr "%1 (только чтение)"
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1241
 msgid "Failed to save stream list. Please check %1 is writable."
-msgstr ""
-"Сбой сохранения списка потоков. Проверьте "
-"права на запись для %1"
+msgstr "Сбой сохранения списка потоков. Проверьте права на запись для %1"
 
-#: models/streamsmodel.cpp:1455
+#: models/streamsmodel.cpp:1639
 msgid "All"
 msgstr "Всё"
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr "Слушать трансляцию"
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:154
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr "«%1»"
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:156
 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:372 mpd/mpdconnection.cpp:415
+#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
+#: mpd/mpdconnection.cpp:1036
 msgid "Connection to %1 failed"
 msgstr "Сбой подключения к %1"
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
 msgid "Connection to %1 failed - incorrect password"
 msgstr "Сбой подключения к %1 — неправильный пароль"
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:455
 msgid "Failed to send command to %1 - not connected"
 msgstr "Сбой передачи команды для %1 — нет подключения"
 
-#: mpd/mpdconnection.cpp:472
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "Сбой загрузки. Проверьте права на чтение для пользователя «mpd»."
 
-#: mpd/mpdconnection.cpp:474
+#: mpd/mpdconnection.cpp:493
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr ""
-"Сбой загрузки. MPD может проигрывать локальные файлы только "
-"при подключении к локальному сокету."
+"Сбой загрузки. MPD может проигрывать локальные файлы только при подключении "
+"к локальному сокету."
 
-#: mpd/mpdconnection.cpp:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
 msgid "Failed to send command. Disconnected from %1"
 msgstr "Сбой передачи команды.  Отключено от %1."
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1171
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "Сбой переименования <b>%1</b> в <b>%2</b>"
 
-#: mpd/mpdconnection.cpp:1158
+#: mpd/mpdconnection.cpp:1183
 msgid "Failed to save <b>%1</b>"
 msgstr "Сбой сохранения <b>%1</b>"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1196
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr "Нельзя добавлять фрагменты файла cue sheet в плейлист."
 
-#: mpd/mpdconnection.cpp:1174
+#: mpd/mpdconnection.cpp:1199
 msgid "You cannot add a playlist to another playlist!"
 msgstr "Нельзя добавлять плейлист к другому плейлисту."
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] "%1 день %2"
-msgstr[1] "%1 дня %2"
-msgstr[2] "%1 дней %2"
-msgstr[3] "%1 день %2"
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr "Частный"
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:343
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -3230,19 +3399,19 @@ msgstr "Ogg"
 msgid "Streaming format:"
 msgstr "Формат потока:"
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr "Потоковая передача"
 
-#: 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"
 
@@ -3250,10 +3419,6 @@ msgstr "WAV"
 msgid "Magnatune Settings"
 msgstr "Настройки Magnatune"
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr "Членство:"
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -3262,8 +3427,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:51 po/rc.cpp:694 po/rc.cpp:706
-#: rc.cpp:694 rc.cpp:706
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
+#: rc.cpp:711 rc.cpp:729
 msgid "Username:"
 msgstr "Пользователь:"
 
@@ -3271,7 +3436,7 @@ msgstr "Пользователь:"
 #. 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)
@@ -3283,7 +3448,7 @@ msgstr "Пользователь:"
 #. 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)
@@ -3291,53 +3456,270 @@ 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: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: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
 msgid "Password:"
 msgstr "Пароль:"
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr "Членство:"
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr "Загрузки:"
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr "Идёт загрузка"
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr "Обновление экрана"
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr "Сортировка треков"
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr "Обработка ответа"
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr "Сбой обработки"
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr "Сбой загрузки"
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
 msgstr "Загрузить в библиотеку"
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
+msgid "Search For Podcasts"
+msgstr "Искать подкасты"
+
+#: online/onlineservicespage.cpp:63
+msgid "Download Podcast Episodes"
+msgstr "Загрузить эпизоды подкаста"
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr "Удалить загруженные эпизоды подкаста"
+
+#: online/onlineservicespage.cpp:329
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "Поиск %1:"
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:464
 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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr "Отменить подписку для <b>%1</b>?"
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr "Обновить список всех подкастов?"
+
+#: online/onlineservicespage.cpp:621
+msgid "Refresh episode listing from <b>%1</b>?"
+msgstr "Обновить список эпизодов для <b>%1</b>?"
+
+#: online/onlineservicespage.cpp:695
+msgid "All selected podcasts have already been downloaded!"
+msgstr "Все выбранные подкасты были уже загружены."
+
+#: online/onlineservicespage.cpp:699
+msgid "Do you wish to download the following podcast episode?"
+msgstr "Загрузить следующий эпизод подкаста?"
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr "Загрузить следующие эпизоды подкаста?"
+
+#: online/onlineservicespage.cpp:705
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr "Загрузить выбранные эпизоды подкаста?"
+
+#: online/onlineservicespage.cpp:753
+msgid "All selected downloaded podcast episodes have already been deleted!"
+msgstr "Все выбранные загруженные эпизоды подкаста уже были удалены."
+
+#: online/onlineservicespage.cpp:757
+msgid ""
+"Do you wish to delete the downloaded file of the following podcast episode?"
+msgstr "Удалить загруженный файл следующего эпизода подкаста?"
+
+#: online/onlineservicespage.cpp:760
+msgid ""
+"Do you wish to the delete downloaded files of the following podcast episodes?"
+msgstr "Удалить загруженные файлы следующих эпизодов подкаста?"
+
+#: online/onlineservicespage.cpp:763
+msgid ""
+"Do you wish to the delete downloaded files of the selected podcast episodes?"
+msgstr "Удалить загруженные файлы выбранного эпизода подкаста?"
+
+#: online/podcastsearchdialog.cpp:243
+msgid "RSS:"
+msgstr "RSS:"
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr "Сайт:"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Podcast details"
+msgstr "Подробности подкаста"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Select a podcast to display its details"
+msgstr "Выбрать подкаст для показа подробностей"
+
+#: online/podcastsearchdialog.cpp:322
+msgid "Enter search term..."
+msgstr "Введите поисковый запрос…"
+
+#: online/podcastsearchdialog.cpp:372
+msgid "Failed to fetch podcasts from %1"
+msgstr "Сбой получения подкаста с %1"
+
+#: online/podcastsearchdialog.cpp:378
+msgid "There was a problem parsing the response from %1"
+msgstr "При выполнении обработки ответа от %1 возникла ошибка"
+
+#: online/podcastsearchdialog.cpp:439
+msgid "Failed to download directory listing"
+msgstr "Не удалось загрузить содержимое каталога"
+
+#: online/podcastsearchdialog.cpp:447
+msgid "Failed to parse directory listing"
+msgstr "Не удалось проанализировать содержимое каталога"
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr "Подписаться"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search %1"
+msgstr "Искать %1"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr "Поиск подкастов на %1"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr "Просмотреть %1"
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr "Просмотреть %1 подкастов"
+
+#: online/podcastsearchdialog.cpp:602
+msgid "Subscription added"
+msgstr "Подписка добавлена"
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr "Вы уже подписаны на этот подкаст"
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr "Подкасты"
+
+#: online/podcastservice.cpp:284
+msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
+msgstr ""
+"Cantata поддерживает только аудио-подкасты, а %1 содержит "
+"только видео-подкасты."
+
+#: online/podcastservice.cpp:286
+msgid "Failed to parse %1"
+msgstr "Сбой обработки %1"
+
+#: online/podcastservice.cpp:290
+msgid "Failed to download %1"
+msgstr "Не удалось загрузить %1"
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr "Проверить наличие новых эпизодов:"
+
+#: online/podcastsettingsdialog.cpp:59
+msgid "Download episodes to:"
+msgstr "Загрузить эпизоды в:"
+
+#: online/podcastsettingsdialog.cpp:60
+msgid "Automatically download new episodes:"
+msgstr "Автоматически загружать новые эпизоды:"
+
+#: online/podcastsettingsdialog.cpp:82
+msgid "Podcast Settings"
+msgstr "Настройки подкастов"
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr "Вручную"
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr "Каждые 15 минут"
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr "Каждые 30 минут"
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr "Каждый час"
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr "Каждые 2 часа"
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr "Каждые 6 часов"
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr "Каждые 12 часов"
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr "Каждый день"
+
+#: online/podcastsettingsdialog.cpp:92
+msgid "Every week"
+msgstr "Каждую неделю"
+
 #. i18n: file: context/othersettings.ui:19
 #. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
 #: po/rc.cpp:3 rc.cpp:3
@@ -3369,15 +3751,12 @@ msgid ""
 "cached articles (using the 'Cache' page).</i>"
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> Cantata не показывает страницы wikipedia полностью (с "
-"изображениями, "
-"ссылками и т.п), показывается только усечённая версия. Эта версия не всегда "
-"получается "
-"аккуратно на все 100%, поэтому, по умолчанию, Cantata показывает только "
-"базовое введение для "
-"каждой статьи. Если выбрать показ страницы полностью, то возможны ошибки "
-"обработки. Также "
-"будет необходимо удалить любую текущую кешированную статью (на страничке "
-"«Кеш»).</i>"
+"изображениями, ссылками и т.п), показывается только усечённая версия. Эта "
+"версия не всегда получается аккуратно на все 100%, поэтому, по умолчанию, "
+"Cantata показывает только базовое введение для каждой статьи. Если выбрать "
+"показ страницы полностью, то возможны ошибки обработки. Также будет "
+"необходимо удалить любую текущую кешированную статью (на страничке «Кеш»).</"
+"i>"
 
 #. i18n: file: context/togglelist.ui:17
 #. i18n: ectx: property (text), widget (QLabel, label_2)
@@ -3413,8 +3792,8 @@ msgstr "Копировать песни с:"
 #. 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
-#: rc.cpp:49 rc.cpp:721
+#: 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
 msgid "TextLabel"
 msgstr "TextLabel"
 
@@ -3460,93 +3839,109 @@ msgstr "Копировать:"
 msgid "Album Details"
 msgstr "Подробности альбома"
 
-#. i18n: file: devices/albumdetails.ui:60
+#. 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:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:73
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
+#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
 msgid "Genre:"
 msgstr "Жанр:"
 
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:86
 #. 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:86
 #. 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:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
 msgid "Year:"
 msgstr "Год:"
 
-#. 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 "Отдельный исполнитель:"
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:99
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #: po/rc.cpp:70 rc.cpp:70
 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/audiocdsettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:88 rc.cpp:88
 msgid "Album and Track Information Retrieval"
 msgstr "Получение информации об альбоме и треке:"
 
 #. i18n: file: devices/audiocdsettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:91 rc.cpp:91
 msgid "Automatically lookup:"
 msgstr "Автоматически искать:"
 
 #. i18n: file: devices/audiocdsettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:94 rc.cpp:94
 msgid "Initially look up via:"
 msgstr "Искать изначально через:"
 
 #. i18n: file: devices/audiocdsettings.ui:52
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:97 rc.cpp:97
 msgid "CDDB Host:"
 msgstr "Хост CDDB:"
 
 #. i18n: file: devices/audiocdsettings.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:100 rc.cpp:100
 msgid "CDDB Port:"
 msgstr "Порт CDDB:"
 
 #. i18n: file: devices/audiocdsettings.ui:88
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:103 rc.cpp:103
 msgid "Audio Extraction"
 msgstr "Извлечение аудио"
 
 #. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:106 rc.cpp:106
 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:106 rc.cpp:106
+#: po/rc.cpp:109 rc.cpp:109
 msgid "Never skip on read error:"
 msgstr "Никогда не пропускать при ошибке чтения:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:109 rc.cpp:109
+#: po/rc.cpp:112 rc.cpp:112
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3556,62 +3951,62 @@ 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: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
 msgid "Music folder:"
 msgstr "Папка с музыкой:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:118 rc.cpp:118
 msgid "Copy album covers as:"
 msgstr "Скопировать обложки альбома как:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:121 rc.cpp:121
 msgid "Maximum cover size:"
 msgstr "Максимальный размер обложки:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:82
 #. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: 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:124 rc.cpp:124
+#: 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:127 rc.cpp:127
+#: po/rc.cpp:130 rc.cpp:130
 msgid "Use cache:"
 msgstr "Использовать кеш:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:121
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:133 rc.cpp:133
 msgid "Default volume:"
 msgstr "Громкость по умолчанию:"
 
@@ -3623,7 +4018,7 @@ msgstr "Громкость по умолчанию:"
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
 #. 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:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
 msgid "Filenames"
 msgstr "Имена файлов:"
 
@@ -3635,7 +4030,7 @@ msgstr "Имена файлов:"
 #. 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
+#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
 msgid "Use only ASCII characters:"
 msgstr "Использовать только символы ASCII:"
 
@@ -3647,7 +4042,7 @@ msgstr "Использовать только символы ASCII:"
 #. 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
+#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
 msgid "Replace spaces with underscores:"
 msgstr "Заменять пробелы символом подчёркивания:"
 
@@ -3659,11 +4054,9 @@ msgstr "Заменять пробелы символом подчёркиван
 #. 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
+#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
 msgid "Ignore 'The' in artist names:"
-msgstr ""
-"Игнорировать артикль 'The' в именах "
-"англоязычных исполнителей:"
+msgstr "Игнорировать артикль 'The' в именах англоязычных исполнителей:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:193
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
@@ -3673,7 +4066,7 @@ msgstr ""
 #. 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:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
 msgid "Filename scheme:"
 msgstr "Схема имени файла:"
 
@@ -3685,101 +4078,99 @@ msgstr "Схема имени файла:"
 #. 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
+#: 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: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:154 rc.cpp:154
 msgid "Transcoding"
 msgstr "Перекодирование"
 
 #. i18n: file: devices/devicepropertieswidget.ui:261
 #. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:157 rc.cpp:157
 msgid "Only transcode if source file is of a different format:"
-msgstr ""
-"Перекодировать, только когда исходный "
-"файл имеет другой формат:"
+msgstr "Перекодировать, только когда исходный файл имеет другой формат:"
 
 #. i18n: file: devices/filenameschemedialog.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:160 rc.cpp:160
 msgid "Example:"
 msgstr "Пример:"
 
 #. i18n: file: devices/filenameschemedialog.ui:58
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:163 rc.cpp:163
 msgid "About filename schemes"
 msgstr "О схемах имени файла"
 
-#. i18n: file: devices/filenameschemedialog.ui:82
+#. i18n: file: devices/filenameschemedialog.ui:70
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:166 rc.cpp:166
 msgid "Album Artist"
 msgstr "Исполнитель альбома"
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:77
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:169 rc.cpp:169
 msgid "Album Title"
 msgstr "Название альбома"
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:91
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:175 rc.cpp:175
 msgid "Track Artist"
 msgstr "Исполнитель трека"
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:98
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:178 rc.cpp:178
 msgid "Track Title"
 msgstr "Название трека"
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:117
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:181 rc.cpp:181
 msgid "Track Title (+Artist)"
 msgstr "Название трека (+Исполнитель)"
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:124
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:184 rc.cpp:184
 msgid "Track #"
 msgstr "Трек №"
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:131
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:187 rc.cpp:187
 msgid "CD #"
 msgstr "CD №"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:196 rc.cpp:196
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
 msgstr ""
-"<i><b>ВНИМАНИЕ:</b> Эти настройки можно изменять только "
-"при отключённом устройстве.</i>"
+"<i><b>ВНИМАНИЕ:</b> Эти настройки можно изменять только при отключённом "
+"устройстве.</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:162
 #. 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:162
 #. 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:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
 msgid "Type:"
 msgstr "Тип:"
 
@@ -3791,14 +4182,14 @@ 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:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
+#: rc.cpp:638
 msgid "Name:"
 msgstr "Имя:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#: po/rc.cpp:205 rc.cpp:205
 msgid "Options"
 msgstr "Параметры"
 
@@ -3806,7 +4197,7 @@ msgstr "Параметры"
 #. 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)
@@ -3816,14 +4207,14 @@ msgstr "Параметры"
 #. 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: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
 msgid "Port:"
 msgstr "Порт:"
 
@@ -3839,7 +4230,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:208 po/rc.cpp:226 po/rc.cpp:247 rc.cpp:208 rc.cpp:226 rc.cpp:247
+#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
 msgid "User:"
 msgstr "Пользователь:"
 
@@ -3851,7 +4242,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:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
 msgid "Domain:"
 msgstr "Домен:"
 
@@ -3863,7 +4254,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:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
 msgid "Share:"
 msgstr "Общий ресурс:"
 
@@ -3875,20 +4266,20 @@ 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:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
 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>ВНИМАНИЕ:</b> введённый здесь пароль будет храниться"
-"<b>незашифрованным</b> в файле настроек Cantata. Для того, "
-"чтобы Cantata запрашивала пароль перед доступом к общему ресурсу, "
-"укажите пароль '-'</i>"
+"<i><b>ВНИМАНИЕ:</b> введённый здесь пароль будет "
+"храниться<b>незашифрованным</b> в файле настроек Cantata. Для того, чтобы "
+"Cantata запрашивала пароль перед доступом к общему ресурсу, укажите пароль "
+"'-'</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:229 rc.cpp:229
 msgid "Service name:"
 msgstr "Имя сервиса:"
 
@@ -3900,281 +4291,275 @@ msgstr "Имя сервиса:"
 #. 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:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
 msgid "Folder:"
 msgstr "Папка:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:259 rc.cpp:259
 msgid "Extra Options:"
 msgstr "Дополнительные параметры:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:262 rc.cpp:262
 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>ВНИМАНИЕ:</b> исходя из принципа работы sshfs, для ввода "
-"пароля вам потребуется подходящее приложение на базе ssh-askpass "
-"(ksshaskpass, ssh-askpass-gnome, и т.п.).</i>"
+"<i><b>ВНИМАНИЕ:</b> исходя из принципа работы sshfs, для ввода пароля вам "
+"потребуется подходящее приложение на базе ssh-askpass (ksshaskpass, ssh-"
+"askpass-gnome, и т.п.).</i>"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:268 rc.cpp:268
 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>ВНИМАНИЕ:</b> с помощью этого диалога можно добавить только "
-"удалённые устройства (например, через Samba) или получить доступ к "
-"локально смонтированным папкам. Для обычных медиа-плееров, "
-"подключённых по USB, Cantata автоматически покажет устройство сразу после "
-"его подключения.</i>"
+"<i><b>ВНИМАНИЕ:</b> с помощью этого диалога можно добавить только удалённые "
+"устройства (например, через Samba) или получить доступ к локально "
+"смонтированным папкам. Для обычных медиа-плееров, подключённых по USB, "
+"Cantata автоматически покажет устройство сразу после его подключения.</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:271 rc.cpp:271
 msgid "No dynamizer port defined in server settings."
 msgstr "В настройках сервера не указан порт для dynamizer"
 
-#. 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:274 rc.cpp:274
 msgid "Remote dynamizer is not running."
 msgstr "Удалённый dynamizer не запущен"
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:277 rc.cpp:277
 msgid "Name of Dynamic Rules"
 msgstr "Имя динамических правил"
 
 #. 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:283 streams/streamspage.cpp:62 rc.cpp:283
 msgid "Edit"
 msgstr "Изменить"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:289 rc.cpp:289
 msgid "About Rules"
 msgstr "О правилах"
 
 #. i18n: file: dynamic/dynamicrule.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:295 rc.cpp:295
 msgid "Album Artist:"
 msgstr "Исполнитель альбома:"
 
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
+#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
 msgid "Album:"
 msgstr "Альбом:"
 
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:103
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:310 rc.cpp:310
 msgid "From Year:"
 msgstr "От года:"
 
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
 msgid "Any"
 msgstr "Любой"
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:126
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:316 rc.cpp:316
 msgid "To Year:"
 msgstr "До года:"
 
-#. i18n: file: dynamic/dynamicrule.ui:136
+#. i18n: file: dynamic/dynamicrule.ui:149
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
+#: po/rc.cpp:322 rc.cpp:322
 msgid "Exact match:"
 msgstr "Точное совпадение:"
 
-#. i18n: file: dynamic/dynamicrule.ui:160
+#. i18n: file: dynamic/dynamicrule.ui:173
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
+#: po/rc.cpp:328 rc.cpp:328
 msgid "Include songs that match the following:"
-msgstr ""
-"Включить песни, отвечающие "
-"следующему условию:"
+msgstr "Включить песни, отвечающие следующему условию:"
 
-#. i18n: file: dynamic/dynamicrule.ui:165
+#. i18n: file: dynamic/dynamicrule.ui:178
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
+#: po/rc.cpp:331 rc.cpp:331
 msgid "Exclude songs that match the following:"
-msgstr ""
-"Исключить песни, отвечающие "
-"следующему условию:"
+msgstr "Исключить песни, отвечающие следующему условию:"
 
-#. i18n: file: dynamic/dynamicrule.ui:173
+#. i18n: file: dynamic/dynamicrule.ui:186
 #. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
+#: po/rc.cpp:334 rc.cpp:334
 msgid "Artists similar to:"
 msgstr "Найти похожих исполнителей:"
 
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:236
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:337 rc.cpp:337
 msgid ""
 "<i><b>NOTE</b> Only enter values for the tags you wish to be search on. </i>"
 msgstr ""
-"<i><b>ВНИМАНИЕ</b> вводить значения только для тегов, "
-"по которым должен производиться поиск.</i>"
+"<i><b>ВНИМАНИЕ</b> вводить значения только для тегов, по которым должен "
+"производиться поиск.</i>"
 
-#. i18n: file: dynamic/dynamicrule.ui:249
+#. i18n: file: dynamic/dynamicrule.ui:262
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:340 rc.cpp:340
 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>ВНИМАНИЕ</b> Чтобы указать несколько жанров заканчивайте строку "
 "астериском (знак «*»). Например, 'rock*' будет соответствовать и 'Hard Rock' "
-"и "
-"'Rock and Roll'. </i>"
+"и 'Rock and Roll'. </i>"
 
 #. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
+#: 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: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
+#: 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:717
+#. 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:717
+#. i18n: file: gui/initialsettingswizard.ui:716
 #. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
+#: po/rc.cpp:352 po/rc.cpp:442 rc.cpp:352 rc.cpp:442
 msgid "Save downloaded covers in music folder:"
-msgstr ""
-"Сохранять загруженные обложки в "
-"папке с музыкой:"
+msgstr "Сохранять загруженные обложки в папке с музыкой:"
 
 #. i18n: file: gui/filesettings.ui:35
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#. i18n: file: gui/initialsettingswizard.ui:730
+#. 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:730
+#. i18n: file: gui/initialsettingswizard.ui:729
 #. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
+#: po/rc.cpp:355 po/rc.cpp:445 rc.cpp:355 rc.cpp:445
 msgid "Save downloaded lyrics in music folder:"
-msgstr ""
-"Сохранять загруженные тексты песен "
-"в папке с музыкой:"
+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:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
+#. i18n: file: gui/filesettings.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
+#: po/rc.cpp:361 po/rc.cpp:451 rc.cpp:361 rc.cpp:451
 msgid "Save list of favorite streams in music folder:"
-msgstr ""
-"Сохранять список избранных потоков "
-"в папке с музыкой:"
+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:110
 #. 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:364 rc.cpp:364
 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>ВНИМАНИЕ:</b> если Cantata настроена на сохранение обложек "
-"или текстов песен в папке с музыкой, а у вас нет доступа на запись в эту "
-"папку, то в этом случае Cantata будет сохранять файлы в вашей персональной "
-"папке для кеша. Тем не менее, если речь идёт о потоках, то при отсутствии "
-"доступа на запись, вы сможете только просматривать и проигрывать потоки, "
-"сохранённые в папке с музыкой, но не добавлять их и не редактировать. Если "
-"вы не указывали сохранять потоки в папку с музыкой, тогда они будут "
-"сохраняться в"
-"в вашей локальной папке с настройками, и будут доступны только вам.</i>"
-
-#. i18n: file: gui/filesettings.ui:128
+"<i><b>ВНИМАНИЕ:</b> если Cantata настроена на сохранение обложек, текстов "
+"песен или фона в папке с музыкой, а у вас нет доступа на запись в эту папку, "
+"то в "
+"таком случае Cantata будет сохранять файлы в вашей личной папке для "
+"кеша. Тем не менее, если речь идёт о потоках, то при отсутствии доступа на "
+"запись, вы сможете только просматривать и проигрывать потоки, сохранённые в "
+"папке с музыкой, но не добавлять их и не редактировать. Если вы не указывали "
+"сохранять потоки в папку с музыкой, тогда они будут сохраняться в вашей "
+"локальной папке с настройками, и будут доступны только вам.</i>"
+
+#. i18n: file: gui/filesettings.ui:145
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:367 rc.cpp:367
 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>ВНИМАНИЕ:</b> если изменить местоположение хранения потоков "
-"(т.е. переключить настройку «хранить список избранных потоков в папке с "
-"музыкой»),"
-"тогда Cantata будет только показывать потоки, хранящиеся в соответствующем"
-"местоположении. Поэтому перед тем, как изменять эту настройку, рекомендуется"
-"экспортировать существующие потоки. После переключения настройки вы сможете"
-"экспортировать их заново в новое местоположение.</i>"
+"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>ВНИМАНИЕ:</b> если изменить местоположение хранения потоков (т.е. "
+"переключить настройку «хранить список избранных потоков в папке с музыкой»),"
+"тогда Cantata будет только показывать потоки, хранящиеся в "
+"соответствующем местоположении. Поэтому перед тем, как изменять эту "
+"настройку, рекомендуется экспортировать существующие потоки. После "
+"переключения настройки вы сможете экспортировать их заново в новое "
+"местоположение.</i>"
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:370 rc.cpp:370
 msgid "Cantata First Run"
 msgstr "Первый запуск программы Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:361 rc.cpp:361
+#: po/rc.cpp:373 rc.cpp:373
 msgid "Welcome to Cantata"
 msgstr "Добро пожаловать в программу 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:376 rc.cpp:376
 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 "
@@ -4184,27 +4569,25 @@ msgid ""
 "p><p>This 'wizard' will guide you through the basic settings required for "
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
-"<html><head/><body><p>Cantata — это многофункциональный и дружественный "
-"к пользователю клиент Music Player Daemon (MPD). MPD — это фоновое "
-"приложение, "
+"<html><head/><body><p>Cantata — это многофункциональный и дружественный к "
+"пользователю клиент Music Player Daemon (MPD). MPD — это фоновое приложение, "
 "которое можно использовать для проигрывания музыки. </p><p>За подробной "
 "информацией по MPD обращайтесь на его официальный сайт: <a href=\"http://www."
-"musicpd.org\"><span style=\" text-decoration: underline; color:#0000ff;\">"
-"http://www.musicpd."
-"org</span></a>.</p><p>Этот помощник проведёт вас по базовым настройкам "
-"программы "
-"Cantata, необходимым для её правильной работы.</p></body></html>"
+"musicpd.org\"><span style=\" text-decoration: underline; color:#0000ff;"
+"\">http://www.musicpd.org</span></a>.</p><p>Этот помощник проведёт вас по "
+"базовым настройкам программы Cantata, необходимым для её правильной работы.</"
+"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:379 rc.cpp:379
 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:370 rc.cpp:370
+#: po/rc.cpp:382 rc.cpp:382
 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 "
@@ -4212,39 +4595,21 @@ msgid ""
 "basis. Please select how you would like to have Cantata initially connect to "
 "(or startup) MPD:</p></body></html>"
 msgstr ""
-"<html><head/><body><p>Cantata — это многофункциональный и дружественный "
-"к пользователю клиент Music Player Daemon (MPD). MPD — это фоновое "
-"приложение, "
+"<html><head/><body><p>Cantata — это многофункциональный и дружественный к "
+"пользователю клиент Music Player Daemon (MPD). MPD — это фоновое приложение, "
 "которое можно использовать для проигрывания музыки. MPD можно запускать как "
 "общесистемно, так и отдельно для каждого пользователя. Выберите, как Cantata "
 "должна подключаться к 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 "Базовая настройка для одного пользователя"
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:385 rc.cpp:385
 msgid "Standard multi-user/server setup"
 msgstr "Стандартная серверная многопользовательская настройка"
 
-#. 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>Выбрать этот параметр, если музыкальная коллекция не является общим "
-"ресурсом для многих пользователей, и Cantata должна настроить и управлять "
-"экземпляром MPD.</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:388 rc.cpp:388
 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 "
@@ -4252,15 +4617,32 @@ msgid ""
 "starting and stopping of the MPD server. You will therfore need to ensure "
 "that MPD is already configured and running.</i>"
 msgstr ""
-"<i>Выберите этот параметр, если музыкальная коллекция является общей "
-"для нескольких пользователей, ваш экземпляр MPD запущен на другом компьютере,"
-"или MPD уже работает с вашими  личным настройками. При выборе этого параметра "
+"<i>Выберите этот параметр, если музыкальная коллекция является общей для "
+"нескольких пользователей, ваш экземпляр MPD запущен на другом компьютере,или "
+"MPD уже работает с вашими  личным настройками. При выборе этого параметра "
 "Cantata не может сама контролировать запуск и останов сервера MPD, поэтому "
 "необходимо убедиться  в том, что MPD уже настроен и запущен.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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>Выбрать этот параметр, если музыкальная коллекция не является общим "
+"ресурсом для многих пользователей, и Cantata должна настроить и управлять "
+"экземпляром MPD.</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:397 rc.cpp:397
 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-"
@@ -4268,22 +4650,21 @@ msgid ""
 "p><p>This 'wizard' will guide you through the basic settings required for "
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
-"<html><head/><body><p>За подробной информацией по MPD обращайтесь "
-"на его официальный сайт: <a href=\"http://www.musicpd.org\"><span style=\" "
-"text-"
+"<html><head/><body><p>За подробной информацией по MPD обращайтесь на его "
+"официальный сайт: <a href=\"http://www.musicpd.org\"><span style=\" text-"
 "decoration: underline; color:#0000ff;\">http://www.musicpd.org</span></a></"
-"p><p>Этот помощник проведёт вас по базовым настройкам программы "
-"Cantata, необходимым для её правильной работы.</p></body></html>"
+"p><p>Этот помощник проведёт вас по базовым настройкам программы Cantata, "
+"необходимым для её правильной работы.</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:400 rc.cpp:400
 msgid "Connection details"
 msgstr "Подробности соединения"
 
-#. 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:403 rc.cpp:403
 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."
@@ -4292,21 +4673,21 @@ msgstr ""
 "Введите необходимые детали и нажмите кнопку «Подключиться» для проверки "
 "соединения."
 
-#. 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:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
 msgid "Host (or local socket):"
 msgstr "Хост (или локальный сокет):"
 
-#. 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:421 rc.cpp:421
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
@@ -4314,43 +4695,43 @@ msgstr ""
 "<i><b>ВНИМАНИЕ:</b> настройка «папка с музыкой» используется для поиска "
 "обложек, текстов песен и т.п.</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:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
 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: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:427 rc.cpp:427
 msgid "Music folder"
 msgstr "Папка с музыкой"
 
-#. 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:430 rc.cpp:430
 msgid "Please choose the folder containing your music collection."
 msgstr "Выбрать папку, в которой хранится ваша музыкальная коллекция."
 
-#. 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:436 rc.cpp:436
 msgid "Covers, Lyrics, and Streams"
 msgstr "Обложки, тексты и потоки."
 
-#. 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:439 rc.cpp:439
 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 "
@@ -4358,33 +4739,55 @@ msgid ""
 "confirm whether you wish Cantata to store the relevant files within the "
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
-"<p>Cantata загружает отсутствующие обложки и тексты песен из Интернета."
-"Также Cantata даёт возможность сохранить список интернет-потоков (т.е"
-"станций интернет-радио), которые вы сможете прослушивать.</p><p>Для каждого"
-"из них необходимо указывать, сохранять ли его в папке с музыкой либо в ваших "
+"<p>Cantata загружает отсутствующие обложки и тексты песен из Интернета.Также "
+"Cantata даёт возможность сохранить список интернет-потоков (т.естанций "
+"интернет-радио), которые вы сможете прослушивать.</p><p>Для каждогоиз них "
+"необходимо указывать, сохранять ли его в папке с музыкой либо в ваших "
 "персональных папках для настроек и кеша.</p>"
 
-#. i18n: file: gui/initialsettingswizard.ui:808
+#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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>ВНИМАНИЕ:</b> если Cantata настроена на сохранение обложек или текстов "
+"песен в папке с музыкой, а у вас нет доступа на запись в эту папку, то в "
+"этом случае Cantata будет сохранять файлы в вашей персональной папке для "
+"кеша. Тем не менее, если речь идёт о потоках, то при отсутствии доступа на "
+"запись, вы сможете только просматривать и проигрывать потоки, сохранённые в "
+"папке с музыкой, но не добавлять их и не редактировать. Если вы не указывали "
+"сохранять потоки в папку с музыкой, тогда они будут сохраняться вв вашей "
+"локальной папке с настройками, и будут доступны только вам.</i>"
+
+#. i18n: file: gui/initialsettingswizard.ui:824
 #. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:443 rc.cpp:443
+#: po/rc.cpp:457 rc.cpp:457
 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>"
 msgstr ""
-"<i><b>ВНИМАНИЕ:</b> «папка с музыкой» привязана к адресу HTTP, а в "
-"настоящий момент Cantata не может заливать файлы на внешние серверы "
-"HTTP. Поэтому настройки выше должны оставаться отключёнными.</i>"
+"<i><b>ВНИМАНИЕ:</b> «папка с музыкой» привязана к адресу HTTP, а в настоящий "
+"момент Cantata не может заливать файлы на внешние серверы HTTP. Поэтому "
+"настройки выше должны оставаться отключёнными.</i>"
 
-#. i18n: file: gui/initialsettingswizard.ui:841
+#. i18n: file: gui/initialsettingswizard.ui:857
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:460 rc.cpp:460
 msgid "Finished!"
 msgstr "Готово!"
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:880
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:463 rc.cpp:463
 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 "
@@ -4394,9 +4797,9 @@ msgstr ""
 "(добавление дополнительных хостов MPD и т.п.) зайдите в диалог настройки, "
 "нажав на кнопку в верхнем правом углу главного окна Cantata."
 
-#. i18n: file: gui/initialsettingswizard.ui:902
+#. i18n: file: gui/initialsettingswizard.ui:918
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:466 rc.cpp:466
 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 "
@@ -4405,34 +4808,11 @@ msgid ""
 "effect."
 msgstr ""
 "<b>Предупреждение:</b> вы не являетесь членом группы 'users'. Функционал "
-"программы Cantata улучшится (сохранение с правильными правами обложек, "
-"слов песен и т.п.) если вы (или ваш администратор) добавите своего "
-"пользователя "
-"в эту группу. Если вы будете делать это самостоятельно, то затем, для "
-"применения "
-"настройки, будет необходимо закончить текущий сеанс пользователя и снова "
-"войти в систему."
-
-#. 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 "Стиль:"
+"программы Cantata улучшится (сохранение с правильными правами обложек, слов "
+"песен и т.п.) если вы (или ваш администратор) добавите своего пользователя в "
+"эту группу. Если вы будете делать это самостоятельно, то затем, для "
+"применения настройки, будет необходимо закончить текущий сеанс пользователя "
+"и снова войти в систему."
 
 #. i18n: file: gui/interfacesettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
@@ -4442,25 +4822,25 @@ msgstr "Стиль:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
 #. 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:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
 msgid "Covers:"
 msgstr "Обложки:"
 
 #. i18n: file: gui/interfacesettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
+#: po/rc.cpp:478 rc.cpp:478
 msgid "Show artist images:"
 msgstr "Показывать изображение исполнителя:"
 
 #. i18n: file: gui/interfacesettings.ui:81
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:467 rc.cpp:467
+#: po/rc.cpp:481 rc.cpp:481
 msgid "Show album year:"
 msgstr "Показывать год альбома:"
 
 #. i18n: file: gui/interfacesettings.ui:123
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:484 rc.cpp:484
 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"
@@ -4472,32 +4852,31 @@ msgstr ""
 "<i><b>ВНИМАНИЕ:</b> при поиске изображений исполнителей Cantata будет искать "
 "файлы artist.jpg, artist.png, 'Artist'.jpg или 'Artist'.png\n"
 "в папке текущего трека или в родительской папке. В случае отсутствия "
-"изображения, "
-"Cantata попробует его скачать. Итоговое показываемое изображение будет "
-"обрезано "
-"(сверху/снизу или справа/слева) до получения квадрата.</i>"
+"изображения, Cantata попробует его загрузить. Итоговое показываемое "
+"изображение будет обрезано (сверху/снизу или справа/слева) до получения "
+"квадрата.</i>"
 
 #. i18n: file: gui/interfacesettings.ui:172
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:497 rc.cpp:497
 msgid "Sort albums:"
 msgstr "Сортировать альбомы:"
 
 #. i18n: file: gui/interfacesettings.ui:183
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Album/Artist"
 msgstr "Альбом/Исполнитель"
 
 #. i18n: file: gui/interfacesettings.ui:188
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:503 rc.cpp:503
 msgid "Artist/Album"
 msgstr "Исполнитель/Альбом"
 
 #. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:506 rc.cpp:506
 msgid "Artist/Year/Album"
 msgstr "Исполнитель/Год/Альбом"
 
@@ -4509,272 +4888,253 @@ msgstr "Исполнитель/Год/Альбом"
 #. 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
+#: 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: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:518 rc.cpp:518
 msgid "Other Views"
 msgstr "Другие типы просмотра"
 
 #. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
 msgid "Folder view style:"
 msgstr "Тип просмотра папки:"
 
 #. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
 msgid "Streams view style:"
 msgstr "Тип просмотра потоков:"
 
 #. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Online view style:"
 msgstr "Тип он-лайн просмотра:"
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:530 rc.cpp:530
 msgid "Devices view style:"
 msgstr "Тип просмотра устройств:"
 
 #. i18n: file: gui/interfacesettings.ui:324
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:525 rc.cpp:525
+#: 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:534 rc.cpp:534
+#: 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:537 rc.cpp:537
+#: 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:540 rc.cpp:540
+#: po/rc.cpp:554 rc.cpp:554
 msgid "Use current album cover as background:"
 msgstr "Использовать обложку текущего альбома как фон:"
 
-#. i18n: file: gui/interfacesettings.ui:398
+#. 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: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:560 rc.cpp:560
 msgid "External"
 msgstr "Внешнее"
 
-#. i18n: file: gui/interfacesettings.ui:404
+#. i18n: file: gui/interfacesettings.ui:417
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
+#: po/rc.cpp:563 rc.cpp:563
 msgid "Show icon in notification area:"
 msgstr "Показывать значок в трее:"
 
-#. i18n: file: gui/interfacesettings.ui:424
+#. i18n: file: gui/interfacesettings.ui:437
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
+#: po/rc.cpp:566 rc.cpp:566
 msgid "Minimize to notification area when closed:"
 msgstr "Свернуть в трей при закрытии:"
 
-#. i18n: file: gui/interfacesettings.ui:444
+#. i18n: file: gui/interfacesettings.ui:457
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
+#: po/rc.cpp:569 rc.cpp:569
 msgid "Show popup messages when changing tracks:"
-msgstr ""
-"Показывать всплывающие сообщения "
-"при смене трека:"
-
-#. 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 "Поддержка мультимедиа-клавиш в GNOME/Unity:"
+msgstr "Показывать всплывающие сообщения при смене трека:"
 
 #. i18n: file: gui/interfacesettings.ui:475
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
+#: po/rc.cpp:572 rc.cpp:572
 msgid "General"
 msgstr "Общее"
 
 #. i18n: file: gui/interfacesettings.ui:486
 #. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
+#: 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:564 rc.cpp:564
+#: po/rc.cpp:581 rc.cpp:581
 msgid "Multiple artist albums:"
 msgstr "Альбомы с несколькими исполнителями:"
 
-#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: file: gui/interfacesettings.ui:533
 #. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
+#: po/rc.cpp:584 rc.cpp:584
 msgid "Show delete action in context menus:"
-msgstr ""
-"Показывать пункт удаления в контекстных "
-"меню:"
+msgstr "Показывать пункт удаления в контекстных меню:"
 
-#. i18n: file: gui/interfacesettings.ui:533
+#. i18n: file: gui/interfacesettings.ui:550
 #. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
+#: po/rc.cpp:587 rc.cpp:587
 msgid "Enforce single-click activation of items:"
-msgstr ""
-"Принудительно включить выделение элементов "
-"по одному щелчку:"
+msgstr "Принудительно включить выделение элементов по одному щелчку:"
 
-#. i18n: file: gui/interfacesettings.ui:574
+#. i18n: file: gui/interfacesettings.ui:591
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
+#: po/rc.cpp:590 rc.cpp:590
 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>"
+"<i><b>ВНИМАНИЕ:</b> настройка «Принудительно включить выделение элементов по "
+"одному щелчку» потребует перезапуска программы Cantata.</i>"
 
-#. i18n: file: gui/mainwindow.ui:244
+#. i18n: file: gui/mainwindow.ui:287
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
+#: po/rc.cpp:593 rc.cpp:593
 msgid "[Dynamic]"
 msgstr "[Динамический]"
 
 #. i18n: file: gui/playbacksettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
+#: po/rc.cpp:596 rc.cpp:596
 msgid "Output"
 msgstr "Вывод"
 
 #. i18n: file: gui/playbacksettings.ui:41
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:585 rc.cpp:585
+#: 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:588 rc.cpp:588
+#: po/rc.cpp:605 rc.cpp:605
 msgid " seconds"
 msgstr " секунд"
 
 #. i18n: file: gui/playbacksettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:591 rc.cpp:591
+#: po/rc.cpp:608 rc.cpp:608
 msgid "Replay gain:"
 msgstr "Replay gain:"
 
 #. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:594 rc.cpp:594
+#: po/rc.cpp:611 rc.cpp:611
 msgid "About replay gain"
 msgstr "Информация о replay gain"
 
 #. i18n: file: gui/playbacksettings.ui:104
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:597 rc.cpp:597
+#: po/rc.cpp:614 rc.cpp:614
 msgid "Devices:"
 msgstr "Устройства:"
 
-#. 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"
-
 #. 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/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
-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>"
-msgstr ""
-"<i><b>ВНИМАНИЕ:</b> Эту возможность можно использовать только если "
-"вывод MPD настроен на HTTP-поток, и вам нужно проигрывать этот поток "
-"с помощью Cantata .</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 "Остановка воспроизведения"
-
-#. i18n: file: gui/playbacksettings.ui:176
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:620 rc.cpp:620
 msgid "Fadeout on stop:"
 msgstr "Затухание при остановке:"
 
-#. i18n: file: gui/playbacksettings.ui:189
+#. i18n: file: gui/playbacksettings.ui:154
 #. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
+#: po/rc.cpp:623 rc.cpp:623
 msgid "Stop playback on exit:"
-msgstr ""
-"Остановить воспроизведение при выходе из "
-"программы:"
+msgstr "Остановить воспроизведение при выходе из программы:"
 
-#. i18n: file: gui/playbacksettings.ui:202
+#. i18n: file: gui/playbacksettings.ui:167
 #. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
+#: 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 ""
-"Остановить dynamizer при выходе из "
-"программы:"
+"Блокировать активацию ждущего режима "
+"во время проигрывания:"
 
-#. i18n: file: gui/playbacksettings.ui:219
+#. i18n: file: gui/playbacksettings.ui:217
 #. i18n: ectx: property (text), widget (QLabel, noteLabel)
-#: po/rc.cpp:621 rc.cpp:621
+#: 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>"
+"показано меню, где можно выбрать, остановить ли воспроизведение сейчас или "
+"после окончания текущей композиции.</i>"
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:635 rc.cpp:635
 msgid "Collection:"
 msgstr "Коллекция:"
 
 #. 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:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
 msgid "Cover filename:"
 msgstr "Имя файла обложки:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:645 rc.cpp:645
+#: po/rc.cpp:656 rc.cpp:656
 msgid "Dynamizer port:"
 msgstr "Порт Dynamizer:"
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:659 rc.cpp:659
+msgid "HTTP stream URL:"
+msgstr "Адрес потока HTTP:"
+
+#. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:648 rc.cpp:648
+#: po/rc.cpp:662 rc.cpp:662
 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 "
@@ -4783,50 +5143,60 @@ msgid ""
 "album folder.</i>"
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> Настройка «папка с музыкой» используется для поиска "
-"обложек (введите значение, указанное выше или <code>cover.jpg / cover.png<"
-"/code> при пустом значении). Если у вас также есть рекурсивные права на "
-"запись в эту "
-"папку, то Cantata будет сохранять все загружаемые обложки в соответствующую "
-"папку "
-"альбома.</i>"
-
-#. i18n: file: gui/serversettings.ui:314
+"обложек (введите значение, указанное выше или <code>cover.jpg / cover.png</"
+"code> при пустом значении). Если у вас также есть рекурсивные права на "
+"запись в эту папку, то Cantata будет сохранять все загружаемые обложки в "
+"соответствующую папку альбома.</i>"
+
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+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>"
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:677 rc.cpp:677
 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>ВНИМАНИЕ:</b> если настройка «папка с музыкой» была изменена, "
-"то вам необходимо вручную обновить базу данных. Это можно сделать, нажав "
-"кнопку «Обновить базу данных» в режиме «Исполнитель» или «Альбом».</i>"
+"<i><b>ВНИМАНИЕ:</b> если настройка «папка с музыкой» была изменена, то вам "
+"необходимо вручную обновить базу данных. Это можно сделать, нажав кнопку "
+"«Обновить базу данных» в режиме «Исполнитель» или «Альбом».</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:680 rc.cpp:680
 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> если  значение  для имени файла обложки не указано, "
-"то Cantata будет использовать имя по умолчанию: <code>cover</code> </i>"
+"<i><b>ВНИМАНИЕ:</b> если  значение  для имени файла обложки не указано, то "
+"Cantata будет использовать имя по умолчанию: <code>cover</code> </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:683 rc.cpp:683
 msgid "Network interface:"
 msgstr "Сетевой интерфейс:"
 
 #. i18n: file: http/httpserversettings.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
+#: po/rc.cpp:686 rc.cpp:686
 msgid "Current URL:"
 msgstr "Текущий URL:"
 
 #. i18n: file: http/httpserversettings.ui:73
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:689 rc.cpp:689
 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 "
@@ -4837,196 +5207,257 @@ msgid ""
 msgstr ""
 "<i><b>ВНИМАНИЕ:</b> как правило, MPD проигрывает только песни, расположенные "
 "в папках MPD. Для возможности проигрывания других файлов Cantata может "
-"использовать "
-"свой мини-HTTP-сервер, но сервер работает только когда запущена Cantata.<br/>"
-"<br/>\n"
+"использовать свой мини-HTTP-сервер, но сервер работает только когда запущена "
+"Cantata.<br/><br/>\n"
 "<b>ВНИМАНИЕ:</b> если в качестве сетевого интерфейса выбрана «локальная "
-"петля», тогда "
-"MPD также <b>должен</b> присутствовать на данной машине.</i>"
+"петля», тогда MPD также <b>должен</b> присутствовать на данной машине.</i>"
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:693 rc.cpp:693
 msgid "Mode:"
 msgstr "Режим:"
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:699 rc.cpp:699
 msgid "HTTP Proxy"
 msgstr "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:702 rc.cpp:702
 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 ""
+"Ниже показан список источников в сети, чтобы «спрятать» источник, "
+"просто уберите соответствующую галочку в списке."
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:723 rc.cpp:723
 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 ""
-"Прослушивание песен бесплатно и не требует регистрации, но владельцы "
-"учётных записей Premium слушают потоки в более высоком качестве и без "
-"рекламы. "
-"Чтобы зарегистрировать учётную запись Premium, посетите <a href=\"http://www."
-"di.fm/premium/\">http://www.di.fm/premium/</a>."
+"Прослушивание песен бесплатно и не требует регистрации, но владельцы учётных "
+"записей Premium слушают потоки в более высоком качестве и без рекламы. Чтобы "
+"зарегистрировать учётную запись Premium, посетите <a href=\"http://www.di.fm/"
+"premium/\">http://www.di.fm/premium/</a>."
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:726 rc.cpp:726
 msgid "Premium Account"
 msgstr "Учётная запись Premium"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:735 rc.cpp:735
 msgid "Stream type:"
 msgstr "Тип потока:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:738 rc.cpp:738
 msgid "Status:"
 msgstr "Статус:"
 
 #. 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:741 streams/digitallyimportedsettings.cpp:130
+#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
 msgid "Login"
 msgstr "Логин"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:747 rc.cpp:747
 msgid "Session expiry:"
 msgstr "Сеанс истекает:"
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:750 rc.cpp:750
+msgid ""
+"<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
+"RockRadio.com, and Sky.fm</i>"
+msgstr ""
+"<i><b>ВНИМАНИЕ:</b> Эти настройки применимы для Digitally Imported, "
+"JazzRadio.com, RockRadio.com и Sky.fm</i>"
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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>"
+
+#. 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 ""
+"Ниже показан список самых популярных категорий потокового аудио, чтобы "
+"«спрятать» категорию, просто уберите соответствующую галочку в списке."
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+msgid "Configure Provider"
+msgstr "Настроить источник"
+
+#. i18n: file: streams/streamssettings.ui:60
+#. i18n: ectx: property (text), widget (QPushButton, installButton)
+#: po/rc.cpp:762 rc.cpp:762
+msgid "Install"
+msgstr "Установить"
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:768 rc.cpp:768
+msgid ""
+"<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
+"removed.</i>"
+msgstr ""
+"<i><b>ВНИМАНИЕ:</b> встроенные категории показываются курсивом, и их "
+"удалить нельзя.</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:771 rc.cpp:771
 msgid "Search:"
 msgstr "Поиск:"
 
-#. 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:774 rc.cpp:774
 msgid "Shortcut for Selected Action"
 msgstr "Горячие клавиши для выбранного действия"
 
-#. 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:777 rc.cpp:777
 msgid "Default:"
 msgstr "По умолчанию:"
 
-#. 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:783 rc.cpp:783
 msgid "Custom:"
 msgstr "Пользовательский:"
 
-#. i18n: file: tags/tageditor.ui:22
+#. i18n: file: tags/tageditor.ui:25
 #. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
+#: po/rc.cpp:786 rc.cpp:786
 msgid "Track:"
 msgstr "Трек:"
 
-#. 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:795 rc.cpp:795
 msgid "Album artist:"
 msgstr "Исполнитель альбома:"
 
-#. 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:804 rc.cpp:804
 msgid "Track number:"
 msgstr "Номер трека:"
 
-#. 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:807 rc.cpp:807
 msgid "Disc number:"
 msgstr "Номер диска:"
 
 #. i18n: file: tags/trackorganiser.ui:155
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:834 rc.cpp:834
 msgid "Original Name"
 msgstr "Исходное название"
 
 #. i18n: file: tags/trackorganiser.ui:160
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:837 rc.cpp:837
 msgid "New Name"
 msgstr "Новое название"
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:838 rc.cpp:838
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "Юлия Дронова"
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:839 rc.cpp:839
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "juliette.tux at gmail.com"
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:121
 msgid "Show All Tracks"
 msgstr "Показать все треки"
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:122
 msgid "Show Untagged Tracks"
 msgstr "Показать треки без тегов"
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
 msgid "Remove From List"
 msgstr "Удалить из списка"
 
-#: replaygain/rgdialog.cpp:140
+#: replaygain/rgdialog.cpp:136
 msgid "Album Gain"
 msgstr "Album Gain"
 
-#: replaygain/rgdialog.cpp:141
+#: replaygain/rgdialog.cpp:137
 msgid "Track Gain"
 msgstr "Track Gain"
 
-#: replaygain/rgdialog.cpp:142
+#: replaygain/rgdialog.cpp:138
 msgid "Album Peak"
 msgstr "Album Peak"
 
-#: replaygain/rgdialog.cpp:143
+#: replaygain/rgdialog.cpp:139
 msgid "Track Peak"
 msgstr "Track Peak"
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
 msgid "Scan"
 msgstr "Сканировать"
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:238
 msgid "Update ReplayGain tags in tracks?"
 msgstr "Обновить теги ReplayGain для  треков?"
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
 msgid "Update Tags"
 msgstr "Обновить теги"
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:252
 msgid "Abort scanning of tracks?"
 msgstr "Прервать сканирование треков?"
 
-#: replaygain/rgdialog.cpp:257
+#: replaygain/rgdialog.cpp:261
 msgid "Abort reading of existing tags?"
 msgstr "Прервать чтение существующих тегов?"
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:287
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
@@ -5034,49 +5465,62 @@ msgstr ""
 "Сканировать <b>все</b> треки?<br><br><i>ВНИМАНИЕ: у всех треков уже есть "
 "теги ReplyGain.</i>"
 
-#: replaygain/rgdialog.cpp:285
+#: replaygain/rgdialog.cpp:289
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "Сканировать все треки, или только треки без существующих тегов?"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "Untagged Tracks"
 msgstr "Треки без тегов"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "All Tracks"
 msgstr "Все треки"
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:300
 msgid "Scanning tracks..."
 msgstr "Сканирование треков..."
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:367
 msgid "Reading existing tags..."
 msgstr "Чтение существующих треков..."
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr "%1 (тайм-аут)"
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr "%1 (испорченные теги?)"
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
 msgid "Failed to update the tags of the following tracks:"
 msgstr "Сбой обновления тегов для следующих треков:"
 
-#: replaygain/rgdialog.cpp:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
+#: tags/trackorganiser.cpp:451
 msgid "Device is not connected."
 msgstr "Устройство не подключено"
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
 msgid "%1 dB"
 msgstr "%1 дБ"
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: 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
 msgid "Failed"
 msgstr "Произошла ошибка"
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
 msgid "Remove the selected tracks from the list?"
 msgstr "Удалить выбранные треки из списка?"
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
 msgid "Remove Tracks"
 msgstr "Удалить треки"
 
@@ -5108,6 +5552,10 @@ msgstr "Выполняется вход..."
 msgid "Logout"
 msgstr "Выйти"
 
+#: streams/streamdialog.cpp:71
+msgid "URL:"
+msgstr "URL:"
+
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
 msgstr "Только добавить в очередь, не проигрывать"
@@ -5128,113 +5576,146 @@ msgstr "Редактировать поток"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>ОШИБКА:</b> недопустимый протокол</i>"
 
-#: streams/streamfetcher.cpp:198
+#: streams/streamfetcher.cpp:205
 msgid "Fetching %1"
 msgstr "Загрузка %1"
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 msgid "Import Streams Into Favorites"
 msgstr "Импортировать потоки в Избранное"
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 msgid "Export Favorite Streams"
 msgstr "Экспортировать избранные потоки"
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr "Добавить новый поток в Избранное"
 
-#: streams/streamspage.cpp:123
-msgid "Search TuneIn:"
-msgstr "Поиск по TuneIn:"
+#: streams/streamspage.cpp:124
+msgctxt "Service name"
+msgid "Digitally Imported"
+msgstr "Digitally Imported"
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:242
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr "*.xml *.xml.gz *.cantata|потоки XML"
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
 msgid "Import Streams"
 msgstr "Импортировать потоки"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:245
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Потоки XML (*.xml *.xml.gz *.cantata)"
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:253
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr "Сбой импорта <b>%1</b>.<br/>Проверьте правильность формата."
 
-#: streams/streamspage.cpp:262
+#: streams/streamspage.cpp:265
 msgid "*.xml|XML Streams"
 msgstr "*.xml|потоки XML"
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
 msgid "Export Streams"
 msgstr "Экспортировать потоки"
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:267
 msgid "XML Streams (*.xml)"
 msgstr "Потоки XML (*.xml)"
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:279
 msgid "Failed to create <b>%1</b>!"
 msgstr "Сбой создания <b>%1</b>"
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "Поток уже существует:<br/><b>%1</b>"
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "Поток с именем <b>%1</b> уже существует."
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:318
 msgid "Bookmark added"
 msgstr "Закладка добавлена"
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:320
 msgid "Already bookmarked"
 msgstr "Уже в закладках"
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:366
 msgid "Added to favorites"
 msgstr "Добавлено в Избранное"
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:368
 msgid "Already in favorites"
 msgstr "Уже в Избранном"
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:393
 msgid "Reload <b>%1</b> streams?"
 msgstr "Обновить <b>%1</b> потоков?"
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:411
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "Точно удалить закладку для <b>%1</b>?"
 
-#: streams/streamspage.cpp:414
+#: streams/streamspage.cpp:417
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "Точно удалить все <b>%1</b> закладок?"
 
-#: streams/streamspage.cpp:442
+#: streams/streamspage.cpp:445
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "Точно удалить все %1 выбранных потоков?"
 
-#: streams/streamspage.cpp:446
+#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "Точно удалить <b>%1</b>?"
 
-#: streams/streamspage.cpp:609
-msgid "Logged into Digitally Imported"
-msgstr "Digitally Imported: вход выполнен"
+#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+msgid "Search %1:"
+msgstr "Поиск %1:"
+
+#: streams/streamssettings.cpp:125
+msgid "*.streams|Cantata Streams"
+msgstr "*.streams|потоки Cantata"
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
-msgstr "Digitally Imported: вход <b>НЕ</b> выполнен"
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+msgid "Install Streams"
+msgstr "Установить потоки"
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
+msgstr "потоки Cantata (*.streams)"
+
+#: streams/streamssettings.cpp:144
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr "Категория <b>%1</b> уже существует.<br/>Перезаписать?"
+
+#: streams/streamssettings.cpp:150
+msgid "Failed top open %1"
+msgstr "Не удалось открыть %1"
+
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
+msgstr "Недопустимый формат файла"
+
+#: streams/streamssettings.cpp:170
+msgid "Failed to create stream category folder!"
+msgstr "Не удалось создать папку для категории потока"
+
+#: streams/streamssettings.cpp:176
+msgid "Failed to save stream list!"
+msgstr "Не удалось сохранить список потоков"
+
+#: streams/streamssettings.cpp:227
+msgid "Failed to remove streams folder!"
+msgstr "Не удалось удалить папку с потоками."
 
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr "&Ok"
 
 #: support/dialog.cpp:90
@@ -5297,39 +5778,39 @@ msgstr "&Предыдущее"
 msgid "&Next"
 msgstr "&Далее"
 
-#: support/fancytabwidget.cpp:952
+#: support/fancytabwidget.cpp:957
 msgid "Icons Only"
 msgstr "Только значки"
 
-#: support/fancytabwidget.cpp:953
+#: support/fancytabwidget.cpp:958
 msgid "Style"
 msgstr "Стиль"
 
-#: support/fancytabwidget.cpp:954
+#: support/fancytabwidget.cpp:959
 msgid "Large Sidebar"
 msgstr "Большая панель"
 
-#: support/fancytabwidget.cpp:955
+#: support/fancytabwidget.cpp:960
 msgid "Small Sidebar"
 msgstr "Маленькая панель"
 
-#: support/fancytabwidget.cpp:956
+#: support/fancytabwidget.cpp:961
 msgid "Top Bar"
 msgstr "Верхняя панель"
 
-#: support/fancytabwidget.cpp:957
+#: support/fancytabwidget.cpp:962
 msgid "Bottom Bar"
 msgstr "Нижняя панель"
 
-#: support/fancytabwidget.cpp:958
+#: support/fancytabwidget.cpp:963
 msgid "Tabs On Side"
 msgstr "Вкладки сбоку"
 
-#: support/fancytabwidget.cpp:959
+#: support/fancytabwidget.cpp:964
 msgid "Tabs On Top"
 msgstr "Вкладки сверху"
 
-#: support/fancytabwidget.cpp:960
+#: support/fancytabwidget.cpp:965
 msgid "Tabs On Bottom"
 msgstr "Вкладки снизу"
 
@@ -5341,19 +5822,20 @@ msgstr "Пароль"
 msgid "Please enter password:"
 msgstr "Введите пароль:"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
 msgid "Warning"
 msgstr "Предупреждение"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
 msgid "Question"
 msgstr "Вопрос"
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
+#: support/messagebox.cpp:107 support/messagebox.cpp:113
+#: support/messagebox.h:62
 msgid "Error"
 msgstr "Ошибка"
 
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr "Инфо"
 
@@ -5373,65 +5855,69 @@ msgstr "Выбрать папку"
 msgid "Select File"
 msgstr "Выбрать файл"
 
-#: support/utils.cpp:271 support/utils.cpp:279
+#: support/utils.cpp:390 support/utils.cpp:398
 msgid "%1 B"
 msgstr "%1 Б"
 
-#: support/utils.cpp:272
+#: support/utils.cpp:391
 msgid "%1 kB"
 msgstr "%1 кБ"
 
-#: support/utils.cpp:273
+#: support/utils.cpp:392
 msgid "%1 MB"
 msgstr "%1 MБ"
 
-#: support/utils.cpp:275
+#: support/utils.cpp:394
 msgid "%1 GB"
 msgstr "%1 ГБ"
 
-#: support/utils.cpp:280
+#: support/utils.cpp:399
 msgid "%1 KiB"
 msgstr "%1 КиБ"
 
-#: support/utils.cpp:281
+#: support/utils.cpp:400
 msgid "%1 MiB"
 msgstr "%1 МиБ"
 
-#: support/utils.cpp:283
+#: support/utils.cpp:402
 msgid "%1 GiB"
 msgstr "%1 ГиБ"
 
-#: tags/tageditor.cpp:131
+#: support/utils.cpp:602
+msgid "1 day %2"
+msgid_plural "%1 days %2"
+msgstr[0] "%1 день %2"
+msgstr[1] "%1 дня %2"
+msgstr[2] "%1 дней %2"
+msgstr[3] "%1 день %2"
+
+#: tags/tageditor.cpp:134
 msgid "Tags"
 msgstr "Теги"
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:147
 msgid "Set 'Album Artist' from 'Artist'"
-msgstr ""
-"Взять значение «Исполнитель альбома» из "
-"значения «Исполнитель»"
+msgstr "Взять значение «Исполнитель альбома» из значения «Исполнитель»"
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
 msgid "All tracks"
 msgstr "Все треки"
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:295
 msgid "(Various)"
 msgstr "(Несколько)"
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:336
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr ""
-"Применить обходное решение «несколько исполнителей» "
-"для <b>всех</b> треков?"
+"Применить обходное решение «несколько исполнителей» для <b>всех</b> треков?"
 
-#: tags/tageditor.cpp:367
+#: tags/tageditor.cpp:378
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr ""
-"Откатить обходное решение «несколько исполнителей» "
-"для <b>всех</b> треков?"
+"Откатить обходное решение «несколько исполнителей» для <b>всех</b> треков?"
 
-#: tags/tageditor.cpp:417
+#: tags/tageditor.cpp:428
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
@@ -5439,91 +5925,104 @@ msgstr ""
 "Установить значение «Исполнитель альбома» из значения «Исполнитель» (при "
 "пустом значении «Исполнитель альбома») для <b>всех</b> треков?"
 
-#: tags/tageditor.cpp:418
+#: tags/tageditor.cpp:429
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr ""
 "Установить значение «Исполнитель альбома» из значения «Исполнитель» (при "
 "пустом значении «Исполнитель альбома») ?"
 
-#: tags/tageditor.cpp:419
+#: tags/tageditor.cpp:430
 msgid "Album Artist from Artist"
 msgstr "Исполнитель альбома как Исполнитель"
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:463
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
 msgstr ""
-"Менять первую букву в значениях «Название», «Исполнитель», "
-"«Исполнитель альбома» и «Альбом» на заглавную?"
+"Менять первую букву в значениях «Название», «Исполнитель», «Исполнитель "
+"альбома» и «Альбом» на заглавную?"
 
-#: tags/tageditor.cpp:485
+#: tags/tageditor.cpp:496
 msgid "Adjust the value of each track number by:"
 msgstr "Настроить значение номера каждого трека по:"
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:554
 msgid "All tracks [modified]"
 msgstr "Все треки [изменено]"
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:556
 msgid "%1 [modified]"
 msgstr "%1 [изменено]"
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:783
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr "Переименовать также и файлы песен, для соответствия тегам?"
 
-#: tags/tageditor.cpp:759
+#: tags/tageditor.cpp:784
 msgid "Rename Files"
 msgstr "Переименовать файлы"
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:150
 msgid "Abort renaming of files?"
 msgstr "Прервать переименование файлов?"
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:263
+msgid "Source file does not exist!<br/>%1"
+msgstr "Исходный файл не существует.<br/>%1"
+
+#: tags/trackorganiser.cpp:282
 msgid "Destination file already exists!<br/>%1"
 msgstr "Конечный файл уже существует <br/>%1"
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:304
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "Сбой создания папки назначения. <br/>%1"
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:325
 msgid "Failed to rename %1 to %2"
 msgstr "Сбой переименования %1 в %2"
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:267
+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
 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 ""
-"<tr><td align=\"right\"><b>Исполнитель:</b></td><td>%1</td></tr><tr><td align="
-"\"right\"><b>Альбом:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>Год:"
-"</b></td><td>%3</td></tr>"
+"<tr><td align=\"right\"><b>Исполнитель:</b></td><td>%1</td></tr><tr><td "
+"align=\"right\"><b>Альбом:</b></td><td>%2</td></tr><tr><td align=\"right"
+"\"><b>Год:</b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:59
+#: widgets/genrecombo.cpp:54
 msgid "All Genres"
 msgstr "Все жанры"
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:267
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: widgets/groupedview.cpp:269
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2 (%3)"
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:480
 msgid "Go Back"
 msgstr "Назад"
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:485
 msgid "Go Home"
 msgstr "Домашняя папка"
 
 #: widgets/menubutton.cpp:36
-msgid "Other Actions"
-msgstr "Другие действия"
+msgid "Menu"
+msgstr "Меню"
 
 #: widgets/searchwidget.cpp:62
 msgid "Search..."
@@ -5533,6 +6032,55 @@ msgstr "Поиск..."
 msgid "Close Search Bar"
 msgstr "Закрыть панель поиска"
 
+#: widgets/servicestatuslabel.cpp:43
+msgid "Logged into %1"
+msgstr "%1: вход выполнен"
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr "%1: вход <b>НЕ</b> выполнен"
+
+#: widgets/songdialog.cpp:48
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check Cantata's \"Music folder"
+"\" setting, and MPD's \"music_directory\" setting.</p>"
+msgstr ""
+"<p>Нет доступа к файлам!<br/><br/>Проверьте настройки «папки с музыкой» "
+"программы Cantata и настройки «каталога с музыкой» сервера MPD.</p>"
+
+#: widgets/songdialog.cpp:51
+msgid ""
+"<p>Cannot access song files!<br/><br/>Please check that the device is still "
+"attached.</p>"
+msgstr ""
+"<p>Нет доступа к файлам!<br/><br/>Убедитесь, что устройство всё ещё "
+"подключено.</p>"
+
+#: widgets/volumeslider.cpp:116 widgets/volumeslider.cpp:231
+#: widgets/volumeslider.cpp:238
+msgid "Mute"
+msgstr "Заглушить звук"
+
+#: widgets/volumeslider.cpp:199
+msgid "Muted"
+msgstr "Звук отключён"
+
+#: widgets/volumeslider.cpp:238
+msgid "Unmute"
+msgstr "Включить звук"
+
+#: widgets/volumeslider.cpp:276
+msgid "Volume Disabled"
+msgstr "Громкость отключена"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1% (Muted)"
+msgstr "Громкость %1% (звук отключён)"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr "Громкость %1%"
+
 #: ../gui/qtplural.h:30
 msgctxt "Singular"
 msgid "1 Track"
@@ -5611,4 +6159,87 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr "%1 правил"
 
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr "1 подкаст"
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr "%1 подкастов"
 
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr "1 эпизод"
+
+#: ../gui/qtplural.h:63
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr "%1 эпизодов"
+
+#~ msgid ""
+#~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
+#~ msgstr ""
+#~ "Сбой загрузки трека — слишком много перенаправлений.<br/><br/<hr/>%1"
+
+#~ 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>Следующие переменные будут заменены их соответствующими значениями для "
+#~ "каждого названия трека.</p><p><table border=\"1\"><tr><th><em>Кнопка</"
+#~ "em></th><th><em>Переменная</em></th><th><em>Описание</em></th></"
+#~ "tr><tr><td>%albumartist%</td><td>%1</td><td>Исполнитель альбома. В "
+#~ "большинстве случаев этозначение равно значению <i>Исполнитель трека.</i> "
+#~ "Для сборников это часто будет значение <i>Несколько исполнителей.</i> </"
+#~ "td></tr><tr><td>%album%</td><td>%2</td><td>Название альбома.</td></"
+#~ "tr><tr><td>%artist%</td><td>%3</td><td>Исполнитель каждого трека.</td></"
+#~ "tr><tr><td>%title%</td><td>%4</td><td>Название трека (без <i>Исполнителя "
+#~ "трека</i>).</td></tr><tr><td>%artistandtitle%</td><td>%5</td><td>Название "
+#~ "трека (с <i>Исполнителем трека</i>, если его значение не равно "
+#~ "<i>Исполнителю альбома</i>).</td></tr><tr><td>%track%</td><td>%6</"
+#~ "td><td>Номер трека.</td></tr><tr><td>%discnumber%</td><td>%7</"
+#~ "td><td>Номер альбома, составленного из нескольких альбомов. Часто в "
+#~ "сборники включаютнесколько альбомов.</td></tr><tr><td>%year%</td><td>%8</"
+#~ "td><td>Год выхода альбома.</td></tr><tr><td>%genre%</td><td>%9</"
+#~ "td><td>Жанр альбома.</td></tr></table></p>"
+
+#~ msgid "Configure Online Service"
+#~ msgstr "Настроить он-лайн сервис"
+
+#~ msgid "Refresh Online Service"
+#~ msgstr "Обновить он-лайн сервис"
+
+#~ msgid "Support media keys under GNOME/Unity:"
+#~ msgstr "Поддержка мультимедиа-клавиш в GNOME/Unity:"
+
+#~ msgid "Stopping Playback"
+#~ msgstr "Остановка воспроизведения"
+
+#~ msgid "Search TuneIn:"
+#~ msgstr "Поиск по TuneIn:"
+
+#~ msgid "Logged into Digitally Imported"
+#~ msgstr "Digitally Imported: вход выполнен"
+
+#~ msgid "Other Actions"
+#~ msgstr "Другие действия"
diff --git a/po/zh_CN.po b/po/zh_CN.po
index e9939ff..2ff1143 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-07-20 19:42+0100\n"
+"POT-Creation-Date: 2013-11-14 20:26+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,39 +19,39 @@ msgstr ""
 msgid "Refresh Album Information"
 msgstr "服务器信息"
 
-#: context/albumview.cpp:71 context/contextwidget.cpp:300
-#: gui/cachesettings.cpp:244
+#: context/albumview.cpp:71 context/contextwidget.cpp:307
+#: gui/cachesettings.cpp:262
 #, fuzzy
 msgid "Album Information"
 msgstr "信息"
 
-#. i18n: file: devices/albumdetails.ui:130
+#. i18n: file: devices/albumdetails.ui:143
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: context/albumview.cpp:166 po/rc.cpp:73 rc.cpp:73
+#: context/albumview.cpp:171 po/rc.cpp:76 rc.cpp:76
 msgid "Tracks"
 msgstr "音轨"
 
-#: context/artistview.cpp:88
+#: context/artistview.cpp:85
 #, fuzzy
 msgid "Refresh Artist Information"
 msgstr "艺术家信息"
 
-#: context/artistview.cpp:95 context/contextwidget.cpp:299
-#: gui/cachesettings.cpp:242
+#: context/artistview.cpp:92 context/contextwidget.cpp:306
+#: gui/cachesettings.cpp:260
 msgid "Artist Information"
 msgstr "艺术家信息"
 
 #. i18n: file: gui/interfacesettings.ui:137
 #. 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:310 gui/mainwindow.cpp:279 po/rc.cpp:488 rc.cpp:488
 msgid "Albums"
 msgstr "专辑"
 
-#: context/artistview.cpp:334
+#: context/artistview.cpp:333
 msgid "Web Links"
 msgstr "Web 链接"
 
-#: context/artistview.cpp:422
+#: context/artistview.cpp:419
 msgid "Similar Artists"
 msgstr "相似艺术家"
 
@@ -63,8 +63,8 @@ msgstr ""
 msgid "Wikipedia Languages"
 msgstr ""
 
-#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1191
-#: models/streamsmodel.cpp:1234 models/streamsmodel.cpp:1438
+#: context/contextsettings.cpp:38 models/streamsmodel.cpp:1368
+#: models/streamsmodel.cpp:1414 models/streamsmodel.cpp:1622
 #, fuzzy
 msgid "Other"
 msgstr "其他视图"
@@ -73,12 +73,12 @@ msgstr "其他视图"
 msgid "Reset Spacing"
 msgstr ""
 
-#: context/contextwidget.cpp:301 context/songview.cpp:90
-#: gui/cachesettings.cpp:241
+#: context/contextwidget.cpp:308 context/songview.cpp:105
+#: gui/cachesettings.cpp:259
 msgid "Lyrics"
 msgstr "歌词"
 
-#: context/lastfmengine.cpp:65
+#: context/lastfmengine.cpp:63
 msgid "Read more on last.fm"
 msgstr ""
 
@@ -93,20 +93,20 @@ msgid ""
 "original song title and artist as displayed in Cantata."
 msgstr ""
 
-#. i18n: file: devices/albumdetails.ui:47
+#. i18n: file: devices/albumdetails.ui:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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:60
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#. i18n: file: dynamic/dynamicrule.ui:64
+#. i18n: file: dynamic/dynamicrule.ui:77
 #. 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 po/rc.cpp:61 po/rc.cpp:304 po/rc.cpp:789
+#: rc.cpp:61 rc.cpp:304 rc.cpp:789
 msgid "Title:"
 msgstr "标题:"
 
@@ -114,16 +114,16 @@ msgstr "标题:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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: ectx: property (text), widget (BuddyLabel, label)
 #. i18n: file: dynamic/dynamicrule.ui:25
 #. 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 po/rc.cpp:55 po/rc.cpp:292 po/rc.cpp:792
+#: rc.cpp:55 rc.cpp:292 rc.cpp:792
 msgid "Artist:"
 msgstr "艺术家:"
 
@@ -131,119 +131,120 @@ msgstr "艺术家:"
 msgid "Search For Lyrics"
 msgstr "搜索歌词"
 
-#: context/lyricsettings.cpp:34
+#: context/lyricsettings.cpp:35
 msgid "Choose the websites you want to use when searching for lyrics."
 msgstr "选择歌词搜索网站。"
 
-#: context/lyricsettings.cpp:46
+#: context/lyricsettings.cpp:66
 msgid "(Polish Translations)"
 msgstr "(波兰语翻译)"
 
-#: context/lyricsettings.cpp:47
+#: context/lyricsettings.cpp:67
 msgid "(Portuguese Translations)"
 msgstr "(葡萄牙语翻译)"
 
-#: context/songview.cpp:74
+#: context/songview.cpp:89
 #, fuzzy
 msgid "Refresh Lyrics"
 msgstr "刷新设备"
 
-#: context/songview.cpp:75
+#: context/songview.cpp:90
 msgid "Edit Lyrics"
 msgstr "编辑歌词"
 
-#: context/songview.cpp:76
+#: context/songview.cpp:91
 msgid "Save Lyrics"
 msgstr "保存歌词"
 
-#: context/songview.cpp:77
+#: context/songview.cpp:92
 msgid "Cancel Editing Lyrics"
 msgstr "取消编辑歌词"
 
-#: context/songview.cpp:78
+#: context/songview.cpp:93
 msgid "Delete Lyrics File"
 msgstr "删除歌词文件"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 msgid "Abort editing of lyrics?"
 msgstr "放弃编辑歌词?"
 
-#: context/songview.cpp:103 context/songview.cpp:122 context/songview.cpp:181
+#: context/songview.cpp:118 context/songview.cpp:137 context/songview.cpp:196
 #, fuzzy
 msgid "Abort Editing"
 msgstr "放弃编辑歌词?"
 
-#: 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: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
 msgid "Abort"
 msgstr ""
 
-#: context/songview.cpp:106
+#: context/songview.cpp:121
 msgid "Delete saved copy of lyrics, and re-download?"
 msgstr "删除已下载的歌词并重新下载?"
 
-#: context/songview.cpp:106 context/songview.cpp:107
-#: online/onlineservicespage.cpp:396 online/onlineservicespage.cpp:397
+#: context/songview.cpp:121 context/songview.cpp:122
+#: online/onlineservicespage.cpp:464 online/onlineservicespage.cpp:465
 #, fuzzy
 msgid "Re-download"
 msgstr "下载:"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Current playing song has changed, still perform search?"
 msgstr "当前播放的歌曲已改变,继续搜索?"
 
-#: context/songview.cpp:132
+#: context/songview.cpp:147
 msgid "Song Changed"
 msgstr ""
 
-#: context/songview.cpp:133
+#: context/songview.cpp:148
 #, fuzzy
 msgid "Perform Search"
 msgstr "搜索"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save updated lyrics?"
 msgstr "保存更新后的歌词?"
 
-#: context/songview.cpp:157
+#: context/songview.cpp:172
 msgid "Save"
 msgstr "保存"
 
-#: context/songview.cpp:170
+#: context/songview.cpp:185
 msgid "Failed to save lyrics."
 msgstr "无法保存歌词."
 
-#: context/songview.cpp:192
+#: context/songview.cpp:207
 msgid "Delete lyrics file?"
 msgstr "确定删除歌词?"
 
-#: context/songview.cpp:192 widgets/messageoverlay.cpp:43
+#: context/songview.cpp:207 gui/mainwindow.cpp:292
+#: widgets/messageoverlay.cpp:43
 msgid "Cancel"
 msgstr "取消"
 
-#: context/songview.cpp:416
+#: context/songview.cpp:431
 #, fuzzy
 msgid "Fetching lyrics via %1"
 msgstr ""
 "%1 - %2\n"
 "从 %3 获取歌词"
 
-#: context/wikipediaengine.cpp:250
+#: context/wikipediaengine.cpp:248
 #, fuzzy
 msgid "Track listing"
 msgstr "音轨艺术家"
 
-#: context/wikipediaengine.cpp:303
+#: context/wikipediaengine.cpp:301
 msgid "Read more on wikipedia"
 msgstr ""
 
-#: context/wikipediaengine.cpp:304
+#: context/wikipediaengine.cpp:302
 msgid "Open in browser"
 msgstr ""
 
-#: 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 ""
@@ -253,48 +254,53 @@ msgctxt "Search pattern for an album, separated by |"
 msgid "album|score|soundtrack"
 msgstr ""
 
-#: context/wikipediasettings.cpp:89
+#: context/wikipediasettings.cpp:99
 #, fuzzy
 msgid ""
 "Choose the wikipedia languages you want to use when searching for artist and "
 "album information."
 msgstr "选择歌词搜索网站。"
 
-#: context/wikipediasettings.cpp:90 models/streamsmodel.cpp:477
+#: context/wikipediasettings.cpp:100 models/streamsmodel.cpp:581
+#: online/podcastsearchdialog.cpp:393
 msgid "Reload"
 msgstr ""
 
-#: devices/actiondialog.cpp:73
+#: dbus/powermanagement.cpp:96
+msgid "Cantata is playing a track"
+msgstr ""
+
+#: devices/actiondialog.cpp:76
 msgid "Songs To Be Copied"
 msgstr ""
 
-#: devices/actiondialog.cpp:139
+#: devices/actiondialog.cpp:146
 msgid "<b>INVALID</b>"
 msgstr "<b>无效</b>"
 
-#: devices/actiondialog.cpp:153 devices/actiondialog.cpp:156
+#: devices/actiondialog.cpp:160 devices/actiondialog.cpp:163
 msgid "<i>(When different)</i>"
 msgstr "<i>(当不同的时候)</i>"
 
-#: devices/actiondialog.cpp:188 devices/synccollectionwidget.cpp:268
+#: devices/actiondialog.cpp:195 devices/synccollectionwidget.cpp:268
 msgid "Artists:%1, Albums:%2, Songs:%3"
 msgstr ""
 
-#: devices/actiondialog.cpp:240 devices/mtpdevice.cpp:1476
+#: devices/actiondialog.cpp:255 devices/mtpdevice.cpp:1472
 #: devices/remotefsdevice.cpp:575 devices/umsdevice.cpp:105
 msgid "%1 free"
 msgstr "剩余 %1"
 
-#: devices/actiondialog.cpp:253 devices/actiondialog.cpp:257
+#: devices/actiondialog.cpp:268 devices/actiondialog.cpp:272
 msgid "Local Music Library"
 msgstr "本地音乐库"
 
-#: devices/actiondialog.cpp:255 devices/albumdetailsdialog.cpp:100
-#: gui/preferencesdialog.cpp:95 widgets/groupedview.cpp:255
+#: devices/actiondialog.cpp:270 devices/albumdetailsdialog.cpp:100
+#: gui/preferencesdialog.cpp:103 widgets/groupedview.cpp:256
 msgid "Audio CD"
 msgstr "音乐 CD"
 
-#: devices/actiondialog.cpp:278
+#: devices/actiondialog.cpp:293
 msgid ""
 "There is insufficient space left on the destination device.\n"
 "The selected songs consume %1, but there is only %2 left.\n"
@@ -305,7 +311,7 @@ msgstr ""
 "歌曲需要 %1 但是设备中仅有 %2.\n"
 "歌曲需要转码成较小的文件大小才能复制."
 
-#: devices/actiondialog.cpp:285
+#: devices/actiondialog.cpp:300
 msgid ""
 "There is insufficient space left on the destination.\n"
 "The selected songs consume %1, but there is only %2 left."
@@ -313,185 +319,182 @@ msgstr ""
 "设备剩余空间不足.\n"
 "歌曲需要 %1 但是设备中仅有 %2."
 
-#: devices/actiondialog.cpp:334
+#: devices/actiondialog.cpp:349
 msgid "Copy Songs"
 msgstr "复制歌曲"
 
-#: 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:349 devices/devicespage.cpp:503
+#: gui/albumspage.cpp:233 gui/folderpage.cpp:260 gui/librarypage.cpp:258
+#: gui/stdactions.cpp:85
 msgid "Delete Songs"
 msgstr "删除歌曲"
 
-#: devices/actiondialog.cpp:364
+#: devices/actiondialog.cpp:380
 msgid ""
 "<p>You have not configured the destination device.<br/>Continue with the "
 "default settings?</p>"
 msgstr "<p>没有设置目标设备。<br/>使用默认设置然后继续?</p>"
 
-#: devices/actiondialog.cpp:365 devices/actiondialog.cpp:369
+#: devices/actiondialog.cpp:381 devices/actiondialog.cpp:385
 #, fuzzy
 msgid "Not Configured"
 msgstr "设置"
 
-#: devices/actiondialog.cpp:366 devices/actiondialog.cpp:370
+#: devices/actiondialog.cpp:382 devices/actiondialog.cpp:386
 #, fuzzy
 msgid "Use Defaults"
 msgstr "默认"
 
-#: devices/actiondialog.cpp:368
+#: devices/actiondialog.cpp:384
 msgid ""
 "<p>You have not configured the source device.<br/>Continue with the default "
 "settings?</p>"
 msgstr "<p>没有设置来源设备。<br/>使用默认设置然后继续?</p>"
 
-#: devices/actiondialog.cpp:430
+#: devices/actiondialog.cpp:446
 #, fuzzy
 msgid "Are you sure you wish to stop?"
 msgstr "确定退出?"
 
-#: devices/actiondialog.cpp:430 gui/mainwindow.cpp:268
+#: devices/actiondialog.cpp:446 gui/stdactions.cpp:58
 msgid "Stop"
 msgstr "停止"
 
-#: devices/actiondialog.cpp:473 devices/syncdialog.cpp:182
-#: replaygain/rgdialog.cpp:486 tags/tageditor.cpp:808
-#: tags/trackorganiser.cpp:421
+#: devices/actiondialog.cpp:489 devices/syncdialog.cpp:182
+#: replaygain/rgdialog.cpp:472 tags/tageditor.cpp:836
+#: tags/trackorganiser.cpp:446
 msgid "Device has been removed!"
 msgstr "设备已移除!"
 
-#: devices/actiondialog.cpp:475
+#: devices/actiondialog.cpp:491
 msgid "Device is not connected!"
 msgstr "设备未连接!"
 
-#: devices/actiondialog.cpp:477 devices/syncdialog.cpp:195
-#: replaygain/rgdialog.cpp:496 tags/tageditor.cpp:818
-#: tags/trackorganiser.cpp:431
+#: devices/actiondialog.cpp:493 devices/syncdialog.cpp:195
+#: replaygain/rgdialog.cpp:482 tags/tageditor.cpp:846
+#: tags/trackorganiser.cpp:456
 msgid "Device is busy?"
 msgstr "设备正忙?"
 
-#: devices/actiondialog.cpp:479 devices/syncdialog.cpp:187
+#: devices/actiondialog.cpp:495 devices/syncdialog.cpp:187
 msgid "Device has been changed?"
 msgstr "设备已改变?"
 
-#: devices/actiondialog.cpp:546
+#: devices/actiondialog.cpp:562
 msgid "Clearing unused folders"
 msgstr "清除不用的文件夹"
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 msgid "Calculate ReplayGain for ripped tracks?"
 msgstr ""
 
-#: devices/actiondialog.cpp:561
+#: devices/actiondialog.cpp:577
 #, fuzzy
 msgid "ReplyGain"
 msgstr "播放增益"
 
-#: devices/actiondialog.cpp:562
+#: devices/actiondialog.cpp:578
 #, fuzzy
 msgid "Calculate"
 msgstr "计算中..."
 
-#: devices/actiondialog.cpp:618
+#: devices/actiondialog.cpp:634
 msgid "The destination filename already exists!<hr/>%1"
 msgstr "目标文件名已存在!<hr/>%1"
 
-#: devices/actiondialog.cpp:621
+#: devices/actiondialog.cpp:637
 msgid "Song already exists!<hr/>%1"
 msgstr "歌曲已存在!<hr/>%1"
 
-#: devices/actiondialog.cpp:624
+#: devices/actiondialog.cpp:640
 msgid "Song does not exist!<hr/>%1"
 msgstr "歌曲不存在!<hr/>%1"
 
-#: devices/actiondialog.cpp:627
+#: devices/actiondialog.cpp:643
 msgid ""
 "Failed to create destination folder!<br/>Please check you have sufficient "
 "permissions.<hr/>%1"
 msgstr "创建文件夹失败!<br/>请检查文件权限<hr/>%1"
 
-#: devices/actiondialog.cpp:630
+#: devices/actiondialog.cpp:646
 msgid "Source file no longer exists?<br/><br/<hr/>%1"
 msgstr "源文件不再存在?<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:633
+#: devices/actiondialog.cpp:649
 msgid "Failed to copy.<hr/>%1"
 msgstr "复制失败.<hr/>%1"
 
-#: devices/actiondialog.cpp:634
+#: devices/actiondialog.cpp:650
 msgid "Failed to delete.<hr/>%1"
 msgstr "删除失败 <hr/>%1"
 
-#: devices/actiondialog.cpp:637
+#: devices/actiondialog.cpp:653
 msgid "Not connected to device.<hr/>%1"
 msgstr "设备未连接.<hr/>%1"
 
-#: devices/actiondialog.cpp:640
+#: devices/actiondialog.cpp:656
 msgid "Selected codec is not available.<hr/>%1"
 msgstr "选择的编码不存在.<hr/>%1"
 
-#: devices/actiondialog.cpp:643
+#: devices/actiondialog.cpp:659
 msgid "Transcoding failed.<br/><br/<hr/>%1"
 msgstr "转码失败.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:646
+#: devices/actiondialog.cpp:662
 msgid ""
 "Failed to create temporary file.<br/>(Required for transcoding to MTP "
 "devices.)<hr/>%1"
 msgstr "临时文件创建失败.<br/>(转码 MTP 设备必须使用)<hr/>%1"
 
-#: devices/actiondialog.cpp:649
+#: devices/actiondialog.cpp:665
 msgid "Failed to read source file.<br/><br/<hr/>%1"
 msgstr "读取源文件失败.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:652
+#: devices/actiondialog.cpp:668
 msgid "Failed to write to destination file.<br/><br/<hr/>%1"
 msgstr "目标文件写入失败.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:655
+#: devices/actiondialog.cpp:671
 msgid "No space left on device.<br/><br/<hr/>%1"
 msgstr "设备剩余空间不足.<br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:658
+#: devices/actiondialog.cpp:674
 msgid "Failed to update metadata.<br/><br/<hr/>%1"
 msgstr "无法更新元数据 <hr/>%1"
 
-#: devices/actiondialog.cpp:661
-msgid ""
-"Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
-msgstr "下载音轨失败 - 重定向计数过多.<br/><br/<hr/>%1"
-
-#: devices/actiondialog.cpp:664
+#: devices/actiondialog.cpp:677
 msgid "Failed to download track.<br/><br/<hr/>%1"
 msgstr "无法下载音轨 <br/><br/<hr/>%1"
 
-#: devices/actiondialog.cpp:667
+#: devices/actiondialog.cpp:680
 msgid "Failed to lock device.<hr/>%1"
 msgstr "无法锁定设备. <hr/>%1"
 
-#: devices/actiondialog.cpp:696
+#: devices/actiondialog.cpp:709
 msgid "Local Music Library Properties"
 msgstr "本地音乐库属性"
 
-#: devices/actiondialog.cpp:737 devices/actiondialog.cpp:751
+#: devices/actiondialog.cpp:750 devices/actiondialog.cpp:764
 msgid "<b>Error</b><br/>"
 msgstr "<b>错误</b><br/>"
 
-#: devices/actiondialog.cpp:741 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:754 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Skip"
 msgstr "跳过"
 
-#: devices/actiondialog.cpp:742 tags/trackorganiser.cpp:258
-#: tags/trackorganiser.cpp:280 tags/trackorganiser.cpp:301
+#: devices/actiondialog.cpp:755 tags/trackorganiser.cpp:264
+#: tags/trackorganiser.cpp:283 tags/trackorganiser.cpp:305
+#: tags/trackorganiser.cpp:326
 msgid "Auto Skip"
 msgstr "自动跳过"
 
-#: devices/actiondialog.cpp:746
+#: devices/actiondialog.cpp:759
 msgid "Retry"
 msgstr "重试"
 
-#: devices/actiondialog.cpp:761
+#: 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</"
@@ -501,7 +504,7 @@ msgstr ""
 "\"right\">专辑:</td><td>%2</td></tr><tr><td align=\"right\">音轨:</td><td>"
 "%3</td></tr></table>"
 
-#: devices/actiondialog.cpp:768
+#: 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>"
@@ -509,61 +512,62 @@ msgstr ""
 "<tr><td align=\"right\">源文件:</td><td>%1</td></tr><tr><td align=\"right\">"
 "目标文件:</td><td>%2</td></tr>"
 
-#: devices/actiondialog.cpp:773
+#: 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:779 gui/cachesettings.cpp:169
+#: devices/actiondialog.cpp:792 gui/cachesettings.cpp:174
+#: gui/cachesettings.cpp:230
 msgid "Calculating..."
 msgstr "计算中..."
 
-#: devices/actiondialog.cpp:786
+#: devices/actiondialog.cpp:799
 #, fuzzy
 msgctxt "time (Estimated)"
 msgid "%1 (Estimated)"
 msgstr "%1 (估算时间)"
 
-#: devices/actiondialog.cpp:789
+#: 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:812 devices/fsdevice.cpp:765
-#: online/onlineservice.cpp:139 online/onlineservice.cpp:165
+#: devices/actiondialog.cpp:825 devices/fsdevice.cpp:755
+#: online/onlineservice.cpp:140 online/onlineservice.cpp:166
 msgid "Saving cache"
 msgstr "正在保存缓存"
 
-#: devices/albumdetailsdialog.cpp:129 devices/albumdetailsdialog.cpp:227
-#: tags/tageditor.cpp:142 tags/tageditor.cpp:330
+#: devices/albumdetailsdialog.cpp:135 devices/albumdetailsdialog.cpp:234
+#: tags/tageditor.cpp:145 tags/tageditor.cpp:341
 msgid "Apply \"Various Artists\" Workaround"
 msgstr "使用\"多个艺术家\" 环境"
 
-#: devices/albumdetailsdialog.cpp:130 devices/albumdetailsdialog.cpp:251
-#: tags/tageditor.cpp:143 tags/tageditor.cpp:375
+#: devices/albumdetailsdialog.cpp:136 devices/albumdetailsdialog.cpp:258
+#: tags/tageditor.cpp:146 tags/tageditor.cpp:386
 msgid "Revert \"Various Artists\" Workaround"
 msgstr "恢复 \"多个艺术家\" 环境"
 
-#: devices/albumdetailsdialog.cpp:131 devices/albumdetailsdialog.cpp:269
-#: tags/tageditor.cpp:145 tags/tageditor.cpp:456
+#: devices/albumdetailsdialog.cpp:137 devices/albumdetailsdialog.cpp:276
+#: tags/tageditor.cpp:148 tags/tageditor.cpp:467
 msgid "Capitalize"
 msgstr "转为大写"
 
-#: devices/albumdetailsdialog.cpp:132 devices/albumdetailsdialog.cpp:286
-#: tags/tageditor.cpp:146 tags/tageditor.cpp:485
+#: devices/albumdetailsdialog.cpp:138 devices/albumdetailsdialog.cpp:293
+#: tags/tageditor.cpp:149 tags/tageditor.cpp:496
 msgid "Adjust Track Numbers"
 msgstr "调整音轨号"
 
-#: devices/albumdetailsdialog.cpp:134 tags/tageditor.cpp:140
+#: devices/albumdetailsdialog.cpp:140 tags/tageditor.cpp:143
 msgid "Tools"
 msgstr "工具"
 
-#: devices/albumdetailsdialog.cpp:223 tags/tageditor.cpp:326
+#: devices/albumdetailsdialog.cpp:230 tags/tageditor.cpp:337
 msgid "Apply \"Various Artists\" workaround?"
 msgstr "确定使用\"多个艺术家\" 环境?"
 
-#: devices/albumdetailsdialog.cpp:225 tags/tageditor.cpp:328
+#: devices/albumdetailsdialog.cpp:232 tags/tageditor.cpp:339
 msgid ""
 "<i>This will set 'Album artist' and 'Artist' to \"Various Artists\", and set "
 "'Title' to \"TrackArtist - TrackTitle\"</i>"
@@ -571,11 +575,11 @@ msgstr ""
 "<i>'专辑艺人' 和 '艺术家'将被设置成 '多个艺术家','标题'将被设置为'音轨艺人 "
 "- 音轨标题'。</i>"
 
-#: devices/albumdetailsdialog.cpp:244 tags/tageditor.cpp:368
+#: devices/albumdetailsdialog.cpp:251 tags/tageditor.cpp:379
 msgid "Revert \"Various Artists\" workaround"
 msgstr "恢复 \"多个艺术家\" 环境"
 
-#: devices/albumdetailsdialog.cpp:246 tags/tageditor.cpp:370
+#: devices/albumdetailsdialog.cpp:253 tags/tageditor.cpp:381
 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' "
@@ -584,36 +588,36 @@ msgid ""
 "will be set to \"Wobble\"</i>"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:252 tags/tageditor.cpp:376
+#: devices/albumdetailsdialog.cpp:259 tags/tageditor.cpp:387
 msgid "Revert"
 msgstr ""
 
-#: devices/albumdetailsdialog.cpp:268 tags/tageditor.cpp:454
+#: devices/albumdetailsdialog.cpp:275 tags/tageditor.cpp:465
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and 'Album'"
 msgstr "'标题', '艺术家', '专辑艺术家', '专辑' 的首字母大写。"
 
-#: devices/albumdetailsdialog.cpp:286 tags/tageditor.cpp:486
+#: devices/albumdetailsdialog.cpp:293 tags/tageditor.cpp:497
 msgid "Adjust track number by:"
 msgstr "调整音轨号为:"
 
-#: 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
+#: 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:114
+#: devices/audiocddevice.cpp:130
 msgid "Reading disc"
 msgstr "正在读碟"
 
-#: 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:353 gui/mainwindow.cpp:2199
+#: models/albumsmodel.cpp:252 models/musicmodel.cpp:206
+#: models/playlistsmodel.cpp:198 models/playlistsmodel.cpp:206
 msgid "1 Track (%2)"
 msgid_plural "%1 Tracks (%2)"
 msgstr[0] "%1 音轨 (%2)"
@@ -630,25 +634,25 @@ msgstr "MusicBrainz"
 msgid "Data Track"
 msgstr "数据音轨"
 
-#: devices/cddbinterface.cpp:137 devices/musicbrainz.cpp:154
+#: devices/cddbinterface.cpp:140 devices/musicbrainz.cpp:154
 msgid "Failed to open CD device"
 msgstr "打开 CD 设备失败"
 
-#: devices/cddbinterface.cpp:162 devices/cddbinterface.cpp:188
+#: devices/cddbinterface.cpp:165 devices/cddbinterface.cpp:191
 #: devices/musicbrainz.cpp:217
 #, fuzzy
 msgid "Track %1"
 msgstr "音轨 #"
 
-#: devices/cddbinterface.cpp:286
+#: devices/cddbinterface.cpp:291
 msgid "Failed to create CDDB connection"
 msgstr "创建 CDDB 连接失败"
 
-#: devices/cddbinterface.cpp:292 devices/cddbinterface.cpp:319
+#: devices/cddbinterface.cpp:297 devices/cddbinterface.cpp:324
 msgid "No matches found in CDDB"
 msgstr "CDDB 中没有发现匹配数据"
 
-#: devices/cddbinterface.cpp:300
+#: devices/cddbinterface.cpp:305
 msgid "CDDB error: %1"
 msgstr "CDDB 错误: %1"
 
@@ -656,19 +660,19 @@ msgstr "CDDB 错误: %1"
 msgid "Multiple matches were found. Please choose the relevant one from below:"
 msgstr "发现多个匹配项目,请在下面选择合适的:"
 
-#. i18n: file: devices/albumdetails.ui:157
+#. i18n: file: devices/albumdetails.ui:170
 #. 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:100 po/rc.cpp:82 replaygain/rgdialog.cpp:133
+#: rc.cpp:82
 msgid "Artist"
 msgstr "艺术家"
 
-#. i18n: file: devices/albumdetails.ui:162
+#. i18n: file: devices/albumdetails.ui:175
 #. 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:99 po/rc.cpp:85 replaygain/rgdialog.cpp:135
+#: rc.cpp:85
 msgid "Title"
 msgstr "标题"
 
@@ -690,10 +694,14 @@ msgctxt "artist - album (year)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2"
 
-#: devices/device.cpp:340
+#: devices/device.cpp:346
 msgid "Updating (%1)..."
 msgstr "正在更新 (%1)..."
 
+#: devices/device.cpp:351
+msgid "Updating (%1%)..."
+msgstr "正在更新 (%1%)..."
+
 #: devices/devicepropertiesdialog.cpp:32
 #: devices/remotedevicepropertiesdialog.cpp:40
 msgid "Device Properties"
@@ -782,24 +790,24 @@ msgstr "清除设备历史"
 msgid "Add Device"
 msgstr "添加设备"
 
-#: devices/devicespage.cpp:419 devices/devicespage.cpp:431
+#: devices/devicespage.cpp:432 devices/devicespage.cpp:444
 msgid "Lookup album and track details?"
 msgstr "查看专辑和音轨信息?"
 
-#: devices/devicespage.cpp:420 devices/devicespage.cpp:432
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:433 devices/devicespage.cpp:445
+#: devices/devicespage.cpp:455
 msgid "Refresh"
 msgstr "刷新"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via CDDB"
 msgstr "通过 CDDB"
 
-#: devices/devicespage.cpp:420
+#: devices/devicespage.cpp:433
 msgid "Via MusicBrainz"
 msgstr "通过 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>"
@@ -808,16 +816,16 @@ msgstr ""
 "<p>你希望选择刷新哪一类?<ul><li>部分 - 仅扫描新增歌曲<i>(较快)</i></li><li>全"
 "部 - 扫描所有的歌曲<i>(较慢)</i></li></ul></p>"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Partial"
 msgstr "部分"
 
-#: devices/devicespage.cpp:442
+#: devices/devicespage.cpp:455
 msgid "Full"
 msgstr "完全"
 
-#: devices/devicespage.cpp:489 gui/albumspage.cpp:187 gui/folderpage.cpp:255
-#: gui/librarypage.cpp:211
+#: devices/devicespage.cpp:502 gui/albumspage.cpp:232 gui/folderpage.cpp:259
+#: gui/librarypage.cpp:257
 #, fuzzy
 msgid ""
 "Are you sure you wish to delete the selected songs?\n"
@@ -826,34 +834,34 @@ msgstr ""
 "确定删除选择的歌曲?\n"
 "操作将无法恢复。"
 
-#: devices/devicespage.cpp:516
+#: devices/devicespage.cpp:529
 #, fuzzy
 msgid "Are you sure you wish to forget <b>%1</b>?"
 msgstr "确定要移除 <b>%1</b> ?"
 
-#: devices/devicespage.cpp:535
+#: devices/devicespage.cpp:548
 #, fuzzy
 msgid "Are you sure you wish to eject Audio CD <b>%1 - %2</b>?"
 msgstr "确定要弹出音乐 CD '%1 - %2'?"
 
-#: devices/devicespage.cpp:536
+#: devices/devicespage.cpp:549
 msgid "Eject"
 msgstr ""
 
-#: devices/devicespage.cpp:537
+#: devices/devicespage.cpp:550
 #, fuzzy
 msgid "Are you sure you wish to disconnect <b>%1</b>?"
 msgstr "确定断开 '%1' 的连接?"
 
-#: devices/devicespage.cpp:538
+#: devices/devicespage.cpp:551
 msgid "Disconnect"
 msgstr "连接断开"
 
-#: devices/devicespage.cpp:557 gui/mainwindow.cpp:1150
+#: devices/devicespage.cpp:570 gui/mainwindow.cpp:1122
 msgid "Please close other dialogs first."
 msgstr "请先关闭其他对话框."
 
-#: devices/encoders.cpp:78
+#: devices/encoders.cpp:77
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -867,7 +875,7 @@ msgstr ""
 "</a>是一种有专利授权的无损压缩数字音频格式.<br> 它的音质比同比特率的 MP3 更"
 "好.它是 iPod 或者其他移动播放设备上的一个较好选择.限于非商业合同使用"
 
-#: devices/encoders.cpp:83
+#: devices/encoders.cpp:82
 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 "
@@ -885,21 +893,21 @@ msgid ""
 "s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:101 devices/encoders.cpp:141
+#: devices/encoders.cpp:100 devices/encoders.cpp:140
 msgid "Expected average bitrate for variable bitrate encoding"
 msgstr "可变比特率编码使用平均比特率"
 
-#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
-#: devices/encoders.cpp:256 devices/encoders.cpp:291
+#: devices/encoders.cpp:112 devices/encoders.cpp:151 devices/encoders.cpp:196
+#: devices/encoders.cpp:232 devices/encoders.cpp:292 devices/encoders.cpp:328
 msgid "Smaller file"
 msgstr "较小文件"
 
-#: devices/encoders.cpp:114 devices/encoders.cpp:153 devices/encoders.cpp:198
-#: devices/encoders.cpp:292
+#: devices/encoders.cpp:113 devices/encoders.cpp:152 devices/encoders.cpp:197
+#: devices/encoders.cpp:233 devices/encoders.cpp:329
 msgid "Better sound quality"
 msgstr "较好音质"
 
-#: devices/encoders.cpp:120
+#: devices/encoders.cpp:119
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -913,7 +921,7 @@ msgstr ""
 "有损压缩的专利音频编码格式.<br>尽管有缺陷,但它仍然市易奏常见的音频存储格式,"
 "几乎所有的移动播放设备都支持 MP3."
 
-#: devices/encoders.cpp:124
+#: devices/encoders.cpp:123
 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 "
@@ -929,11 +937,11 @@ msgid ""
 "anything above <b>205kb/s</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:156 online/magnatuneservice.cpp:182
+#: devices/encoders.cpp:155 online/magnatuneservice.cpp:181
 msgid "Ogg Vorbis"
 msgstr "Ogg Vorbis"
 
-#: devices/encoders.cpp:159
+#: devices/encoders.cpp:158
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -947,7 +955,7 @@ msgstr ""
 "无损压缩音频编码格式.<br>它的文件比同比特率的 MP3 更小. Ogg Vorbis是一种很不"
 "错的选择,特别是对支持它的播放器来说."
 
-#: devices/encoders.cpp:164
+#: devices/encoders.cpp:163
 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 "
@@ -966,15 +974,48 @@ msgid ""
 "anything above <b>8</b> is probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:184
+#: devices/encoders.cpp:183
 msgid "Quality rating"
 msgstr "评级"
 
+#: devices/encoders.cpp:200
+msgid "Opus"
+msgstr ""
+
+#: devices/encoders.cpp:203
+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:205
+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 ""
+
+#: devices/encoders.cpp:222 devices/encoders.cpp:319
+msgid "Bitrate"
+msgstr "比特率"
+
+#: devices/encoders.cpp:241
 msgid "Apple Lossless"
 msgstr "Apple 无损"
 
-#: devices/encoders.cpp:208
+#: devices/encoders.cpp:244
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -988,11 +1029,11 @@ msgstr ""
 "%8B%A4>苹果无损格式 苹果无损格式</a> (ALAC) 是一种无损压缩的数字音乐格式.<br>"
 "推荐在苹果播放器或者其他不支持 FLAC 的播放器上使用."
 
-#: devices/encoders.cpp:223 online/magnatuneservice.cpp:183
+#: devices/encoders.cpp:259 online/magnatuneservice.cpp:182
 msgid "FLAC"
 msgstr "FLAC"
 
-#: devices/encoders.cpp:226
+#: devices/encoders.cpp:262
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1006,7 +1047,7 @@ msgstr ""
 "(FLAC) 是一种开放的自由的无损压缩数字音乐格式.<br>如果想要确保音乐品质, FLAC "
 "是最好的选择."
 
-#: devices/encoders.cpp:230
+#: devices/encoders.cpp:266
 msgid ""
 "The <a href=http://flac.sourceforge.net/documentation_tools_flac."
 "html>compression level</a> is an integer value between 0 and 8 that "
@@ -1021,19 +1062,19 @@ msgid ""
 "file, and are not recommended."
 msgstr ""
 
-#: devices/encoders.cpp:245
+#: devices/encoders.cpp:281
 msgid "Compression level"
 msgstr "压缩级别"
 
-#: devices/encoders.cpp:255
+#: devices/encoders.cpp:291
 msgid "Faster compression"
 msgstr "快速压缩"
 
-#: devices/encoders.cpp:261
+#: devices/encoders.cpp:298
 msgid "Windows Media Audio"
 msgstr "Windows Media Audio"
 
-#: devices/encoders.cpp:264
+#: devices/encoders.cpp:301
 msgctxt ""
 "Feel free to redirect the english Wikipedia link to a local version, if it "
 "exists."
@@ -1047,7 +1088,7 @@ msgstr ""
 "%96%B4_%EC%98%A4%EB%94%94%EC%98%A4>Windows Media Audio</a> (WMA)是一种微软开"
 "发的有损压缩音频编码格式.<br>推荐用在不支持 Ogg Vorbis的设备上"
 
-#: devices/encoders.cpp:268
+#: devices/encoders.cpp:305
 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> "
@@ -1061,69 +1102,112 @@ msgid ""
 "probably overkill."
 msgstr ""
 
-#: devices/encoders.cpp:282
-msgid "Bitrate"
-msgstr "比特率"
-
 #: devices/filenameschemedialog.cpp:33
 msgid "Filename Scheme"
 msgstr "文件名框架"
 
-#: devices/filenameschemedialog.cpp:51
+#: devices/filenameschemedialog.cpp:52
 msgctxt "Example album artist"
 msgid "Various Artists"
 msgstr "多个艺术家"
 
-#: devices/filenameschemedialog.cpp:52
+#: devices/filenameschemedialog.cpp:53
 msgctxt "Example artist"
 msgid "Wibble"
 msgstr "Wibble"
 
-#: devices/filenameschemedialog.cpp:53
+#: devices/filenameschemedialog.cpp:54
+msgctxt "Example composer"
+msgid "Vivaldi"
+msgstr ""
+
+#: devices/filenameschemedialog.cpp:55
 msgctxt "Example album"
 msgid "Now 5001"
 msgstr "现在 5001"
 
-#: devices/filenameschemedialog.cpp:54
+#: devices/filenameschemedialog.cpp:56
 msgctxt "Example song name"
 msgid "Wobble"
 msgstr ""
 
-#: devices/filenameschemedialog.cpp:55
+#: devices/filenameschemedialog.cpp:57
 msgctxt "Example genre"
 msgid "Dance"
 msgstr "舞曲"
 
-#: devices/filenameschemedialog.cpp:99
+#: devices/filenameschemedialog.cpp:101
 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 ""
-
-#: devices/fsdevice.cpp:678
+"for each track name.</p>"
+msgstr ""
+
+#: devices/filenameschemedialog.cpp:103
+msgid ""
+"<tr><th><em>Button</em></th><th><em>Variable</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
 msgid "Updating..."
 msgstr "更新..."
 
-#: devices/fsdevice.cpp:760 online/onlineservice.cpp:93
-#: online/onlineservice.cpp:160
+#: devices/fsdevice.cpp:750 online/onlineservice.cpp:94
+#: online/onlineservice.cpp:161
 msgid "Reading cache"
 msgstr "读取缓存"
 
-#: devices/fsdevice.cpp:772 online/onlineservice.cpp:348
+#: devices/fsdevice.cpp:762 online/onlineservice.cpp:370
 msgctxt "Message percent"
 msgid "%1 %2%"
 msgstr ""
@@ -1157,16 +1241,15 @@ msgstr "更新文件..."
 msgid "Updating tracks..."
 msgstr "更新音轨..."
 
-#: 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
+#: 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:1473 devices/remotefsdevice.cpp:568
-#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:53
+#: devices/mtpdevice.cpp:1469 devices/remotefsdevice.cpp:568
+#: devices/umsdevice.cpp:102 gui/initialsettingswizard.cpp:57
 #: models/devicesmodel.cpp:140
 msgid "Not Connected"
 msgstr "未连接"
@@ -1183,7 +1266,7 @@ msgstr "没有在 MusicBrainz 中找到匹配数据"
 msgid "Connection"
 msgstr "连接"
 
-#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:237
+#: devices/remotedevicepropertiesdialog.cpp:52 gui/cachesettings.cpp:255
 msgid "Music Library"
 msgstr "音乐库"
 
@@ -1270,8 +1353,8 @@ msgstr "容量未知"
 
 #. i18n: file: gui/coverdialog.ui:30
 #. 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:53 gui/stdactions.cpp:92
+#: online/podcastsearchdialog.cpp:323 po/rc.cpp:346 rc.cpp:346
 msgid "Search"
 msgstr "搜索"
 
@@ -1318,92 +1401,92 @@ msgstr "未扫描"
 msgid " (recommended)"
 msgstr " (推荐)"
 
-#: dynamic/dynamic.cpp:195
+#: dynamic/dynamic.cpp:208
 msgid "Start Dynamic Playlist"
 msgstr "开始动态列表"
 
-#: dynamic/dynamic.cpp:196
+#: dynamic/dynamic.cpp:209
 msgid "Stop Dynamic Mode"
 msgstr "停止动态模式"
 
-#: dynamic/dynamic.cpp:244
+#: dynamic/dynamic.cpp:257
 msgid "1 Rule"
 msgid_plural "%1 Rules"
 msgstr[0] "%1 规则"
 
-#: dynamic/dynamic.cpp:383
+#: dynamic/dynamic.cpp:396
 msgid ""
 "You need to install \"perl\" on your system in order for Cantata's dynamic "
 "mode to function."
 msgstr ""
 
-#: dynamic/dynamic.cpp:390
+#: dynamic/dynamic.cpp:403
 msgid "Failed to locate rules file - %1"
 msgstr "无法加载配置 - %1"
 
-#: dynamic/dynamic.cpp:398
+#: dynamic/dynamic.cpp:411
 msgid "Failed to remove previous rules file - %1"
 msgstr "无法删除前一个配置 - %1"
 
-#: dynamic/dynamic.cpp:403
+#: dynamic/dynamic.cpp:416
 msgid "Failed to install rules file - %1 -> %2"
 msgstr "无法安装配置 - %1 到 %2"
 
-#: dynamic/dynamic.cpp:703
+#: dynamic/dynamic.cpp:729
 #, fuzzy
 msgid "Dynamizer has been terminated."
 msgstr "动态未启用"
 
-#: dynamic/dynamic.cpp:790
+#: dynamic/dynamic.cpp:816
 msgid "Uknown"
 msgstr "未知"
 
-#: dynamic/dynamic.cpp:792
+#: dynamic/dynamic.cpp:818
 msgid "Loading list of rules"
 msgstr "加载规则列表"
 
-#: dynamic/dynamic.cpp:793
+#: dynamic/dynamic.cpp:819
 msgid "Saving rule"
 msgstr "正在保存规则"
 
-#: dynamic/dynamic.cpp:794
+#: dynamic/dynamic.cpp:820
 msgid "Deleting rule"
 msgstr "删除规则"
 
-#: dynamic/dynamic.cpp:795
+#: dynamic/dynamic.cpp:821
 msgid "Setting active rule"
 msgstr "设置活动的配置"
 
-#: dynamic/dynamic.cpp:796
+#: dynamic/dynamic.cpp:822
 msgid "Stopping dynamizer"
 msgstr "正在停止动态"
 
-#: dynamic/dynamic.cpp:797
+#: dynamic/dynamic.cpp:823
 #, fuzzy
 msgid "Requesting ID details"
 msgstr "连接详情"
 
-#: dynamic/dynamic.cpp:800
+#: dynamic/dynamic.cpp:826
 msgid "Awaiting response for previous command. (%1)"
 msgstr "等待响应前一个命令. (%1)"
 
-#: dynamic/dynamic.cpp:955
+#: dynamic/dynamic.cpp:981
 msgid "Dynamizer is not active"
 msgstr "动态未启用"
 
-#: dynamic/dynamic.cpp:963
+#: dynamic/dynamic.cpp:989
 msgid "Failed to retrieve list of dynamic rules. (%1)"
 msgstr "获取动态列表失败. (%1)"
 
-#: dynamic/dynamic.cpp:994
+#: dynamic/dynamic.cpp:1020
 msgid "Failed to delete rules file. (%1)"
 msgstr "删除 (%1) 失败."
 
-#: dynamic/dynamic.cpp:1001
+#: dynamic/dynamic.cpp:1027
 msgid "Failed to control dynamizer state. (%1)"
 msgstr "设置动态 (%1) 失败"
 
-#: dynamic/dynamic.cpp:1010
+#: dynamic/dynamic.cpp:1036
 msgid "Failed to set the current dynamic rules. (%1)"
 msgstr "无法设置当前动态规则. (%1)"
 
@@ -1438,15 +1521,15 @@ msgstr "动态规则"
 
 #. 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:136 po/rc.cpp:280 rc.cpp:280
 msgid "Add"
 msgstr "添加"
 
-#: dynamic/dynamicruledialog.cpp:191
+#: dynamic/dynamicruledialog.cpp:202
 msgid "<i><b>ERROR</b>: 'From Year' should be less than 'To Year'</i>"
 msgstr "<i><b>错误</b>: 原有的年份应在更改后的年份之前</i>"
 
-#: dynamic/dynamicruledialog.cpp:194
+#: dynamic/dynamicruledialog.cpp:205
 msgid ""
 "<i><b>ERROR:</b> Date range is too large (can only be a maximum of %1 years)"
 "</i>"
@@ -1460,45 +1543,51 @@ msgstr "相似艺术家"
 msgid "AlbumArtist"
 msgstr "专辑艺术家"
 
-#: dynamic/dynamicrulesdialog.cpp:72 gui/playbacksettings.cpp:50
-#: models/playqueuemodel.cpp:104 replaygain/rgdialog.cpp:138
+#. i18n: file: devices/filenameschemedialog.ui:84
+#. i18n: ectx: property (text), widget (QPushButton, composer)
+#: dynamic/dynamicrulesdialog.cpp:72 po/rc.cpp:172 rc.cpp:172
+msgid "Composer"
+msgstr ""
+
+#: dynamic/dynamicrulesdialog.cpp:74 gui/playbacksettings.cpp:50
+#: models/playqueuemodel.cpp:101 replaygain/rgdialog.cpp:134
 msgid "Album"
 msgstr "专辑"
 
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#. i18n: file: devices/filenameschemedialog.ui:179
+#. i18n: file: devices/filenameschemedialog.ui:145
 #. i18n: ectx: property (text), widget (QPushButton, genre)
-#. i18n: file: dynamic/dynamicrule.ui:77
+#. i18n: file: dynamic/dynamicrule.ui:90
 #. 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:106
+#: po/rc.cpp:193 po/rc.cpp:307 rc.cpp:193 rc.cpp:307
 msgid "Genre"
 msgstr "流派"
 
-#: dynamic/dynamicrulesdialog.cpp:78
+#: dynamic/dynamicrulesdialog.cpp:80
 msgid "Date"
 msgstr "日期"
 
-#: dynamic/dynamicrulesdialog.cpp:90
+#: dynamic/dynamicrulesdialog.cpp:92
 msgid "Include"
 msgstr "包含"
 
-#: dynamic/dynamicrulesdialog.cpp:97
+#: dynamic/dynamicrulesdialog.cpp:99
 msgid "Exclude"
 msgstr "排除"
 
-#: dynamic/dynamicrulesdialog.cpp:120
+#: dynamic/dynamicrulesdialog.cpp:122
 msgid " (Exact)"
 msgstr " (解压)"
 
-#: dynamic/dynamicrulesdialog.cpp:137
+#: dynamic/dynamicrulesdialog.cpp:139
 msgid "Dynamic Rules"
 msgstr "动态规则"
 
-#: dynamic/dynamicrulesdialog.cpp:288
+#: dynamic/dynamicrulesdialog.cpp:290
 msgid ""
 "<p>Cantata will query your library using all of the rules listed. The list "
 "of <i>Include</i> rules will be used to build a set of songs that can be "
@@ -1514,11 +1603,11 @@ msgid ""
 "to keep the play queue filled with 10 entries.</p>"
 msgstr ""
 
-#: dynamic/dynamicrulesdialog.cpp:307
+#: dynamic/dynamicrulesdialog.cpp:309
 msgid "Failed to save %1"
 msgstr "%1 保存失败"
 
-#: dynamic/dynamicrulesdialog.cpp:325
+#: dynamic/dynamicrulesdialog.cpp:327
 msgid ""
 "A set of rules named '%1' already exists!\n"
 "Overwrite?"
@@ -1526,33 +1615,37 @@ msgstr ""
 "已经有名为 '%1' 的规则!\n"
 "覆盖吗?"
 
-#: dynamic/dynamicrulesdialog.cpp:326
+#: dynamic/dynamicrulesdialog.cpp:328
 #, fuzzy
 msgid "Overwrite Rules"
 msgstr "覆盖歌曲:"
 
-#: dynamic/dynamicrulesdialog.cpp:351
+#: dynamic/dynamicrulesdialog.cpp:353
 msgid "Saving %1"
 msgstr "正在保存 %1"
 
-#: gui/cachesettings.cpp:163
+#: gui/cachesettings.cpp:168
 #, fuzzy
 msgid "Deleting..."
 msgstr "删除规则"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Name"
 msgstr "名称"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Item Count"
 msgstr "计数"
 
-#: gui/cachesettings.cpp:189
+#: gui/cachesettings.cpp:191
 msgid "Space Used"
 msgstr "已用空间"
 
-#: gui/cachesettings.cpp:227
+#: gui/cachesettings.cpp:234
+msgid "Total space used: %1"
+msgstr ""
+
+#: gui/cachesettings.cpp:245
 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 "
@@ -1561,49 +1654,54 @@ msgid ""
 "there). Below is a summary of Cantata's cache usage."
 msgstr ""
 
-#: gui/cachesettings.cpp:239
+#: gui/cachesettings.cpp:257
 msgid "Covers"
 msgstr "封面"
 
-#: gui/cachesettings.cpp:240
+#: gui/cachesettings.cpp:258
 #, fuzzy
 msgid "Backdrops"
 msgstr "后退"
 
-#: gui/cachesettings.cpp:245 gui/mainwindow.cpp:307
-#: widgets/groupedview.cpp:255
+#: 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:246
+#: gui/cachesettings.cpp:264
 msgid "Jamendo"
 msgstr ""
 
-#: gui/cachesettings.cpp:247
+#: gui/cachesettings.cpp:265
 msgid "Magnatune"
 msgstr ""
 
-#: gui/cachesettings.cpp:249
+#: gui/cachesettings.cpp:266
+msgid "Podcast Directories"
+msgstr ""
+
+#: gui/cachesettings.cpp:273
 msgid "Delete All"
 msgstr "删除全部"
 
-#: gui/cachesettings.cpp:288
+#: gui/cachesettings.cpp:312
 msgid "Delete all '%1' items?"
 msgstr "确定所有 '%1' 的项目?"
 
-#: gui/cachesettings.cpp:289 gui/cachesettings.cpp:299
+#: gui/cachesettings.cpp:313 gui/cachesettings.cpp:323
 msgid "Delete Cache Items"
 msgstr "确定删除缓存?"
 
-#: gui/cachesettings.cpp:298
+#: gui/cachesettings.cpp:322
 msgid "<p>Delete all from the following?<ul>%1</ul></p>"
 msgstr "<p>删除下面所有的项目吗?<ul>%1</ul></p>"
 
-#: gui/coverdialog.cpp:150 gui/main.cpp:169
+#: gui/coverdialog.cpp:151 gui/main.cpp:231
 msgid "Last.fm"
 msgstr ""
 
-#: gui/coverdialog.cpp:164
+#: gui/coverdialog.cpp:165
 msgctxt ""
 "name\n"
 "width x height (file size)"
@@ -1614,7 +1712,7 @@ msgstr ""
 "%1\n"
 "%2 x %3 (%4)"
 
-#: gui/coverdialog.cpp:183
+#: gui/coverdialog.cpp:184
 msgctxt ""
 "Google\n"
 "width x height (file size)"
@@ -1625,7 +1723,7 @@ msgstr ""
 "Google\n"
 "%1 x %2 (%3)"
 
-#: gui/coverdialog.cpp:203
+#: gui/coverdialog.cpp:204
 msgctxt ""
 "Discogs\n"
 "width x height"
@@ -1634,7 +1732,7 @@ msgid ""
 "%1 x %2"
 msgstr ""
 
-#: gui/coverdialog.cpp:237
+#: gui/coverdialog.cpp:238
 msgctxt ""
 "Current Cover\n"
 "width x height"
@@ -1645,39 +1743,39 @@ msgstr ""
 "当前封面\n"
 "%1 x %2"
 
-#: gui/coverdialog.cpp:255
+#: gui/coverdialog.cpp:256
 msgid "Image"
 msgstr "图片"
 
-#: gui/coverdialog.cpp:258
+#: gui/coverdialog.cpp:259
 msgid "Downloading..."
 msgstr "正在下载..."
 
-#: gui/coverdialog.cpp:303 gui/coverdialog.cpp:338
+#: gui/coverdialog.cpp:304 gui/coverdialog.cpp:339
 msgctxt "Image (width x height zoom%)"
 msgid "Image (%1 x %2 %3%)"
 msgstr "图片 (%1 x %2 %3%)"
 
-#: gui/coverdialog.cpp:431
+#: gui/coverdialog.cpp:432
 #, 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:432
+#: gui/coverdialog.cpp:433
 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:439 models/albumsmodel.cpp:267
-#: models/musicmodel.cpp:204
+#: 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:613
+#: gui/coverdialog.cpp:579
 msgid ""
 "Failed to set cover!\n"
 "Could not download to temporary file!"
@@ -1685,37 +1783,44 @@ msgstr ""
 "设置封面失败!\n"
 "无法下载临时文件!"
 
-#: gui/coverdialog.cpp:642
+#: gui/coverdialog.cpp:607
 msgid "Failed to download image!"
 msgstr "下载图片失败!"
 
-#: gui/coverdialog.cpp:828 gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:793 gui/coverdialog.cpp:795
 msgid "Load Local Cover"
 msgstr "加载本地封面"
 
-#: gui/coverdialog.cpp:830
+#: gui/coverdialog.cpp:795
 msgid "Images (*.png *.jpg)"
 msgstr "图片 Images (*.png *.jpg)"
 
-#: gui/coverdialog.cpp:835
+#: gui/coverdialog.cpp:800
 msgid "File is already in list!"
 msgstr "文件已在列表中!"
 
-#: gui/coverdialog.cpp:839
+#: gui/coverdialog.cpp:804
 msgid "Failed to read image!"
 msgstr "读取图片失败!"
 
-#: gui/coverdialog.cpp:852
+#: gui/coverdialog.cpp:817
 msgid "Display"
 msgstr "显示"
 
 #. 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:818 gui/stdactions.cpp:91 po/rc.cpp:286 po/rc.cpp:765
+#: rc.cpp:286 rc.cpp:765
 msgid "Remove"
 msgstr "删除"
 
-#: gui/coverdialog.cpp:1218
+#: gui/coverdialog.cpp:1181
 msgid ""
 "Failed to set cover!\n"
 "Could not make copy!"
@@ -1723,7 +1828,7 @@ msgstr ""
 "设置封面失败!\n"
 "复制图片失败!"
 
-#: gui/coverdialog.cpp:1227
+#: gui/coverdialog.cpp:1190
 msgid ""
 "Failed to set cover!\n"
 "Could not backup original!"
@@ -1731,7 +1836,7 @@ msgstr ""
 "设置封面失败!\n"
 "备份原封面失败!"
 
-#: gui/coverdialog.cpp:1276
+#: gui/coverdialog.cpp:1239
 msgid ""
 "Failed to set cover!\n"
 "Could not copy file to '%1'!"
@@ -1743,379 +1848,398 @@ msgstr ""
 msgid "Open In File Manager"
 msgstr "在文件管理器里打开"
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Established"
 msgstr ""
 
-#: gui/initialsettingswizard.cpp:135
+#: gui/initialsettingswizard.cpp:140
 msgid "Connection Failed"
 msgstr "连接失败"
 
-#. i18n: file: support/shortcutssettingspage.ui:78
+#. 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
+#: gui/interfacesettings.cpp:39 gui/playbacksettings.cpp:48
+#: online/magnatuneservice.cpp:159 po/rc.cpp:780 rc.cpp:780
 msgid "None"
 msgstr "无"
 
-#: gui/interfacesettings.cpp:36
+#: gui/interfacesettings.cpp:40
 msgid "Small"
 msgstr "小"
 
-#: gui/interfacesettings.cpp:37
+#: gui/interfacesettings.cpp:41
 msgid "Medium"
 msgstr "中"
 
-#: gui/interfacesettings.cpp:38
+#: gui/interfacesettings.cpp:42
 msgid "Large"
 msgstr "大"
 
-#: gui/interfacesettings.cpp:39
+#: gui/interfacesettings.cpp:43
 msgid "Extra Large"
 msgstr "非常大"
 
-#: gui/interfacesettings.cpp:44
+#: gui/interfacesettings.cpp:48
 msgid "Simple Tree"
 msgstr "简单树形"
 
-#: gui/interfacesettings.cpp:45
+#: gui/interfacesettings.cpp:49
 msgid "Detailed Tree"
 msgstr "详细信息"
 
 #. i18n: file: gui/interfacesettings.ui:329
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: gui/interfacesettings.cpp:47 po/rc.cpp:528 rc.cpp:528
+#: gui/interfacesettings.cpp:51 po/rc.cpp:542 rc.cpp:542
 msgid "Grouped Albums"
 msgstr "分组专辑"
 
-#: gui/interfacesettings.cpp:49
+#: gui/interfacesettings.cpp:53
 msgid "List"
 msgstr "列表"
 
-#: gui/interfacesettings.cpp:51
+#: gui/interfacesettings.cpp:55
 msgid "Icon/List"
 msgstr "图标/列表"
 
-#: gui/interfacesettings.cpp:85
+#: gui/interfacesettings.cpp:164 gui/mainwindow.cpp:280
+msgid "Folders"
+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)
+#: 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
+msgid "Style:"
+msgstr "视图:"
+
+#: gui/interfacesettings.cpp:170 gui/mainwindow.cpp:284
+#: gui/preferencesdialog.cpp:89
+msgid "Online"
+msgstr "在线"
+
+#: gui/interfacesettings.cpp:173 gui/mainwindow.cpp:286
+msgid "Devices"
+msgstr "设备"
+
+#: gui/interfacesettings.cpp:178
 msgid "Grouped by 'Album Artist'"
 msgstr "'专辑艺术家'分组"
 
-#: gui/interfacesettings.cpp:86
+#: gui/interfacesettings.cpp:179
 msgid "Grouped under 'Various Artists'"
 msgstr "'多个艺术家'分组"
 
-#: 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/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
 msgid "Cantata"
 msgstr ""
 
-#: gui/main.cpp:152
+#: gui/main.cpp:214
 msgid "A KDE client for MPD"
 msgstr "KDE 下的 MPD 客户端"
 
-#: gui/main.cpp:154
-msgid "Copyright (C) 2011-2013 Craig Drummond"
-msgstr "Copyright (C) 2011-2013 Craig Drummond"
+#: gui/main.cpp:216
+#, fuzzy
+msgid "Copyright (c) 2011–2013 Craig Drummond"
+msgstr "Copyright (c) 2011-2013 Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Craig Drummond"
 msgstr "Craig Drummond"
 
-#: gui/main.cpp:158
+#: gui/main.cpp:220
 msgid "Maintainer"
 msgstr "维护者"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "Piotr Wicijowski"
 msgstr "Piotr Wicijowski"
 
-#: gui/main.cpp:159
+#: gui/main.cpp:221
 msgid "UI Improvements"
 msgstr "界面优化"
 
-#: gui/main.cpp:160
+#: gui/main.cpp:222
 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:222 gui/main.cpp:223 gui/main.cpp:224 gui/main.cpp:225
 msgid "QtMPC author"
 msgstr "QtMPC 作者"
 
-#: gui/main.cpp:161
+#: gui/main.cpp:223
 msgid "Roeland Douma"
 msgstr "Roeland Douma"
 
-#: gui/main.cpp:162
+#: gui/main.cpp:224
 msgid "Daniel Selinger"
 msgstr "Daniel Selinger"
 
-#: gui/main.cpp:163
+#: gui/main.cpp:225
 msgid "Armin Walland"
 msgstr "Armin Walland"
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid "FanArt.tv"
 msgstr ""
 
-#: gui/main.cpp:167
+#: gui/main.cpp:229
 msgid ""
 "Context view backdrops (please consider uploading your own music fan-art to "
 "fanart.tv)"
 msgstr ""
 
-#: gui/main.cpp:168
+#: gui/main.cpp:230
 msgid "Wikipedia"
 msgstr ""
 
-#: gui/main.cpp:168 gui/main.cpp:169
+#: gui/main.cpp:230 gui/main.cpp:231
 msgid "Context view metadata"
 msgstr ""
 
-#: gui/main.cpp:173
+#: gui/main.cpp:235
 msgid "URL to open"
 msgstr "打开 URL"
 
-#: gui/mainwindow.cpp:255
+#: gui/mainwindow.cpp:238
 msgid "Quit"
 msgstr "退出"
 
-#: gui/mainwindow.cpp:259
+#: gui/mainwindow.cpp:242
 msgid "Show Window"
 msgstr "显示窗口"
 
-#. 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:245 po/rc.cpp:418 rc.cpp:418
 msgid "Connect"
 msgstr "连接"
 
-#: gui/mainwindow.cpp:263 gui/preferencesdialog.cpp:77
+#: gui/mainwindow.cpp:246 gui/preferencesdialog.cpp:80
 #, fuzzy
 msgid "Collection"
 msgstr "连接"
 
-#: gui/mainwindow.cpp:264
+#: gui/mainwindow.cpp:247
 msgid "Outputs"
 msgstr "输出"
 
-#: gui/mainwindow.cpp:265
-msgid "Previous Track"
-msgstr "上一个"
-
-#: gui/mainwindow.cpp:266
-msgid "Next Track"
-msgstr "下一个"
-
-#: gui/mainwindow.cpp:267
-msgid "Play/Pause"
-msgstr "播放/暂停"
-
-#: gui/mainwindow.cpp:269
-msgid "Stop After Current Track"
-msgstr "当前音轨后停止"
-
-#: gui/mainwindow.cpp:270
+#: gui/mainwindow.cpp:248 gui/stdactions.cpp:60
 msgid "Stop After Track"
 msgstr "音轨后停止"
 
-#: gui/mainwindow.cpp:271
-msgid "Increase Volume"
-msgstr "增大音量"
-
-#: gui/mainwindow.cpp:272
-msgid "Decrease Volume"
-msgstr "减小音量"
-
-#: gui/mainwindow.cpp:273
-msgid "Mute"
-msgstr "静音"
-
-#: gui/mainwindow.cpp:274
+#: gui/mainwindow.cpp:249
 msgid "Add To Stored Playlist"
 msgstr "添加到已有列表"
 
-#: gui/mainwindow.cpp:275
+#: gui/mainwindow.cpp:250
 msgid "Remove From Play Queue"
 msgstr "从播放队列中删除"
 
-#: gui/mainwindow.cpp:276
+#: gui/mainwindow.cpp:251
 msgid "Copy Track Info"
 msgstr "复制音轨信息"
 
-#: gui/mainwindow.cpp:277
+#: gui/mainwindow.cpp:252
 msgid "Crop"
 msgstr "裁减"
 
-#: gui/mainwindow.cpp:278
-msgid "Shuffle"
+#: gui/mainwindow.cpp:253
+#, fuzzy
+msgid "Shuffle Tracks"
+msgstr "单个音轨"
+
+#: gui/mainwindow.cpp:254
+#, fuzzy
+msgid "Shuffle Albums"
 msgstr "随机"
 
-#: gui/mainwindow.cpp:279
+#: gui/mainwindow.cpp:255
 msgid "Add Stream URL"
 msgstr "添加流媒体"
 
-#: gui/mainwindow.cpp:280
+#: gui/mainwindow.cpp:256
 msgid "Clear"
 msgstr "清除"
 
-#: gui/mainwindow.cpp:281
+#: gui/mainwindow.cpp:257
 msgid "Expanded Interface"
 msgstr "展开界面"
 
-#: gui/mainwindow.cpp:282
+#: gui/mainwindow.cpp:258
 #, fuzzy
 msgid "Show Current Song Information"
 msgstr "服务器信息"
 
-#: gui/mainwindow.cpp:285
+#: gui/mainwindow.cpp:261
 msgid "Full Screen"
 msgstr "全屏"
 
-#: gui/mainwindow.cpp:287
+#: gui/mainwindow.cpp:263
 msgid "Random"
 msgstr "随机"
 
-#: gui/mainwindow.cpp:288
+#: gui/mainwindow.cpp:264
 msgid "Repeat"
 msgstr "重复"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid "Single"
 msgstr "单曲"
 
-#: gui/mainwindow.cpp:289
+#: gui/mainwindow.cpp:265
 msgid ""
 "When 'Single' is activated, playback is stopped after current song, or song "
 "is repeated if 'Repeat' is enabled."
 msgstr ""
 "'单曲'启用时, 将在当前歌曲完成后停止播放. 或者 '重复'启用时, 将反复播放."
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid "Consume"
 msgstr "省资源"
 
-#: gui/mainwindow.cpp:290
+#: gui/mainwindow.cpp:266
 msgid ""
 "When consume is activated, a song is removed from the play queue after it "
 "has been played."
 msgstr "当节省资源打开时,播放过的歌曲将被从队列中移除."
 
-#: gui/mainwindow.cpp:291
+#: gui/mainwindow.cpp:267
 #, fuzzy
 msgid "Search Play Queue"
 msgstr "搜索播放队列..."
 
-#: gui/mainwindow.cpp:293
+#: gui/mainwindow.cpp:269
 msgid "Set Priority"
 msgstr "设置优先级"
 
-#: gui/mainwindow.cpp:295
+#: gui/mainwindow.cpp:271
 msgid "Play Stream"
 msgstr "播放流媒体"
 
-#: gui/mainwindow.cpp:297
+#: gui/mainwindow.cpp:273
 msgid "Locate In Library"
 msgstr "在库中定位"
 
-#: gui/mainwindow.cpp:299
+#: gui/mainwindow.cpp:275
 msgid "Edit Song Tags"
 msgstr "编辑歌曲标签"
 
 #. i18n: file: gui/interfacesettings.ui:304
 #. i18n: ectx: attribute (title), widget (QWidget, tab_5)
-#: gui/mainwindow.cpp:301 po/rc.cpp:519 rc.cpp:519
+#: gui/mainwindow.cpp:277 po/rc.cpp:533 rc.cpp:533
 msgid "Play Queue"
 msgstr "播放队列"
 
 #. i18n: file: gui/interfacesettings.ui:27
 #. i18n: ectx: attribute (title), widget (QWidget, tab)
-#: gui/mainwindow.cpp:302 po/rc.cpp:455 rc.cpp:455
+#: gui/mainwindow.cpp:278 po/rc.cpp:469 rc.cpp:469
 msgid "Artists"
 msgstr "艺术家"
 
-#: gui/mainwindow.cpp:304
-msgid "Folders"
-msgstr "文件夹"
-
 #. 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
+#: gui/mainwindow.cpp:281 po/rc.cpp:509 rc.cpp:509
 msgid "Playlists"
 msgstr "播放列表"
 
-#: gui/mainwindow.cpp:306
+#: gui/mainwindow.cpp:282
 msgid "Dynamic"
 msgstr "动态"
 
-#: gui/mainwindow.cpp:308
-msgid "Online"
-msgstr "在线"
-
-#: gui/mainwindow.cpp:310
-msgid "Devices"
-msgstr "设备"
-
-#: gui/mainwindow.cpp:312
+#: gui/mainwindow.cpp:288
 msgid "Expand All"
 msgstr "展开所有"
 
-#: gui/mainwindow.cpp:313
+#: gui/mainwindow.cpp:289
 msgid "Collapse All"
 msgstr "收起所有"
 
-#: gui/mainwindow.cpp:428
+#: gui/mainwindow.cpp:290
+#, fuzzy
+msgid "Remove All Songs"
+msgstr "删除播放列表?"
+
+#: gui/mainwindow.cpp:398
 msgid "Info"
 msgstr "信息"
 
-#: gui/mainwindow.cpp:435
+#: gui/mainwindow.cpp:405
 msgid "Auto Hide"
 msgstr "自动隐藏"
 
-#: gui/mainwindow.cpp:441
+#: gui/mainwindow.cpp:411
 msgid "Monochrome Icons"
 msgstr ""
 
-#: gui/mainwindow.cpp:574
+#: gui/mainwindow.cpp:541
 msgid "Server information..."
 msgstr "服务器信息..."
 
-#: gui/mainwindow.cpp:585
+#: gui/mainwindow.cpp:552
 msgid "Configure Cantata..."
 msgstr "设置 Cantata..."
 
-#: gui/mainwindow.cpp:589
+#: gui/mainwindow.cpp:559
 msgctxt "Qt-only"
 msgid "About Cantata..."
 msgstr "关于 Cantata..."
 
-#: gui/mainwindow.cpp:599
+#: gui/mainwindow.cpp:571
 msgid "&File"
 msgstr "文件(&F)"
 
-#: gui/mainwindow.cpp:602
+#: gui/mainwindow.cpp:574
 msgid "&Settings"
 msgstr "设置(&S)"
 
-#: gui/mainwindow.cpp:617 support/dialog.cpp:97
+#: gui/mainwindow.cpp:589 support/dialog.cpp:97
 msgid "&Help"
 msgstr "帮助(&H)"
 
-#: gui/mainwindow.cpp:980
+#: gui/mainwindow.cpp:948
 msgid "Failed to locate any songs matching the dynamic playlist rules."
 msgstr "无法给歌曲匹配动态设置."
 
-#: gui/mainwindow.cpp:1101 mpd/mpdconnection.cpp:356
+#: gui/mainwindow.cpp:1063 mpd/mpdconnection.cpp:367
 msgid "Connecting to %1"
 msgstr "连接到 %1"
 
-#: gui/mainwindow.cpp:1461
+#: gui/mainwindow.cpp:1151
+msgid ""
+"Podcasts are currently being downloaded\n"
+"\n"
+"Quiting now will abort all downloads."
+msgstr ""
+
+#: gui/mainwindow.cpp:1152
+msgid "Abort downloads and quit"
+msgstr ""
+
+#: gui/mainwindow.cpp:1447
 msgctxt "Qt-only"
 msgid "About Cantata"
 msgstr "关于 Cantata"
 
-#: gui/mainwindow.cpp:1462
+#: gui/mainwindow.cpp:1448
 #, fuzzy
 msgctxt "Qt-only"
 msgid ""
@@ -2124,36 +2248,36 @@ msgid ""
 "\">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) "
+"2011-2012.<br/>采用 GPLv2 协议发布<br/><br/><i><small>基于 QtMPC - (c) "
 "2007-2010 QtMPC 作者版权所有</small></i>"
 
-#: gui/mainwindow.cpp:1464
+#: gui/mainwindow.cpp:1450
 msgid ""
-"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (C) 2007-2010 The "
+"Based upon <a href=\"http://qtmpc.lowblog.nl\">QtMPC</a> - (c) 2007-2010 The "
 "QtMPC Authors<br/>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1466
+#: gui/mainwindow.cpp:1451
 msgctxt "Qt-only"
 msgid ""
 "Context view backdrops courtesy of <a href=\"http://www.fanart.tv\">FanArt."
 "tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1467
+#: gui/mainwindow.cpp:1452
 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:1468
+#: gui/mainwindow.cpp:1453
 msgid ""
 "Please consider uploading your own music fan-art to <a href=\"http://www."
 "fanart.tv\">FanArt.tv</a>"
 msgstr ""
 
-#: gui/mainwindow.cpp:1479
+#: gui/mainwindow.cpp:1464
 #, fuzzy
 msgid ""
 "<tr><td colspan=\"2\"><b>Server</b></td></tr><tr><td align=\"right\">Version:"
@@ -2164,7 +2288,7 @@ msgstr ""
 "\"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:1487
+#: gui/mainwindow.cpp:1472
 #, fuzzy
 msgid ""
 "<tr><td colspan=\"2\"><b>Database</b></td></tr><tr><td align=\"right"
@@ -2179,82 +2303,78 @@ msgstr ""
 "%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:1496
+#: gui/mainwindow.cpp:1481
 msgid "Server Information"
 msgstr "服务器信息"
 
-#: gui/mainwindow.cpp:1743 gui/mainwindow.cpp:1750
+#: gui/mainwindow.cpp:1713 gui/mainwindow.cpp:1720
 msgid "Cantata (%1)"
 msgstr ""
 
-#: gui/mainwindow.cpp:1746 gui/mainwindow.cpp:1753
+#: gui/mainwindow.cpp:1716 gui/mainwindow.cpp:1723
 msgctxt "track :: Cantata (connection)"
 msgid "%1 :: Cantata (%2)"
 msgstr "%1 :: Cantata (%2)"
 
-#: gui/mainwindow.cpp:1747 gui/mainwindow.cpp:1754
+#: gui/mainwindow.cpp:1717 gui/mainwindow.cpp:1724
 msgctxt "track :: Cantata"
 msgid "%1 :: Cantata"
 msgstr "%1 :: Cantata"
 
-#: gui/mainwindow.cpp:1758
+#: gui/mainwindow.cpp:1728
 msgctxt "track - artist :: Cantata (connection)"
 msgid "%1 - %2 :: Cantata (%3)"
 msgstr "%1 - %2 :: Cantata (%3)"
 
-#: gui/mainwindow.cpp:1760
+#: gui/mainwindow.cpp:1730
 msgctxt "track - artist :: Cantata"
 msgid "%1 - %2 :: Cantata"
 msgstr "%1 - %2 :: Cantata"
 
-#: gui/mainwindow.cpp:1805
+#: gui/mainwindow.cpp:1773
 msgid "(Stream)"
 msgstr "(流媒体)"
 
-#: gui/mainwindow.cpp:1807
+#: gui/mainwindow.cpp:1775
 msgctxt "title - artist"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1825 widgets/groupedview.cpp:268
+#: gui/mainwindow.cpp:1793 widgets/groupedview.cpp:280
 msgctxt "artist - album"
 msgid "%1 - %2"
 msgstr "%1 - %2"
 
-#: gui/mainwindow.cpp:1921 gui/mainwindow.cpp:1922
-msgid "Volume Disabled"
-msgstr "静音"
+#: gui/mainwindow.cpp:1843
+msgid "MPD reported the following error: %1"
+msgstr ""
 
-#: gui/mainwindow.cpp:1933
+#: gui/mainwindow.cpp:1990
 #, fuzzy
-msgid "Volume %1% (Muted)"
-msgstr "音量 %1%"
-
-#: gui/mainwindow.cpp:1933
-msgid "Volume %1%"
-msgstr "音量 %1%"
+msgid "Remove all songs from play queue?"
+msgstr "从播放队列中删除"
 
-#: gui/mainwindow.cpp:2119 models/playqueuemodel.cpp:110
+#: gui/mainwindow.cpp:2080 models/playqueuemodel.cpp:107
 msgid "Priority"
 msgstr "优先级"
 
-#: gui/mainwindow.cpp:2119
+#: gui/mainwindow.cpp:2080
 msgid "Enter priority (0..255):"
 msgstr "输入优先级 (0到255)"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Playlist Name"
 msgstr "播放列表名称"
 
-#: gui/mainwindow.cpp:2142 gui/playlistspage.cpp:203
+#: gui/mainwindow.cpp:2103 gui/playlistspage.cpp:207
 msgid "Enter a name for the playlist:"
 msgstr "输入播放列表名称:"
 
-#: gui/mainwindow.cpp:2145
+#: gui/mainwindow.cpp:2106
 msgid "A playlist named <b>%1</b> already exists!<br/>Add to that playlist?"
 msgstr "已经有名为 <b>%1</b>的播放列表!<br/>添加到它吗?"
 
-#: gui/mainwindow.cpp:2146
+#: gui/mainwindow.cpp:2107
 msgid "Existing Playlist"
 msgstr "已有同名播放列表"
 
@@ -2266,10 +2386,10 @@ msgstr "不淡出"
 msgid " ms"
 msgstr " 毫秒"
 
-#. i18n: file: devices/albumdetails.ui:152
+#. i18n: file: devices/albumdetails.ui:165
 #. 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:49 po/rc.cpp:79 widgets/playqueueview.cpp:170
+#: rc.cpp:79
 msgid "Track"
 msgstr "音轨"
 
@@ -2278,7 +2398,7 @@ msgstr "音轨"
 msgid "Auto"
 msgstr "自动跳过"
 
-#: gui/playbacksettings.cpp:143
+#: gui/playbacksettings.cpp:164
 #, fuzzy
 msgid ""
 "<i>Connected to %1<br/>The entries below apply to the currently connected "
@@ -2287,14 +2407,14 @@ msgstr "<i><b>%1 已连接</b><br/>下面是已经连接的MPD。</i>"
 
 #. i18n: file: gui/playbacksettings.ui:26
 #. i18n: ectx: property (text), widget (QLabel, messageLabel)
-#: gui/playbacksettings.cpp:146 po/rc.cpp:582 rc.cpp:582
+#: gui/playbacksettings.cpp:167 po/rc.cpp:599 rc.cpp:599
 #, 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:153
+#: gui/playbacksettings.cpp:174
 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 "
@@ -2304,15 +2424,15 @@ 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 ""
 
-#: gui/playlistspage.cpp:43 tags/tageditor.cpp:759 tags/trackorganiser.cpp:65
+#: gui/playlistspage.cpp:43 tags/tageditor.cpp:784 tags/trackorganiser.cpp:65
 msgid "Rename"
 msgstr "重命名"
 
-#: gui/playlistspage.cpp:186
+#: gui/playlistspage.cpp:190
 msgid ""
 "Are you sure you wish to remove the selected playlists?\n"
 "This cannot be undone."
@@ -2320,117 +2440,129 @@ msgstr ""
 "确定删除选择的列表?\n"
 "操作将无法恢复。"
 
-#: gui/playlistspage.cpp:187
+#: gui/playlistspage.cpp:191
 #, fuzzy
 msgid "Remove Playlists"
 msgstr "删除播放列表?"
 
-#: gui/playlistspage.cpp:207 gui/playlistspage.cpp:230
+#: gui/playlistspage.cpp:211 gui/playlistspage.cpp:234
 msgid "A playlist named <b>%1</b> already exists!<br/>Overwrite?"
 msgstr "已经有名为 <b>%1</b>的播放列表!<br/><br/>覆盖吗?"
 
-#: gui/playlistspage.cpp:208 gui/playlistspage.cpp:231
+#: gui/playlistspage.cpp:212 gui/playlistspage.cpp:235
 #, fuzzy
 msgid "Overwrite Playlist"
 msgstr "覆盖播放列表?"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Rename Playlist"
 msgstr "重命名播放列表"
 
-#: gui/playlistspage.cpp:226
+#: gui/playlistspage.cpp:230
 msgid "Enter new name for playlist:"
 msgstr "输入播放列表新名称:"
 
-#: gui/preferencesdialog.cpp:77
+#: gui/preferencesdialog.cpp:80
 #, fuzzy
 msgid "Collection Settings"
 msgstr "连接设置"
 
-#: gui/preferencesdialog.cpp:78
+#. i18n: file: gui/playbacksettings.ui:132
+#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
+#: gui/preferencesdialog.cpp:81 po/rc.cpp:617 rc.cpp:617
 msgid "Playback"
 msgstr "回放"
 
-#: gui/preferencesdialog.cpp:78
+#: gui/preferencesdialog.cpp:81
 msgid "Playback Settings"
 msgstr "回放设置"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "Files"
 msgstr "文件"
 
-#: gui/preferencesdialog.cpp:79
+#: gui/preferencesdialog.cpp:82
 msgid "File Settings"
 msgstr "设置"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface"
 msgstr "界面"
 
-#: gui/preferencesdialog.cpp:80
+#: gui/preferencesdialog.cpp:83
 msgid "Interface Settings"
 msgstr "界面设置"
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:85
+#, fuzzy
+msgid "Streams Settings"
+msgstr "流媒体"
+
+#: gui/preferencesdialog.cpp:89
+#, fuzzy
+msgid "Online Providers"
+msgstr "在线视图:"
+
+#: gui/preferencesdialog.cpp:92
 msgid "Context"
 msgstr ""
 
-#: gui/preferencesdialog.cpp:81
+#: gui/preferencesdialog.cpp:92
 #, fuzzy
 msgid "Context View Settings"
 msgstr "连接设置"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server"
 msgstr "HTTP 服务器"
 
-#: gui/preferencesdialog.cpp:86
+#: gui/preferencesdialog.cpp:95
 msgid "HTTP Server Settings"
 msgstr "HTTP 服务器设置"
 
-#: gui/preferencesdialog.cpp:95
+#: gui/preferencesdialog.cpp:103
 msgid "Audio CD Settings"
 msgstr "音乐 CD 设置"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 #, fuzzy
 msgid "Proxy"
 msgstr "代理"
 
-#: gui/preferencesdialog.cpp:100
+#: gui/preferencesdialog.cpp:108
 msgctxt "Qt-only"
 msgid "Proxy Settings"
 msgstr "代理设置"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Shortcuts"
 msgstr "快捷"
 
-#: gui/preferencesdialog.cpp:106
+#: gui/preferencesdialog.cpp:112
 msgctxt "Qt-only"
 msgid "Keyboard Shortcut Settings"
 msgstr "快捷键设定"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cache"
 msgstr "缓存"
 
-#: gui/preferencesdialog.cpp:110
+#: gui/preferencesdialog.cpp:115
 msgid "Cached Items"
 msgstr "缓存项目"
 
-#: gui/preferencesdialog.cpp:118
+#: gui/preferencesdialog.cpp:116
 msgid "Configure"
 msgstr "设置"
 
-#: gui/serversettings.cpp:75
+#: 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:88
+#: gui/serversettings.cpp:100
 #, fuzzy
 msgid "Not used"
 msgstr "未使用"
@@ -2447,12 +2579,12 @@ msgstr "未使用"
 #. 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:208 po/rc.cpp:247 po/rc.cpp:705
+#: rc.cpp:208 rc.cpp:247 rc.cpp:705
 msgid "Host:"
 msgstr "主机名:"
 
-#: 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 "
@@ -2462,7 +2594,7 @@ msgid ""
 "service.</i>"
 msgstr ""
 
-#: 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 "
@@ -2476,7 +2608,7 @@ msgstr ""
 "态</code> 程序 <b>必须</b> 已经安装并且启动于远程主机 - Cantata无法自动启动和"
 "停止相关的服务。如果未作设定,Cantata将使用单用户模式来随机播放列表。</i>"
 
-#: gui/serversettings.cpp:109
+#: 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 "
@@ -2484,7 +2616,7 @@ msgid ""
 "</i></p>"
 msgstr ""
 
-#: gui/serversettings.cpp:230
+#: gui/serversettings.cpp:252
 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</"
@@ -2492,119 +2624,187 @@ msgid ""
 "configure and control the MPD instance</li></ul>"
 msgstr ""
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 #, fuzzy
 msgid "Add Collection"
 msgstr "连接"
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Standard"
 msgstr ""
 
-#: gui/serversettings.cpp:233
+#: gui/serversettings.cpp:255
 msgid "Basic"
 msgstr ""
 
-#: gui/serversettings.cpp:264
+#: gui/serversettings.cpp:297
 #, fuzzy
 msgid "Delete <b>%1</b>?"
 msgstr "确定删除 %1 ?"
 
-#: gui/serversettings.cpp:265
+#: gui/serversettings.cpp:298
 #, fuzzy
 msgid "Delete"
 msgstr "删除全部"
 
-#: gui/serversettings.cpp:303
+#: gui/serversettings.cpp:336
 #, fuzzy
 msgid "New Collection %1"
 msgstr "连接到 %1"
 
-#: gui/serversettings.cpp:319 mpd/mpdconnection.cpp:145
+#: gui/serversettings.cpp:352 mpd/mpdconnection.cpp:148
 msgid "Default"
 msgstr "默认"
 
-#: gui/stdactions.cpp:55
-msgid "Save As"
-msgstr "另存为"
+#: gui/shortcutssettingspage.cpp:74
+msgid "Multi-Media Keys"
+msgstr ""
 
-#: gui/stdactions.cpp:56
-msgid "Add To Play Queue"
-msgstr "添加到正在播放"
+#: gui/shortcutssettingspage.cpp:80
+msgid "Do not use media keys to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:81
+msgid "Use media keys to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:84
+msgid "Use media keys, as configured in desktop settings, to control Cantata"
+msgstr ""
+
+#: gui/shortcutssettingspage.cpp:85
+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
+#, 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 "上一个"
+
+#: gui/stdactions.cpp:56
+msgid "Next Track"
+msgstr "下一个"
 
 #: gui/stdactions.cpp:57
+msgid "Play/Pause"
+msgstr "播放/暂停"
+
+#: gui/stdactions.cpp:59
+msgid "Stop After Current Track"
+msgstr "当前音轨后停止"
+
+#: gui/stdactions.cpp:61
+msgid "Increase Volume"
+msgstr "增大音量"
+
+#: gui/stdactions.cpp:62
+msgid "Decrease Volume"
+msgstr "减小音量"
+
+#: gui/stdactions.cpp:63
+msgid "Save As"
+msgstr "另存为"
+
+#: gui/stdactions.cpp:64
+msgid "Add To Play Queue"
+msgstr "添加到正在播放"
+
+#: gui/stdactions.cpp:65
+msgid "Add Albums In Random Order"
+msgstr ""
+
+#: gui/stdactions.cpp:66
 msgid "Replace Play Queue"
 msgstr "替换播放队列"
 
-#: gui/stdactions.cpp:58
+#: gui/stdactions.cpp:67
 msgid "Add With Priority"
 msgstr "添加时设定优先级"
 
-#: gui/stdactions.cpp:59
+#: gui/stdactions.cpp:68
 msgid "Highest Priority (255)"
 msgstr "最高优先级 (255)"
 
-#: gui/stdactions.cpp:60
+#: gui/stdactions.cpp:69
 msgid "High Priority (200)"
 msgstr "高优先级 (200)"
 
-#: gui/stdactions.cpp:61
+#: gui/stdactions.cpp:70
 msgid "Medium Priority (125)"
 msgstr "中等优先级 (125)"
 
-#: gui/stdactions.cpp:62
+#: gui/stdactions.cpp:71
 msgid "Low Priority (50)"
 msgstr "低优先级 (50)"
 
-#: gui/stdactions.cpp:63
+#: gui/stdactions.cpp:72
 msgid "Default Priority (0)"
 msgstr "默认优先级 (0)"
 
-#: gui/stdactions.cpp:64
+#: gui/stdactions.cpp:73
 msgid "Custom Priority..."
 msgstr "自定义优先级..."
 
-#: gui/stdactions.cpp:65
+#: gui/stdactions.cpp:74
 msgid "Add To Playlist"
 msgstr "添加到播放列表"
 
-#: gui/stdactions.cpp:67 tags/trackorganiser.cpp:59
+#: gui/stdactions.cpp:76 tags/trackorganiser.cpp:59
 msgid "Organize Files"
 msgstr "组织文件"
 
-#: gui/stdactions.cpp:68
+#: gui/stdactions.cpp:77
 msgid "Edit Tags"
 msgstr "编辑标签"
 
-#: gui/stdactions.cpp:71 replaygain/rgdialog.cpp:115
+#: gui/stdactions.cpp:80 replaygain/rgdialog.cpp:111
 msgid "ReplayGain"
 msgstr "播放增益"
 
-#: gui/stdactions.cpp:74
+#: gui/stdactions.cpp:83
 #, fuzzy
 msgid "Copy Songs To Device"
 msgstr "复制到设备"
 
-#: gui/stdactions.cpp:78
+#: gui/stdactions.cpp:87
 #, fuzzy
 msgid "Set Image"
 msgstr "图片"
 
-#: gui/stdactions.cpp:79
+#: gui/stdactions.cpp:88
 msgid "Refresh Database"
 msgstr "刷新数据"
 
-#: gui/stdactions.cpp:80
+#: gui/stdactions.cpp:89
 msgid "Back"
 msgstr "后退"
 
-#: gui/trayitem.cpp:165
+#: gui/trayitem.cpp:192
 #, fuzzy
 msgctxt "Song on Album"
 msgid "%1 on %2"
 msgstr "%2 的 %3 中的 %1"
 
-#: gui/trayitem.cpp:166
+#: gui/trayitem.cpp:193
 #, fuzzy
 msgctxt "Song on Album (track duration)"
 msgid "%1 on %2 (%3)"
@@ -2612,17 +2812,17 @@ msgstr ""
 "Google\n"
 "%1 x %2 (%3)"
 
-#: gui/trayitem.cpp:168
+#: gui/trayitem.cpp:195
 msgctxt "Song by Artist on Album"
 msgid "%1 by %2 on %3"
 msgstr "%2 的 %3 中的 %1"
 
-#: gui/trayitem.cpp:169
+#: gui/trayitem.cpp:196
 msgctxt "Song by Artist on Album (track duration)"
 msgid "%1 by %2 on %3 (%4)"
 msgstr "%2 的 %3 中的 %1"
 
-#: gui/trayitem.cpp:196
+#: gui/trayitem.cpp:223
 msgid "Now playing"
 msgstr "正在播放"
 
@@ -2646,6 +2846,16 @@ msgstr ""
 msgid "Inactive"
 msgstr "非交互"
 
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:192
+#: models/musicmodel.cpp:128
+msgid "Cue Sheet"
+msgstr "Cue 表"
+
+#: models/albumsmodel.cpp:291 models/dirviewmodel.cpp:191
+#: models/musicmodel.cpp:128
+msgid "Playlist"
+msgstr "播放列表"
+
 #: models/devicesmodel.cpp:108
 msgid "Configure Device"
 msgstr "设置设备"
@@ -2666,7 +2876,7 @@ msgstr "断开设备"
 msgid "Edit CD Details"
 msgstr "编辑 CD 详细信息"
 
-#: models/devicesmodel.cpp:687
+#: models/devicesmodel.cpp:690
 msgid "No Devices Attached"
 msgstr "没有关联设备"
 
@@ -2679,29 +2889,29 @@ msgstr "未加载"
 msgid "Logged in"
 msgstr ""
 
-#: models/digitallyimported.cpp:184 models/digitallyimported.cpp:206
+#: models/digitallyimported.cpp:185 models/digitallyimported.cpp:211
 #, fuzzy
 msgid "Unknown error"
 msgstr "未知"
 
-#: models/digitallyimported.cpp:193
+#: models/digitallyimported.cpp:198
 msgid "No subscriptions"
 msgstr ""
 
-#: models/digitallyimported.cpp:200
+#: models/digitallyimported.cpp:205
 msgid "You do not have an active subscription"
 msgstr ""
 
-#: models/digitallyimported.cpp:219
+#: models/digitallyimported.cpp:224
 msgid "Logged in (expiry:%1)"
 msgstr ""
 
-#: models/digitallyimported.cpp:227
+#: models/digitallyimported.cpp:232
 msgid "Session expired"
 msgstr ""
 
 #: models/dirviewmodel.cpp:175 models/dirviewmodel.cpp:183
-#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:560
+#: models/streamsearchmodel.cpp:125 models/streamsmodel.cpp:675
 msgid "1 Entry"
 msgid_plural "%1 Entries"
 msgstr[0] "接口 %1"
@@ -2710,229 +2920,255 @@ msgstr[0] "接口 %1"
 msgid "Audio File"
 msgstr "音频文件"
 
-#: models/dirviewmodel.cpp:191 models/musicmodel.cpp:120
-msgid "Playlist"
-msgstr "播放列表"
-
-#: models/dirviewmodel.cpp:192 models/musicmodel.cpp:120
-msgid "Cue Sheet"
-msgstr "Cue 表"
-
-#: models/musiclibraryitemartist.cpp:218 models/musiclibraryitemartist.cpp:231
-#: models/musiclibraryitemroot.cpp:798
+#: models/musiclibraryitemartist.cpp:255 models/musiclibraryitemartist.cpp:268
+#: models/musiclibraryitemroot.cpp:844
 msgid "Single Tracks"
 msgstr "单个音轨"
 
-#: models/musicmodel.cpp:158 models/onlineservicesmodel.cpp:146
-#: widgets/groupedview.cpp:353
+#: models/musicmodel.cpp:179 models/onlineservicesmodel.cpp:159
+#: widgets/groupedview.cpp:366
 msgid "1 Track"
 msgid_plural "%1 Tracks"
 msgstr[0] "1 音轨"
 
-#: models/musicmodel.cpp:164
+#: models/musicmodel.cpp:185
 msgid "1 Artist"
 msgid_plural "%1 Artists"
 msgstr[0] "艺术家 %1"
 
-#: models/musicmodel.cpp:172
+#: models/musicmodel.cpp:192
 msgid "1 Album"
 msgid_plural "%1 Albums"
 msgstr[0] "专辑封面 %1"
 
-#: models/onlineservicesmodel.cpp:76
-msgid "Configure Online Service"
-msgstr "设置在线服务"
+#: models/musicmodel.cpp:198
+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
+#, fuzzy
+msgid "Configure Service"
+msgstr "设置设备"
 
-#: models/onlineservicesmodel.cpp:77
-msgid "Refresh Online Service"
-msgstr "刷新在线服务"
+#: models/onlineservicesmodel.cpp:84
+#, fuzzy
+msgid "Refresh Service"
+msgstr "刷新设备"
 
-#: models/onlineservicesmodel.cpp:125
+#: models/onlineservicesmodel.cpp:85
+#, fuzzy
+msgid "Add Subscription"
+msgstr "连接"
+
+#: models/onlineservicesmodel.cpp:86
+msgid "Remove Subscription"
+msgstr ""
+
+#: models/onlineservicesmodel.cpp:87
+#, fuzzy
+msgid "Refresh Subscription"
+msgstr "服务器信息"
+
+#: models/onlineservicesmodel.cpp:137
 #, fuzzy
 msgid "Last Search:%1"
 msgstr "搜索:"
 
-#: models/onlineservicesmodel.cpp:136
+#: models/onlineservicesmodel.cpp:149
 #, fuzzy
 msgid "Searching..."
 msgstr "搜索 %1 ..."
 
-#: models/onlineservicesmodel.cpp:139 models/streamsearchmodel.cpp:117
-#: models/streamsmodel.cpp:544
+#: models/onlineservicesmodel.cpp:152 models/streamsearchmodel.cpp:120
+#: models/streamsmodel.cpp:670
 msgid "Not Loaded"
 msgstr "未加载"
 
-#: models/onlineservicesmodel.cpp:142
+#: models/onlineservicesmodel.cpp:155
 msgid "Use search to locate tracks"
 msgstr ""
 
-#: models/playlistsmodel.cpp:78
+#: models/onlineservicesmodel.cpp:166
+msgid "1 Podcast"
+msgid_plural "%1 Podcasts"
+msgstr[0] ""
+
+#: models/onlineservicesmodel.cpp:177
+#, fuzzy
+msgid "(Downloading: %1%)"
+msgstr "下载 %1"
+
+#: models/onlineservicesmodel.cpp:235
+#, fuzzy
+msgctxt "podcast name (num unplayed episodes)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: models/playlistsmodel.cpp:77
 msgid "New Playlist..."
 msgstr "新播放列表..."
 
-#: models/playqueuemodel.cpp:105
+#: models/playqueuemodel.cpp:102
 msgctxt "Track Number (#)"
 msgid "#"
 msgstr "#"
 
-#: models/playqueuemodel.cpp:106
+#: models/playqueuemodel.cpp:103
 msgid "Length"
 msgstr "长度"
 
-#: models/playqueuemodel.cpp:107
+#: models/playqueuemodel.cpp:104
 msgid "Disc"
 msgstr "碟片"
 
-#. i18n: file: devices/filenameschemedialog.ui:199
+#. i18n: file: devices/filenameschemedialog.ui:138
 #. i18n: ectx: property (text), widget (QPushButton, year)
-#: models/playqueuemodel.cpp:108 po/rc.cpp:187 rc.cpp:187
+#: models/playqueuemodel.cpp:105 po/rc.cpp:190 rc.cpp:190
 msgid "Year"
 msgstr "年份"
 
-#: models/playqueuemodel.cpp:363
+#: models/playqueuemodel.cpp:360
 msgid "<b>(Priority: %1)</b>"
 msgstr "<b>(属性: %1)</b>"
 
-#: models/streamsearchmodel.cpp:119 models/streamsmodel.cpp:557
+#: models/streamsearchmodel.cpp:122 models/streamsmodel.cpp:672
 #, fuzzy
 msgid "Loading..."
 msgstr "正在下载..."
 
-#: models/streamsmodel.cpp:235
+#: models/streamsmodel.cpp:286
 msgid "Bookmarks"
 msgstr ""
 
-#: models/streamsmodel.cpp:461
+#: models/streamsmodel.cpp:560
 msgid "TuneIn"
 msgstr ""
 
-#: models/streamsmodel.cpp:464
+#: models/streamsmodel.cpp:563
 msgid "IceCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:465
+#: models/streamsmodel.cpp:564
 msgid "ShoutCast"
 msgstr ""
 
-#: models/streamsmodel.cpp:466
+#: models/streamsmodel.cpp:567
 msgid "SomaFM"
 msgstr ""
 
-#: models/streamsmodel.cpp:467
+#: models/streamsmodel.cpp:568
 msgid "Digitally Imported"
 msgstr ""
 
-#: models/streamsmodel.cpp:468
+#: models/streamsmodel.cpp:569
 msgid "JazzRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:469
+#: models/streamsmodel.cpp:570
 msgid "RockRadio.com"
 msgstr ""
 
-#: models/streamsmodel.cpp:470
+#: models/streamsmodel.cpp:571
 msgid "Sky.fm"
 msgstr ""
 
-#: models/streamsmodel.cpp:471
+#: models/streamsmodel.cpp:572
 msgid "Favorites"
 msgstr ""
 
-#: models/streamsmodel.cpp:474
+#: models/streamsmodel.cpp:573
+msgid "Listen Live"
+msgstr ""
+
+#: models/streamsmodel.cpp:578
 #, fuzzy
 msgid "Bookmark Category"
 msgstr "添加类别"
 
-#: models/streamsmodel.cpp:475
+#: models/streamsmodel.cpp:579
 msgid "Add Stream To Favorites"
 msgstr ""
 
-#: models/streamsmodel.cpp:476
+#: models/streamsmodel.cpp:580
 #, fuzzy
 msgid "Configure Streams"
 msgstr "设置"
 
-#: models/streamsmodel.cpp:545
+#: models/streamsmodel.cpp:660
 msgid "%1 (Read-Only)"
 msgstr ""
 
-#: models/streamsmodel.cpp:1064
+#: models/streamsmodel.cpp:1241
 msgid "Failed to save stream list. Please check %1 is writable."
 msgstr "保存流媒体列表失败. 请检查 %1 的写入全线"
 
-#: models/streamsmodel.cpp:1455
+#: models/streamsmodel.cpp:1639
 msgid "All"
 msgstr ""
 
-#: models/streamsmodel.cpp:1641
-msgid "Listen Live"
-msgstr ""
-
-#: mpd/mpdconnection.cpp:151
+#: mpd/mpdconnection.cpp:154
 msgctxt "name (host)"
 msgid "\"%1\""
 msgstr ""
 
-#: mpd/mpdconnection.cpp:153
+#: mpd/mpdconnection.cpp:156
 #, fuzzy
 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:372 mpd/mpdconnection.cpp:415
+#: mpd/mpdconnection.cpp:465 mpd/mpdconnection.cpp:1009
+#: mpd/mpdconnection.cpp:1036
 msgid "Connection to %1 failed"
 msgstr "连接 %1 失败"
 
-#: mpd/mpdconnection.cpp:367 mpd/mpdconnection.cpp:405
+#: mpd/mpdconnection.cpp:378 mpd/mpdconnection.cpp:419
 msgid "Connection to %1 failed - incorrect password"
 msgstr "连接 %1 失败 - 密码错误"
 
-#: mpd/mpdconnection.cpp:436
+#: mpd/mpdconnection.cpp:455
 msgid "Failed to send command to %1 - not connected"
 msgstr "发送到 %1 失败 - 未能连接"
 
-#: mpd/mpdconnection.cpp:472
+#: mpd/mpdconnection.cpp:491
 msgid "Failed to load. Please check user \"mpd\" has read permission."
 msgstr "无法加载. 请检查 \"mpd\" 是否有读取权限."
 
-#: mpd/mpdconnection.cpp:474
+#: mpd/mpdconnection.cpp:493
 msgid ""
 "Failed to load. MPD can only play local files if connected via a local "
 "socket."
 msgstr "无法加载. MPD 只能从本地 Socket 播放本地文件."
 
-#: mpd/mpdconnection.cpp:480 mpd/mpdconnection.cpp:487
+#: mpd/mpdconnection.cpp:499 mpd/mpdconnection.cpp:506
 msgid "Failed to send command. Disconnected from %1"
 msgstr "发送失败. %1 已断开"
 
-#: mpd/mpdconnection.cpp:1146
+#: mpd/mpdconnection.cpp:1171
 msgid "Failed to rename <b>%1</b> to <b>%2</b>"
 msgstr "<b>%1</b> 重命名为 <b>%2</b> 失败"
 
-#: mpd/mpdconnection.cpp:1158
+#: mpd/mpdconnection.cpp:1183
 msgid "Failed to save <b>%1</b>"
 msgstr "<b>%1</b> 保存失败"
 
-#: mpd/mpdconnection.cpp:1171
+#: mpd/mpdconnection.cpp:1196
 msgid "You cannot add parts of a cue sheet to a playlist!"
 msgstr ""
 
-#: mpd/mpdconnection.cpp:1174
+#: mpd/mpdconnection.cpp:1199
 msgid "You cannot add a playlist to another playlist!"
 msgstr ""
 
-#: mpd/mpdparseutils.cpp:663
-msgid "1 day %2"
-msgid_plural "%1 days %2"
-msgstr[0] "%1 天 %2"
-
-#: mpd/mpduser.cpp:55
+#: mpd/mpduser.cpp:56
 msgid "Personal"
 msgstr ""
 
-#: mpd/song.cpp:305
+#: mpd/song.cpp:343
 msgctxt ""
 "Song\n"
 "Artist\n"
@@ -2975,19 +3211,19 @@ msgstr ""
 msgid "Streaming format:"
 msgstr "流媒体格式:"
 
-#: online/magnatuneservice.cpp:161
+#: online/magnatuneservice.cpp:160
 msgid "Streaming"
 msgstr "流媒体"
 
-#: online/magnatuneservice.cpp:180
+#: online/magnatuneservice.cpp:179
 msgid "MP3 128k"
 msgstr ""
 
-#: online/magnatuneservice.cpp:181
+#: online/magnatuneservice.cpp:180
 msgid "MP3 VBR"
 msgstr ""
 
-#: online/magnatuneservice.cpp:184
+#: online/magnatuneservice.cpp:183
 msgid "WAV"
 msgstr ""
 
@@ -2995,10 +3231,6 @@ msgstr ""
 msgid "Magnatune Settings"
 msgstr "Magnatune 设置"
 
-#: online/magnatunesettingsdialog.cpp:49
-msgid "Membership:"
-msgstr ""
-
 #. i18n: file: network/proxysettings.ui:96
 #. i18n: ectx: property (text), widget (BuddyLabel, proxyUsernameLabel)
 #. i18n: file: streams/digitallyimportedsettings.ui:48
@@ -3007,8 +3239,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:51 po/rc.cpp:694 po/rc.cpp:706
-#: rc.cpp:694 rc.cpp:706
+#: online/magnatunesettingsdialog.cpp:43 po/rc.cpp:711 po/rc.cpp:729
+#: rc.cpp:711 rc.cpp:729
 msgid "Username:"
 msgstr "用户名:"
 
@@ -3016,7 +3248,7 @@ msgstr "用户名:"
 #. 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)
@@ -3028,7 +3260,7 @@ msgstr "用户名:"
 #. 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)
@@ -3036,54 +3268,281 @@ 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: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: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
 msgid "Password:"
 msgstr "密码:"
 
-#: online/magnatunesettingsdialog.cpp:55
+#: online/magnatunesettingsdialog.cpp:51
+msgid "Membership:"
+msgstr ""
+
+#: online/magnatunesettingsdialog.cpp:57
 msgid "Downloads:"
 msgstr "下载:"
 
-#: online/onlineservice.cpp:67 online/onlineservice.cpp:155
+#: online/onlineservice.cpp:68 online/onlineservice.cpp:156
 msgid "Dowloading"
 msgstr "正在下载"
 
-#: online/onlineservice.cpp:97
+#: online/onlineservice.cpp:98
 msgid "Updating display"
 msgstr "更新显示"
 
-#: online/onlineservice.cpp:108
+#: online/onlineservice.cpp:109
 msgid "Grouping tracks"
 msgstr "分组音轨:"
 
-#: online/onlineservice.cpp:131
+#: online/onlineservice.cpp:132
 msgid "Parsing response"
 msgstr ""
 
-#: online/onlineservice.cpp:143 online/onlineservice.cpp:146
+#: online/onlineservice.cpp:144 online/onlineservice.cpp:147
 msgid "Failed to parse"
 msgstr "操作失败"
 
-#: online/onlineservice.cpp:149
+#: online/onlineservice.cpp:150
 msgid "Failed to download"
 msgstr "下载失败"
 
-#: online/onlineservicespage.cpp:58
+#: online/onlineservicespage.cpp:61
 msgid "Download To Library"
 msgstr "下载到库"
 
-#: online/onlineservicespage.cpp:282
+#: online/onlineservicespage.cpp:62 online/podcastsearchdialog.cpp:554
+#, fuzzy
+msgid "Search For Podcasts"
+msgstr "搜索歌词"
+
+#: online/onlineservicespage.cpp:63
+msgid "Download Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:64
+msgid "Delete Downloaded Podcast Episodes"
+msgstr ""
+
+#: online/onlineservicespage.cpp:329
 #, fuzzy
 msgctxt "Search ServiceName:"
 msgid "Search %1:"
 msgstr "搜索:"
 
-#: online/onlineservicespage.cpp:396
+#: online/onlineservicespage.cpp:464
 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
+msgid "Unsubscribe from <b>%1</b>?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:600
+msgid "Refresh all podcast listings?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:621
+msgid "Refresh episode listing from <b>%1</b>?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:695
+msgid "All selected podcasts have already been downloaded!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:699
+msgid "Do you wish to download the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:702
+msgid "Do you wish to download the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:705
+#, fuzzy
+msgid "Do you wish to download the selected podcast episodes?"
+msgstr "确定不保存选择的设备?"
+
+#: online/onlineservicespage.cpp:753
+msgid "All selected downloaded podcast episodes have already been deleted!"
+msgstr ""
+
+#: online/onlineservicespage.cpp:757
+msgid ""
+"Do you wish to delete the downloaded file of the following podcast episode?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:760
+msgid ""
+"Do you wish to the delete downloaded files of the following podcast episodes?"
+msgstr ""
+
+#: online/onlineservicespage.cpp:763
+msgid ""
+"Do you wish to the delete downloaded files of the selected podcast episodes?"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:243
+msgid "RSS:"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:245
+msgid "Website:"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:252
+#, fuzzy
+msgid "Podcast details"
+msgstr "连接详情"
+
+#: online/podcastsearchdialog.cpp:252
+msgid "Select a podcast to display its details"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:322
+msgid "Enter search term..."
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:372
+#, fuzzy
+msgid "Failed to fetch podcasts from %1"
+msgstr "\"%1\" 的连接无法断开"
+
+#: online/podcastsearchdialog.cpp:378
+msgid "There was a problem parsing the response from %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:439
+#, fuzzy
+msgid "Failed to download directory listing"
+msgstr "下载流媒体列表失败"
+
+#: online/podcastsearchdialog.cpp:447
+#, fuzzy
+msgid "Failed to parse directory listing"
+msgstr "清除流媒体列表失败"
+
+#: online/podcastsearchdialog.cpp:508
+msgid "Subscribe"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+#, fuzzy
+msgid "Search %1"
+msgstr "搜索:"
+
+#: online/podcastsearchdialog.cpp:526 online/podcastsearchdialog.cpp:530
+msgid "Search for podcasts on %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:543
+msgid "Browse %1 podcasts"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:602
+msgid "Subscription added"
+msgstr ""
+
+#: online/podcastsearchdialog.cpp:604
+msgid "You are already subscribed to this podcast!"
+msgstr ""
+
+#: online/podcastservice.cpp:103
+msgid "Podcasts"
+msgstr ""
+
+#: online/podcastservice.cpp:284
+msgid "Cantata only supports audio podcasts! %1 contains only video podcasts."
+msgstr ""
+
+#: online/podcastservice.cpp:286
+#, fuzzy
+msgid "Failed to parse %1"
+msgstr "操作失败"
+
+#: online/podcastservice.cpp:290
+#, fuzzy
+msgid "Failed to download %1"
+msgstr "下载失败"
+
+#: online/podcastsettingsdialog.cpp:58
+msgid "Check for new episodes:"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:59
+#, fuzzy
+msgid "Download episodes to:"
+msgstr "下载:"
+
+#: online/podcastsettingsdialog.cpp:60
+#, fuzzy
+msgid "Automatically download new episodes:"
+msgstr "自动查找:"
+
+#: online/podcastsettingsdialog.cpp:82
+#, fuzzy
+msgid "Podcast Settings"
+msgstr "代理设置"
+
+#: online/podcastsettingsdialog.cpp:84
+msgid "Manually"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:85
+msgid "Every 15 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:86
+msgid "Every 30 minutes"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:87
+msgid "Every hour"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:88
+msgid "Every 2 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:89
+msgid "Every 6 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:90
+msgid "Every 12 hours"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:91
+msgid "Every day"
+msgstr ""
+
+#: online/podcastsettingsdialog.cpp:92
+msgid "Every week"
+msgstr ""
+
 #. i18n: file: context/othersettings.ui:19
 #. i18n: ectx: property (text), widget (BuddyLabel, contextBackdropLabel)
 #: po/rc.cpp:3 rc.cpp:3
@@ -3152,8 +3611,8 @@ msgstr "从复制歌曲:"
 #. 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
-#: rc.cpp:49 rc.cpp:721
+#: 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
 msgid "TextLabel"
 msgstr "文本标签"
 
@@ -3199,93 +3658,109 @@ msgstr ""
 msgid "Album Details"
 msgstr "专辑详情"
 
-#. i18n: file: devices/albumdetails.ui:60
+#. 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:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#. i18n: file: devices/albumdetails.ui:60
+#. i18n: file: devices/albumdetails.ui:73
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:113
+#. i18n: file: tags/tageditor.ui:129
 #. i18n: ectx: property (text), widget (StateLabel, genreLabel)
-#: po/rc.cpp:61 po/rc.cpp:763 rc.cpp:61 rc.cpp:763
+#: po/rc.cpp:64 po/rc.cpp:810 rc.cpp:64 rc.cpp:810
 msgid "Genre:"
 msgstr "流派:"
 
-#. i18n: file: devices/albumdetails.ui:73
+#. i18n: file: devices/albumdetails.ui:86
 #. 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:86
 #. 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:67 po/rc.cpp:813 rc.cpp:67 rc.cpp:813
 msgid "Year:"
 msgstr "年份:"
 
-#. 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 "艺术家:"
-
-#. i18n: file: devices/albumdetails.ui:103
+#. i18n: file: devices/albumdetails.ui:99
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
 #: po/rc.cpp:70 rc.cpp:70
 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/audiocdsettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:85 rc.cpp:85
+#: po/rc.cpp:88 rc.cpp:88
 msgid "Album and Track Information Retrieval"
 msgstr "专辑音轨信息"
 
 #. i18n: file: devices/audiocdsettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#: po/rc.cpp:88 rc.cpp:88
+#: po/rc.cpp:91 rc.cpp:91
 msgid "Automatically lookup:"
 msgstr "自动查找:"
 
 #. i18n: file: devices/audiocdsettings.ui:39
 #. i18n: ectx: property (text), widget (BuddyLabel, cdLookupLabel)
-#: po/rc.cpp:91 rc.cpp:91
+#: po/rc.cpp:94 rc.cpp:94
 msgid "Initially look up via:"
 msgstr "通过下列查找:"
 
 #. i18n: file: devices/audiocdsettings.ui:52
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbHostLabel)
-#: po/rc.cpp:94 rc.cpp:94
+#: po/rc.cpp:97 rc.cpp:97
 msgid "CDDB Host:"
 msgstr "CDDB 主机名:"
 
 #. i18n: file: devices/audiocdsettings.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, cddbPortLabel)
-#: po/rc.cpp:97 rc.cpp:97
+#: po/rc.cpp:100 rc.cpp:100
 msgid "CDDB Port:"
 msgstr "CDDB 端口:"
 
 #. i18n: file: devices/audiocdsettings.ui:88
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox_2)
-#: po/rc.cpp:100 rc.cpp:100
+#: po/rc.cpp:103 rc.cpp:103
 msgid "Audio Extraction"
 msgstr "抽取音频"
 
 #. i18n: file: devices/audiocdsettings.ui:94
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:103 rc.cpp:103
+#: po/rc.cpp:106 rc.cpp:106
 msgid "Full paranoia mode (best quality):"
 msgstr ""
 
 #. i18n: file: devices/audiocdsettings.ui:107
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:106 rc.cpp:106
+#: po/rc.cpp:109 rc.cpp:109
 msgid "Never skip on read error:"
 msgstr "从不跳过读取错误:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:20
 #. i18n: ectx: property (text), widget (QLabel, remoteDeviceNote)
-#: po/rc.cpp:109 rc.cpp:109
+#: po/rc.cpp:112 rc.cpp:112
 msgid ""
 "<i><b>NOTE:</b> These settings are only valid, and editable, when the device "
 "is connected.</i>"
@@ -3293,62 +3768,62 @@ 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: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
 msgid "Music folder:"
 msgstr "音乐文件夹:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:48
 #. i18n: ectx: property (text), widget (BuddyLabel, albumCoversLabel)
-#: po/rc.cpp:115 rc.cpp:115
+#: po/rc.cpp:118 rc.cpp:118
 msgid "Copy album covers as:"
 msgstr "复制专辑封面为:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:65
 #. i18n: ectx: property (text), widget (BuddyLabel, coverMaxSizeLabel)
-#: po/rc.cpp:118 rc.cpp:118
+#: po/rc.cpp:121 rc.cpp:121
 msgid "Maximum cover size:"
 msgstr "最大专辑封面大小:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:82
 #. i18n: ectx: property (text), widget (BuddyLabel, fixVariousArtistsLabel)
-#: po/rc.cpp:121 rc.cpp:121
+#: 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:124 rc.cpp:124
+#: 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:127 rc.cpp:127
+#: po/rc.cpp:130 rc.cpp:130
 msgid "Use cache:"
 msgstr "使用缓存:"
 
 #. i18n: file: devices/devicepropertieswidget.ui:121
 #. i18n: ectx: property (text), widget (QLabel, defaultVolumeLabel)
-#: po/rc.cpp:130 rc.cpp:130
+#: po/rc.cpp:133 rc.cpp:133
 msgid "Default volume:"
 msgstr "默认音量:"
 
@@ -3360,7 +3835,7 @@ msgstr "默认音量:"
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
 #. 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:136 po/rc.cpp:816 rc.cpp:136 rc.cpp:816
 msgid "Filenames"
 msgstr "文件名"
 
@@ -3372,7 +3847,7 @@ msgstr "文件名"
 #. 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
+#: po/rc.cpp:139 po/rc.cpp:828 rc.cpp:139 rc.cpp:828
 msgid "Use only ASCII characters:"
 msgstr "仅使用 ASCII 字符:"
 
@@ -3384,7 +3859,7 @@ msgstr "仅使用 ASCII 字符:"
 #. 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
+#: po/rc.cpp:142 po/rc.cpp:825 rc.cpp:142 rc.cpp:825
 msgid "Replace spaces with underscores:"
 msgstr "用下划线替换空格:"
 
@@ -3396,7 +3871,7 @@ msgstr "用下划线替换空格:"
 #. 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
+#: po/rc.cpp:145 po/rc.cpp:822 rc.cpp:145 rc.cpp:822
 msgid "Ignore 'The' in artist names:"
 msgstr "忽略艺术家中的 'The':"
 
@@ -3408,7 +3883,7 @@ msgstr "忽略艺术家中的 'The':"
 #. 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:148 po/rc.cpp:819 rc.cpp:148 rc.cpp:819
 msgid "Filename scheme:"
 msgstr "文件名框架"
 
@@ -3420,79 +3895,79 @@ msgstr "文件名框架"
 #. 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
+#: 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: ectx: property (title), widget (QGroupBox, transcoderFrame)
-#: po/rc.cpp:151 rc.cpp:151
+#: po/rc.cpp:154 rc.cpp:154
 msgid "Transcoding"
 msgstr "正在转码"
 
 #. i18n: file: devices/devicepropertieswidget.ui:261
 #. i18n: ectx: property (text), widget (BuddyLabel, transcoderWhenDifferentLabel)
-#: po/rc.cpp:154 rc.cpp:154
+#: po/rc.cpp:157 rc.cpp:157
 msgid "Only transcode if source file is of a different format:"
 msgstr "仅在格式不同时方能转码:"
 
 #. i18n: file: devices/filenameschemedialog.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label_album_example)
-#: po/rc.cpp:157 rc.cpp:157
+#: po/rc.cpp:160 rc.cpp:160
 msgid "Example:"
 msgstr "例如:"
 
 #. i18n: file: devices/filenameschemedialog.ui:58
 #. i18n: ectx: property (text), widget (UrlLabel, help)
-#: po/rc.cpp:160 rc.cpp:160
+#: po/rc.cpp:163 rc.cpp:163
 msgid "About filename schemes"
 msgstr "关于文件名框架"
 
-#. i18n: file: devices/filenameschemedialog.ui:82
+#. i18n: file: devices/filenameschemedialog.ui:70
 #. i18n: ectx: property (text), widget (QPushButton, albumArtist)
-#: po/rc.cpp:163 rc.cpp:163
+#: po/rc.cpp:166 rc.cpp:166
 msgid "Album Artist"
 msgstr "专辑艺术家"
 
-#. i18n: file: devices/filenameschemedialog.ui:101
+#. i18n: file: devices/filenameschemedialog.ui:77
 #. i18n: ectx: property (text), widget (QPushButton, albumTitle)
-#: po/rc.cpp:166 rc.cpp:166
+#: po/rc.cpp:169 rc.cpp:169
 msgid "Album Title"
 msgstr "专辑标题"
 
-#. i18n: file: devices/filenameschemedialog.ui:120
+#. i18n: file: devices/filenameschemedialog.ui:91
 #. i18n: ectx: property (text), widget (QPushButton, trackArtist)
-#: po/rc.cpp:169 rc.cpp:169
+#: po/rc.cpp:175 rc.cpp:175
 msgid "Track Artist"
 msgstr "音轨艺术家"
 
-#. i18n: file: devices/filenameschemedialog.ui:139
+#. i18n: file: devices/filenameschemedialog.ui:98
 #. i18n: ectx: property (text), widget (QPushButton, trackTitle)
-#: po/rc.cpp:172 rc.cpp:172
+#: po/rc.cpp:178 rc.cpp:178
 msgid "Track Title"
 msgstr "音轨标题"
 
-#. i18n: file: devices/filenameschemedialog.ui:158
+#. i18n: file: devices/filenameschemedialog.ui:117
 #. i18n: ectx: property (text), widget (QPushButton, trackArtistAndTitle)
-#: po/rc.cpp:175 rc.cpp:175
+#: po/rc.cpp:181 rc.cpp:181
 msgid "Track Title (+Artist)"
 msgstr "音轨标题(+艺术家)"
 
-#. i18n: file: devices/filenameschemedialog.ui:165
+#. i18n: file: devices/filenameschemedialog.ui:124
 #. i18n: ectx: property (text), widget (QPushButton, trackNo)
-#: po/rc.cpp:178 rc.cpp:178
+#: po/rc.cpp:184 rc.cpp:184
 msgid "Track #"
 msgstr "音轨 #"
 
-#. i18n: file: devices/filenameschemedialog.ui:172
+#. i18n: file: devices/filenameschemedialog.ui:131
 #. i18n: ectx: property (text), widget (QPushButton, cdNo)
-#: po/rc.cpp:181 rc.cpp:181
+#: po/rc.cpp:187 rc.cpp:187
 msgid "CD #"
 msgstr "CD #"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:17
 #. i18n: ectx: property (text), widget (QLabel, connectionNote)
-#: po/rc.cpp:190 rc.cpp:190
+#: po/rc.cpp:196 rc.cpp:196
 msgid ""
 "<i><b>NOTE:</b> These settings are only editable when the device is not "
 "connected.</i>"
@@ -3500,17 +3975,17 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:32
 #. i18n: ectx: property (text), widget (BuddyLabel, typeLabel)
-#. i18n: file: dynamic/dynamicrule.ui:149
+#. i18n: file: dynamic/dynamicrule.ui:162
 #. 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:162
 #. 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:199 po/rc.cpp:325 po/rc.cpp:696 rc.cpp:199 rc.cpp:325 rc.cpp:696
 msgid "Type:"
 msgstr "类型:"
 
@@ -3522,14 +3997,14 @@ 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:196 po/rc.cpp:627 streams/streamdialog.cpp:70 rc.cpp:196
-#: rc.cpp:627
+#: po/rc.cpp:202 po/rc.cpp:638 streams/streamdialog.cpp:70 rc.cpp:202
+#: rc.cpp:638
 msgid "Name:"
 msgstr "名称:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:60
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:199 rc.cpp:199
+#: po/rc.cpp:205 rc.cpp:205
 msgid "Options"
 msgstr "选项:"
 
@@ -3537,7 +4012,7 @@ msgstr "选项:"
 #. 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)
@@ -3547,14 +4022,14 @@ msgstr "选项:"
 #. 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: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
 msgid "Port:"
 msgstr "端口:"
 
@@ -3570,7 +4045,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:208 po/rc.cpp:226 po/rc.cpp:247 rc.cpp:208 rc.cpp:226 rc.cpp:247
+#: po/rc.cpp:214 po/rc.cpp:232 po/rc.cpp:253 rc.cpp:214 rc.cpp:232 rc.cpp:253
 msgid "User:"
 msgstr "用户:"
 
@@ -3582,7 +4057,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:211 po/rc.cpp:229 rc.cpp:211 rc.cpp:229
+#: po/rc.cpp:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
 msgid "Domain:"
 msgstr "域名"
 
@@ -3594,7 +4069,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:217 po/rc.cpp:235 rc.cpp:217 rc.cpp:235
+#: po/rc.cpp:223 po/rc.cpp:241 rc.cpp:223 rc.cpp:241
 msgid "Share:"
 msgstr "共享:"
 
@@ -3606,7 +4081,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:220 po/rc.cpp:238 rc.cpp:220 rc.cpp:238
+#: po/rc.cpp:226 po/rc.cpp:244 rc.cpp:226 rc.cpp:244
 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 "
@@ -3615,7 +4090,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:192
 #. i18n: ectx: property (text), widget (BuddyLabel, hostLabel_2x)
-#: po/rc.cpp:223 rc.cpp:223
+#: po/rc.cpp:229 rc.cpp:229
 msgid "Service name:"
 msgstr "服务名称:"
 
@@ -3627,19 +4102,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:250 po/rc.cpp:259 rc.cpp:250 rc.cpp:259
+#: po/rc.cpp:256 po/rc.cpp:265 rc.cpp:256 rc.cpp:265
 msgid "Folder:"
 msgstr "文件夹:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:348
 #. i18n: ectx: property (text), widget (BuddyLabel, sshExtraLabel)
-#: po/rc.cpp:253 rc.cpp:253
+#: po/rc.cpp:259 rc.cpp:259
 msgid "Extra Options:"
 msgstr "额外选项:"
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:363
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:256 rc.cpp:256
+#: po/rc.cpp:262 rc.cpp:262
 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 "
@@ -3648,7 +4123,7 @@ msgstr ""
 
 #. i18n: file: devices/remotedevicepropertieswidget.ui:416
 #. i18n: ectx: property (text), widget (QLabel, infoLabel)
-#: po/rc.cpp:262 rc.cpp:262
+#: po/rc.cpp:268 rc.cpp:268
 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, "
@@ -3656,115 +4131,115 @@ msgid ""
 "attached.</i>"
 msgstr ""
 
-#. 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:271 rc.cpp:271
 msgid "No dynamizer port defined in server settings."
 msgstr "未定义动态端口.将使用默认设置."
 
-#. 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:274 rc.cpp:274
 #, fuzzy
 msgid "Remote dynamizer is not running."
 msgstr "动态未启用"
 
 #. i18n: file: dynamic/dynamicrules.ui:30
 #. i18n: ectx: property (placeholderText), widget (LineEdit, nameText)
-#: po/rc.cpp:271 rc.cpp:271
+#: po/rc.cpp:277 rc.cpp:277
 msgid "Name of Dynamic Rules"
 msgstr "动态配置名称"
 
 #. 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:283 streams/streamspage.cpp:62 rc.cpp:283
 msgid "Edit"
 msgstr "编辑"
 
 #. i18n: file: dynamic/dynamicrules.ui:93
 #. i18n: ectx: property (text), widget (UrlLabel, aboutLabel)
-#: po/rc.cpp:283 rc.cpp:283
+#: po/rc.cpp:289 rc.cpp:289
 msgid "About Rules"
 msgstr "关于规则"
 
 #. i18n: file: dynamic/dynamicrule.ui:38
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:289 rc.cpp:289
+#: po/rc.cpp:295 rc.cpp:295
 msgid "Album Artist:"
 msgstr "专辑艺术家:"
 
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#. i18n: file: dynamic/dynamicrule.ui:51
+#. i18n: file: dynamic/dynamicrule.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, label_3)
-#. i18n: file: tags/tageditor.ui:74
+#. i18n: file: tags/tageditor.ui:90
 #. i18n: ectx: property (text), widget (StateLabel, albumLabel)
-#: po/rc.cpp:292 po/rc.cpp:754 rc.cpp:292 rc.cpp:754
+#: po/rc.cpp:301 po/rc.cpp:801 rc.cpp:301 rc.cpp:801
 msgid "Album:"
 msgstr "专辑:"
 
-#. i18n: file: dynamic/dynamicrule.ui:90
+#. i18n: file: dynamic/dynamicrule.ui:103
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:301 rc.cpp:301
+#: po/rc.cpp:310 rc.cpp:310
 msgid "From Year:"
 msgstr "年份:"
 
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#. i18n: file: dynamic/dynamicrule.ui:106
+#. i18n: file: dynamic/dynamicrule.ui:119
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateFromSpin)
-#. i18n: file: dynamic/dynamicrule.ui:129
+#. i18n: file: dynamic/dynamicrule.ui:142
 #. i18n: ectx: property (specialValueText), widget (SpinBox, dateToSpin)
-#: po/rc.cpp:304 po/rc.cpp:310 rc.cpp:304 rc.cpp:310
+#: po/rc.cpp:313 po/rc.cpp:319 rc.cpp:313 rc.cpp:319
 msgid "Any"
 msgstr "任意"
 
-#. i18n: file: dynamic/dynamicrule.ui:113
+#. i18n: file: dynamic/dynamicrule.ui:126
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6x)
-#: po/rc.cpp:307 rc.cpp:307
+#: po/rc.cpp:316 rc.cpp:316
 msgid "To Year:"
 msgstr "年份:"
 
-#. i18n: file: dynamic/dynamicrule.ui:136
+#. i18n: file: dynamic/dynamicrule.ui:149
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:313 rc.cpp:313
+#: po/rc.cpp:322 rc.cpp:322
 msgid "Exact match:"
 msgstr "精确匹配:"
 
-#. i18n: file: dynamic/dynamicrule.ui:160
+#. i18n: file: dynamic/dynamicrule.ui:173
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:319 rc.cpp:319
+#: po/rc.cpp:328 rc.cpp:328
 #, fuzzy
 msgid "Include songs that match the following:"
 msgstr "包括符合下列条件的歌曲:"
 
-#. i18n: file: dynamic/dynamicrule.ui:165
+#. i18n: file: dynamic/dynamicrule.ui:178
 #. i18n: ectx: property (text), item, widget (QComboBox, typeCombo)
-#: po/rc.cpp:322 rc.cpp:322
+#: po/rc.cpp:331 rc.cpp:331
 #, fuzzy
 msgid "Exclude songs that match the following:"
 msgstr "排除符合下列条件的歌曲:"
 
-#. i18n: file: dynamic/dynamicrule.ui:173
+#. i18n: file: dynamic/dynamicrule.ui:186
 #. i18n: ectx: property (text), widget (BuddyLabel, similarArtistsText_label)
-#: po/rc.cpp:325 rc.cpp:325
+#: po/rc.cpp:334 rc.cpp:334
 msgid "Artists similar to:"
 msgstr "相似艺术家:"
 
-#. i18n: file: dynamic/dynamicrule.ui:223
+#. i18n: file: dynamic/dynamicrule.ui:236
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:328 rc.cpp:328
+#: po/rc.cpp:337 rc.cpp:337
 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:249
+#. i18n: file: dynamic/dynamicrule.ui:262
 #. i18n: ectx: property (text), widget (QLabel, label_7x)
-#: po/rc.cpp:331 rc.cpp:331
+#: po/rc.cpp:340 rc.cpp:340
 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>"
@@ -3772,100 +4247,107 @@ msgstr ""
 
 #. i18n: file: gui/coverdialog.ui:23
 #. i18n: ectx: property (toolTip), widget (QToolButton, cancelButton)
-#: po/rc.cpp:334 rc.cpp:334
+#: 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: ectx: property (toolTip), widget (QToolButton, addFileButton)
-#: po/rc.cpp:340 rc.cpp:340
+#: 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:717
+#. 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:717
+#. i18n: file: gui/initialsettingswizard.ui:716
 #. i18n: ectx: property (text), widget (BuddyLabel, storeCoversInMpdDirLabel)
-#: po/rc.cpp:343 po/rc.cpp:431 rc.cpp:343 rc.cpp:431
+#: 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:730
+#. 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:730
+#. i18n: file: gui/initialsettingswizard.ui:729
 #. i18n: ectx: property (text), widget (BuddyLabel, storeLyricsInMpdDirLabel)
-#: po/rc.cpp:346 po/rc.cpp:434 rc.cpp:346 rc.cpp:434
+#: 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:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#. i18n: file: gui/filesettings.ui:52
+#. i18n: file: gui/filesettings.ui:69
 #. i18n: ectx: property (text), widget (QLabel, label)
-#. i18n: file: gui/initialsettingswizard.ui:747
+#. i18n: file: gui/initialsettingswizard.ui:763
 #. i18n: ectx: property (text), widget (QLabel, storeStreamsInMpdDirLabel)
-#: po/rc.cpp:349 po/rc.cpp:437 rc.cpp:349 rc.cpp:437
+#: 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:93
+#. i18n: file: gui/filesettings.ui:110
 #. 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: 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:364 rc.cpp:364
 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 ""
 
-#. i18n: file: gui/filesettings.ui:128
+#. i18n: file: gui/filesettings.ui:145
 #. i18n: ectx: property (text), widget (StateLabel, streamLocationNote)
-#: po/rc.cpp:355 rc.cpp:355
+#: po/rc.cpp:367 rc.cpp:367
 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>"
+"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 ""
 
 #. i18n: file: gui/initialsettingswizard.ui:14
 #. i18n: ectx: property (windowTitle), widget (QWizard, InitialSettingsWizard)
-#: po/rc.cpp:358 rc.cpp:358
+#: po/rc.cpp:370 rc.cpp:370
 msgid "Cantata First Run"
 msgstr "首次运行 Cantata"
 
 #. i18n: file: gui/initialsettingswizard.ui:46
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:361 rc.cpp:361
+#: po/rc.cpp:373 rc.cpp:373
 msgid "Welcome to Cantata"
 msgstr "欢迎来到 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:376 rc.cpp:376
 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 "
@@ -3878,13 +4360,13 @@ msgstr ""
 
 #. i18n: file: gui/initialsettingswizard.ui:105
 #. i18n: ectx: property (text), widget (QLabel, label_7)
-#: po/rc.cpp:367 rc.cpp:367
+#: po/rc.cpp:379 rc.cpp:379
 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:370 rc.cpp:370
+#: po/rc.cpp:382 rc.cpp:382
 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 "
@@ -3894,28 +4376,14 @@ msgid ""
 msgstr ""
 
 #. 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 ""
-
-#. i18n: file: gui/initialsettingswizard.ui:189
 #. i18n: ectx: property (text), widget (QRadioButton, advanced)
-#: po/rc.cpp:376 rc.cpp:376
+#: po/rc.cpp:385 rc.cpp:385
 msgid "Standard multi-user/server setup"
 msgstr ""
 
-#. 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 ""
-
-#. 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:388 rc.cpp:388
 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 "
@@ -3924,9 +4392,23 @@ msgid ""
 "that MPD is already configured and running.</i>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:260
+#. i18n: file: gui/initialsettingswizard.ui:211
+#. i18n: ectx: property (text), widget (QRadioButton, basic)
+#: po/rc.cpp:391 rc.cpp:391
+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
+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 ""
+
+#. i18n: file: gui/initialsettingswizard.ui:259
 #. i18n: ectx: property (text), widget (QLabel, label_11)
-#: po/rc.cpp:386 rc.cpp:386
+#: po/rc.cpp:397 rc.cpp:397
 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-"
@@ -3935,77 +4417,77 @@ msgid ""
 "Cantata to function correctly.</p></body></html>"
 msgstr ""
 
-#. 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:400 rc.cpp:400
 msgid "Connection details"
 msgstr "连接详情"
 
-#. 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:403 rc.cpp:403
 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 ""
 
-#. 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:406 po/rc.cpp:641 rc.cpp:406 rc.cpp:641
 msgid "Host (or local socket):"
 msgstr "主机名 (或本地 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:421 rc.cpp:421
 msgid ""
 "<i><b>NOTE:</b> The 'Music folder' setting is used to lookup cover-art, "
 "lyrics, etc.</i>"
 msgstr ""
 
-#. 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:424 po/rc.cpp:665 rc.cpp:424 rc.cpp:665
 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> 使用本地 Socket 时请输入完整路径。 (端口号可以省略).</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:427 rc.cpp:427
 #, fuzzy
 msgid "Music folder"
 msgstr "音乐文件夹:"
 
-#. 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:430 rc.cpp:430
 msgid "Please choose the folder containing your music collection."
 msgstr ""
 
-#. 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:436 rc.cpp:436
 msgid "Covers, Lyrics, and Streams"
 msgstr ""
 
-#. 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:439 rc.cpp:439
 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 "
@@ -4014,33 +4496,47 @@ msgid ""
 "music folder, or within your personal cache/config folders.</p>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:808
+#. i18n: file: gui/initialsettingswizard.ui:796
+#. i18n: ectx: property (text), widget (QLabel, persNote)
+#: po/rc.cpp:454 rc.cpp:454
+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 ""
+
+#. i18n: file: gui/initialsettingswizard.ui:824
 #. i18n: ectx: property (text), widget (QLabel, httpNote)
-#: po/rc.cpp:443 rc.cpp:443
+#: po/rc.cpp:457 rc.cpp:457
 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>"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:841
+#. i18n: file: gui/initialsettingswizard.ui:857
 #. i18n: ectx: property (text), widget (QLabel, label_6)
-#: po/rc.cpp:446 rc.cpp:446
+#: po/rc.cpp:460 rc.cpp:460
 msgid "Finished!"
 msgstr ""
 
-#. i18n: file: gui/initialsettingswizard.ui:864
+#. i18n: file: gui/initialsettingswizard.ui:880
 #. i18n: ectx: property (text), widget (QLabel, label_5)
-#: po/rc.cpp:449 rc.cpp:449
+#: po/rc.cpp:463 rc.cpp:463
 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:902
+#. i18n: file: gui/initialsettingswizard.ui:918
 #. i18n: ectx: property (text), widget (QLabel, groupWarningLabel)
-#: po/rc.cpp:452 rc.cpp:452
+#: po/rc.cpp:466 rc.cpp:466
 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 "
@@ -4049,27 +4545,6 @@ msgid ""
 "effect."
 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 "视图:"
-
 #. i18n: file: gui/interfacesettings.ui:51
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
@@ -4078,25 +4553,25 @@ msgstr "视图:"
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5b)
 #. i18n: file: gui/interfacesettings.ui:159
 #. 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:475 po/rc.cpp:494 rc.cpp:475 rc.cpp:494
 msgid "Covers:"
 msgstr "封面:"
 
 #. i18n: file: gui/interfacesettings.ui:64
 #. i18n: ectx: property (text), widget (BuddyLabel, libraryArtistImageLabel)
-#: po/rc.cpp:464 rc.cpp:464
+#: po/rc.cpp:478 rc.cpp:478
 msgid "Show artist images:"
 msgstr "显示艺术家图片:"
 
 #. i18n: file: gui/interfacesettings.ui:81
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6)
-#: po/rc.cpp:467 rc.cpp:467
+#: po/rc.cpp:481 rc.cpp:481
 msgid "Show album year:"
 msgstr "显示专辑年份:"
 
 #. i18n: file: gui/interfacesettings.ui:123
 #. i18n: ectx: property (text), widget (QLabel, label_8)
-#: po/rc.cpp:470 rc.cpp:470
+#: po/rc.cpp:484 rc.cpp:484
 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"
@@ -4108,25 +4583,25 @@ msgstr ""
 
 #. i18n: file: gui/interfacesettings.ui:172
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5x)
-#: po/rc.cpp:483 rc.cpp:483
+#: po/rc.cpp:497 rc.cpp:497
 msgid "Sort albums:"
 msgstr "专辑分类:"
 
 #. i18n: file: gui/interfacesettings.ui:183
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:486 rc.cpp:486
+#: po/rc.cpp:500 rc.cpp:500
 msgid "Album/Artist"
 msgstr "专辑/艺术家"
 
 #. i18n: file: gui/interfacesettings.ui:188
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:489 rc.cpp:489
+#: po/rc.cpp:503 rc.cpp:503
 msgid "Artist/Album"
 msgstr "艺术家/专辑"
 
 #. i18n: file: gui/interfacesettings.ui:193
 #. i18n: ectx: property (text), item, widget (QComboBox, albumSort)
-#: po/rc.cpp:492 rc.cpp:492
+#: po/rc.cpp:506 rc.cpp:506
 msgid "Artist/Year/Album"
 msgstr "艺术家/年份/专辑"
 
@@ -4138,229 +4613,212 @@ msgstr "艺术家/年份/专辑"
 #. 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
+#: 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: ectx: attribute (title), widget (QWidget, tab_3)
-#: po/rc.cpp:504 rc.cpp:504
+#: po/rc.cpp:518 rc.cpp:518
 msgid "Other Views"
 msgstr "其他视图"
 
 #. i18n: file: gui/interfacesettings.ui:251
-#. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:507 rc.cpp:507
+#. i18n: ectx: property (text), widget (BuddyLabel, folderViewLabel)
+#: po/rc.cpp:521 rc.cpp:521
 msgid "Folder view style:"
 msgstr "文件夹视图:"
 
 #. i18n: file: gui/interfacesettings.ui:264
-#. i18n: ectx: property (text), widget (BuddyLabel, label_x)
-#: po/rc.cpp:510 rc.cpp:510
+#. i18n: ectx: property (text), widget (BuddyLabel, streamsViewLabel)
+#: po/rc.cpp:524 rc.cpp:524
 msgid "Streams view style:"
 msgstr "流媒体视图:"
 
 #. i18n: file: gui/interfacesettings.ui:277
-#. i18n: ectx: property (text), widget (BuddyLabel, label_xx)
-#: po/rc.cpp:513 rc.cpp:513
+#. i18n: ectx: property (text), widget (BuddyLabel, onlineViewLabel)
+#: po/rc.cpp:527 rc.cpp:527
 msgid "Online view style:"
 msgstr "在线视图:"
 
 #. i18n: file: gui/interfacesettings.ui:290
 #. i18n: ectx: property (text), widget (BuddyLabel, devicesViewLabel)
-#: po/rc.cpp:516 rc.cpp:516
+#: po/rc.cpp:530 rc.cpp:530
 msgid "Devices view style:"
 msgstr "设备查看模式:"
 
 #. i18n: file: gui/interfacesettings.ui:324
 #. i18n: ectx: property (text), item, widget (QComboBox, playQueueGrouped)
-#: po/rc.cpp:525 rc.cpp:525
+#: 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:534 rc.cpp:534
+#: 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:537 rc.cpp:537
+#: 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:540 rc.cpp:540
+#: po/rc.cpp:554 rc.cpp:554
 #, fuzzy
 msgid "Use current album cover as background:"
 msgstr "用封面作为歌词背景:"
 
-#. i18n: file: gui/interfacesettings.ui:398
+#. 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: ectx: attribute (title), widget (QWidget, tab_7)
-#: po/rc.cpp:543 rc.cpp:543
+#: po/rc.cpp:560 rc.cpp:560
 msgid "External"
 msgstr "外部"
 
-#. i18n: file: gui/interfacesettings.ui:404
+#. i18n: file: gui/interfacesettings.ui:417
 #. i18n: ectx: property (text), widget (BuddyLabel, label_10)
-#: po/rc.cpp:546 rc.cpp:546
+#: po/rc.cpp:563 rc.cpp:563
 msgid "Show icon in notification area:"
 msgstr "显示托盘图标:"
 
-#. i18n: file: gui/interfacesettings.ui:424
+#. i18n: file: gui/interfacesettings.ui:437
 #. i18n: ectx: property (text), widget (BuddyLabel, minimiseOnCloseLabel)
-#: po/rc.cpp:549 rc.cpp:549
+#: po/rc.cpp:566 rc.cpp:566
 msgid "Minimize to notification area when closed:"
 msgstr "最小化到托盘:"
 
-#. i18n: file: gui/interfacesettings.ui:444
+#. i18n: file: gui/interfacesettings.ui:457
 #. i18n: ectx: property (text), widget (BuddyLabel, label_11)
-#: po/rc.cpp:552 rc.cpp:552
+#: po/rc.cpp:569 rc.cpp:569
 msgid "Show popup messages when changing tracks:"
 msgstr "更改音轨时在托盘显示信息:"
 
-#. 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 "GNOME/Unity 快捷键支持:"
-
 #. i18n: file: gui/interfacesettings.ui:475
 #. i18n: ectx: attribute (title), widget (QWidget, tab_4)
-#: po/rc.cpp:558 rc.cpp:558
+#: po/rc.cpp:572 rc.cpp:572
 msgid "General"
 msgstr "流派"
 
 #. i18n: file: gui/interfacesettings.ui:486
 #. i18n: ectx: property (text), widget (BuddyLabel, label_7)
-#: po/rc.cpp:561 rc.cpp:561
+#: 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
+#, fuzzy
+msgid "Group albums by composer:"
+msgstr "复制专辑封面为:"
+
+#. i18n: file: gui/interfacesettings.ui:520
 #. i18n: ectx: property (text), widget (BuddyLabel, groupMultipleLabel)
-#: po/rc.cpp:564 rc.cpp:564
+#: po/rc.cpp:581 rc.cpp:581
 msgid "Multiple artist albums:"
 msgstr "多个艺术家专辑:"
 
-#. i18n: file: gui/interfacesettings.ui:516
+#. i18n: file: gui/interfacesettings.ui:533
 #. i18n: ectx: property (text), widget (BuddyLabel, showDeleteActionLabel)
-#: po/rc.cpp:567 rc.cpp:567
+#: po/rc.cpp:584 rc.cpp:584
 msgid "Show delete action in context menus:"
 msgstr "在上下文菜单中显示删除:"
 
-#. i18n: file: gui/interfacesettings.ui:533
+#. i18n: file: gui/interfacesettings.ui:550
 #. i18n: ectx: property (text), widget (BuddyLabel, forceSingleClick_label)
-#: po/rc.cpp:570 rc.cpp:570
+#: po/rc.cpp:587 rc.cpp:587
 msgid "Enforce single-click activation of items:"
 msgstr "强制使用单击选择项目:"
 
-#. i18n: file: gui/interfacesettings.ui:574
+#. i18n: file: gui/interfacesettings.ui:591
 #. i18n: ectx: property (text), widget (StateLabel, singleClickLabel)
-#: po/rc.cpp:573 rc.cpp:573
+#: po/rc.cpp:590 rc.cpp:590
 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:244
+#. i18n: file: gui/mainwindow.ui:287
 #. i18n: ectx: property (text), widget (QLabel, dynamicLabel)
-#: po/rc.cpp:576 rc.cpp:576
+#: po/rc.cpp:593 rc.cpp:593
 msgid "[Dynamic]"
 msgstr "[动态]"
 
 #. i18n: file: gui/playbacksettings.ui:20
 #. i18n: ectx: property (title), widget (QGroupBox, outputBox)
-#: po/rc.cpp:579 rc.cpp:579
+#: po/rc.cpp:596 rc.cpp:596
 msgid "Output"
 msgstr "输出"
 
 #. i18n: file: gui/playbacksettings.ui:41
 #. i18n: ectx: property (text), widget (BuddyLabel, crossfadingLabel)
-#: po/rc.cpp:585 rc.cpp:585
+#: 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:588 rc.cpp:588
+#: po/rc.cpp:605 rc.cpp:605
 msgid " seconds"
 msgstr " 秒"
 
 #. i18n: file: gui/playbacksettings.ui:61
 #. i18n: ectx: property (text), widget (BuddyLabel, replayGainLabel)
-#: po/rc.cpp:591 rc.cpp:591
+#: po/rc.cpp:608 rc.cpp:608
 msgid "Replay gain:"
 msgstr "播放增益:"
 
 #. i18n: file: gui/playbacksettings.ui:95
 #. i18n: ectx: property (text), widget (UrlLabel, aboutReplayGain)
-#: po/rc.cpp:594 rc.cpp:594
+#: po/rc.cpp:611 rc.cpp:611
 #, fuzzy
 msgid "About replay gain"
 msgstr "播放增益:"
 
 #. i18n: file: gui/playbacksettings.ui:104
 #. i18n: ectx: property (text), widget (QLabel, outputsViewLabel)
-#: po/rc.cpp:597 rc.cpp:597
+#: po/rc.cpp:614 rc.cpp:614
 #, fuzzy
 msgid "Devices:"
 msgstr "设备"
 
-#. i18n: file: gui/playbacksettings.ui:132
-#. i18n: ectx: property (title), widget (QGroupBox, streamBox)
-#: po/rc.cpp:600 rc.cpp:600
-#, fuzzy
-msgid "HTTP Stream"
-msgstr "流媒体 %1"
-
 #. 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 ""
-
-#. i18n: file: gui/playbacksettings.ui:154
-#. i18n: ectx: property (text), widget (QLabel, streamUrlInfoLabel)
-#: po/rc.cpp:606 rc.cpp:606
-#, fuzzy
-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>"
-msgstr ""
-"<i><b>注意:</b> HTTP 流媒体输出仅在 MPD 也配置了 HTTP 流媒体输出时可用。</i>"
-
-#. i18n: file: gui/playbacksettings.ui:167
-#. i18n: ectx: property (title), widget (QGroupBox, stopPlaybackBox)
-#: po/rc.cpp:609 rc.cpp:609
-#, fuzzy
-msgid "Stopping Playback"
-msgstr "回放"
-
-#. i18n: file: gui/playbacksettings.ui:176
 #. i18n: ectx: property (text), widget (BuddyLabel, label_6b)
-#: po/rc.cpp:612 rc.cpp:612
+#: po/rc.cpp:620 rc.cpp:620
 msgid "Fadeout on stop:"
 msgstr "停止时淡出:"
 
-#. i18n: file: gui/playbacksettings.ui:189
+#. i18n: file: gui/playbacksettings.ui:154
 #. i18n: ectx: property (text), widget (BuddyLabel, stopOnExitLabel)
-#: po/rc.cpp:615 rc.cpp:615
+#: po/rc.cpp:623 rc.cpp:623
 msgid "Stop playback on exit:"
 msgstr "退出时停止回放:"
 
-#. i18n: file: gui/playbacksettings.ui:202
+#. i18n: file: gui/playbacksettings.ui:167
 #. i18n: ectx: property (text), widget (BuddyLabel, stopDynamizerOnExitLabel)
-#: po/rc.cpp:618 rc.cpp:618
+#: po/rc.cpp:626 rc.cpp:626
 msgid "Stop dynamizer on exit:"
 msgstr "退出时关闭动态:"
 
-#. i18n: file: gui/playbacksettings.ui:219
+#. 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:621 rc.cpp:621
+#: 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 "
@@ -4369,32 +4827,39 @@ msgstr ""
 
 #. i18n: file: gui/serversettings.ui:35
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:624 rc.cpp:624
+#: po/rc.cpp:635 rc.cpp:635
 #, fuzzy
 msgid "Collection:"
 msgstr "连接"
 
 #. 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:653 po/rc.cpp:674 rc.cpp:653 rc.cpp:674
 msgid "Cover filename:"
 msgstr "封面名称:"
 
 #. i18n: file: gui/serversettings.ui:155
 #. i18n: ectx: property (text), widget (BuddyLabel, dynamizerPortLabel)
-#: po/rc.cpp:645 rc.cpp:645
+#: po/rc.cpp:656 rc.cpp:656
 msgid "Dynamizer port:"
 msgstr "动态端口"
 
-#. i18n: file: gui/serversettings.ui:186
+#. i18n: file: gui/serversettings.ui:168
+#. i18n: ectx: property (text), widget (BuddyLabel, streamUrlLabel)
+#: po/rc.cpp:659 rc.cpp:659
+#, fuzzy
+msgid "HTTP stream URL:"
+msgstr "流媒体 %1"
+
+#. i18n: file: gui/serversettings.ui:199
 #. i18n: ectx: property (text), widget (QLabel, musicFolderNoteLabel)
-#: po/rc.cpp:648 rc.cpp:648
+#: po/rc.cpp:662 rc.cpp:662
 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 "
@@ -4406,18 +4871,29 @@ msgstr ""
 "<code>cover.jpg/cover.png</code>). 如果有文件夹及子文件的写入权限,Cantata 将"
 "自动下载专辑封面到专辑文件夹</i>"
 
-#. i18n: file: gui/serversettings.ui:314
+#. i18n: file: gui/serversettings.ui:277
+#. i18n: ectx: property (text), widget (QLabel, streamUrlNoteLabel)
+#: po/rc.cpp:668 rc.cpp:668
+#, 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>注意:</b> HTTP 流媒体输出仅在 MPD 也配置了 HTTP 流媒体输出时可用。</i>"
+
+#. i18n: file: gui/serversettings.ui:353
 #. i18n: ectx: property (text), widget (StateLabel, basicMusicFolderNoteLabel)
-#: po/rc.cpp:660 rc.cpp:660
+#: po/rc.cpp:677 rc.cpp:677
 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 ""
 
-#. 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:680 rc.cpp:680
 msgid ""
 "<i><b>NOTE:</b> If no setting is specified for 'Cover filename, then Cantata "
 "will use a default of <code>cover</code> </i>"
@@ -4425,20 +4901,20 @@ msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:25
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:666 rc.cpp:666
+#: po/rc.cpp:683 rc.cpp:683
 #, fuzzy
 msgid "Network interface:"
 msgstr "地址/网络接口:"
 
 #. i18n: file: http/httpserversettings.ui:38
 #. i18n: ectx: property (text), widget (QLabel, label_3b)
-#: po/rc.cpp:669 rc.cpp:669
+#: po/rc.cpp:686 rc.cpp:686
 msgid "Current URL:"
 msgstr ""
 
 #. i18n: file: http/httpserversettings.ui:73
 #. i18n: ectx: property (text), widget (QLabel, label_4)
-#: po/rc.cpp:672 rc.cpp:672
+#: po/rc.cpp:689 rc.cpp:689
 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 "
@@ -4450,25 +4926,33 @@ msgstr ""
 
 #. i18n: file: network/proxysettings.ui:26
 #. i18n: ectx: property (text), widget (BuddyLabel, modeLabel)
-#: po/rc.cpp:676 rc.cpp:676
+#: po/rc.cpp:693 rc.cpp:693
 msgid "Mode:"
 msgstr ""
 
 #. i18n: file: network/proxysettings.ui:50
 #. i18n: ectx: property (text), item, widget (QComboBox, proxyType)
-#: po/rc.cpp:682 rc.cpp:682
+#: po/rc.cpp:699 rc.cpp:699
 msgid "HTTP Proxy"
 msgstr "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:702 rc.cpp:702
 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 ""
+
 #. i18n: file: streams/digitallyimportedsettings.ui:29
 #. i18n: ectx: property (text), widget (QLabel, label)
-#: po/rc.cpp:700 rc.cpp:700
+#: po/rc.cpp:723 rc.cpp:723
 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."
@@ -4478,212 +4962,272 @@ msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:42
 #. i18n: ectx: property (title), widget (QGroupBox, groupBox)
-#: po/rc.cpp:703 rc.cpp:703
+#: po/rc.cpp:726 rc.cpp:726
 msgid "Premium Account"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:78
 #. i18n: ectx: property (text), widget (BuddyLabel, label_4)
-#: po/rc.cpp:712 rc.cpp:712
+#: po/rc.cpp:735 rc.cpp:735
 #, fuzzy
 msgid "Stream type:"
 msgstr "流媒体:"
 
 #. i18n: file: streams/digitallyimportedsettings.ui:91
 #. i18n: ectx: property (text), widget (BuddyLabel, label_5)
-#: po/rc.cpp:715 rc.cpp:715
+#: po/rc.cpp:738 rc.cpp:738
 msgid "Status:"
 msgstr ""
 
 #. 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:741 streams/digitallyimportedsettings.cpp:130
+#: streams/digitallyimportedsettings.cpp:136 rc.cpp:741
 msgid "Login"
 msgstr ""
 
 #. i18n: file: streams/digitallyimportedsettings.ui:131
 #. i18n: ectx: property (text), widget (QLabel, expiryLabel)
-#: po/rc.cpp:724 rc.cpp:724
+#: po/rc.cpp:747 rc.cpp:747
 msgid "Session expiry:"
 msgstr ""
 
-#. i18n: file: support/shortcutssettingspage.ui:22
+#. i18n: file: streams/digitallyimportedsettings.ui:151
+#. i18n: ectx: property (text), widget (QLabel, noteLabel)
+#: po/rc.cpp:750 rc.cpp:750
+msgid ""
+"<i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, "
+"RockRadio.com, and Sky.fm</i>"
+msgstr ""
+
+#. i18n: file: streams/digitallyimportedsettings.ui:161
+#. i18n: ectx: property (text), widget (QLabel, note2Label)
+#: po/rc.cpp:753 rc.cpp:753
+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: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 ""
+
+#. i18n: file: streams/streamssettings.ui:47
+#. i18n: ectx: property (text), widget (QPushButton, configureButton)
+#: po/rc.cpp:759 rc.cpp:759
+#, 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
+msgid "Install"
+msgstr ""
+
+#. i18n: file: streams/streamssettings.ui:80
+#. i18n: ectx: property (text), widget (QLabel, note)
+#: po/rc.cpp:768 rc.cpp:768
+msgid ""
+"<i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be "
+"removed.</i>"
+msgstr ""
+
+#. i18n: file: support/shortcutssettingswidget.ui:22
 #. i18n: ectx: property (text), widget (BuddyLabel, label_2)
-#: po/rc.cpp:727 rc.cpp:727
+#: po/rc.cpp:771 rc.cpp:771
 msgid "Search:"
 msgstr "搜索:"
 
-#. 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:774 rc.cpp:774
 msgid "Shortcut for Selected Action"
 msgstr "选定动作的快捷键"
 
-#. 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:777 rc.cpp:777
 msgid "Default:"
 msgstr "默认:"
 
-#. 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:783 rc.cpp:783
 msgid "Custom:"
 msgstr "自定义:"
 
-#. i18n: file: tags/tageditor.ui:22
+#. i18n: file: tags/tageditor.ui:25
 #. i18n: ectx: property (text), widget (StateLabel, trackNameLabel)
-#: po/rc.cpp:742 rc.cpp:742
+#: po/rc.cpp:786 rc.cpp:786
 msgid "Track:"
 msgstr "音轨:"
 
-#. 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:795 rc.cpp:795
 msgid "Album artist:"
 msgstr "专辑艺术家:"
 
-#. 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:804 rc.cpp:804
 msgid "Track number:"
 msgstr "音轨号:"
 
-#. 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:807 rc.cpp:807
 msgid "Disc number:"
 msgstr "碟片序号:"
 
 #. i18n: file: tags/trackorganiser.ui:155
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:787 rc.cpp:787
+#: po/rc.cpp:834 rc.cpp:834
 msgid "Original Name"
 msgstr "原始名称"
 
 #. i18n: file: tags/trackorganiser.ui:160
 #. i18n: ectx: property (text), widget (QTreeWidget, files)
-#: po/rc.cpp:790 rc.cpp:790
+#: po/rc.cpp:837 rc.cpp:837
 msgid "New Name"
 msgstr "新名称"
 
-#: po/rc.cpp:791 rc.cpp:791
+#: po/rc.cpp:838 rc.cpp:838
 msgctxt "NAME OF TRANSLATORS"
 msgid "Your names"
 msgstr "姓名"
 
-#: po/rc.cpp:792 rc.cpp:792
+#: po/rc.cpp:839 rc.cpp:839
 msgctxt "EMAIL OF TRANSLATORS"
 msgid "Your emails"
 msgstr "你的 E-mail"
 
-#: replaygain/rgdialog.cpp:125
+#: replaygain/rgdialog.cpp:121
 #, fuzzy
 msgid "Show All Tracks"
 msgstr "所有音轨"
 
-#: replaygain/rgdialog.cpp:126
+#: replaygain/rgdialog.cpp:122
 #, fuzzy
 msgid "Show Untagged Tracks"
 msgstr "音轨无标签"
 
-#: replaygain/rgdialog.cpp:133 tags/trackorganiser.cpp:72
+#: replaygain/rgdialog.cpp:129 tags/trackorganiser.cpp:72
 #, fuzzy
 msgid "Remove From List"
 msgstr "确定删除流媒体?"
 
-#: replaygain/rgdialog.cpp:140
+#: replaygain/rgdialog.cpp:136
 msgid "Album Gain"
 msgstr "专辑增益"
 
-#: replaygain/rgdialog.cpp:141
+#: replaygain/rgdialog.cpp:137
 msgid "Track Gain"
 msgstr "音轨增益"
 
-#: replaygain/rgdialog.cpp:142
+#: replaygain/rgdialog.cpp:138
 msgid "Album Peak"
 msgstr "专辑峰值"
 
-#: replaygain/rgdialog.cpp:143
+#: replaygain/rgdialog.cpp:139
 msgid "Track Peak"
 msgstr "音轨峰值"
 
-#: replaygain/rgdialog.cpp:163 replaygain/rgdialog.cpp:284
+#: replaygain/rgdialog.cpp:159 replaygain/rgdialog.cpp:288
 msgid "Scan"
 msgstr "扫描"
 
-#: replaygain/rgdialog.cpp:235
+#: replaygain/rgdialog.cpp:238
 #, fuzzy
 msgid "Update ReplayGain tags in tracks?"
 msgstr "更新文件的增益标签?"
 
-#: replaygain/rgdialog.cpp:235 replaygain/rgdialog.cpp:236
+#: replaygain/rgdialog.cpp:238 replaygain/rgdialog.cpp:239
 #, fuzzy
 msgid "Update Tags"
 msgstr "正在更新 %1"
 
-#: replaygain/rgdialog.cpp:248
+#: replaygain/rgdialog.cpp:252
 #, fuzzy
 msgid "Abort scanning of tracks?"
 msgstr "放弃编辑歌词?"
 
-#: replaygain/rgdialog.cpp:257
+#: replaygain/rgdialog.cpp:261
 #, fuzzy
 msgid "Abort reading of existing tags?"
 msgstr "取消获取标签?"
 
-#: replaygain/rgdialog.cpp:283
+#: replaygain/rgdialog.cpp:287
 msgid ""
 "Scan <b>all</b> tracks?<br><br><i>NOTE: All tracks have existing ReplyGain "
 "tags.</i>"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:285
+#: replaygain/rgdialog.cpp:289
 #, fuzzy
 msgid "Do you wish to scan all tracks, or only tracks without existing tags?"
 msgstr "扫描所有文件还是仅扫描缺少标签的文件?"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "Untagged Tracks"
 msgstr "音轨无标签"
 
-#: replaygain/rgdialog.cpp:286
+#: replaygain/rgdialog.cpp:290
 msgid "All Tracks"
 msgstr "所有音轨"
 
-#: replaygain/rgdialog.cpp:299
+#: replaygain/rgdialog.cpp:300
 #, fuzzy
 msgid "Scanning tracks..."
 msgstr "更新音轨..."
 
-#: replaygain/rgdialog.cpp:376
+#: replaygain/rgdialog.cpp:367
 msgid "Reading existing tags..."
 msgstr "读取标签..."
 
-#: replaygain/rgdialog.cpp:447 tags/tageditor.cpp:743
+#: replaygain/rgdialog.cpp:418 tags/tageditor.cpp:754
+#, fuzzy
+msgctxt "filename (Timeout)"
+msgid "%1 (Timeout)"
+msgstr "%1 (估算时间)"
+
+#: replaygain/rgdialog.cpp:422 tags/tageditor.cpp:758
+msgctxt "filename (Corrupt tags?)"
+msgid "%1 (Corrupt tags?)"
+msgstr ""
+
+#: replaygain/rgdialog.cpp:436 tags/tageditor.cpp:768
 msgid "Failed to update the tags of the following tracks:"
 msgstr "下列歌曲标签更新失败:"
 
-#: replaygain/rgdialog.cpp:491 tags/tageditor.cpp:813
-#: tags/trackorganiser.cpp:426
+#: replaygain/rgdialog.cpp:477 tags/tageditor.cpp:841
+#: tags/trackorganiser.cpp:451
 msgid "Device is not connected."
 msgstr "设备未连接."
 
-#: replaygain/rgdialog.cpp:529 replaygain/rgdialog.cpp:584
-#: replaygain/rgdialog.cpp:643 replaygain/rgdialog.cpp:645
+#: replaygain/rgdialog.cpp:517 replaygain/rgdialog.cpp:524
+#: replaygain/rgdialog.cpp:603 replaygain/rgdialog.cpp:605
 msgid "%1 dB"
 msgstr "%1 dB"
 
-#: replaygain/rgdialog.cpp:559 replaygain/rgdialog.cpp:560
+#: 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
 msgid "Failed"
 msgstr "失败"
 
-#: replaygain/rgdialog.cpp:695 tags/trackorganiser.cpp:380
+#: replaygain/rgdialog.cpp:655 tags/trackorganiser.cpp:405
 msgid "Remove the selected tracks from the list?"
 msgstr ""
 
-#: replaygain/rgdialog.cpp:696 tags/trackorganiser.cpp:381
+#: replaygain/rgdialog.cpp:656 tags/trackorganiser.cpp:406
 #, fuzzy
 msgid "Remove Tracks"
 msgstr "确定删除流媒体?"
@@ -4717,6 +5261,10 @@ msgstr ""
 msgid "Logout"
 msgstr ""
 
+#: streams/streamdialog.cpp:71
+msgid "URL:"
+msgstr ""
+
 #: streams/streamdialog.cpp:76
 msgid "Just add to play queue, do not save"
 msgstr ""
@@ -4737,121 +5285,162 @@ msgstr "编辑流媒体"
 msgid "<i><b>ERROR:</b> Invalid protocol</i>"
 msgstr "<i><b>错误:</b>协议无效</i>"
 
-#: streams/streamfetcher.cpp:198
+#: streams/streamfetcher.cpp:205
 #, fuzzy
 msgid "Fetching %1"
 msgstr "正在保存 %1"
 
-#: streams/streamspage.cpp:61
+#: streams/streamspage.cpp:59
 #, fuzzy
 msgid "Import Streams Into Favorites"
 msgstr "导入流媒体"
 
-#: streams/streamspage.cpp:62
+#: streams/streamspage.cpp:60
 #, fuzzy
 msgid "Export Favorite Streams"
 msgstr "导出流媒体"
 
-#: streams/streamspage.cpp:63
+#: streams/streamspage.cpp:61
 msgid "Add New Stream To Favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:123
+#: streams/streamspage.cpp:124
 #, fuzzy
-msgid "Search TuneIn:"
-msgstr "搜索:"
+msgctxt "Service name"
+msgid "Digitally Imported"
+msgstr "Jamendo 设置"
 
-#: streams/streamspage.cpp:239
+#: streams/streamspage.cpp:242
 msgid "*.xml *.xml.gz *.cantata|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:239 streams/streamspage.cpp:241
+#: streams/streamspage.cpp:242 streams/streamspage.cpp:244
 msgid "Import Streams"
 msgstr "导入流媒体"
 
-#: streams/streamspage.cpp:242
+#: streams/streamspage.cpp:245
 #, fuzzy
 msgid "XML Streams (*.xml *.xml.gz *.cantata)"
 msgstr "Cantata 流媒体 (*.cantata)"
 
-#: streams/streamspage.cpp:250
+#: streams/streamspage.cpp:253
 msgid ""
 "Failed to import <b>%1</b>!<br/>Please check this is of the correct type."
 msgstr "无法导入 <b>%1</b>!<br/>请检查格式是否正确。"
 
-#: streams/streamspage.cpp:262
+#: streams/streamspage.cpp:265
 msgid "*.xml|XML Streams"
 msgstr ""
 
-#: streams/streamspage.cpp:262 streams/streamspage.cpp:264
+#: streams/streamspage.cpp:265 streams/streamspage.cpp:267
 msgid "Export Streams"
 msgstr "导出流媒体"
 
-#: streams/streamspage.cpp:264
+#: streams/streamspage.cpp:267
 msgid "XML Streams (*.xml)"
 msgstr ""
 
-#: streams/streamspage.cpp:276
+#: streams/streamspage.cpp:279
 msgid "Failed to create <b>%1</b>!"
 msgstr "<b>%1</b> 创建失败!"
 
-#: streams/streamspage.cpp:293 streams/streamspage.cpp:489
+#: streams/streamspage.cpp:296 streams/streamspage.cpp:492
 msgid "Stream already exists!<br/><b>%1</b>"
 msgstr "流媒体已经存在! <br/><b>%1</b>"
 
-#: streams/streamspage.cpp:295 streams/streamspage.cpp:491
+#: streams/streamspage.cpp:298 streams/streamspage.cpp:494
 msgid "A stream named <b>%1</b> already exists!"
 msgstr "已经有名为 <b>%1</b> 的流媒体!"
 
-#: streams/streamspage.cpp:315
+#: streams/streamspage.cpp:318
 msgid "Bookmark added"
 msgstr ""
 
-#: streams/streamspage.cpp:317
+#: streams/streamspage.cpp:320
 msgid "Already bookmarked"
 msgstr ""
 
-#: streams/streamspage.cpp:363
+#: streams/streamspage.cpp:366
 msgid "Added to favorites"
 msgstr ""
 
-#: streams/streamspage.cpp:365
+#: streams/streamspage.cpp:368
 #, fuzzy
 msgid "Already in favorites"
 msgstr "已经存在"
 
-#: streams/streamspage.cpp:390
+#: streams/streamspage.cpp:393
 msgid "Reload <b>%1</b> streams?"
 msgstr ""
 
-#: streams/streamspage.cpp:408
+#: streams/streamspage.cpp:411
 #, fuzzy
 msgid "Are you sure you wish to remove bookmark to <b>%1</b>?"
 msgstr "确定要移除 <b>%1</b> ?"
 
-#: streams/streamspage.cpp:414
+#: streams/streamspage.cpp:417
 #, fuzzy
 msgid "Are you sure you wish to remove all <b>%1</b> bookmarks?"
 msgstr "确定要移除 <b>%1</b> ?"
 
-#: streams/streamspage.cpp:442
+#: streams/streamspage.cpp:445
 msgid "Are you sure you wish to remove the %1 selected streams?"
 msgstr "确定移除选择的流媒体 %1 ?"
 
-#: streams/streamspage.cpp:446
+#: streams/streamspage.cpp:449 streams/streamssettings.cpp:221
 msgid "Are you sure you wish to remove <b>%1</b>?"
 msgstr "确定要移除 <b>%1</b> ?"
 
-#: streams/streamspage.cpp:609
-msgid "Logged into Digitally Imported"
+#: streams/streamspage.cpp:560 streams/streamspage.cpp:576
+#, fuzzy
+msgid "Search %1:"
+msgstr "搜索:"
+
+#: streams/streamssettings.cpp:125
+#, fuzzy
+msgid "*.streams|Cantata Streams"
+msgstr "*.cantata|Cantata 流媒体"
+
+#: streams/streamssettings.cpp:125 streams/streamssettings.cpp:127
+#, fuzzy
+msgid "Install Streams"
+msgstr "导入流媒体"
+
+#: streams/streamssettings.cpp:127
+msgid "Cantata Streams (*.streams)"
 msgstr ""
 
-#: streams/streamspage.cpp:609
-msgid "<b>NOT</b> logged into Digitally Imported"
+#: streams/streamssettings.cpp:144
+#, fuzzy
+msgid "A category named <b>%1</b> already exists!<br/>Overwrite?"
+msgstr "已经有名为 <b>%1</b>的播放列表!<br/><br/>覆盖吗?"
+
+#: streams/streamssettings.cpp:150
+#, fuzzy
+msgid "Failed top open %1"
+msgstr "%1 保存失败"
+
+#: streams/streamssettings.cpp:163
+msgid "Invalid file format!"
 msgstr ""
 
+#: streams/streamssettings.cpp:170
+#, fuzzy
+msgid "Failed to create stream category folder!"
+msgstr "文件夹 <br/>%1 创建失败!"
+
+#: streams/streamssettings.cpp:176
+#, fuzzy
+msgid "Failed to save stream list!"
+msgstr "下载流媒体列表失败"
+
+#: streams/streamssettings.cpp:227
+#, fuzzy
+msgid "Failed to remove streams folder!"
+msgstr "无法删除前一个配置 - %1"
+
 #: support/dialog.cpp:89
-msgid "&Ok"
+msgid "&OK"
 msgstr ""
 
 #: support/dialog.cpp:90
@@ -4924,39 +5513,39 @@ msgstr "上一个"
 msgid "&Next"
 msgstr "下一个"
 
-#: support/fancytabwidget.cpp:952
+#: support/fancytabwidget.cpp:957
 msgid "Icons Only"
 msgstr "仅图标"
 
-#: support/fancytabwidget.cpp:953
+#: support/fancytabwidget.cpp:958
 msgid "Style"
 msgstr "视图"
 
-#: support/fancytabwidget.cpp:954
+#: support/fancytabwidget.cpp:959
 msgid "Large Sidebar"
 msgstr "大侧边栏"
 
-#: support/fancytabwidget.cpp:955
+#: support/fancytabwidget.cpp:960
 msgid "Small Sidebar"
 msgstr "小侧边栏"
 
-#: support/fancytabwidget.cpp:956
+#: support/fancytabwidget.cpp:961
 msgid "Top Bar"
 msgstr "顶栏"
 
-#: support/fancytabwidget.cpp:957
+#: support/fancytabwidget.cpp:962
 msgid "Bottom Bar"
 msgstr "底部栏"
 
-#: support/fancytabwidget.cpp:958
+#: support/fancytabwidget.cpp:963
 msgid "Tabs On Side"
 msgstr "标签在左侧"
 
-#: support/fancytabwidget.cpp:959
+#: support/fancytabwidget.cpp:964
 msgid "Tabs On Top"
 msgstr "标签在顶部"
 
-#: support/fancytabwidget.cpp:960
+#: support/fancytabwidget.cpp:965
 msgid "Tabs On Bottom"
 msgstr "标签在底部"
 
@@ -4968,19 +5557,20 @@ msgstr "密码"
 msgid "Please enter password:"
 msgstr "请输入密码:"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:123
 msgid "Warning"
 msgstr "警告"
 
-#: support/messagebox.cpp:50
+#: support/messagebox.cpp:50 support/messagebox.cpp:118
 msgid "Question"
 msgstr "问题"
 
-#: support/messagebox.cpp:76 support/messagebox.h:57
+#: support/messagebox.cpp:107 support/messagebox.cpp:113
+#: support/messagebox.h:62
 msgid "Error"
 msgstr "错误"
 
-#: support/messagebox.h:60
+#: support/messagebox.h:65
 msgid "Information"
 msgstr "信息"
 
@@ -5000,120 +5590,135 @@ msgstr "选择文件夹"
 msgid "Select File"
 msgstr "选择文件"
 
-#: 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 ""
 
-#: 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] "%1 天 %2"
+
+#: tags/tageditor.cpp:134
 msgid "Tags"
 msgstr "标签"
 
-#: tags/tageditor.cpp:144
+#: tags/tageditor.cpp:147
 msgid "Set 'Album Artist' from 'Artist'"
 msgstr ""
 
-#: tags/tageditor.cpp:228 tags/tageditor.cpp:549
+#: tags/tageditor.cpp:243 tags/tageditor.cpp:560
 msgid "All tracks"
 msgstr "所有音轨"
 
-#: tags/tageditor.cpp:282
+#: tags/tageditor.cpp:295
 msgid "(Various)"
 msgstr "(多个)"
 
-#: tags/tageditor.cpp:325
+#: tags/tageditor.cpp:336
 msgid "Apply \"Various Artists\" workaround to <b>all</b> tracks?"
 msgstr "应用\"多个艺术家\" 环境到 <b>所有</b> 音轨?"
 
-#: tags/tageditor.cpp:367
+#: tags/tageditor.cpp:378
 msgid "Revert \"Various Artists\" workaround on <b>all</b> tracks?"
 msgstr "确定恢复 \"多个艺术家\" 环境到 <b>所有</b>音轨?"
 
-#: tags/tageditor.cpp:417
+#: tags/tageditor.cpp:428
 msgid ""
 "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty) for <b>all</b> "
 "tracks?"
 msgstr ""
 "获取\"专辑艺人\"标签并应用到\"艺术家(如果为空)\" 环境到 <b>所有</b> 音轨?"
 
-#: tags/tageditor.cpp:418
+#: tags/tageditor.cpp:429
 msgid "Set 'Album Artist' from 'Artist' (if 'Album Artist' is empty)?"
 msgstr "获取\"专辑艺人\"标签并应用到\"艺术家(如果为空)\" ?"
 
-#: tags/tageditor.cpp:419
+#: tags/tageditor.cpp:430
 #, fuzzy
 msgid "Album Artist from Artist"
 msgstr "专辑艺术家"
 
-#: tags/tageditor.cpp:452
+#: tags/tageditor.cpp:463
 msgid ""
 "Capitalize the first letter of 'Title', 'Artist', 'Album artist', and "
 "'Album' of <b>all</b> tracks?"
 msgstr "<b>所有</b>音轨的'标题', '艺术家', '专辑艺术家', '专辑' 的首字母大写?"
 
-#: tags/tageditor.cpp:485
+#: tags/tageditor.cpp:496
 msgid "Adjust the value of each track number by:"
 msgstr "调整每个音轨号按:"
 
-#: tags/tageditor.cpp:543
+#: tags/tageditor.cpp:554
 msgid "All tracks [modified]"
 msgstr "所有音轨 [已修改]"
 
-#: tags/tageditor.cpp:545
+#: tags/tageditor.cpp:556
 msgid "%1 [modified]"
 msgstr "%1 [已修改]"
 
-#: tags/tageditor.cpp:758
+#: tags/tageditor.cpp:783
 msgid ""
 "Would you also like to rename your song files, so as to match your tags?"
 msgstr ""
 
-#: tags/tageditor.cpp:759
+#: tags/tageditor.cpp:784
 #, fuzzy
 msgid "Rename Files"
 msgstr "重命名文件?"
 
-#: tags/trackorganiser.cpp:143
+#: tags/trackorganiser.cpp:150
 #, fuzzy
 msgid "Abort renaming of files?"
 msgstr "取消重命名?"
 
-#: tags/trackorganiser.cpp:257
+#: tags/trackorganiser.cpp:263
+#, fuzzy
+msgid "Source file does not exist!<br/>%1"
+msgstr "歌曲不存在!<hr/>%1"
+
+#: tags/trackorganiser.cpp:282
 msgid "Destination file already exists!<br/>%1"
 msgstr "目标文件已存在!<br/>%1"
 
-#: tags/trackorganiser.cpp:279
+#: tags/trackorganiser.cpp:304
 msgid "Failed to create destination folder!<br/>%1"
 msgstr "文件夹 <br/>%1 创建失败!"
 
-#: tags/trackorganiser.cpp:300
+#: tags/trackorganiser.cpp:325
 msgid "Failed to rename %1 to %2"
 msgstr "无法把 %1 重命名为 %2"
 
-#: widgets/coverwidget.cpp:258
+#: widgets/coverwidget.cpp:267
+#, 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
 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:"
@@ -5123,28 +5728,34 @@ msgstr ""
 "\"right\"><b>专辑:</b></td><td>%2</td></tr><tr><td align=\"right\"><b>年:</"
 "b></td><td>%3</td></tr>"
 
-#: widgets/genrecombo.cpp:59
+#: widgets/genrecombo.cpp:54
 msgid "All Genres"
 msgstr "所有流派"
 
-#: widgets/groupedview.cpp:266
+#: widgets/groupedview.cpp:267
+#, fuzzy
+msgctxt "album (albumYear)"
+msgid "%1 (%2)"
+msgstr "%1 (%2)"
+
+#: widgets/groupedview.cpp:269
 #, fuzzy
 msgctxt "artist - album (albumYear)"
 msgid "%1 - %2 (%3)"
 msgstr "%1 - %2"
 
-#: widgets/itemview.cpp:478
+#: widgets/itemview.cpp:480
 #, fuzzy
 msgid "Go Back"
 msgstr "后退"
 
-#: widgets/itemview.cpp:482
+#: widgets/itemview.cpp:485
 msgid "Go Home"
 msgstr ""
 
 #: widgets/menubutton.cpp:36
-msgid "Other Actions"
-msgstr "其他动作"
+msgid "Menu"
+msgstr ""
 
 #: widgets/searchwidget.cpp:62
 #, fuzzy
@@ -5155,6 +5766,54 @@ msgstr "搜索 %1 ..."
 msgid "Close Search Bar"
 msgstr ""
 
+#: widgets/servicestatuslabel.cpp:43
+#, fuzzy
+msgid "Logged into %1"
+msgstr "连接到 %1"
+
+#: widgets/servicestatuslabel.cpp:44
+msgid "<b>NOT</b> logged into %1"
+msgstr ""
+
+#: widgets/songdialog.cpp:48
+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
+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
+msgid "Mute"
+msgstr "静音"
+
+#: widgets/volumeslider.cpp:199
+#, fuzzy
+msgid "Muted"
+msgstr "静音"
+
+#: widgets/volumeslider.cpp:238
+msgid "Unmute"
+msgstr ""
+
+#: widgets/volumeslider.cpp:276
+msgid "Volume Disabled"
+msgstr "静音"
+
+#: widgets/volumeslider.cpp:287
+#, fuzzy
+msgid "Volume %1% (Muted)"
+msgstr "音量 %1%"
+
+#: widgets/volumeslider.cpp:287
+msgid "Volume %1%"
+msgstr "音量 %1%"
+
 #: ../gui/qtplural.h:30
 msgctxt "Singular"
 msgid "1 Track"
@@ -5233,6 +5892,52 @@ msgctxt "Plural (N!=1)"
 msgid "%1 Rules"
 msgstr "%1 规则"
 
+#: ../gui/qtplural.h:58
+msgctxt "Singular"
+msgid "1 Podcast"
+msgstr ""
+
+#: ../gui/qtplural.h:59
+#, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Podcasts"
+msgstr ""
+
+#: ../gui/qtplural.h:62
+msgctxt "Singular"
+msgid "1 Episode"
+msgstr ""
+
+#: ../gui/qtplural.h:63
+#, fuzzy, qt-format
+msgctxt "Plural (N!=1)"
+msgid "%1 Episodes"
+msgstr "%1 项"
+
+#~ msgid ""
+#~ "Failed to download track - too many redirects encountered.<br/><br/<hr/>%1"
+#~ msgstr "下载音轨失败 - 重定向计数过多.<br/><br/<hr/>%1"
+
+#~ msgid "Configure Online Service"
+#~ msgstr "设置在线服务"
+
+#~ msgid "Refresh Online Service"
+#~ msgstr "刷新在线服务"
+
+#~ msgid "Support media keys under GNOME/Unity:"
+#~ msgstr "GNOME/Unity 快捷键支持:"
+
+#, fuzzy
+#~ msgid "Stopping Playback"
+#~ msgstr "回放"
+
+#, fuzzy
+#~ msgid "Search TuneIn:"
+#~ msgstr "搜索:"
+
+#~ msgid "Other Actions"
+#~ msgstr "其他动作"
+
 #~ msgid "Disc %1"
 #~ msgstr "碟片 %1"
 
@@ -5290,19 +5995,9 @@ msgstr "%1 规则"
 #~ msgid "Disconnect Online Service"
 #~ msgstr "断开在线服务"
 
-#~ msgid "Failed to parse downloaded stream list."
-#~ msgstr "清除流媒体列表失败"
-
 #~ msgid "Failed to read downloaded stream list."
 #~ msgstr "下载流媒体列表失败"
 
-#~ msgid "Failed to download stream list."
-#~ msgstr "下载流媒体列表失败"
-
-#~ msgctxt "name (host)"
-#~ msgid "%1 (%2)"
-#~ msgstr "%1 (%2)"
-
 #~ msgid "Failed to reconnect to %1"
 #~ msgstr "无法连接 %1"
 
@@ -5387,9 +6082,6 @@ msgstr "%1 规则"
 #~ msgid "Music folder not writeable."
 #~ msgstr "音乐文件夹没有写入权限"
 
-#~ msgid "*.cantata|Cantata Streams"
-#~ msgstr "*.cantata|Cantata 流媒体"
-
 #~ msgid "Are you sure you wish to remove the selected categories &streams?"
 #~ msgstr "确定移除流媒体类别?"
 
@@ -5414,9 +6106,6 @@ msgstr "%1 规则"
 #~ msgid "Download streams from %1?"
 #~ msgstr "从 %1 下载流媒体?"
 
-#~ msgid "Download %1"
-#~ msgstr "下载 %1"
-
 #~ msgctxt ""
 #~ "message \n"
 #~ " url"
@@ -5516,9 +6205,6 @@ msgstr "%1 规则"
 #~ msgid "Failed to update the tags of some tracks."
 #~ msgstr "一些歌曲标签更新失败."
 
-#~ msgid "Are you sure you wish to forget the selected device?"
-#~ msgstr "确定不保存选择的设备?"
-
 #~ msgid "Select Music Folder"
 #~ msgstr "选择音乐文件夹"
 
diff --git a/replaygain/CMakeLists.txt b/replaygain/CMakeLists.txt
index 4611764..2f65dab 100644
--- a/replaygain/CMakeLists.txt
+++ b/replaygain/CMakeLists.txt
@@ -88,10 +88,6 @@ if (FFMPEG_FOUND OR MPG123_FOUND)
     if (SPEEXDSP_FOUND)
         target_link_libraries(cantata-replaygain ${SPEEXDSP_LIBRARIES})
     endif (SPEEXDSP_FOUND)
-    if (TAGLIB-EXTRAS_FOUND)
-        target_link_libraries(cantata-replaygain ${TAGLIB-EXTRAS_LIBRARIES})
-        include_directories(${TAGLIB-EXTRAS_INCLUDES})
-    endif (TAGLIB-EXTRAS_FOUND)
-    target_link_libraries(cantata-replaygain ${QTCORELIBS} ${TAGLIB_LIBRARIES})
+    target_link_libraries(cantata-replaygain ${QTCORELIBS})
 endif (FFMPEG_FOUND OR MPG123_FOUND)
 
diff --git a/replaygain/rgdialog.cpp b/replaygain/rgdialog.cpp
index df8dcf8..b229a1e 100644
--- a/replaygain/rgdialog.cpp
+++ b/replaygain/rgdialog.cpp
@@ -81,30 +81,26 @@ int RgDialog::instanceCount()
     return iCount;
 }
 
-#if QT_VERSION < 0x050000
 static inline void setResizeMode(QHeaderView *hdr, int idx, QHeaderView::ResizeMode mode)
 {
+    #if QT_VERSION < 0x050000
     hdr->setResizeMode(idx, mode);
-}
-
-static inline void setResizeMode(QHeaderView *hdr, QHeaderView::ResizeMode mode)
-{
-    hdr->setResizeMode(mode);
-}
-#else
-static inline void setResizeMode(QHeaderView *hdr, int idx, QHeaderView::ResizeMode 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
 }
-#endif
 
 RgDialog::RgDialog(QWidget *parent)
-    : Dialog(parent, "RgDialog", QSize(800, 400))
+    : SongDialog(parent, "RgDialog", QSize(800, 400))
     , state(State_Idle)
     , totalToScan(0)
     , tagReader(0)
@@ -199,6 +195,7 @@ void RgDialog::show(const QList<Song> &songs, const QString &udi, bool autoScan)
 
     autoScanTags=autoScan;
     qSort(origSongs);
+
     #ifdef ENABLE_DEVICES_SUPPORT
     if (udi.isEmpty()) {
         base=MPDConnection::self()->getDetails().dir;
@@ -213,9 +210,13 @@ void RgDialog::show(const QList<Song> &songs, const QString &udi, bool autoScan)
         base=dev->path();
     }
     #else
-    Q_UNUSED(udi)
     base=MPDConnection::self()->getDetails().dir;
     #endif
+
+    if (!songsOk(origSongs, base, udi.isEmpty())) {
+        return;
+    }
+
     state=State_Idle;
     enableButton(User1, origSongs.count());
     view->clear();
@@ -236,9 +237,10 @@ void RgDialog::slotButtonClicked(int button)
     case Ok:
         if (MessageBox::Yes==MessageBox::questionYesNo(this, i18n("Update ReplayGain tags in tracks?"), i18n("Update Tags"),
                                                        GuiItem(i18n("Update Tags")), StdGuiItem::cancel())) {
-            saveTags();
-            stopScanning();
-            accept();
+            if (saveTags()) {
+                stopScanning();
+                accept();
+            }
         }
         break;
     case User1:
@@ -388,7 +390,7 @@ void RgDialog::stopReadingTags()
     autoScanTags=false;
 }
 
-void RgDialog::saveTags()
+bool RgDialog::saveTags()
 {
     state=State_Saving;
     enableButton(Ok, false);
@@ -402,13 +404,28 @@ void RgDialog::saveTags()
     progress->setRange(0, tagsToSave.count());
 
     int count=0;
+    bool someTimedout=false;
     QMap<int, Tags::ReplayGain>::ConstIterator it=tagsToSave.constBegin();
     QMap<int, Tags::ReplayGain>::ConstIterator end=tagsToSave.constEnd();
 
     for (; it!=end; ++it) {
-        if (Tags::Update_Failed==Tags::updateReplaygain(base+origSongs.at(it.key()).file, it.value())) {
+        switch (Tags::updateReplaygain(base+origSongs.at(it.key()).file, it.value())) {
+        case Tags::Update_Failed:
             failed.append(origSongs.at(it.key()).file);
+            break;
+        #ifdef ENABLE_EXTERNAL_TAGS
+        case Tags::Update_Timedout:
+            failed.append(i18nc("filename (Timeout)", "%1 (Timeout)", origSongs.at(it.key()).file));
+            someTimedout=true;
+            break;
+        case Tags::Update_BadFile:
+            failed.append(i18nc("filename (Corrupt tags?)", "%1 (Corrupt tags?)", origSongs.at(it.key()).file));
+            break;
+        #endif
+        default:
+            break;
         }
+
         progress->setValue(progress->value()+1);
         if (0==count++%10) {
             QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents);
@@ -418,6 +435,8 @@ void RgDialog::saveTags()
     if (failed.count()) {
         MessageBox::errorListEx(this, i18n("Failed to update the tags of the following tracks:"), failed);
     }
+
+    return !someTimedout;
 }
 
 void RgDialog::updateView()
diff --git a/replaygain/rgdialog.h b/replaygain/rgdialog.h
index 1fbd16c..9bce912 100644
--- a/replaygain/rgdialog.h
+++ b/replaygain/rgdialog.h
@@ -25,9 +25,8 @@
 #define _RGDIALOG_H_
 
 #include <QFont>
-#include "dialog.h"
+#include "songdialog.h"
 #include "albumscanner.h"
-#include "song.h"
 #include "tags.h"
 #include "config.h"
 
@@ -41,7 +40,7 @@ class Device;
 class TagReader;
 class Action;
 
-class RgDialog : public Dialog
+class RgDialog : public SongDialog
 {
     Q_OBJECT
 
@@ -65,7 +64,7 @@ private:
     void clearScanners();
     void startReadingTags();
     void stopReadingTags();
-    void saveTags();
+    bool saveTags();
     void updateView();
     #ifdef ENABLE_DEVICES_SUPPORT
     Device * getDevice(const QString &udi, QWidget *p);
diff --git a/streams/digitallyimportedsettings.ui b/streams/digitallyimportedsettings.ui
index 484096c..6282bd7 100644
--- a/streams/digitallyimportedsettings.ui
+++ b/streams/digitallyimportedsettings.ui
@@ -146,6 +146,26 @@
     </widget>
    </item>
    <item>
+    <widget class="QLabel" name="noteLabel">
+     <property name="text">
+      <string><i><b>NOTE:</b> These settings apply to Digitally Imported, JazzRadio.com, RockRadio.com, and Sky.fm</i></string>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QLabel" name="note2Label">
+     <property name="text">
+      <string><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></string>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item>
     <spacer name="verticalSpacer">
      <property name="orientation">
       <enum>Qt::Vertical</enum>
diff --git a/streams/icons/favourites.svg b/streams/icons/favourites.svg
index b6e03da..02fd481 100644
--- a/streams/icons/favourites.svg
+++ b/streams/icons/favourites.svg
@@ -1,4 +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:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 128 128">
+<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="">
@@ -24,16 +24,16 @@
 <stop stop-color="#deb9b9" offset="0"/>
 <stop stop-color="#de1212" offset="1"/>
 </linearGradient>
-<radialGradient id="radialGradient45434" gradientUnits="userSpaceOnUse" cy="64.205" cx="64.586" gradientTransform="matrix(-6.1526273e-7,.77699,-1.03492,0,131.03309,13.73394)" r="47.328">
+<radialGradient id="radialGradient45434" gradientUnits="userSpaceOnUse" cy="64.205" cx="64.586" gradientTransform="matrix(-6.1526e-7 .77699 -1.0349 0 131.03 13.734)" r="47.328">
 <stop stop-color="#f20000" offset="0"/>
 <stop stop-color="#bf0000" offset="1"/>
 </radialGradient>
 </defs>
-<g transform="matrix(1.08911,0,0,1.16485,240.46736,-1061.9861)">
-<path filter="url(#filter45478)" fill-rule="evenodd" d="m-180.81,921.68c-19.771-0.3761-37.469,13.878-37.469,33.75,0,10.036,3.7809,17.005,9.2812,22.719s12.626,10.298,19.719,16.031l20.75,16.75c1.6646,1.3454,2.7151,2.2022,3.7188,2.8124s2.0546,0.9376,3.125,0.9376,2.1526-0.3273,3.1562-0.9376,2.0541-1.467,3.7188-2.8124l20.719-16.75c7.0927-5.7328,14.25-10.318,19.75-16.031s9.2812-12.683,9.2812-22.719c0-26.243-30.886-42.674-56.625-28.562-6.2477-3.4244-12.787-5.0669-19.125-5.1875z" fill-opacity=".502"/>
-<path fill-rule="evenodd" d="m-182.01,922.97c6.1316,0.138,12.488,1.7999,18.569,5.2875l0.7554,0.4092,0.7554-0.4092c24.326-13.95,53.253,1.455,53.253,25.745,0,9.372-3.3155,15.421-8.4978,20.804s-12.307,9.9616-19.608,15.862l-20.898,16.87c-1.6798,1.3577-2.7081,2.1921-3.3991,2.6123s-0.9388,0.5035-1.6051,0.5036-0.8827-0.083-1.5737-0.5036-1.7508-1.2546-3.4306-2.6123l-20.867-16.87c-7.3007-5.901-14.426-10.48-19.608-15.862s-8.4978-11.432-8.4978-20.804c0-18.218,16.257-31.447,34.652-31.033z" fill="url(#linearGradient45395)"/>
-<path fill-rule="evenodd" d="m44.5,24.812c-15.392-0.0596-27.656,10.179-27.656,25.656,0.000001,8.3082,1.724,13.666,6.5938,18.438s10.608,8.8313,17.469,14.062l18.562,14.969c1.5785,1.2036,2.5382,1.94,3.1875,2.3125s0.8739,0.4374,1.5,0.4375,0.8819-0.0651,1.5312-0.4375,1.609-1.1089,3.1875-2.3125l18.562-14.969c6.8605-5.2312,12.599-9.2905,17.469-14.062s6.5938-10.129,6.5938-18.438c0-21.533-23.766-32.898-46.625-20.531-0.4688,0.227-0.9375,0.2964-1.4062,0-6.4292-3.4782-12.946-5.1017-18.969-5.125z" transform="translate(-226.8571,902.6479)" fill="url(#radialGradient45434)"/>
-<path stroke="url(#linearGradient45381)" stroke-width="3" d="m-162.68,1011.8c1.732,0,2.5791-0.7081,5.9116-3.4017l20.735-16.76c14.342-11.592,28.462-18.242,28.462-37.583,0-25.307-30.091-41.211-55.11-26.863-25.019-14.348-55.11,1.5564-55.11,26.863,0,19.341,14.121,25.991,28.462,37.583l20.735,16.76c3.3325,2.6936,4.1796,3.4017,5.9116,3.4017z" fill="none"/>
-<path fill-rule="evenodd" d="m42.969,22.969c-15.914,0-29.812,10.879-29.812,26.281,0,8.5098,2.8765,12.144,8.125,17.031,3.2803,3.0548,6.9026,5.421,10.812,8.25h0.0312c36.569-8.4723,52.826-38.213,81.531-33.875-4.0477-10.704-15.495-17.688-28.25-17.688-6.4916,0.0239-13.317,1.8839-20.438,7.2188-0.2526,0.1518-0.5286,0.2276-0.7812,0.2188-0.2526,0.0089-0.5286-0.0669-0.7812-0.2188-7.1208-5.3348-13.946-7.1949-20.438-7.2188z" transform="translate(-226.8571,902.6479)" fill="url(#linearGradient45462)"/>
+<g transform="matrix(1.0891 0 0 1.1648 240.47 -1062)">
+<path filter="url(#filter45478)" fill-opacity=".502" d="m-180.81 921.68c-19.771-0.3761-37.469 13.878-37.469 33.75 0 10.036 3.7809 17.005 9.2812 22.719s12.626 10.298 19.719 16.031l20.75 16.75c1.6646 1.3454 2.7151 2.2022 3.7188 2.8124s2.0546 0.9376 3.125 0.9376 2.1526-0.3273 3.1562-0.9376 2.0541-1.467 3.7188-2.8124l20.719-16.75c7.0927-5.7328 14.25-10.318 19.75-16.031s9.2812-12.683 9.2812-22.719c0-26.243-30.886-42.674-56.625-28.562-6.2477-3.4244-12.787-5.0669-19.125-5.1875z" fill-rule="evenodd"/>
+<path fill="url(#linearGradient45395)" d="m-182.01 922.97c6.1316 0.138 12.488 1.7999 18.569 5.2875l0.7554 0.4092 0.7554-0.4092c24.326-13.95 53.253 1.455 53.253 25.745 0 9.372-3.3155 15.421-8.4978 20.804s-12.307 9.9616-19.608 15.862l-20.898 16.87c-1.6798 1.3577-2.7081 2.1921-3.3991 2.6123s-0.9388 0.5035-1.6051 0.5036-0.8827-0.083-1.5737-0.5036-1.7508-1.2546-3.4306-2.6123l-20.867-16.87c-7.3007-5.901-14.426-10.48-19.608-15.862s-8.4978-11.432-8.4978-20.804c0-18.218 16.257-31.447 34.652-31.033z" fill-rule="evenodd"/>
+<path transform="translate(-226.86 902.65)" fill="url(#radialGradient45434)" d="m44.5 24.812c-15.392-0.0596-27.656 10.179-27.656 25.656 0.000001 8.3082 1.724 13.666 6.5938 18.438s10.608 8.8313 17.469 14.062l18.562 14.969c1.5785 1.2036 2.5382 1.94 3.1875 2.3125s0.8739 0.4374 1.5 0.4375 0.8819-0.0651 1.5312-0.4375 1.609-1.1089 3.1875-2.3125l18.562-14.969c6.8605-5.2312 12.599-9.2905 17.469-14.062s6.5938-10.129 6.5938-18.438c0-21.533-23.766-32.898-46.625-20.531-0.4688 0.227-0.9375 0.2964-1.4062 0-6.4292-3.4782-12.946-5.1017-18.969-5.125z" fill-rule="evenodd"/>
+<path stroke="url(#linearGradient45381)" stroke-width="3" d="m-162.68 1011.8c1.732 0 2.5791-0.7081 5.9116-3.4017l20.735-16.76c14.342-11.592 28.462-18.242 28.462-37.583 0-25.307-30.091-41.211-55.11-26.863-25.019-14.348-55.11 1.5564-55.11 26.863 0 19.341 14.121 25.991 28.462 37.583l20.735 16.76c3.3325 2.6936 4.1796 3.4017 5.9116 3.4017z" fill="none"/>
+<path transform="translate(-226.86 902.65)" fill="url(#linearGradient45462)" d="m42.969 22.969c-15.914 0-29.812 10.879-29.812 26.281 0 8.5098 2.8765 12.144 8.125 17.031 3.2803 3.0548 6.9026 5.421 10.812 8.25h0.0312c36.569-8.4723 52.826-38.213 81.531-33.875-4.0477-10.704-15.495-17.688-28.25-17.688-6.4916 0.0239-13.317 1.8839-20.438 7.2188-0.2526 0.1518-0.5286 0.2276-0.7812 0.2188-0.2526 0.0089-0.5286-0.0669-0.7812-0.2188-7.1208-5.3348-13.946-7.1949-20.438-7.2188z" fill-rule="evenodd"/>
 </g>
 </svg>
diff --git a/streams/icons/icecast.svg b/streams/icons/icecast.svg
index 6526301..188cb2d 100644
--- a/streams/icons/icecast.svg
+++ b/streams/icons/icecast.svg
@@ -1,26 +1,26 @@
-<svg viewBox="0 0 210 210" xmlns="http://www.w3.org/2000/svg">
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 210 210">
 <defs>
-<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_1_" x2="0" y1="12.3687" y2="79.9995">
-<stop offset="0" stop-color="#ccf8ff"/>
-<stop offset="1" stop-color="#67d4ff"/>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x2="0" y2="80" y1="12.369">
+<stop stop-color="#ccf8ff" offset="0"/>
+<stop stop-color="#67d4ff" offset="1"/>
 </linearGradient>
-<linearGradient gradientTransform="matrix(1,0,0,-1,-315.9902,-16.5996)" gradientUnits="userSpaceOnUse" id="SVGID_2_" x1="348.3721" x2="419.7986" y1="-165.4727" y2="-94.6755">
-<stop offset="0" stop-color="#ebffff"/>
-<stop offset="1" stop-color="#0ab2ff"/>
+<linearGradient id="SVGID_2_" y2="-94.676" gradientUnits="userSpaceOnUse" y1="-165.47" gradientTransform="matrix(1 0 0 -1 -315.99 -16.6)" x2="419.8" x1="348.37">
+<stop stop-color="#ebffff" offset="0"/>
+<stop stop-color="#0ab2ff" offset="1"/>
 </linearGradient>
-<linearGradient gradientTransform="matrix(1,0,0,-1,-315.9902,-16.5996)" gradientUnits="userSpaceOnUse" id="SVGID_3_" x1="478.9404" x2="451.2592" y1="-166.6392" y2="-105.5098">
-<stop offset="0" stop-color="#a2ffff"/>
-<stop offset="1" stop-color="#32c8ff"/>
+<linearGradient id="SVGID_3_" y2="-105.51" gradientUnits="userSpaceOnUse" y1="-166.64" gradientTransform="matrix(1 0 0 -1 -315.99 -16.6)" x2="451.26" x1="478.94">
+<stop stop-color="#a2ffff" offset="0"/>
+<stop stop-color="#32c8ff" offset="1"/>
 </linearGradient>
-<linearGradient gradientUnits="userSpaceOnUse" id="SVGID_5_" x2="0" y1="205" y2="5">
-<stop offset="0" stop-color="#244d80"/>
-<stop offset="1" stop-color="#0176c5"/>
+<linearGradient id="SVGID_5_" gradientUnits="userSpaceOnUse" x2="0" y2="5" y1="205">
+<stop stop-color="#244d80" offset="0"/>
+<stop stop-color="#0176c5" offset="1"/>
 </linearGradient>
 </defs>
 <title>Nuvola apps package</title>
-<path d="m105,12.369-90.093,33.091 90.093,34.54 90.093-34.54-90.093-33.091z" fill="url(#SVGID_1_)"/>
-<path d="m14.907,45.46v119.32l90.093,32.85v-117.63l-90.093-34.54z" fill="url(#SVGID_2_)"/>
-<path d="m195.093,45.46-90.093,34.54v117.63l90.093-32.85v-119.32z" fill="url(#SVGID_3_)"/>
-<path d="m14.907,45.46 90.093,34.54 90.093-34.54m-90.093,34.54v117.63" fill="none" stroke="#fff" stroke-linejoin="round" stroke-width="2.4"/>
-<path d="m197.479,38.966-90.097-33.091-2.384-.875-2.385.875-90.092,33.091-4.533,1.665v4.831 119.321 4.843l4.549,1.658 90.089,32.851 2.372.865 2.37-.865 90.094-32.851 4.55-1.658v-4.843-119.321-4.831l-4.533-1.665zm-2.387,125.817-90.094,32.851-90.093-32.851v-119.321l90.093-33.092 90.094,33.092v119.321z" fill="url(#SVGID_5_)"/>
+<path d="m105 12.369-90.093 33.091 90.093 34.54 90.093-34.54-90.093-33.091z" fill="url(#SVGID_1_)"/>
+<path d="m14.907 45.46v119.32l90.093 32.85v-117.63l-90.093-34.54z" fill="url(#SVGID_2_)"/>
+<path d="m195.09 45.46-90.093 34.54v117.63l90.093-32.85v-119.32z" fill="url(#SVGID_3_)"/>
+<path stroke-linejoin="round" stroke="#fff" stroke-width="2.4" d="m14.907 45.46 90.093 34.54 90.093-34.54m-90.093 34.54v117.63" fill="none"/>
+<path d="m197.48 38.966-90.097-33.091-2.384-0.875-2.385 0.875-90.092 33.091-4.533 1.665v128.99l4.549 1.658 90.089 32.851 2.372 0.865 2.37-0.865 90.094-32.851 4.55-1.658v-128.99l-4.533-1.665zm-2.387 125.82-90.094 32.851-90.093-32.851v-119.32l90.093-33.092 90.094 33.092v119.32z" fill="url(#SVGID_5_)"/>
 </svg>
diff --git a/streams/icons/listenlive.svg b/streams/icons/listenlive.svg
index 90a49aa..faf4dde 100644
--- a/streams/icons/listenlive.svg
+++ b/streams/icons/listenlive.svg
@@ -1,24 +1,24 @@
-<svg viewBox="0 0 128 128" xmlns="http://www.w3.org/2000/svg">
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
 <defs>
-<linearGradient gradientUnits="userSpaceOnUse" id="linearGradient8229" x2="0" y1="9.107" y2="127.4757">
-<stop offset="0" stop-color="#600"/>
-<stop offset="1" stop-color="#c00"/>
+<linearGradient id="linearGradient8229" gradientUnits="userSpaceOnUse" x2="0" y2="127.48" y1="9.107">
+<stop stop-color="#600" offset="0"/>
+<stop stop-color="#c00" offset="1"/>
 </linearGradient>
-<linearGradient gradientUnits="userSpaceOnUse" id="linearGradient8231" x2="0" y1="11.6721" y2="124.9047">
-<stop offset="0" stop-color="#f76701"/>
-<stop offset=".5" stop-color="#ff3"/>
-<stop offset="1" stop-color="#ff9600"/>
+<linearGradient id="linearGradient8231" gradientUnits="userSpaceOnUse" x2="0" y2="124.9" y1="11.672">
+<stop stop-color="#f76701" offset="0"/>
+<stop stop-color="#ff3" offset=".5"/>
+<stop stop-color="#ff9600" offset="1"/>
 </linearGradient>
-<linearGradient gradientUnits="userSpaceOnUse" id="linearGradient8233" x2="0" y1="123.1515" y2="10.7649">
-<stop offset="0" stop-color="#ff9600"/>
-<stop offset=".5" stop-color="#ff3"/>
-<stop offset="1" stop-color="#fff"/>
+<linearGradient id="linearGradient8233" gradientUnits="userSpaceOnUse" x2="0" y2="10.765" y1="123.15">
+<stop stop-color="#ff9600" offset="0"/>
+<stop stop-color="#ff3" offset=".5"/>
+<stop stop-color="#fff" offset="1"/>
 </linearGradient>
 </defs>
-<g transform="matrix(1.32846,0,0,1.07576,-166.13249,-10.01386)">
-<path d="m163.5454,14.7546h33.4691l-18.9708,31.0286h19.3194l-17.0832,25.761 14.6041.1233-38.66,52.2103 14.0089-45.3227h-12.9207l14.8047-27.0704-19.0306-.1233 10.4591-36.6068z" fill="none" stroke="#000" stroke-linecap="round" stroke-linejoin="round" stroke-opacity=".502" stroke-width="9.2416"/>
-<path d="m162.5185,13.7278h33.4691l-18.9708,31.0286h19.3194l-17.0832,25.761 14.6041.1233-38.66,52.2103 14.0089-45.3227h-12.9207l14.8047-27.0704-19.0306-.1233 10.4591-36.6068z" fill="none" stroke="url(#linearGradient8229)" stroke-linecap="round" stroke-linejoin="round" stroke-width="9.2416"/>
-<path d="m162.5185,13.7278h33.4691l-18.9708,31.0286h19.3194l-17.0832,25.761 14.6041.1233-38.66,52.2103 14.0089-45.3227h-12.9207l14.8047-27.0704-19.0306-.1233 10.4591-36.6068z" fill="none" stroke="url(#linearGradient8231)" stroke-linecap="round" stroke-linejoin="round" stroke-width="4.1074"/>
-<path d="m162.5992,14.013h33.4691l-18.9708,31.0286h19.3194l-17.0832,25.761 14.6041.1233-38.66,52.2103 14.0089-45.3227h-12.9207l14.8047-27.0704-19.0306-.1233 10.4591-36.6068z" fill="url(#linearGradient8233)" fill-rule="evenodd"/>
+<g transform="matrix(1.3285 0 0 1.0758 -166.13 -10.014)">
+<path stroke-linejoin="round" d="m163.55 14.755h33.469l-18.971 31.029h19.319l-17.083 25.761 14.604 0.1233-38.66 52.21 14.009-45.323h-12.921l14.805-27.07-19.031-0.1233 10.459-36.607z" stroke-opacity=".502" stroke="#000" stroke-linecap="round" stroke-width="9.2416" fill="none"/>
+<path stroke-linejoin="round" d="m162.52 13.728h33.469l-18.971 31.029h19.319l-17.083 25.761 14.604 0.1233-38.66 52.21 14.009-45.323h-12.921l14.805-27.07-19.031-0.1233 10.459-36.607z" stroke="url(#linearGradient8229)" stroke-linecap="round" stroke-width="9.2416" fill="none"/>
+<path stroke-linejoin="round" d="m162.52 13.728h33.469l-18.971 31.029h19.319l-17.083 25.761 14.604 0.1233-38.66 52.21 14.009-45.323h-12.921l14.805-27.07-19.031-0.1233 10.459-36.607z" stroke="url(#linearGradient8231)" stroke-linecap="round" stroke-width="4.1074" fill="none"/>
+<path fill-rule="evenodd" d="m162.6 14.013h33.469l-18.971 31.029h19.319l-17.083 25.761 14.604 0.1233-38.66 52.21 14.009-45.323h-12.921l14.805-27.07-19.031-0.1233 10.459-36.607z" fill="url(#linearGradient8233)"/>
 </g>
 </svg>
diff --git a/streams/icons/radiogfm.png b/streams/icons/radiogfm.png
new file mode 100644
index 0000000..fde167e
Binary files /dev/null and b/streams/icons/radiogfm.png differ
diff --git a/streams/icons/rockradio.svg b/streams/icons/rockradio.svg
index 472e0b7..fd9ce7a 100644
--- a/streams/icons/rockradio.svg
+++ b/streams/icons/rockradio.svg
@@ -1,4 +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:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 640 640">
+<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="">
@@ -8,39 +8,39 @@
 </cc:Work>
 </rdf:RDF>
 </metadata>
-<g transform="matrix(1.03253,0,0,1.04682,-.02626,-30.11268)" 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 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" stroke="#000" stroke-width="1.2962" fill="#fff"/>
-<path d="m708.15,130.77h26.264a4.7898,4.7898,0,0,1,4.7898,4.7898,4.7898,4.7898,0,0,1,-4.7898,4.7898h-26.264a4.7898,4.7898,0,0,1,-4.7898,-4.7898,4.7898,4.7898,0,0,1,4.7898,-4.7898" transform="matrix(1.26693,1.35501,-1.10266,1.24555,-502.82405,-773.06983)" stroke="#000" stroke-linecap="round" stroke-width="1.0169" fill="#e6e6e6"/>
-<path d="m706.89,164.37h27.527a4.7814,4.7814,0,0,1,4.7814,4.7814,4.7814,4.7814,0,0,1,-4.7814,4.7814h-27.527a4.7814,4.7814,0,0,1,-4.7814,-4.7814,4.7814,4.7814,0,0,1,4.7814,-4.7814" transform="matrix(1.26693,1.35501,-1.10266,1.24555,-502.82405,-773.06983)" stroke="#000" stroke-linecap="round" stroke-width="1.0336" fill="#e6e6e6"/>
-<path d="m728.08-99.51h26.838a4.8736,4.8736,0,0,1,4.8736,4.8736,4.8736,4.8736,0,0,1,-4.8736,4.8736h-26.838a4.8736,4.8736,0,0,1,-4.8736,-4.8736,4.8736,4.8736,0,0,1,4.8736,-4.8736" transform="matrix(1.09552,1.51977,1.27412,-1.03673,-502.82405,-773.06983)" stroke="#000" stroke-linecap="round" stroke-width="1.0364" fill="#e6e6e6"/>
-<path d="m546.55,61.848-295.7,263.63c9.4297,13.406,22.885,25.728,41.59,36.635l284.85-273.19-30.741-27.078z" stroke="#000" stroke-width="1.6621" fill="#c87137"/>
-<g transform="matrix(1.08676,0,0,1.1379,156.43993,-5.28275)">
-<path d="m388.18,45.12-1.2797-0.049s-8.3364-5.2678-7.3364-8.7707,7.9707-6.9327,11.336-5.2408,2.1262,12.008,2.1262,12.008l-1.0749,1.25,2.1531,4.2764-3.5944,1.6617-2.3303-5.1359z" stroke="#000" stroke-width="1.3363" fill="#999"/>
-<path d="m371.9,52.17-1.2797-0.049s-8.3364-5.2678-7.3364-8.7707,7.9707-6.9327,11.336-5.2408,2.1262,12.008,2.1262,12.008l-1.0749,1.25,2.1531,4.2765-3.5944,1.6617-2.3302-5.136z" stroke="#000" stroke-width="1.3363" fill="#999"/>
-<path d="m353.75,60.002-1.2797-0.049s-8.3364-5.2678-7.3364-8.7707,7.9707-6.9327,11.336-5.2408,2.1262,12.008,2.1262,12.008l-1.0749,1.2501,2.1531,4.2764-3.5945,1.6617-2.3302-5.1359z" stroke="#000" stroke-width="1.3363" fill="#999"/>
-<path d="m337.33,69.06-1.2797-0.049s-8.3363-5.2678-7.3364-8.7707,7.9707-6.9327,11.336-5.2408,2.1262,12.008,2.1262,12.008l-1.0749,1.25,2.1531,4.2764-3.5945,1.6617-2.3302-5.136z" stroke="#000" stroke-width="1.3363" fill="#999"/>
-<path d="m320.5,76.087-1.2797-0.049s-8.3363-5.2678-7.3363-8.7706,7.9707-6.9327,11.336-5.2408,2.1262,12.008,2.1262,12.008l-1.0749,1.25,2.1531,4.2765-3.5945,1.6617-2.3302-5.136z" stroke="#000" stroke-width="1.3363" fill="#999"/>
-<path d="m304.05,84.568-1.2798-0.049s-8.3363-5.2679-7.3364-8.7707,7.9708-6.9327,11.336-5.2409,2.1262,12.008,2.1262,12.008l-1.0749,1.25,2.1531,4.2764-3.5944,1.6617-2.3302-5.1359z" stroke="#000" stroke-width="1.3363" fill="#999"/>
-<path d="m294.65,115.42c-6.8258-9.125-5.5248-17.124,3.9031-23.997,0.0471,0.7114,66.513-36.7,97.369-46.921,25.014-13.208,29.854,21.438,29.762,26.634-0.3393,19.115-28.13,24.566-33.261,11.768-13.019,18.992-20.807,44.989-37.584,58.478-12.033-1.111-24.308-1.9249-33.104,1.7046l-27.085-27.666z" stroke="#000" stroke-width="1.1656" fill="#9d530a"/>
-<path d="m291.88-129.96h43.414a0.3303,0.3303,0,0,1,0.3303,0.3303v4.6532a0.3303,0.3303,0,0,1,-0.3303,0.3303h-43.414a0.3303,0.3303,0,0,1,-0.3303,-0.3303v-4.6532a0.3303,0.3303,0,0,1,0.3303,-0.3303" transform="matrix(.69956,.71457,-.67981,.73339,0,0)" stroke="#000" stroke-width="1.123" fill="#d38d5f"/>
-<path d="m383.44,68.437c-1.8526,1.9986-5.0799,1.8562-7.2085-0.3181s-2.3523-5.557-0.4998-7.5556,5.08-1.8561,7.2085,0.318,2.3523,5.557,0.4998,7.5556z" fill="#b3b3b3"/>
-<path d="m366.81,77.092c-1.8526,1.9986-5.0799,1.8562-7.2085-0.318s-2.3523-5.557-0.4997-7.5556,5.0799-1.8561,7.2085,0.3181,2.3523,5.557,0.4998,7.5556z" fill="#b3b3b3"/>
-<path d="m349.7,85.656c-1.8526,1.9986-5.0799,1.8562-7.2085-0.318s-2.3523-5.557-0.4997-7.5556,5.08-1.8562,7.2085,0.318,2.3523,5.557,0.4997,7.5556z" fill="#b3b3b3"/>
-<path d="m331.97,93.65c-1.8526,1.9986-5.0799,1.8562-7.2085-0.318s-2.3523-5.557-0.4998-7.5556,5.0799-1.8561,7.2085,0.3181,2.3523,5.557,0.4998,7.5556z" fill="#b3b3b3"/>
-<path d="m399.45,60.585c-1.8526,1.9986-5.0799,1.8562-7.2085-0.318s-2.3523-5.557-0.4997-7.5556,5.0799-1.8562,7.2085,0.318,2.3523,5.557,0.4997,7.5556z" fill="#b3b3b3"/>
-<path d="m316.94,101.72c-1.8526,1.9986-5.0799,1.8563-7.2085-0.318s-2.3523-5.557-0.4998-7.5556,5.08-1.8561,7.2085,0.318,2.3523,5.557,0.4997,7.5556z" fill="#b3b3b3"/>
+<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"/>
+<path d="m708.15 130.77h26.264a4.7898 4.7898 0 0 1 4.7898 4.7898 4.7898 4.7898 0 0 1 -4.7898 4.7898h-26.264a4.7898 4.7898 0 0 1 -4.7898 -4.7898 4.7898 4.7898 0 0 1 4.7898 -4.7898" transform="matrix(1.2669 1.355 -1.1027 1.2456 -502.82 -773.07)" stroke="#000" stroke-linecap="round" stroke-width="1.0169" fill="#e6e6e6"/>
+<path d="m706.89 164.37h27.527a4.7814 4.7814 0 0 1 4.7814 4.7814 4.7814 4.7814 0 0 1 -4.7814 4.7814h-27.527a4.7814 4.7814 0 0 1 -4.7814 -4.7814 4.7814 4.7814 0 0 1 4.7814 -4.7814" transform="matrix(1.2669 1.355 -1.1027 1.2456 -502.82 -773.07)" stroke="#000" stroke-linecap="round" stroke-width="1.0336" fill="#e6e6e6"/>
+<path d="m728.08-99.51h26.838a4.8736 4.8736 0 0 1 4.8736 4.8736 4.8736 4.8736 0 0 1 -4.8736 4.8736h-26.838a4.8736 4.8736 0 0 1 -4.8736 -4.8736 4.8736 4.8736 0 0 1 4.8736 -4.8736" transform="matrix(1.0955 1.5198 1.2741 -1.0367 -502.82 -773.07)" stroke="#000" stroke-linecap="round" stroke-width="1.0364" fill="#e6e6e6"/>
+<path stroke="#000" stroke-width="1.6621" d="m546.55 61.848-295.7 263.63c9.4297 13.406 22.885 25.728 41.59 36.635l284.85-273.19-30.741-27.078z" fill="#c87137"/>
+<g transform="matrix(1.0868 0 0 1.1379 156.44 -5.2828)">
+<path stroke="#000" stroke-width="1.3363" d="m388.18 45.12-1.2797-0.049s-8.3364-5.2678-7.3364-8.7707 7.9707-6.9327 11.336-5.2408 2.1262 12.008 2.1262 12.008l-1.0749 1.25 2.1531 4.2764-3.5944 1.6617-2.3303-5.1359z" fill="#999"/>
+<path stroke="#000" stroke-width="1.3363" d="m371.9 52.17-1.2797-0.049s-8.3364-5.2678-7.3364-8.7707 7.9707-6.9327 11.336-5.2408 2.1262 12.008 2.1262 12.008l-1.0749 1.25 2.1531 4.2765-3.5944 1.6617-2.3302-5.136z" fill="#999"/>
+<path stroke="#000" stroke-width="1.3363" d="m353.75 60.002-1.2797-0.049s-8.3364-5.2678-7.3364-8.7707 7.9707-6.9327 11.336-5.2408 2.1262 12.008 2.1262 12.008l-1.0749 1.2501 2.1531 4.2764-3.5945 1.6617-2.3302-5.1359z" fill="#999"/>
+<path stroke="#000" stroke-width="1.3363" d="m337.33 69.06-1.2797-0.049s-8.3363-5.2678-7.3364-8.7707 7.9707-6.9327 11.336-5.2408 2.1262 12.008 2.1262 12.008l-1.0749 1.25 2.1531 4.2764-3.5945 1.6617-2.3302-5.136z" fill="#999"/>
+<path stroke="#000" stroke-width="1.3363" d="m320.5 76.087-1.2797-0.049s-8.3363-5.2678-7.3363-8.7706 7.9707-6.9327 11.336-5.2408 2.1262 12.008 2.1262 12.008l-1.0749 1.25 2.1531 4.2765-3.5945 1.6617-2.3302-5.136z" fill="#999"/>
+<path stroke="#000" stroke-width="1.3363" d="m304.05 84.568-1.2798-0.049s-8.3363-5.2679-7.3364-8.7707 7.9708-6.9327 11.336-5.2409 2.1262 12.008 2.1262 12.008l-1.0749 1.25 2.1531 4.2764-3.5944 1.6617-2.3302-5.1359z" fill="#999"/>
+<path stroke="#000" stroke-width="1.1656" d="m294.65 115.42c-6.8258-9.125-5.5248-17.124 3.9031-23.997 0.0471 0.7114 66.513-36.7 97.369-46.921 25.014-13.208 29.854 21.438 29.762 26.634-0.3393 19.115-28.13 24.566-33.261 11.768-13.019 18.992-20.807 44.989-37.584 58.478-12.033-1.111-24.308-1.9249-33.104 1.7046l-27.085-27.666z" fill="#9d530a"/>
+<path stroke="#000" stroke-width="1.123" fill="#d38d5f" d="m291.88-129.96h43.414a0.3303 0.3303 0 0 1 0.3303 0.3303v4.6532a0.3303 0.3303 0 0 1 -0.3303 0.3303h-43.414a0.3303 0.3303 0 0 1 -0.3303 -0.3303v-4.6532a0.3303 0.3303 0 0 1 0.3303 -0.3303" transform="matrix(.69956,.71457,-.67981,.73339,0,0)"/>
+<path d="m383.44 68.437c-1.8526 1.9986-5.0799 1.8562-7.2085-0.3181s-2.3523-5.557-0.4998-7.5556 5.08-1.8561 7.2085 0.318 2.3523 5.557 0.4998 7.5556z" fill="#b3b3b3"/>
+<path d="m366.81 77.092c-1.8526 1.9986-5.0799 1.8562-7.2085-0.318s-2.3523-5.557-0.4997-7.5556 5.0799-1.8561 7.2085 0.3181 2.3523 5.557 0.4998 7.5556z" fill="#b3b3b3"/>
+<path d="m349.7 85.656c-1.8526 1.9986-5.0799 1.8562-7.2085-0.318s-2.3523-5.557-0.4997-7.5556 5.08-1.8562 7.2085 0.318 2.3523 5.557 0.4997 7.5556z" fill="#b3b3b3"/>
+<path d="m331.97 93.65c-1.8526 1.9986-5.0799 1.8562-7.2085-0.318s-2.3523-5.557-0.4998-7.5556 5.0799-1.8561 7.2085 0.3181 2.3523 5.557 0.4998 7.5556z" fill="#b3b3b3"/>
+<path d="m399.45 60.585c-1.8526 1.9986-5.0799 1.8562-7.2085-0.318s-2.3523-5.557-0.4997-7.5556 5.0799-1.8562 7.2085 0.318 2.3523 5.557 0.4997 7.5556z" fill="#b3b3b3"/>
+<path d="m316.94 101.72c-1.8526 1.9986-5.0799 1.8563-7.2085-0.318s-2.3523-5.557-0.4998-7.5556 5.08-1.8561 7.2085 0.318 2.3523 5.557 0.4997 7.5556z" fill="#b3b3b3"/>
 </g>
-<g stroke="#000" stroke-linecap="round" transform="matrix(.88608,.94768,-.8622,.97393,258.81268,-286.04253)" fill="#e6e6e6">
-<path d="m384.93,434.46c0,4.5207-4.0973,8.1855-9.1515,8.1855s-9.1516-3.6648-9.1516-8.1855,4.0973-8.1854,9.1516-8.1854,9.1515,3.6647,9.1515,8.1854z"/>
-<path d="m415.98,448.67c0,4.5206-4.0973,8.1855-9.1515,8.1855s-9.1515-3.6648-9.1515-8.1855,4.0973-8.1854,9.1515-8.1854,9.1515,3.6648,9.1515,8.1854z"/>
-<path d="m439.45,467.4c0,4.5207-4.0973,8.1855-9.1515,8.1855s-9.1515-3.6648-9.1515-8.1855,4.0973-8.1854,9.1515-8.1854,9.1515,3.6648,9.1515,8.1854z"/>
+<g stroke="#000" stroke-linecap="round" transform="matrix(.88608 .94768 -.8622 .97393 258.81 -286.04)" fill="#e6e6e6">
+<path d="m384.93 434.46c0 4.5207-4.0973 8.1855-9.1515 8.1855s-9.1516-3.6648-9.1516-8.1855 4.0973-8.1854 9.1516-8.1854 9.1515 3.6647 9.1515 8.1854z"/>
+<path d="m415.98 448.67c0 4.5206-4.0973 8.1855-9.1515 8.1855s-9.1515-3.6648-9.1515-8.1855 4.0973-8.1854 9.1515-8.1854 9.1515 3.6648 9.1515 8.1854z"/>
+<path d="m439.45 467.4c0 4.5207-4.0973 8.1855-9.1515 8.1855s-9.1515-3.6648-9.1515-8.1855 4.0973-8.1854 9.1515-8.1854 9.1515 3.6648 9.1515 8.1854z"/>
 </g>
-<path d="m411.85,198.95h62.326a7.9539,7.9539,0,0,1,7.9539,7.9539v21.061a7.9539,7.9539,0,0,1,-7.9539,7.9539h-62.326a7.9539,7.9539,0,0,1,-7.9539,-7.9539v-21.061a7.9539,7.9539,0,0,1,7.9539,-7.9539" transform="matrix(.68297,.73045,-.66285,.74875,0,0)" stroke="#000" stroke-linecap="round" stroke-width="1.7567" fill="#858687"/>
-<path d="m406.8,224.92h47.574a8.6091,8.6091,0,0,1,8.6091,8.6091v3.2434a8.6091,8.6091,0,0,1,-8.6091,8.6091h-47.574a8.6091,8.6091,0,0,1,-8.6091,-8.6091v-3.2434a8.6091,8.6091,0,0,1,8.6091,-8.6091" transform="matrix(.71039,.70381,-.63108,.77572,0,0)" stroke="#000" stroke-linecap="round" stroke-width="1.8363" fill="#2e3436"/>
-<g stroke="#000" transform="matrix(.88608,.94768,-.8622,.97393,258.81268,-286.04253)">
-<path d="m371.26,386.82c-0.7895,30.874-2.5913,54.65-7.9439,80.742-2.1543,2.094-3.2054,10.456,0.3612,8.3972,7.9117-14.425,10.251-59.543,12.277-89.139h-4.694z" fill="#2e3436"/>
-<path d="m517.24,133.08a1.894,1.894,0,0,1,1.894,1.894v17.425a1.894,1.894,0,0,1,-1.894,1.894,1.894,1.894,0,0,1,-1.894,-1.894v-17.425a1.894,1.894,0,0,1,1.894,-1.894" transform="matrix(1.4293,.03435,-.0384,1.27843,-359.62271,172.75699)" stroke-linecap="round" fill="#ccc"/>
+<path d="m411.85 198.95h62.326a7.9539 7.9539 0 0 1 7.9539 7.9539v21.061a7.9539 7.9539 0 0 1 -7.9539 7.9539h-62.326a7.9539 7.9539 0 0 1 -7.9539 -7.9539v-21.061a7.9539 7.9539 0 0 1 7.9539 -7.9539" transform="matrix(.68297,.73045,-.66285,.74875,0,0)" stroke="#000" stroke-linecap="round" stroke-width="1.7567" fill="#858687"/>
+<path d="m406.8 224.92h47.574a8.6091 8.6091 0 0 1 8.6091 8.6091v3.2434a8.6091 8.6091 0 0 1 -8.6091 8.6091h-47.574a8.6091 8.6091 0 0 1 -8.6091 -8.6091v-3.2434a8.6091 8.6091 0 0 1 8.6091 -8.6091" transform="matrix(.71039,.70381,-.63108,.77572,0,0)" stroke="#000" stroke-linecap="round" stroke-width="1.8363" fill="#2e3436"/>
+<g stroke="#000" transform="matrix(.88608 .94768 -.8622 .97393 258.81 -286.04)">
+<path d="m371.26 386.82c-0.7895 30.874-2.5913 54.65-7.9439 80.742-2.1543 2.094-3.2054 10.456 0.3612 8.3972 7.9117-14.425 10.251-59.543 12.277-89.139h-4.694z" fill="#2e3436"/>
+<path stroke-linecap="round" fill="#ccc" d="m517.24 133.08a1.894 1.894 0 0 1 1.894 1.894v17.425a1.894 1.894 0 0 1 -1.894 1.894 1.894 1.894 0 0 1 -1.894 -1.894v-17.425a1.894 1.894 0 0 1 1.894 -1.894" transform="matrix(1.4293 .03435 -.0384 1.2784 -359.62 172.76)"/>
 </g>
 </g>
 </svg>
diff --git a/streams/icons/shoutcast.svg b/streams/icons/shoutcast.svg
index a1d2403..8b59039 100644
--- a/streams/icons/shoutcast.svg
+++ b/streams/icons/shoutcast.svg
@@ -1,4 +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:dc="http://purl.org/dc/elements/1.1/" viewBox="0 0 256 256">
+<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="">
@@ -8,37 +8,37 @@
 </cc:Work>
 </rdf:RDF>
 </metadata>
-<g fill-rule="evenodd" transform="matrix(6.62315,0,0,5.19145,15.76741,55.66796)" fill="#f8b600">
-<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 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>
-<g fill-rule="evenodd" transform="matrix(6.62315,0,0,5.19145,15.86382,55.51865)" fill="#f8b600">
-<path d="m0,38.256,28.984-18.505-0.008-5.2211-3.9007-1.3655,9.1967-9.296v-3.8685l-27.718,15.863v5.2639h5.2972l-11.844,11.967-0.0066,5.1745v-0.0121z"/>
+<g fill="#f8b600" transform="matrix(6.6232 0 0 5.1914 15.864 55.519)" fill-rule="evenodd">
+<path d="m0 38.256 28.984-18.505-0.008-5.2211-3.9007-1.3655 9.1967-9.296v-3.8685l-27.718 15.863v5.2639h5.2972l-11.844 11.967-0.0066 5.1745v-0.0121z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(6.62315,0,0,5.19145,17.40688,131.09295)" fill="#e86923">
-<path d="m0,18.559,28.726-18.559-10.561,6.0141-18.165,12.545z"/>
+<g fill="#e86923" transform="matrix(6.6232 0 0 5.1914 17.407 131.09)" fill-rule="evenodd">
+<path d="m0 18.559 28.726-18.559-10.561 6.0141-18.165 12.545z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(6.62315,0,0,5.19145,62.60454,138.26221)" fill="#e86923">
-<path d="m9.8473,0h-9.8473l6.9541,0.5368,2.8932-0.5368z"/>
+<g fill="#e86923" transform="matrix(6.6232 0 0 5.1914 62.605 138.26)" fill-rule="evenodd">
+<path d="m9.8473 0h-9.8473l6.9541 0.5368 2.8932-0.5368z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(6.62315,0,0,5.19145,156.99397,56.90515)" fill="#e86923">
-<path d="m0,11.405,12.805-11.405-5.3185,5.6123-7.4869,5.7929z"/>
+<g fill="#e86923" transform="matrix(6.6232 0 0 5.1914 156.99 56.905)" fill-rule="evenodd">
+<path d="m0 11.405 12.805-11.405-5.3185 5.6123-7.4869 5.7929z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(6.62315,0,0,5.19145,156.0135,57.0204)" fill="#f8f4c7">
-<path d="m0,11.375,2.0152-2.5017,10.789-8.8733-12.804,11.375z"/>
+<g fill="#f8f4c7" transform="matrix(6.6232 0 0 5.1914 156.01 57.02)" fill-rule="evenodd">
+<path d="m0 11.375 2.0152-2.5017 10.789-8.8733-12.804 11.375z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(5.82814,0,0,5.40616,126.32886,55.45665)" fill="#161413">
-<path d="m0,1.0499c0,0.5799,0.4694,1.0499,1.0486,1.0499s1.0486-0.47,1.0486-1.0499-0.4695-1.0499-1.0486-1.0499-1.0486,0.47-1.0486,1.0499z"/>
+<g fill="#161413" transform="matrix(5.8281 0 0 5.4062 126.33 55.457)" fill-rule="evenodd">
+<path d="m0 1.0499c0 0.5799 0.4694 1.0499 1.0486 1.0499s1.0486-0.47 1.0486-1.0499-0.4695-1.0499-1.0486-1.0499-1.0486 0.47-1.0486 1.0499z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(5.82814,0,0,5.40616,109.92206,37.38029)" fill="#161413">
-<path d="m4.2525,0.364c1.8712,0.364,3.0916,2.1758,2.728,4.0466-0.1917,0.9909-0.7935,1.7974-1.5921,2.2844,0.6162-0.4516,1.071-1.1259,1.2284-1.9349,0.3319-1.7057-0.7828-3.3605-2.49-3.6931s-3.3599,0.7842-3.6918,2.4912c-0.1706,0.8759,0.041,1.7347,0.5156,2.4115-0.6439-0.7711-0.9507-1.8132-0.7445-2.8761,0.3637-1.8709,2.1753-3.0936,4.0463-2.7296z"/>
+<g fill="#161413" transform="matrix(5.8281 0 0 5.4062 109.92 37.38)" fill-rule="evenodd">
+<path d="m4.2525 0.364c1.8712 0.364 3.0916 2.1758 2.728 4.0466-0.1917 0.9909-0.7935 1.7974-1.5921 2.2844 0.6162-0.4516 1.071-1.1259 1.2284-1.9349 0.3319-1.7057-0.7828-3.3605-2.49-3.6931s-3.3599 0.7842-3.6918 2.4912c-0.1706 0.8759 0.041 1.7347 0.5156 2.4115-0.6439-0.7711-0.9507-1.8132-0.7445-2.8761 0.3637-1.8709 2.1753-3.0936 4.0463-2.7296z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(5.82814,0,0,5.40616,88.84071,16.93452)" fill="#161413">
-<path d="m3.487,1.8616c2.7597-1.8616,6.5044-1.1337,8.3662,1.6259,0.9851,1.4623,1.2377,3.1995,0.8543,4.7888,0.2023-1.3183-0.0662-2.7138-0.8715-3.9078-1.6978-2.5174-5.1174-3.1824-7.6351-1.4845s-3.1827,5.1187-1.4836,7.6375c0.8701,1.2908,2.1925,2.0906,3.614,2.3394-1.7469-0.1533-3.4129-1.0644-4.4708-2.6314-1.8605-2.7596-1.1318-6.5063,1.6265-8.3679z"/>
+<g fill="#161413" transform="matrix(5.8281 0 0 5.4062 88.841 16.935)" fill-rule="evenodd">
+<path d="m3.487 1.8616c2.7597-1.8616 6.5044-1.1337 8.3662 1.6259 0.9851 1.4623 1.2377 3.1995 0.8543 4.7888 0.2023-1.3183-0.0662-2.7138-0.8715-3.9078-1.6978-2.5174-5.1174-3.1824-7.6351-1.4845s-3.1827 5.1187-1.4836 7.6375c0.8701 1.2908 2.1925 2.0906 3.614 2.3394-1.7469-0.1533-3.4129-1.0644-4.4708-2.6314-1.8605-2.7596-1.1318-6.5063 1.6265-8.3679z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(5.82814,0,0,5.40616,81.13942,.06912)" fill="#161413">
-<path d="m9.8499,0.7148c-4.5156-0.7148-8.7564,2.3655-9.4703,6.8834-0.3795,2.393,0.3147,4.7023,1.715,6.4578-1.0155-1.5238-1.4916-3.4181-1.1822-5.37,0.652-4.1224,4.5224-6.9357,8.6428-6.2824s6.9329,4.5243,6.2809,8.6454c-0.3344,2.113-1.5167,3.8776-3.1404,5.0113,2.084-1.207,3.6298-3.3068,4.0357-5.8714,0.7153-4.5177-2.3657-8.7593-6.8814-9.4741z"/>
+<g fill="#161413" transform="matrix(5.8281 0 0 5.4062 81.139 .06912)" fill-rule="evenodd">
+<path d="m9.8499 0.7148c-4.5156-0.7148-8.7564 2.3655-9.4703 6.8834-0.3795 2.393 0.3147 4.7023 1.715 6.4578-1.0155-1.5238-1.4916-3.4181-1.1822-5.37 0.652-4.1224 4.5224-6.9357 8.6428-6.2824s6.9329 4.5243 6.2809 8.6454c-0.3344 2.113-1.5167 3.8776-3.1404 5.0113 2.084-1.207 3.6298-3.3068 4.0357-5.8714 0.7153-4.5177-2.3657-8.7593-6.8814-9.4741z"/>
 </g>
-<g fill-rule="evenodd" transform="matrix(5.82814,0,0,5.40616,125.93283,65.60541)" fill="#161413">
-<path d="m0.8582,0.0929-0.8582,12.899,2.482-1.0199-0.9217-11.972-0.7021,0.0929z"/>
+<g fill="#161413" transform="matrix(5.8281 0 0 5.4062 125.93 65.605)" fill-rule="evenodd">
+<path d="m0.8582 0.0929-0.8582 12.899 2.482-1.0199-0.9217-11.972-0.7021 0.0929z"/>
 </g>
 </svg>
diff --git a/streams/icons/tunein.svg b/streams/icons/tunein.svg
index b5fc306..80a4af6 100644
--- a/streams/icons/tunein.svg
+++ b/streams/icons/tunein.svg
@@ -1 +1 @@
-<svg viewBox="0 0 759.25 759.125" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><defs><clipPath><path d="m5918.72,5008.6c0,251.6-89.44,466.85-266.36,642.78-176.91,176.91-392.15,266.35-644.75,266.35h-3941.22c-252.589,0-467.835-89.44-644.749-266.35-176.911-175.93-266.352-391.18-266.352-642.78v-3944.18c0-251.6 89.441-466.85 266.352-643.76s392.16-266.351 644.749-266.351h3941.22c252.6,0 467.84,89.441 644.75,266.351 176.92,176.91 266.36,392.16 266.36,643.76v3944.18z"></path></clipPath><radialGradient cx="0" cy="0" fx="0" fy="0" gradientTransform="matrix(377.232,0,0,-376.588,303.7,303.602)" gradientUnits="userSpaceOnUse" r="1"><stop offset="0" stop-color="#fff"></stop><stop offset="1" stop-color="#e9e9e9"></stop><stop offset="1" stop-color="#e9e9e9"></stop></radialGradient></defs><g transform="matrix(1.25,0,0,-1.25,0,759.125)"><g transform="matrix(1.46265,0,0,1.46265,-143.17659,-153.31484)"><path d="m352.548,496.338c-13.269,13.171-29.092,19.756-47.865,19.756s-34.793-6.585-47.963-19.756-19.853-29.191-19.853-47.864c0-18.576 6.683-34.597 19.853-47.766s29.191-19.756 47.963-19.756 34.596,6.585 47.865,19.756 19.853,29.19 19.853,47.766c0,18.673-6.585,34.694-19.853,47.864" fill="#bee4e2"></path><path d="m250.43,226.252c-3.342-.099-5.013-1.868-5.307-5.308v-106.737c.294-3.342 1.965-5.111 5.307-5.308h59.953c28.896,5.406 46.194,22.606 51.698,51.6v60.445c-.196,3.44-1.965,5.209-5.307,5.308h-106.344" fill="#6aa4dd"></path><path d="m362.474,249.152v53.369c-4.324,36.365-23.883,55.923-58.872,58.676h-183.596c-3.244-.099-5.013-1.868-5.21-5.21v-60.445c5.406-29.092 22.606-46.194 51.699-51.697h190.672c3.342.097 5.111,1.965 5.307,5.307" fill="#e05c23"></path><path d="m378.79,302.521v-53.467c.196-3.342 1.965-5.111 5.307-5.209h60.544c29.092,5.405 46.292,22.605 51.796,51.599v60.446c-.197,3.44-1.966,5.209-5.209,5.307h-53.664c-17.003-1.376-30.468-6.782-40.199-16.119-10.123-9.828-16.413-24.079-18.575-42.557" fill="#8cd6e9"></path></g></g></svg>
+<svg xml:space="preserve" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 759.25 759.125"><g transform="matrix(1.25 0 0 -1.25 0 759.12)"><g transform="matrix(1.4626 0 0 1.4626 -143.18 -153.31)"><path d="m352.55 496.34c-13.269 13.171-29.092 19.756-47.865 19.756s-34.793-6.585-47.963-19.756-19.853-29.191-19.853-47.864c0-18.576 6.683-34.597 19.853-47.766s29.191-19.756 47.963-19.756 34.596 6.585 47.865 19.756 19.853 29.19 19.853 47.766c0 18.673-6.585 34.694-19.853 47.864" fill="#bee4e2"/><path d="m250.43 226.25c-3.342-0.099-5.013-1.868-5.307-5.308v-106.74c0.294-3.342 1.965-5.111 5.307-5.308h59.953c28.896 5.406 46.194 22.606 51.698 51.6v60.445c-0.196 3.44-1.965 5.209-5.307 5.308h-106.34" fill="#6aa4dd"/><path d="m362.47 249.15v53.369c-4.324 36.365-23.883 55.923-58.872 58.676h-183.6c-3.244-0.099-5.013-1.868-5.21-5.21v-60.445c5.406-29.092 22.606-46.194 51.699-51.697h190.67c3.342 0.097 5.111 1.965 5.307 5.307" fill="#e05c23"/><path d="m378.79 302.52v-53.467c0.196-3.342 1.965-5.111 5.307-5.209h60.544c29.092 5.405 46.292 22.605 51.796 51.599v60.446c-0.197 3.44-1.966 5.209-5.209 5.307h-53.664c-17.003-1.376-30.468-6.782-40.199-16.119-10.123-9.828-16.413-24.079-18.575-42.557" fill="#8cd6e9"/></g></g></svg>
diff --git a/streams/providers/1.fm.png b/streams/providers/1.fm.png
new file mode 100644
index 0000000..4b37ecf
Binary files /dev/null and b/streams/providers/1.fm.png differ
diff --git a/streams/providers/1.fm.xml.gz b/streams/providers/1.fm.xml.gz
new file mode 100644
index 0000000..2c501f3
Binary files /dev/null and b/streams/providers/1.fm.xml.gz differ
diff --git a/streams/providers/CMakeLists.txt b/streams/providers/CMakeLists.txt
new file mode 100644
index 0000000..40595e6
--- /dev/null
+++ b/streams/providers/CMakeLists.txt
@@ -0,0 +1,8 @@
+if (WIN32)
+    set(STREAM_PROVIDER_PREFIX ${CMAKE_INSTALL_PREFIX}/streams)
+else (WIN32)
+    set(STREAM_PROVIDER_PREFIX ${CMAKE_INSTALL_PREFIX}/share/${CMAKE_PROJECT_NAME}/streams)
+endif (WIN32)
+
+install(FILES 1.fm.png DESTINATION ${STREAM_PROVIDER_PREFIX}/1.fm RENAME icon.png)
+install(FILES 1.fm.xml.gz DESTINATION ${STREAM_PROVIDER_PREFIX}/1.fm RENAME streams.xml.gz)
diff --git a/streams/streamfetcher.cpp b/streams/streamfetcher.cpp
index dc89ec8..a1a9c94 100644
--- a/streams/streamfetcher.cpp
+++ b/streams/streamfetcher.cpp
@@ -249,7 +249,7 @@ void StreamFetcher::dataReady()
     data+=job->readAll();
 
     if (data.count()>constMaxData) {
-        QNetworkReply *thisJob=job;
+        NetworkJob *thisJob=job;
         disconnect(thisJob, SIGNAL(readyRead()), this, SLOT(dataReady()));
         disconnect(thisJob, SIGNAL(finished()), this, SLOT(jobFinished()));
         jobFinished(thisJob);
@@ -260,45 +260,34 @@ void StreamFetcher::dataReady()
 
 void StreamFetcher::jobFinished()
 {
-    QNetworkReply *reply=qobject_cast<QNetworkReply *>(sender());
+    NetworkJob *reply=qobject_cast<NetworkJob *>(sender());
     if (reply) {
         jobFinished(reply);
     }
 }
 
-void StreamFetcher::jobFinished(QNetworkReply *reply)
+void StreamFetcher::jobFinished(NetworkJob *reply)
 {
     // We only handle 1 job at a time!
     if (reply==job) {
         bool redirected=false;
         if (!reply->error()) {
-            QVariant redirect = reply->header(QNetworkRequest::LocationHeader);
-            if (redirect.isValid() && ++redirects<constMaxRedirects) {
-                current=redirect.toString();
-                DBUG << "real redirect" << current;
+            QString u=parse(data);
+            if (u.isEmpty() || u==current) {
+                DBUG << "use (empty/current)" << current;
+                done.append(MPDParseUtils::addStreamName(current.startsWith(StreamsModel::constPrefix) ? current.mid(StreamsModel::constPrefix.length()) : current, currentName));
+            } else if (u.startsWith(QLatin1String("http://")) && ++redirects<constMaxRedirects) {
+                // Redirect...
+                current=u;
+                DBUG << "semi-redirect" << current;
                 data.clear();
-                job=NetworkAccessManager::self()->get(current, constTimeout);
+                job=NetworkAccessManager::self()->get(u, constTimeout);
                 connect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
                 connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
                 redirected=true;
             } else {
-                QString u=parse(data);
-                if (u.isEmpty() || u==current) {
-                    DBUG << "use (empty/current)" << current;
-                    done.append(MPDParseUtils::addStreamName(current.startsWith(StreamsModel::constPrefix) ? current.mid(StreamsModel::constPrefix.length()) : current, currentName));
-                } else if (u.startsWith(QLatin1String("http://")) && ++redirects<constMaxRedirects) {
-                    // Redirect...
-                    current=u;
-                    DBUG << "semi-redirect" << current;
-                    data.clear();
-                    job=NetworkAccessManager::self()->get(u, constTimeout);
-                    connect(job, SIGNAL(readyRead()), this, SLOT(dataReady()));
-                    connect(job, SIGNAL(finished()), this, SLOT(jobFinished()));
-                    redirected=true;
-                } else {
-                    DBUG << "use" << u;
-                    done.append(MPDParseUtils::addStreamName(u, currentName));
-                }
+                DBUG << "use" << u;
+                done.append(MPDParseUtils::addStreamName(u, currentName));
             }
         } else {
             DBUG << "error " << reply->errorString() << " - use" << current;
diff --git a/streams/streamfetcher.h b/streams/streamfetcher.h
index 5f39993..b2737dc 100644
--- a/streams/streamfetcher.h
+++ b/streams/streamfetcher.h
@@ -29,7 +29,7 @@
 #include <QByteArray>
 #include <QStringList>
 
-class QNetworkReply;
+class NetworkJob;
 
 class StreamFetcher : public QObject
 {
@@ -58,10 +58,10 @@ private Q_SLOTS:
     void jobFinished();
 
 private:
-    void jobFinished(QNetworkReply *reply);
+    void jobFinished(NetworkJob *reply);
 
 private:
-    QNetworkReply *job;
+    NetworkJob *job;
     QString current;
     QString currentName;
     QStringList todo;
diff --git a/streams/streamspage.cpp b/streams/streamspage.cpp
index 7bf542e..d024257 100644
--- a/streams/streamspage.cpp
+++ b/streams/streamspage.cpp
@@ -31,7 +31,6 @@
 #include "actioncollection.h"
 #include "networkaccessmanager.h"
 #include "settings.h"
-#include "streamsmodel.h"
 #include "statuslabel.h"
 #include "digitallyimported.h"
 #include "digitallyimportedsettings.h"
@@ -42,7 +41,6 @@
 #include <QFileDialog>
 #include <QDir>
 #endif
-#include <QAction>
 #include <QMenu>
 #include <QFileInfo>
 #if QT_VERSION >= 0x050000
@@ -66,6 +64,7 @@ StreamsPage::StreamsPage(QWidget *p)
 //     connect(view, SIGNAL(itemsSelected(bool)), addToPlaylist, SLOT(setEnabled(bool)));
     connect(view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &)));
     connect(view, SIGNAL(searchIsActive(bool)), this, SLOT(controlSearch(bool)));
+    connect(view, SIGNAL(searchItems()), this, SLOT(searchItems()));
     connect(view, SIGNAL(itemsSelected(bool)), SLOT(controlActions()));
     connect(searchView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(itemDoubleClicked(const QModelIndex &)));
     connect(searchView, SIGNAL(searchItems()), this, SLOT(searchItems()));
@@ -82,10 +81,12 @@ StreamsPage::StreamsPage(QWidget *p)
     connect(StreamsModel::self(), SIGNAL(error(const QString &)), this, SIGNAL(error(const QString &)));
     connect(StreamsModel::self(), SIGNAL(loading()), view, SLOT(showSpinner()));
     connect(StreamsModel::self(), SIGNAL(loaded()), view, SLOT(hideSpinner()));
+    connect(StreamsModel::self(), SIGNAL(categoriesChanged()), view, SLOT(closeSearch()));
     connect(&searchModel, SIGNAL(loading()), searchView, SLOT(showSpinner()));
     connect(&searchModel, SIGNAL(loaded()), searchView, SLOT(hideSpinner()));
     connect(MPDConnection::self(), SIGNAL(dirChanged()), SLOT(mpdDirChanged()));
     connect(DigitallyImported::self(), SIGNAL(loginStatus(bool,QString)), SLOT(updateDiStatus()));
+    connect(DigitallyImported::self(), SIGNAL(updated()), SLOT(updateDiStatus()));
     QMenu *menu=new QMenu(this);
     menu->addAction(addAction);
     menu->addAction(StdActions::self()->removeAction);
@@ -95,6 +96,9 @@ StreamsPage::StreamsPage(QWidget *p)
     menu->addAction(importAction);
     menu->addAction(exportAction);
     menu->addSeparator();
+    QAction *configAction=new QAction(Icons::self()->configureIcon, i18n("Configure..."), this);
+    menu->addAction(configAction);
+    connect(configAction, SIGNAL(triggered(bool)), this, SLOT(showPreferencesPage()));
     menuButton->setMenu(menu);
     Icon::init(replacePlayQueue);
 
@@ -116,17 +120,22 @@ StreamsPage::StreamsPage(QWidget *p)
     searchView->addAction(StreamsModel::self()->addBookmarkAct());
     searchProxy.setSourceModel(&searchModel);
     searchView->setModel(&searchProxy);
-    searchView->setBackgroundImage(StreamsModel::self()->tuneInIcon());
 
-    diStatusLabel->setText("DI");
-    updateDiStatus();
-    searchView->setSearchLabelText(i18n("Search TuneIn:"));
+    diStatusLabel->setText("DI", i18nc("Service name", "Digitally Imported"));
+    connect(diStatusLabel, SIGNAL(clicked()), SLOT(diSettings()));
+    updateDiStatus();  
 }
 
 StreamsPage::~StreamsPage()
 {
 }
 
+void StreamsPage::showEvent(QShowEvent *e)
+{
+    view->focusView();
+    QWidget::showEvent(e);
+}
+
 void StreamsPage::setEnabled(bool e)
 {
     if (e==enabled) {
@@ -160,7 +169,7 @@ void StreamsPage::refresh()
         searchView->setLevel(0);
         StreamsModel::self()->reloadFavourites();
         exportAction->setEnabled(StreamsModel::self()->rowCount()>0);
-        view->expand(proxy->mapFromSource(StreamsModel::self()->favouritesIndex()));
+        view->expand(proxy->mapFromSource(StreamsModel::self()->favouritesIndex()), true);
     }
 }
 
@@ -222,7 +231,6 @@ void StreamsPage::configureStreams()
 void StreamsPage::diSettings()
 {
     DigitallyImportedSettings(this).show();
-    updateDiStatus();
 }
 
 void StreamsPage::importXml()
@@ -349,7 +357,7 @@ void StreamsPage::addToFavourites()
         if (urlStr.endsWith('&')) {
             urlStr=urlStr.left(urlStr.length()-1);
         }
-        if (StreamsModel::self()->addToFavourites(urlStr, item->name)) {
+        if (StreamsModel::self()->addToFavourites(urlStr, item->modifiedName())) {
             added++;
         }
     }
@@ -497,7 +505,40 @@ void StreamsPage::searchItems()
     if (!searching) {
         return;
     }
-    searchModel.search(searchView->searchText().trimmed(), false);
+    if (proxy==&searchProxy) {
+        searchModel.search(searchView->searchText().trimmed(), false);
+    } else {
+        QString text=view->searchText().trimmed();
+        if (!view->isSearchActive()) {
+            proxy->setFilterItem(0);
+        }
+        proxy->update(view->isSearchActive() ? text : QString(), QString());
+        if (proxy->enabled() && !text.isEmpty()) {
+            view->expandAll(proxy->filterItem()
+                            ? proxy->mapFromSource(StreamsModel::self()->categoryIndex(static_cast<const StreamsModel::CategoryItem *>(proxy->filterItem())))
+                            : QModelIndex());
+        }
+    }
+}
+
+StreamsModel::CategoryItem * StreamsPage::getSearchCategory()
+{
+    bool srch=searching;
+    searching=false;
+    QModelIndexList selected = itemView()->selectedIndexes(false); // Dont need sorted selection here...
+    searching=srch;
+
+    if (1!=selected.size()) {
+        return StreamsModel::self()->tuneInCat();
+    }
+
+    QModelIndex index=proxy->mapToSource(selected.first());
+    StreamsModel::Item *item=static_cast<StreamsModel::Item *>(index.internalPointer());
+    if (!item) {
+        return StreamsModel::self()->tuneInCat();
+    }
+    StreamsModel::CategoryItem *cat=item->getTopLevelCategory();
+    return 0==cat ? StreamsModel::self()->tuneInCat() : cat;
 }
 
 void StreamsPage::controlSearch(bool on)
@@ -505,14 +546,46 @@ void StreamsPage::controlSearch(bool on)
     if (on!=searching) {
         searching=on;
         if (searching) {
-            proxy=&searchProxy;
+            StreamsModel::CategoryItem *cat=getSearchCategory();
+            StreamSearchModel::Category searchCat=StreamsModel::self()->isTuneIn(cat)
+                                                    ? StreamSearchModel::TuneIn
+                                                    : StreamsModel::self()->isShoutCast(cat)
+                                                        ? StreamSearchModel::ShoutCast
+                                                        : StreamSearchModel::Filter;
+
+            if (StreamSearchModel::Filter==searchCat) {
+                proxy=&streamsProxy;
+                searchModel.clear();
+                viewStack->setCurrentIndex(0);
+                view->setSearchLabelText(i18n("Search %1:", cat->name));
+                view->setBackgroundImage(cat->icon);
+                proxy->setFilterItem(cat);
+                proxy->update(QString(), QString());
+                QModelIndex filterIndex=cat ? StreamsModel::self()->categoryIndex(cat) : QModelIndex();
+                if (filterIndex.isValid()) {
+                    view->expand(proxy->mapFromSource(filterIndex), true);
+                }
+                // We need to call focusSearch via 'invokeMethod' as we need this to occur at the nex event-loop iteration.
+                // This is due to the fact that we have 2 views - search (for TuneIn/ShoutCasy) and standard. Our focusSearch()
+                // calls focusSearch on both - which triggers this controlSearch().
+                QMetaObject::invokeMethod(view, "focusSearch", Qt::QueuedConnection);
+            } else {
+                proxy=&searchProxy;
+                searchModel.setCat(searchCat);
+                viewStack->setCurrentIndex(1);
+                searchView->setSearchLabelText(i18n("Search %1:", cat->name));
+                searchView->setBackgroundImage(cat->icon);
+            }
             view->clearSelection();
         } else {
+            proxy->setFilterItem(0);
+            proxy->update(QString(), QString());
             proxy=&streamsProxy;
             searchModel.clear();
             view->setSearchVisible(false);
+            viewStack->setCurrentIndex(0);
+            view->setBackgroundImage(QIcon());
         }
-        viewStack->setCurrentIndex(on ? 1 : 0);
         controlActions();
     }
 }
@@ -599,18 +672,11 @@ void StreamsPage::updateDiStatus()
     if (DigitallyImported::self()->user().isEmpty() || DigitallyImported::self()->pass().isEmpty()) {
         diStatusLabel->setVisible(false);
     } else {
-        bool loggedIn=DigitallyImported::self()->loggedIn();
-        diStatusLabel->setVisible(true);
-        diStatusLabel->setToolTip(loggedIn ? i18n("Logged into Digitally Imported") : i18n("<b>NOT</b> logged into Digitally Imported"));
-        QString col=loggedIn
-                        ? palette().highlight().color().name()
-                        : palette().color(QPalette::Disabled, QPalette::WindowText).name();
-
-        int margin=style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this);
-        if (margin<2) {
-            margin=2;
-        }
-        diStatusLabel->setStyleSheet(QString("QLabel { color : %1; border-radius: %4px; border: 2px solid %2; margin: %3px}")
-                                     .arg(col).arg(col).arg(margin).arg(margin*2));
+        diStatusLabel->setStatus(DigitallyImported::self()->loggedIn());
     }
 }
+
+void StreamsPage::showPreferencesPage()
+{
+    emit showPreferencesPage(QLatin1String("streams"));
+}
diff --git a/streams/streamspage.h b/streams/streamspage.h
index 3003a41..9cf0823 100644
--- a/streams/streamspage.h
+++ b/streams/streamspage.h
@@ -27,6 +27,7 @@
 #include "ui_streamspage.h"
 #include "streamsproxymodel.h"
 #include "streamsearchmodel.h"
+#include "streamsmodel.h"
 
 class Action;
 class QAction;
@@ -48,11 +49,13 @@ public:
     void focusSearch() { view->focusSearch(); searchView->focusSearch(); }
     void goBack() { itemView()->backActivated(); }
     ItemView *itemView() { return searching ? searchView : view; }
+    void showEvent(QShowEvent *e);
 
 Q_SIGNALS:
     void add(const QStringList &streams, bool replace, quint8 priorty);
 
     void error(const QString &str);
+    void showPreferencesPage(const QString &page);
 
 public Q_SLOTS:
     void mpdDirChanged();
@@ -75,9 +78,11 @@ private Q_SLOTS:
     void controlSearch(bool on);
     void itemDoubleClicked(const QModelIndex &index);
     void updateDiStatus();
+    void showPreferencesPage();
 
 private:
     void addItemsToPlayQueue(const QModelIndexList &indexes, bool replace, quint8 priorty=0);
+    StreamsModel::CategoryItem *getSearchCategory();
 
 private:
     bool enabled;
diff --git a/streams/streamspage.ui b/streams/streamspage.ui
index a9c2c57..027375c 100644
--- a/streams/streamspage.ui
+++ b/streams/streamspage.ui
@@ -11,6 +11,9 @@
    </rect>
   </property>
   <layout class="QVBoxLayout" name="vlayout">
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <property name="leftMargin">
     <number>0</number>
    </property>
@@ -35,7 +38,7 @@
    <item>
     <layout class="QHBoxLayout" name="hlayout">
      <property name="spacing">
-      <number>0</number>
+      <number>1</number>
      </property>
      <property name="leftMargin">
       <number>0</number>
@@ -50,14 +53,7 @@
       <number>0</number>
      </property>
      <item>
-      <widget class="QLabel" name="diStatusLabel">
-       <property name="font">
-        <font>
-         <weight>75</weight>
-         <bold>true</bold>
-        </font>
-       </property>
-      </widget>
+      <widget class="ServiceStatusLabel" name="diStatusLabel"/>
      </item>
      <item>
       <spacer name="horizontalSpacer">
@@ -73,6 +69,9 @@
       </spacer>
      </item>
      <item>
+      <widget class="SizeWidget" name="sizeWidget"/>
+     </item>
+     <item>
       <widget class="MenuButton" name="menuButton"/>
      </item>
      <item>
@@ -98,6 +97,16 @@
    <extends>QToolButton</extends>
    <header>toolbutton.h</header>
   </customwidget>
+  <customwidget>
+   <class>SizeWidget</class>
+   <extends>QWidget</extends>
+   <header>sizewidget.h</header>
+  </customwidget>
+  <customwidget>
+   <class>ServiceStatusLabel</class>
+   <extends>QLabel</extends>
+   <header>servicestatuslabel.h</header>
+  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>
diff --git a/streams/streamssettings.cpp b/streams/streamssettings.cpp
new file mode 100644
index 0000000..aeafce6
--- /dev/null
+++ b/streams/streamssettings.cpp
@@ -0,0 +1,260 @@
+/*
+ * 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 "streamssettings.h"
+#include "streamsmodel.h"
+#include "basicitemdelegate.h"
+#include "icon.h"
+#include "localize.h"
+#include "tar.h"
+#include "messagebox.h"
+#include "utils.h"
+#include "digitallyimportedsettings.h"
+#include <QListWidget>
+#include <QFileInfo>
+#ifdef ENABLE_KDE_SUPPORT
+#include <KDE/KFileDialog>
+#else
+#include <QFileDialog>
+#endif
+
+enum Roles {
+    KeyRole = Qt::UserRole,
+    BuiltInRole,
+    ConfigurableRole
+};
+
+static bool removeDir(const QString &d, const QStringList &types)
+{
+    QDir dir(d);
+    if (dir.exists()) {
+        QFileInfoList files=dir.entryInfoList(types, QDir::Files|QDir::NoDotAndDotDot);
+        foreach (const QFileInfo &file, files) {
+            if (!QFile::remove(file.absoluteFilePath())) {
+                return false;
+            }
+        }
+        return dir.rmdir(d);
+    }
+    return true; // Does not exist...
+}
+
+StreamsSettings::StreamsSettings(QWidget *p)
+    : QWidget(p)
+{
+    setupUi(this);
+    categories->setItemDelegate(new BasicItemDelegate(categories));
+    categories->setSortingEnabled(true);
+    int iSize=Icon::stdSize(QApplication::fontMetrics().height()*1.25);
+    categories->setIconSize(QSize(iSize, iSize));
+    connect(categories, SIGNAL(currentRowChanged(int)), SLOT(currentCategoryChanged(int)));
+    connect(installButton, SIGNAL(clicked()), this, SLOT(install()));
+    connect(removeButton, SIGNAL(clicked()), this, SLOT(remove()));
+    connect(configureButton, SIGNAL(clicked()), this, SLOT(configure()));
+    removeButton->setEnabled(false);
+    configureButton->setEnabled(false);
+}
+
+void StreamsSettings::load()
+{
+    QList<StreamsModel::Category> cats=StreamsModel::self()->getCategories();
+    QFont f(font());
+    f.setItalic(true);
+    foreach (const StreamsModel::Category &cat, cats) {
+        QListWidgetItem *item=new QListWidgetItem(cat.name, categories);
+        item->setCheckState(cat.hidden ? Qt::Unchecked : Qt::Checked);
+        item->setData(KeyRole, cat.key);
+        item->setData(BuiltInRole, cat.builtin);
+        item->setData(ConfigurableRole, cat.configurable);
+        item->setIcon(cat.icon);
+        if (cat.builtin) {
+            item->setFont(f);
+        }
+    }
+}
+
+void StreamsSettings::save()
+{
+    QSet<QString> disabled;
+    for (int i=0; i<categories->count(); ++i) {
+        QListWidgetItem *item=categories->item(i);
+        if (Qt::Unchecked==item->checkState()) {
+            disabled.insert(item->data(Qt::UserRole).toString());
+        }
+    }
+    StreamsModel::self()->setHiddenCategories(disabled);
+}
+
+void StreamsSettings::currentCategoryChanged(int row)
+{
+    bool enableRemove=false;
+    bool enableConfigure=false;
+
+    if (row>=0) {
+        QListWidgetItem *item=categories->item(row);
+        enableRemove=!item->data(BuiltInRole).toBool();
+        enableConfigure=item->data(ConfigurableRole).toBool();
+    }
+    removeButton->setEnabled(enableRemove);
+    configureButton->setEnabled(enableConfigure);
+}
+
+void StreamsSettings::install()
+{
+    #ifdef ENABLE_KDE_SUPPORT
+    QString fileName=KFileDialog::getOpenFileName(KUrl(), i18n("*.streams|Cantata Streams"), this, i18n("Install Streams"));
+    #else
+    QString fileName=QFileDialog::getOpenFileName(this, i18n("Install Streams"), QDir::homePath(), i18n("Cantata Streams (*.streams)"));
+    #endif
+    if (fileName.isEmpty()) {
+        return;
+    }
+
+    QString name=QFileInfo(fileName).baseName();
+    if (name.isEmpty()) {
+        return;
+    }
+    name=name.replace(Utils::constDirSep, "_");
+    #ifdef Q_OS_WIN
+    name=name.replace("\\", "_");
+    #endif
+
+    QListWidgetItem *existing=get(name);
+
+    if (existing && MessageBox::No==MessageBox::warningYesNo(this, i18n("A category named <b>%1</b> already exists!<br/>Overwrite?", name))) {
+        return;
+    }
+
+    Tar tar(fileName);
+    if (!tar.open()) {
+        MessageBox::error(this, i18n("Failed top open %1", fileName));
+        return;
+    }
+
+    QMap<QString, QByteArray> files=tar.extract(QStringList() << StreamsModel::constXmlFile << StreamsModel::constCompressedXmlFile
+                                                              << StreamsModel::constPngIcon << StreamsModel::constSvgIcon
+                                                              << ".png" << ".svg");
+    QString streamsName=files.contains(StreamsModel::constCompressedXmlFile) ? StreamsModel::constCompressedXmlFile : StreamsModel::constXmlFile;
+    QString iconName=files.contains(StreamsModel::constSvgIcon) ? StreamsModel::constSvgIcon : StreamsModel::constPngIcon;
+    QByteArray xml=files[streamsName];
+    QByteArray icon=files[iconName];
+
+    if (xml.isEmpty() || icon.isEmpty()) {
+        MessageBox::error(this, i18n("Invalid file format!"));
+        return;
+    }
+
+    QString streamsDir=Utils::dataDir(StreamsModel::constSubDir, true);
+    QString dir=streamsDir+name;
+    if (!QDir(dir).exists() && !QDir(dir).mkpath(dir)) {
+        MessageBox::error(this, i18n("Failed to create stream category folder!"));
+        return;
+    }
+
+    QFile streamsFile(dir+Utils::constDirSep+streamsName);
+    if (!streamsFile.open(QIODevice::WriteOnly)) {
+        MessageBox::error(this, i18n("Failed to save stream list!"));
+        return;
+    }
+    streamsFile.write(xml);
+
+    QFile iconFile(dir+Utils::constDirSep+iconName);
+    if (iconFile.open(QIODevice::WriteOnly)) {
+        iconFile.write(icon);
+    }
+    QIcon icn;
+    icn.addFile(dir+Utils::constDirSep+iconName);
+
+    // Write all other png and svg files...
+    QMap<QString, QByteArray>::ConstIterator it=files.constBegin();
+    QMap<QString, QByteArray>::ConstIterator end=files.constEnd();
+    for (; it!=end; ++it) {
+        if (it.key()!=iconName && (it.key().endsWith(".png") || it.key().endsWith(".svg"))) {
+            QFile f(dir+Utils::constDirSep+it.key());
+            if (f.open(QIODevice::WriteOnly)) {
+                f.write(it.value());
+            }
+        }
+    }
+
+    StreamsModel::CategoryItem *cat=StreamsModel::self()->addXmlCategory(name, icn, dir+Utils::constDirSep+streamsName, true);
+    if (existing) {
+        delete existing;
+    }
+
+    QListWidgetItem *item=new QListWidgetItem(name, categories);
+    item->setCheckState(Qt::Checked);
+    item->setData(KeyRole, cat->configName);
+    item->setData(BuiltInRole, false);
+    item->setData(ConfigurableRole, false);
+    item->setIcon(icn);
+}
+
+void StreamsSettings::remove()
+{
+    int row=categories->currentRow();
+    if (row<0) {
+        return;
+    }
+
+    QListWidgetItem *item=categories->item(row);
+    if (!item->data(BuiltInRole).toBool() && MessageBox::No==MessageBox::warningYesNo(this, i18n("Are you sure you wish to remove <b>%1</b>?", item->text()))) {
+        return;
+    }
+
+    QString dir=Utils::dataDir(StreamsModel::constSubDir);
+    if (!dir.isEmpty() && !removeDir(dir+item->text(), QStringList() << "*.xml" << "*.xml.gz" << "*.png" << "*.svg")) {
+        MessageBox::error(this, i18n("Failed to remove streams folder!"));
+        return;
+    }
+
+    StreamsModel::self()->removeXmlCategory(item->data(KeyRole).toString());
+    delete item;
+}
+
+void StreamsSettings::configure()
+{
+    int row=categories->currentRow();
+    if (row<0) {
+        return;
+    }
+
+    QListWidgetItem *item=categories->item(row);
+    if (!item->data(ConfigurableRole).toBool()) {
+        return;
+    }
+
+    // TODO: Currently only digitally imported can be configured...
+    DigitallyImportedSettings(this).show();
+}
+
+QListWidgetItem *  StreamsSettings::get(const QString &name)
+{
+    for (int i=0; i<categories->count(); ++i) {
+        QListWidgetItem *item=categories->item(i);
+        if (!item->data(BuiltInRole).toBool() && item->text()==name) {
+            return item;
+        }
+    }
+    return 0;
+}
diff --git a/gui/filesettings.h b/streams/streamssettings.h
similarity index 69%
copy from gui/filesettings.h
copy to streams/streamssettings.h
index d125562..5d59a9c 100644
--- a/gui/filesettings.h
+++ b/streams/streamssettings.h
@@ -21,27 +21,32 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef FILESETTINGS_H
-#define FILESETTINGS_H
+#ifndef STREAMS_SETTINGS_H
+#define STREAMS_SETTINGS_H
 
-#include "ui_filesettings.h"
+#include "ui_streamssettings.h"
 
-class FileSettings : public QWidget, private Ui::FileSettings
+class QListWidgetItem;
+
+class StreamsSettings : public QWidget, private Ui::StreamsSettings
 {
     Q_OBJECT
 
 public:
-    FileSettings(QWidget *p);
-    virtual ~FileSettings() { }
+    StreamsSettings(QWidget *p);
+    virtual ~StreamsSettings() { }
 
     void load();
     void save();
 
-Q_SIGNALS:
-    void reloadStreams();
-
 private Q_SLOTS:
-    void streamLocationChanged();
+    void currentCategoryChanged(int row);
+    void install();
+    void remove();
+    void configure();
+
+private:
+    QListWidgetItem * get(const QString &name);
 };
 
 #endif
diff --git a/streams/streamssettings.ui b/streams/streamssettings.ui
new file mode 100644
index 0000000..4206197
--- /dev/null
+++ b/streams/streamssettings.ui
@@ -0,0 +1,91 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>StreamsSettings</class>
+ <widget class="QWidget" name="Form">
+  <layout class="QGridLayout" name="layout">
+   <property name="margin">
+    <number>0</number>
+   </property>
+   <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>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+   <item row="1" column="0" colspan="4">
+    <widget class="QListWidget" name="categories"/>
+   </item>
+   <item row="2" column="0">
+    <spacer name="spacer">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="sizeType">
+      <enum>QSizePolicy::MinimumExpanding</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>0</width>
+       <height>0</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="2" column="1">
+    <widget class="QPushButton" name="configureButton">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Configure Provider</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="2">
+    <widget class="QPushButton" name="installButton">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Install</string>
+     </property>
+    </widget>
+   </item>
+   <item row="2" column="3">
+    <widget class="QPushButton" name="removeButton">
+     <property name="sizePolicy">
+      <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="text">
+      <string>Remove</string>
+     </property>
+    </widget>
+   </item>
+   <item row="3" column="0" colspan="4">
+    <widget class="QLabel" name="note">
+     <property name="text">
+      <string><i><b>NOTE:</b> Built-in categories are shown in italic, and these cannot be removed.</i></string>
+     </property>
+     <property name="wordWrap">
+      <bool>true</bool>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/streams/tar.cpp b/streams/tar.cpp
new file mode 100644
index 0000000..e826ca4
--- /dev/null
+++ b/streams/tar.cpp
@@ -0,0 +1,143 @@
+/*
+ * 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 "tar.h"
+#include "qtiocompressor/qtiocompressor.h"
+
+Tar::Tar(const QString &fileName)
+    : file(fileName)
+    , compressor(0)
+{
+}
+
+Tar::~Tar()
+{
+    delete compressor;
+}
+
+bool Tar::open()
+{
+    if (!file.open(QIODevice::ReadOnly)) {
+        return false;
+    }
+
+    // Check for gzip header...
+    QByteArray header=file.read(2);
+    bool isCompressed=((unsigned char)header[0])==0x1f && ((unsigned char)header[1])==0x8b;
+    file.seek(0);
+
+    if (isCompressed) {
+         compressor=new QtIOCompressor(&file);
+         compressor->setStreamFormat(QtIOCompressor::GzipFormat);
+         if (!compressor->open(QIODevice::ReadOnly)) {
+             return false;
+         }
+         dev=compressor;
+    } else {
+        dev=&file;
+    }
+    return true;
+}
+
+static const qint64 constHeaderLen=512;
+
+static qint64 roundUp(qint64 sz)
+{
+    return ((sz/constHeaderLen)*constHeaderLen)+(sz%constHeaderLen ? constHeaderLen : 0);
+}
+
+struct TarHeader
+{
+    TarHeader() : fileSize(0) { }
+    bool ok() const { return fileSize>0 && !fileName.isEmpty(); }
+    QString fileName;
+    qint64 fileSize;
+};
+
+static unsigned int octStrToInt(char *ch, unsigned int size) 
+{
+    unsigned int val = 0;
+    while (size > 0){
+        if (ch) {
+            val = (val * 8) + (*ch - '0');
+        }
+        ch++;
+        size--;
+    }
+    return val;
+}
+
+static TarHeader readHeader(QIODevice *dev)
+{
+    TarHeader header;
+    char buffer[constHeaderLen];
+    qint64 bytesRead=dev->read(buffer, constHeaderLen);
+    if (constHeaderLen==bytesRead && ('0'==buffer[156] || '\0'==buffer[156])) {
+        buffer[100]='\0';
+        header.fileName=QFile::decodeName(buffer);
+        header.fileSize=octStrToInt(&buffer[124], 11);
+    }
+    return header;
+}
+
+static QString getExt(const QString &fileName)
+{
+    int pos=fileName.lastIndexOf(".");
+    return -1!=pos ? fileName.mid(pos) : fileName;
+}
+
+QMap<QString, QByteArray> Tar::extract(const QStringList &files)
+{
+    QMap<QString, QByteArray> data;
+    if (!dev) {
+        return data;
+    }
+    qint64 offset=0;
+    qint64 pos=0;
+    for (;;) {
+        TarHeader header=readHeader(dev);
+        if (header.ok()) {
+            pos+=constHeaderLen;
+            if (!data.contains(header.fileName) && (files.contains(header.fileName) || files.contains(getExt(header.fileName)))) {
+                data[header.fileName]=dev->read(header.fileSize);
+                pos+=header.fileSize;
+            }
+            offset+=constHeaderLen+header.fileSize;
+            offset=roundUp(offset);
+            if (dev->isSequential()) {
+                static const qint64 constSkipBlock=1024;
+                // Can't seek with QtIOCompressor - so fake this by reading and discarding
+                while (pos<offset) {
+                    qint64 toRead=qMin(constSkipBlock, offset-pos);
+                    dev->read(toRead);
+                    pos+=toRead;
+                }
+            } else {
+                dev->seek(offset);
+            }
+        } else {
+            break;
+        }
+    }
+    return data;
+}
diff --git a/context/contextsettings.h b/streams/tar.h
similarity index 70%
copy from context/contextsettings.h
copy to streams/tar.h
index 6cf8d6b..f59be3b 100644
--- a/context/contextsettings.h
+++ b/streams/tar.h
@@ -21,26 +21,31 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef CONTEXTSETTINGS_H
-#define CONTEXTSETTINGS_H
+#ifndef TAR_H
+#define TAR_H
 
-#include <QTabWidget>
+#include <QString>
+#include <QStringList>
+#include <QList>
+#include <QMap>
+#include <QByteArray>
+#include <QFile>
 
-class WikipediaSettings;
-class LyricSettings;
-class OtherSettings;
-
-class ContextSettings : public QTabWidget {
+class QtIOCompressor;
+class Tar
+{
 public:
-    ContextSettings(QWidget *p=0);
-    virtual ~ContextSettings() { }
-    void load();
-    void save();
+    Tar(const QString &fileName);
+    ~Tar();
+
+    bool open();
+    QMap<QString, QByteArray> extract(const QStringList &files);
     
 private:
-    WikipediaSettings *wiki;
-    LyricSettings *lyrics;
-    OtherSettings *other;
+    QFile file;
+    QtIOCompressor *compressor;
+    QIODevice *dev;
 };
 
 #endif
+
diff --git a/support/CMakeLists.txt b/support/CMakeLists.txt
index e224e1c..89c7268 100644
--- a/support/CMakeLists.txt
+++ b/support/CMakeLists.txt
@@ -1,7 +1,7 @@
 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)
+    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 thread.h)
+set(SUPPORT_MOC_HDRS action.h actioncollection.h fancytabwidget.h messagewidget.h inputdialog.h thread.h)
 
 if (NOT WIN32)
     set(SUPPORT_SRCS ${SUPPORT_SRCS} onoffbutton.cpp spinbox.cpp windowmanager.cpp gtkproxystyle.cpp combobox.cpp shortcuthandler.cpp)
@@ -15,19 +15,19 @@ if (NOT WIN32)
 endif (NOT WIN32)
 
 if (ENABLE_KDE_SUPPORT )
-    macro_ensure_version("4.7.0" ${KDE_VERSION} KDE_VERSION_47)
-    if (NOT KDE_VERSION_47)
+    # 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 )
-    endif (NOT KDE_VERSION_47)
+    # endif (NOT KDE_VERSION_47)
     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
-        shortcutssettingspage.cpp keysequencewidget.cpp acceleratormanager.cpp proxystyle.cpp urllabel.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
-         dialog.h shortcutsmodel.h shortcutssettingspage.h keysequencewidget.h spinner.h acceleratormanager_private.h)
-    set(SUPPORT_UIS shortcutssettingspage.ui )
+         dialog.h shortcutsmodel.h shortcutssettingswidget.h keysequencewidget.h spinner.h acceleratormanager_private.h)
+    set(SUPPORT_UIS shortcutssettingswidget.ui )
     if (ENABLE_QT5)
         qt5_wrap_ui(SUPPORT_UI_HDRS ${SUPPORT_UIS} )
     else (ENABLE_QT5)
@@ -41,5 +41,5 @@ else (ENABLE_QT5)
     qt4_wrap_cpp(SUPPORT_MOC_SRCS ${SUPPORT_MOC_HDRS} )
 endif (ENABLE_QT5)
 
-include_directories(${CMAKE_CURRENT_BINARY_DIR} ${QTINCLUDES} )
+include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR} ${QTINCLUDES} )
 add_library(support STATIC ${SUPPORT_MOC_SRCS} ${SUPPORT_SRCS} ${SUPPORT_UI_HDRS} )
diff --git a/support/acceleratormanager.cpp b/support/acceleratormanager.cpp
index 71abefc..ccb2cd1 100644
--- a/support/acceleratormanager.cpp
+++ b/support/acceleratormanager.cpp
@@ -39,6 +39,7 @@
 #include <QStackedWidget>
 #include <QDockWidget>
 #include <QTextDocument>
+#include "pathrequester.h"
 
 //#include <kstandardaction.h>
 //#include <kdebug.h>
@@ -353,6 +354,11 @@ void AcceleratorManagerPrivate::manageWidget(QWidget *w, Item *item)
     return;
   }
 
+  if ( qobject_cast<PathRequester*>(w) ) {
+    traverseChildren(w, item);
+    return;
+  }
+
   // now treat 'ordinary' widgets
   QLabel *label =  qobject_cast<QLabel*>(w);
   if ( label  ) {
@@ -741,7 +747,6 @@ void AccelString::dump()
  * The weights probably need some tweaking so they make more sense.
 
  *********************************************************************/
-
 void AccelManagerAlgorithm::findAccelerators(AccelStringList &result, QString &used)
 {
   AccelStringList accel_strings = result;
@@ -902,7 +907,8 @@ QWidgetStackAccelManager::QWidgetStackAccelManager(QStackedWidget *stack)
 
 bool QWidgetStackAccelManager::eventFilter ( QObject * watched, QEvent * e )
 {
-    if ( e->type() == QEvent::Show && qApp->activeWindow() ) {
+    // 'Paint' seems to be required for Cantata's PageWidget???
+    if ( (e->type() == QEvent::Show || e->type() == QEvent::Paint) && qApp->activeWindow() ) {
         AcceleratorManager::manage( qApp->activeWindow() );
         watched->removeEventFilter( this );
     }
@@ -917,7 +923,6 @@ void QWidgetStackAccelManager::currentChanged(int child)
         return;
     }
 
-    AcceleratorManager::manage( m_stack->parentWidget() ); // Aded for Cantata - not sure *why* this is needed...
     static_cast<QStackedWidget*>(parent())->widget(child)->installEventFilter( this );
 }
 
diff --git a/support/action.cpp b/support/action.cpp
index bb2b75a..bd19e9a 100644
--- a/support/action.cpp
+++ b/support/action.cpp
@@ -23,6 +23,7 @@
 #include "action.h"
 #include "gtkstyle.h"
 #include <QApplication>
+#include <QKeySequence>
 
 Action::Action(QObject *parent)
 #ifdef ENABLE_KDE_SUPPORT
@@ -71,11 +72,34 @@ Action::Action(const QIcon &icon, const QString &text, QObject *parent, const QO
 
 void Action::initIcon(QAction *act)
 {
-    if (GtkStyle::isActive()) {
+    if (GtkStyle::isActive() && act) {
         act->setIconVisibleInMenu(false);
     }
 }
 
+static const char *constPlainToolTipProperty="plain-tt";
+
+void Action::updateToolTip(QAction *act)
+{
+    if (!act) {
+        return;
+    }
+    QKeySequence sc=act->shortcut();
+    if (sc.isEmpty()) {
+        act->setToolTip(act->property(constPlainToolTipProperty).toString());
+        act->setProperty(constPlainToolTipProperty, QString());
+    } else {
+        QString tt=act->property(constPlainToolTipProperty).toString();
+        if (tt.isEmpty()) {
+            tt=act->toolTip();
+            act->setProperty(constPlainToolTipProperty, tt);
+        }
+        act->setToolTip(QString::fromLatin1("%1 <span style=\"color: gray; font-size: small\">%2</span>")
+                        .arg(tt)
+                        .arg(sc.toString()));
+    }
+}
+
 #ifndef ENABLE_KDE_SUPPORT
 void Action::init() {
   connect(this, SIGNAL(triggered(bool)), this, SLOT(slotTriggered()));
diff --git a/support/action.h b/support/action.h
index ddd84a7..9e76ce5 100644
--- a/support/action.h
+++ b/support/action.h
@@ -30,6 +30,7 @@ class Action : public KAction {
 
 public:
     static void initIcon(QAction *act);
+    static void updateToolTip(QAction *act);
 
     explicit Action(QObject *parent);
     Action(const QString &text, QObject *parent, const QObject *receiver = 0, const char *slot = 0, const QKeySequence &shortcut = 0);
@@ -58,6 +59,8 @@ public:
     Q_DECLARE_FLAGS(ShortcutTypes, ShortcutType)
 
     static void initIcon(QAction *act);
+    static void updateToolTip(QAction *act);
+
     explicit Action(QObject *parent);
     Action(const QString &text, QObject *parent, const QObject *receiver = 0, const char *slot = 0, const QKeySequence &shortcut = 0);
     Action(const QIcon &icon, const QString &text, QObject *parent, const QObject *receiver = 0, const char *slot = 0, const QKeySequence &shortcut = 0);
diff --git a/support/actioncollection.cpp b/support/actioncollection.cpp
index 2228845..6a2a772 100644
--- a/support/actioncollection.cpp
+++ b/support/actioncollection.cpp
@@ -78,6 +78,13 @@ Action * ActionCollection::createAction(const QString &name, const QString &text
     return act;
 }
 
+void ActionCollection::updateToolTips()
+{
+    foreach (QAction *act, actions()) {
+        Action::updateToolTip(act);
+    }
+}
+
 #ifndef ENABLE_KDE_SUPPORT
 
 #include <QSettings>
diff --git a/support/actioncollection.h b/support/actioncollection.h
index 6d6c3ef..5247a73 100644
--- a/support/actioncollection.h
+++ b/support/actioncollection.h
@@ -39,6 +39,8 @@ public:
     static ActionCollection * get();
     Action * createAction(const QString &name, const QString &text, const char *icon=0, const QString &whatsThis=QString());
     Action * createAction(const QString &name, const QString &text, const QIcon &icon, const QString &whatsThis=QString());
+
+    void updateToolTips();
 };
 
 #else
@@ -107,12 +109,14 @@ public:
         return a;
     }
 
-signals:
+    void updateToolTips();
+
+Q_SIGNALS:
     void inserted(QAction *action);
     void actionHovered(QAction *action);
     void actionTriggered(QAction *action);
 
-protected slots:
+protected Q_SLOTS:
     virtual void connectNotify(const char *signal);
     virtual void slotActionTriggered();
 
@@ -121,7 +125,7 @@ protected:
     virtual void connectNotify(const QMetaMethod &signal);
 #endif
 
-private slots:
+private Q_SLOTS:
     void slotActionHovered();
     void actionDestroyed(QObject *);
     void associatedWidgetDestroyed(QObject *);
diff --git a/support/buddylabel.cpp b/support/buddylabel.cpp
index 7e369c6..4836fa6 100644
--- a/support/buddylabel.cpp
+++ b/support/buddylabel.cpp
@@ -51,8 +51,11 @@ bool BuddyLabel::event(QEvent *e)
 {
     if (QEvent::Shortcut==e->type()) {
         mouseReleaseEvent(0);
+        e->accept();
+        return true;
+    } else {
+        return QLabel::event(e);
     }
-    return QLabel::event(e);
 }
 
 void BuddyLabel::mouseReleaseEvent(QMouseEvent *)
diff --git a/support/dialog.cpp b/support/dialog.cpp
index 35cbc00..76d6e76 100644
--- a/support/dialog.cpp
+++ b/support/dialog.cpp
@@ -86,7 +86,7 @@ void Dialog::resize(const QSize &sz)
 #include <QStyle>
 
 namespace StdGuiItem {
-GuiItem ok() { return GuiItem(i18n("&Ok"), "dialog-ok"); }
+GuiItem ok() { return GuiItem(i18n("&OK"), "dialog-ok"); }
 GuiItem cancel() { return GuiItem(i18n("&Cancel"), "dialog-cancel"); }
 GuiItem yes() { return GuiItem(i18n("&Yes"), "dialog-ok"); }
 GuiItem no() { return GuiItem(i18n("&No"), "process-stop"); }
diff --git a/support/fancytabwidget.cpp b/support/fancytabwidget.cpp
index 85c2914..50f132e 100644
--- a/support/fancytabwidget.cpp
+++ b/support/fancytabwidget.cpp
@@ -38,6 +38,7 @@
 #include "icon.h"
 #include "gtkstyle.h"
 #include "action.h"
+#include "utils.h"
 #include <QHBoxLayout>
 #include <QMenu>
 #include <QMouseEvent>
@@ -53,6 +54,15 @@
 #include <QPropertyAnimation>
 #include <QSignalMapper>
 
+static inline int sidebarSpacing(bool withText)
+{
+    int sp=Utils::isHighDpi() ? 24 : 12;
+    if (!withText) {
+        sp*=1.25;
+    }
+    return sp;
+}
+
 static inline Qt::TextElideMode elideMode()
 {
     return Qt::LeftToRight==QApplication::layoutDirection() ? Qt::ElideRight : Qt::ElideLeft;
@@ -66,13 +76,10 @@ const int FancyTabBar::m_textPadding = 4;
 
 static int largeIconSize=32;
 static int smallIconSize=16;
-
 void FancyTabWidget::setup()
 {
-    int height=QApplication::fontMetrics().height();
-
-    if (height>22) {
-        largeIconSize=Icon::stdSize(height*2.5);
+    if (Utils::isHighDpi()) {
+        largeIconSize=Icon::stdSize(40);
         smallIconSize=16;
         if (largeIconSize>32) {
             if (largeIconSize<56) {
@@ -248,9 +255,7 @@ void FancyTabProxyStyle::drawControl(
   QString txt=text;
   txt.replace("&", "");
   txt=p->fontMetrics().elidedText(txt, elideMode(), text_rect.width());
-
   p->drawText(text_rect.translated(0, -1), textFlags, txt);
-
   p->restore();
 }
 
@@ -285,7 +290,7 @@ bool FancyTabProxyStyle::eventFilter(QObject* o, QEvent* e) {
   return false;
 }
 
-FancyTab::FancyTab(QWidget* tabbar)
+FancyTab::FancyTab(FancyTabBar* tabbar)
   : QWidget(tabbar), tabbar(tabbar), m_fader(0)
 {
   animator.setPropertyName("fader");
@@ -335,10 +340,10 @@ FancyTabBar::FancyTabBar(QWidget *parent, bool hasBorder, bool text, int iSize,
         layout=new QHBoxLayout;
 //         layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Fixed));
     } else {
-        setMinimumWidth(28);
+        setMinimumWidth(tabSizeHint().width());
         setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
         layout=new QVBoxLayout;
-        layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::Expanding));
+        layout->addSpacerItem(new QSpacerItem(0, 0, QSizePolicy::Fixed, QSizePolicy::MinimumExpanding));
     }
 
     layout->setSpacing(0);
@@ -355,17 +360,14 @@ FancyTabBar::~FancyTabBar()
 }
 
 QSize FancyTab::sizeHint() const {
-//   QFont boldFont(font());
-//   boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize());
-//   boldFont.setBold(true);
-    int iconSize=static_cast<FancyTabBar *>(parent())->iconSize();
-    const int spacing = 8;
-    if (static_cast<FancyTabBar *>(parent())->showText()) {
+    int iconSize=tabbar->iconSize();
+    bool withText=tabbar->showText();
+    int spacing = sidebarSpacing(withText);
+    if (withText) {
         QFontMetrics fm(font());
         int textWidth = fm.width(text)*1.1;
-        int width = qMax(iconSize, qMin(3*iconSize, textWidth)) + spacing + 2;
-        QSize ret(width, iconSize + iconSize + fm.height());
-        return ret;
+        int width = qMax(iconSize, qMin(3*iconSize, textWidth)) + spacing;
+        return QSize(width, iconSize + spacing + fm.height());
     } else {
         return QSize(iconSize + spacing, iconSize + spacing);
     }
@@ -373,17 +375,14 @@ QSize FancyTab::sizeHint() const {
 
 QSize FancyTabBar::tabSizeHint() const
 {
-//   QFont boldFont(font());
-//   boldFont.setPointSizeF(Utils::StyleHelper::sidebarFontSize());
-//   boldFont.setBold(true);
-    const int spacing = 8;
+    int spacing = sidebarSpacing(m_showText);
     if (m_showText) {
         QFontMetrics fm(font());
         int maxTw=0;
         foreach (FancyTab *tab, m_tabs) {
             maxTw=qMax(maxTw, tab->sizeHint().width());
         }
-        return QSize(qMax(m_iconSize + spacing + 2, maxTw), m_iconSize + spacing + fm.height());
+        return QSize(qMax(m_iconSize + spacing, maxTw), m_iconSize + spacing + fm.height());
     } else {
         return QSize(m_iconSize + spacing, m_iconSize + spacing);
     }
@@ -1122,9 +1121,39 @@ void FancyTabWidget::SetIcon(int index, const QIcon &icon)
     }
 }
 
+void FancyTabWidget::SetToolTip(int index, const QString &tt)
+{
+    if (index>0 && index<items_.count()) {
+        Item &item=items_[index];
+        item.tab_tooltip_=tt.isEmpty() ? item.tab_label_ : tt;
+
+        if (tab_bar_ && -1!=item.index_) {
+            if (qobject_cast<QTabBar *>(tab_bar_)) {
+                static_cast<QTabBar *>(tab_bar_)->setTabToolTip(item.index_, item.tab_tooltip_);
+            } else {
+                static_cast<FancyTabBar *>(tab_bar_)->setTabToolTip(item.index_, item.tab_tooltip_);
+            }
+        }
+    }
+}
+
 void FancyTabWidget::Recreate()
 {
     Mode m=mode_;
     mode_=Mode_None;
     SetMode(m);
 }
+
+QStringList FancyTabWidget::hiddenPages() const
+{
+    QStringList pages;
+    for (int i=0; i<count(); ++i) {
+        if (!isEnabled(i)) {
+            QWidget *w=widget(i);
+            if (w) {
+                pages << w->metaObject()->className();
+            }
+        }
+    }
+    return pages;
+}
diff --git a/support/fancytabwidget.h b/support/fancytabwidget.h
index 1298d3f..1c0576c 100644
--- a/support/fancytabwidget.h
+++ b/support/fancytabwidget.h
@@ -43,6 +43,7 @@
 #include <QPropertyAnimation>
 #include <QTimer>
 #include <QScopedPointer>
+#include <QStringList>
 
 //#include <boost/scoped_ptr.hpp>
 
@@ -71,12 +72,13 @@ protected:
     bool eventFilter(QObject* o, QEvent* e);
 };
 
+class FancyTabBar;
 class FancyTab : public QWidget{
     Q_OBJECT
 
     Q_PROPERTY(float fader READ fader WRITE setFader)
 public:
-    FancyTab(QWidget *tabbar);
+    FancyTab(FancyTabBar *tabbar);
     float fader() { return m_fader; }
     void setFader(float value);
 
@@ -94,7 +96,7 @@ protected:
 
 private:
     QPropertyAnimation animator;
-    QWidget *tabbar;
+    FancyTabBar *tabbar;
     float m_fader;
 };
 
@@ -193,7 +195,7 @@ public:
 
         enum Type {
             Type_Tab,
-            Type_Spacer,
+            Type_Spacer
         };
 
         Type type_;
@@ -225,7 +227,9 @@ public:
     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();
+    QStringList hiddenPages() const;
 
 public slots:
     void SetCurrentIndex(int index);
diff --git a/support/gtkproxystyle.cpp b/support/gtkproxystyle.cpp
index 83a702d..8ffff83 100644
--- a/support/gtkproxystyle.cpp
+++ b/support/gtkproxystyle.cpp
@@ -44,8 +44,6 @@
 #include <QDesktopWidget>
 #include <QLibrary>
 
-const char * GtkProxyStyle::constSlimComboProperty="gtkslim";
-
 static const char * constOnCombo="on-combo";
 #ifndef ENABLE_KDE_SUPPORT
 static const char * constAccelProp="catata-accel";
@@ -97,7 +95,6 @@ GtkProxyStyle::GtkProxyStyle(ScrollbarType sb)
     }
 
     setBaseStyle(qApp->style());
-    toolbarCombo=new QComboBox(new QToolBar());
     if (SB_Standard!=sbarType) {
         int fh=QApplication::fontMetrics().height();
         sbarPlainViewWidth=fh/1.75;
@@ -129,14 +126,7 @@ QSize GtkProxyStyle::sizeFromContents(ContentsType type, const QStyleOption *opt
 {
     QSize sz=baseStyle()->sizeFromContents(type, option, size, widget);
 
-    if (CT_ComboBox==type && widget && widget->property(constSlimComboProperty).toBool()) {
-        QSize orig=baseStyle()->sizeFromContents(type, option, size, widget);
-        QSize other=baseStyle()->sizeFromContents(type, option, size, toolbarCombo);
-        if (orig.height()>other.height()) {
-            return QSize(orig.width(), other.height());
-        }
-        return orig;
-    } else if (SB_Standard!=sbarType && CT_ScrollBar==type) {
+    if (SB_Standard!=sbarType && CT_ScrollBar==type) {
         if (const QStyleOptionSlider *sb = qstyleoption_cast<const QStyleOptionSlider *>(option)) {
             int extent(pixelMetric(PM_ScrollBarExtent, option, widget)),
                 sliderMin(pixelMetric(PM_ScrollBarSliderMin, option, widget));
diff --git a/support/gtkproxystyle.h b/support/gtkproxystyle.h
index 3917e32..7d30d5c 100644
--- a/support/gtkproxystyle.h
+++ b/support/gtkproxystyle.h
@@ -27,7 +27,6 @@
 #include <QProxyStyle>
 #include "config.h"
 
-class QComboBox;
 #ifdef ENABLE_OVERLAYSCROLLBARS
 class QScrollBar;
 class OsThumb;
@@ -39,8 +38,6 @@ class GtkProxyStyle : public QProxyStyle
     Q_OBJECT
 
 public:
-    static const char * constSlimComboProperty;
-
     enum ScrollbarType {
         SB_Standard,
         SB_Thin
@@ -84,7 +81,6 @@ private:
 
 private:
     ShortcutHandler *shortcutHander;
-    QComboBox *toolbarCombo;
 
     ScrollbarType sbarType;
     int sbarPlainViewWidth;
diff --git a/support/gtkstyle.cpp b/support/gtkstyle.cpp
index 1a5fa6d..7a703a5 100644
--- a/support/gtkstyle.cpp
+++ b/support/gtkstyle.cpp
@@ -133,60 +133,67 @@ static QString runProc(const QString &cmd, const QStringList &args)
 }
 #endif
 
+#if !defined Q_OS_WIN && !defined QT_NO_STYLE_GTK
+static QString iconThemeSetting;
+static QString themeNameSetting;
+#endif
+
 // Copied from musique
 QString GtkStyle::themeName()
 {
     #if defined Q_OS_WIN || defined QT_NO_STYLE_GTK
     return QString();
     #else
-    static QString name;
-    static bool read=false;
 
-    if (read) {
-        return name;
-    }
-    read=true;
+    if (themeNameSetting.isEmpty()) {
+        static bool read=false;
 
-    if (name.isEmpty()) {
-        name=runProc("dconf",  QStringList() << "read" << "/org/gnome/desktop/interface/gtk-theme");
-        if (!name.isEmpty()) {
-            return name;
+        if (read) {
+            return themeNameSetting;
         }
+        read=true;
+
+        if (themeNameSetting.isEmpty()) {
+            themeNameSetting=runProc("dconf",  QStringList() << "read" << "/org/gnome/desktop/interface/gtk-theme");
+            if (!themeNameSetting.isEmpty()) {
+                return themeNameSetting;
+            }
 
-        QString rcPaths = QString::fromLocal8Bit(qgetenv("GTK2_RC_FILES"));
-        if (!rcPaths.isEmpty()) {
-            QStringList paths = rcPaths.split(QLatin1String(":"));
-            foreach (const QString &rcPath, paths) {
-                if (!rcPath.isEmpty()) {
-                    QFile rcFile(rcPath);
-                    if (rcFile.exists() && rcFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
-                        QTextStream in(&rcFile);
-                        while(!in.atEnd()) {
-                            QString line = in.readLine();
-                            if (line.contains(QLatin1String("gtk-theme-name"))) {
-                                line = line.right(line.length() - line.indexOf(QLatin1Char('=')) - 1);
-                                line.remove(QLatin1Char('\"'));
-                                line = line.trimmed();
-                                name = line;
-                                break;
+            QString rcPaths = QString::fromLocal8Bit(qgetenv("GTK2_RC_FILES"));
+            if (!rcPaths.isEmpty()) {
+                QStringList paths = rcPaths.split(QLatin1String(":"));
+                foreach (const QString &rcPath, paths) {
+                    if (!rcPath.isEmpty()) {
+                        QFile rcFile(rcPath);
+                        if (rcFile.exists() && rcFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
+                            QTextStream in(&rcFile);
+                            while(!in.atEnd()) {
+                                QString line = in.readLine();
+                                if (line.contains(QLatin1String("gtk-theme-name"))) {
+                                    line = line.right(line.length() - line.indexOf(QLatin1Char('=')) - 1);
+                                    line.remove(QLatin1Char('\"'));
+                                    line = line.trimmed();
+                                    themeNameSetting = line;
+                                    break;
+                                }
                             }
                         }
                     }
-                }
-                if (!name.isEmpty()) {
-                    break;
+                    if (!themeNameSetting.isEmpty()) {
+                        break;
+                    }
                 }
             }
-        }
 
-        #if QT_VERSION < 0x050000
-        // Fall back to gconf
-        if (name.isEmpty()) {
-            name = QGtkStyle::getGConfString(QLatin1String("/desktop/gnome/interface/gtk_theme"));
+            #if QT_VERSION < 0x050000
+            // Fall back to gconf
+            if (themeNameSetting.isEmpty()) {
+                themeNameSetting = QGtkStyle::getGConfString(QLatin1String("/desktop/gnome/interface/gtk_theme"));
+            }
+            #endif
         }
-        #endif
     }
-    return name;
+    return themeNameSetting;
     #endif
 }
 
@@ -195,14 +202,33 @@ QString GtkStyle::iconTheme()
     #if defined Q_OS_WIN || defined QT_NO_STYLE_GTK
     return QString();
     #else
-    static bool read=false;
-    static QString name;
+    if (iconThemeSetting.isEmpty()) {
+        static bool read=false;
 
-    if (!read) {
-        read=true;
-        name=runProc("dconf",  QStringList() << "read" << "/org/gnome/desktop/interface/icon-theme");
+        if (!read) {
+            read=true;
+            iconThemeSetting=runProc("dconf",  QStringList() << "read" << "/org/gnome/desktop/interface/icon-theme");
+        }
     }
-    return name;
+    return iconThemeSetting;
+    #endif
+}
+
+extern void GtkStyle::setThemeName(const QString &n)
+{
+    #if defined Q_OS_WIN || defined QT_NO_STYLE_GTK
+    Q_UNUSED(n)
+    #else
+    themeNameSetting=n;
+    #endif
+}
+
+extern void GtkStyle::setIconTheme(const QString &n)
+{
+    #if defined Q_OS_WIN || defined QT_NO_STYLE_GTK
+    Q_UNUSED(n)
+    #else
+    iconThemeSetting=n;
     #endif
 }
 
diff --git a/support/gtkstyle.h b/support/gtkstyle.h
index e20a7b0..ed0a621 100644
--- a/support/gtkstyle.h
+++ b/support/gtkstyle.h
@@ -37,6 +37,8 @@ namespace GtkStyle
     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();
diff --git a/support/inputdialog.cpp b/support/inputdialog.cpp
index 9c7a019..2c9c2be 100644
--- a/support/inputdialog.cpp
+++ b/support/inputdialog.cpp
@@ -24,57 +24,91 @@
 #include "inputdialog.h"
 #include "gtkstyle.h"
 #include "spinbox.h"
+#include "lineedit.h"
 #include "dialog.h"
+#include "utils.h"
 #include <QLabel>
-#include <QFormLayout>
+#include <QBoxLayout>
 
-class IntInputDialog : public Dialog
+InputDialog::InputDialog(const QString &caption, const QString &label, const QString &value, QLineEdit::EchoMode echo, QWidget *parent)
+    : Dialog(parent)
+    , spin(0)
 {
-public:
-    IntInputDialog(const QString &caption, const QString &label, int value, int minValue, int maxValue, int step, QWidget *parent)
-        : Dialog(parent) {
-        setButtons(Ok|Cancel);
-        QWidget *wid=new QWidget(this);
-        QFormLayout *layout=new QFormLayout(wid);
+    init(false, caption, label);
+    edit->setText(value);
+    edit->setEchoMode(echo);
+    enableOkButton();
+    connect(edit, SIGNAL(textChanged(QString)), this, SLOT(enableOkButton()));
+}
+
+InputDialog::InputDialog(const QString &caption, const QString &label, int value, int minValue, int maxValue, int step, QWidget *parent)
+    : Dialog(parent)
+    , edit(0)
+{
+    init(true, caption, label);
+    spin->setRange(minValue, maxValue);
+    spin->setValue(value);
+    spin->setSingleStep(step);
+}
+
+void InputDialog::init(bool intInput, const QString &caption, const QString &label)
+{
+    setButtons(Ok|Cancel);
+    QWidget *wid=new QWidget(this);
+    QBoxLayout *layout=new QBoxLayout(QBoxLayout::TopToBottom, wid);
 
+    if (intInput) {
         spin=new SpinBox(wid);
-        spin->setRange(minValue, maxValue);
-        spin->setValue(value);
-        spin->setSingleStep(step);
         spin->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
-        layout->setWidget(0, QFormLayout::LabelRole, new QLabel(label, wid));
-        layout->setWidget(0, QFormLayout::FieldRole, spin);
-        layout->setMargin(0);
-
-        setCaption(caption);
-        setMainWidget(wid);
-        setButtons(Ok|Cancel);
+        setMinimumWidth(Utils::isHighDpi() ? 600 : 300);
+    } else {
+        edit=new LineEdit(wid);
+        edit->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Preferred);
+        setMinimumWidth(Utils::isHighDpi() ? 700 : 350);
     }
+    layout->addWidget(new QLabel(label, wid));
+    layout->addWidget(intInput ? (QWidget *)spin : (QWidget *)edit);
+    layout->setMargin(0);
+
+    setCaption(caption);
+    setMainWidget(wid);
+    setButtons(Ok|Cancel);
+}
 
-SpinBox *spin;
-};
+void InputDialog::enableOkButton()
+{
+    enableButton(Ok, 0==edit || !edit->text().trimmed().isEmpty());
+}
 
-int InputDialog::getInteger(const QString &caption, const QString &label, int value, int minValue, int maxValue, int step, int base, bool *ok, QWidget *parent) {
+int InputDialog::getInteger(const QString &caption, const QString &label, int value, int minValue, int maxValue, int step, int base, bool *ok, QWidget *parent)
+{
+    Q_UNUSED(base)
+    InputDialog dlg(caption, label, value, minValue, maxValue, step, parent);
+    if (QDialog::Accepted==dlg.exec()) {
+        if (ok) {
+            *ok=true;
+        }
+        return dlg.spin->value();
+    } else {
+        if (ok) {
+            *ok=false;
+        }
+        return value;
+    }
+}
 
-    if (GtkStyle::mimicWidgets()) {
-        IntInputDialog dlg(caption, label, value, minValue, maxValue, step, parent);
-        if (QDialog::Accepted==dlg.exec()) {
-            if (ok) {
-                *ok=true;
-            }
-            return dlg.spin->value();
-        } else {
-            if (ok) {
-                *ok=false;
-            }
-            return value;
+QString InputDialog::getText(const QString &caption, const QString &label, QLineEdit::EchoMode echoMode, const QString &value, bool *ok, QWidget *parent)
+{
+    InputDialog dlg(caption, label, value, echoMode, parent);
+    if (QDialog::Accepted==dlg.exec()) {
+        if (ok) {
+            *ok=true;
         }
+        return dlg.edit->text();
     } else {
-        #ifdef ENABLE_KDE_SUPPORT
-        return KInputDialog::getInteger(caption, label, value, minValue, maxValue, step, base, ok, parent);
-        #else
-        Q_UNUSED(base)
-        return QInputDialog::getInt(parent, caption, label, value, minValue, maxValue, step, ok);
-        #endif
+        if (ok) {
+            *ok=false;
+        }
+        return value;
     }
 }
diff --git a/support/inputdialog.h b/support/inputdialog.h
index 6322901..0b597db 100644
--- a/support/inputdialog.h
+++ b/support/inputdialog.h
@@ -24,28 +24,42 @@
 #ifndef INPUT_DIALOG_H
 #define INPUT_DIALOG_H
 
-#include <QInputDialog>
-#ifdef ENABLE_KDE_SUPPORT
-#include <KDE/KInputDialog>
-#endif
+#include <QLineEdit>
 #include "localize.h"
+#include "dialog.h"
 
-namespace InputDialog
+class SpinBox;
+class LineEdit;
+
+class InputDialog : public Dialog
 {
-    inline QString getText(const QString &caption, const QString &label, const QString &value=QString(), bool *ok=0, QWidget *parent=0) {
-        #ifdef ENABLE_KDE_SUPPORT
-        return KInputDialog::getText(caption, label, value, ok, parent=0);
-        #else
-        return QInputDialog::getText(parent, caption, label, QLineEdit::Normal, value, ok);
-        #endif
-    }
+    Q_OBJECT
 
-    extern int getInteger(const QString &caption, const QString &label, int value=0, int minValue=INT_MIN, int maxValue=INT_MAX,
+public:
+    InputDialog(const QString &caption, const QString &label, const QString &value, QLineEdit::EchoMode echo, QWidget *parent);
+    InputDialog(const QString &caption, const QString &label, int value, int minValue, int maxValue, int step, QWidget *parent);
+
+    static QString getText(const QString &caption, const QString &label, QLineEdit::EchoMode echoMode, const QString &value=QString(),
+                           bool *ok=0, QWidget *parent=0);
+    static int getInteger(const QString &caption, const QString &label, int value=0, int minValue=INT_MIN, int maxValue=INT_MAX,
                           int step=1, int base=10, bool *ok=0, QWidget *parent=0);
 
-    inline QString getPassword(const QString &value=QString(), bool *ok=0, QWidget *parent=0) {
-        return QInputDialog::getText(parent, i18n("Password"), i18n("Please enter password:"), QLineEdit::Password, value, ok);
+    static QString getText(const QString &caption, const QString &label, const QString &value=QString(), bool *ok=0, QWidget *parent=0) {
+        return getText(caption, label, QLineEdit::Normal, value, ok, parent);
+    }
+    static QString getPassword(const QString &value=QString(), bool *ok=0, QWidget *parent=0) {
+        return getText(i18n("Password"), i18n("Please enter password:"), QLineEdit::Password, value, ok, parent);
     }
+
+private:
+    void init(bool intInput, const QString &caption, const QString &label);
+
+private Q_SLOTS:
+    void enableOkButton();
+
+private:
+    SpinBox *spin;
+    LineEdit *edit;
 };
 
 #endif // INPUT_DIALOG_H
diff --git a/support/kmessagewidget.cpp b/support/kmessagewidget.cpp
index b963e69..c433624 100644
--- a/support/kmessagewidget.cpp
+++ b/support/kmessagewidget.cpp
@@ -30,6 +30,7 @@
 #endif
 
 #include "icon.h"
+#include "squeezedtextlabel.h"
 #include <QEvent>
 #include <QGridLayout>
 #include <QHBoxLayout>
@@ -88,7 +89,7 @@ void KMsgWidgetPrivate::init(KMsgWidget *q_ptr)
     iconLabel = new QLabel(content);
     iconLabel->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
 
-    textLabel = new QLabel(content);
+    textLabel = new SqueezedTextLabel(content);
     textLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
     textLabel->setTextInteractionFlags(Qt::TextBrowserInteraction);
 
@@ -344,17 +345,17 @@ void KMsgWidget::setMessageType(KMsgWidget::MessageType type)
     d->iconLabel->setPixmap(icon.pixmap(size));
 }
 
-QSize KMsgWidget::sizeHint() const
-{
-    ensurePolished();
-    return d->content->sizeHint();
-}
-
-QSize KMsgWidget::minimumSizeHint() const
-{
-    ensurePolished();
-    return d->content->minimumSizeHint();
-}
+//QSize KMsgWidget::sizeHint() const
+//{
+//    ensurePolished();
+//    return d->content->sizeHint();
+//}
+
+//QSize KMsgWidget::minimumSizeHint() const
+//{
+//    ensurePolished();
+//    return d->content->minimumSizeHint();
+//}
 
 bool KMsgWidget::event(QEvent* event)
 {
diff --git a/support/kmessagewidget.h b/support/kmessagewidget.h
index a6bfc7d..3696dd5 100644
--- a/support/kmessagewidget.h
+++ b/support/kmessagewidget.h
@@ -23,6 +23,7 @@
 #include <QFrame>
 
 class KMsgWidgetPrivate;
+class SqueezedTextLabel;
 
 /**
  * @short A widget to provide feedback or propose opportunistic interactions.
@@ -125,9 +126,9 @@ public:
 
     void removeAction(QAction *action);
 
-    QSize sizeHint() const;
+//    QSize sizeHint() const;
 
-    QSize minimumSizeHint() const;
+//    QSize minimumSizeHint() const;
 
     int heightForWidth(int width) const;
 
@@ -180,7 +181,7 @@ public:
     KMsgWidget* q;
     QFrame* content;
     QLabel* iconLabel;
-    QLabel* textLabel;
+    SqueezedTextLabel* textLabel;
     QToolButton* closeButton;
     QTimeLine* timeLine;
 
diff --git a/support/messagebox.cpp b/support/messagebox.cpp
index 3b5c604..0f7b797 100644
--- a/support/messagebox.cpp
+++ b/support/messagebox.cpp
@@ -66,24 +66,76 @@ MessageBox::ButtonCode MessageBox::questionYesNoCancel(QWidget *parent, const QS
 }
 #endif
 
+#ifdef ENABLE_KDE_SUPPORT
 void MessageBox::errorListEx(QWidget *parent, const QString &message, const QStringList &strlist, const QString &title)
+#else
+namespace MessageBox
 {
+class YesNoListDialog : public Dialog
+{
+public:
+    YesNoListDialog(QWidget *p) : Dialog(p) { }
+    void slotButtonClicked(int b) {
+        switch(b) {
+        case Dialog::Ok:
+        case Dialog::Yes:
+            accept();
+            break;
+        case Dialog::No:
+            reject();
+            break;
+        }
+    }
+};
+}
+
+MessageBox::ButtonCode MessageBox::msgListEx(QWidget *parent, Type type, const QString &message, const QStringList &strlist, const QString &title)
+#endif
+{
+    #ifdef ENABLE_KDE_SUPPORT
     Dialog *dlg=new Dialog(parent);
-    dlg->setCaption(title.isEmpty() ? i18n("Error") : title);
+    #else
+    MessageBox::YesNoListDialog *dlg=new MessageBox::YesNoListDialog(parent);
+    #endif
     dlg->setAttribute(Qt::WA_DeleteOnClose);
-    dlg->setButtons(Dialog::Ok);
     QWidget *wid=new QWidget(dlg);
     QGridLayout *lay=new QGridLayout(wid);
     QLabel *iconLabel=new QLabel(wid);
     int iconSize=Icon::dlgIconSize();
     iconLabel->setMinimumSize(iconSize, iconSize);
     iconLabel->setMaximumSize(iconSize, iconSize);
+    #ifdef ENABLE_KDE_SUPPORT
+    dlg->setCaption(title.isEmpty() ? i18n("Error") : title);
+    dlg->setButtons(Dialog::Ok);
     iconLabel->setPixmap(Icon("dialog-error").pixmap(iconSize, iconSize));
+    #else
+    switch(type) {
+    case Error:
+        dlg->setCaption(title.isEmpty() ? i18n("Error") : title);
+        dlg->setButtons(Dialog::Ok);
+        iconLabel->setPixmap(Icon("dialog-error").pixmap(iconSize, iconSize));
+        break;
+    case Question:
+        dlg->setCaption(title.isEmpty() ? i18n("Question") : title);
+        dlg->setButtons(Dialog::Yes|Dialog::No);
+        iconLabel->setPixmap(Icon("dialog-information").pixmap(iconSize, iconSize));
+        break;
+    case Warning:
+        dlg->setCaption(title.isEmpty() ? i18n("Warning") : title);
+        dlg->setButtons(Dialog::Yes|Dialog::No);
+        iconLabel->setPixmap(Icon("dialog-warning").pixmap(iconSize, iconSize));
+        break;
+    }
+    #endif
     lay->addWidget(iconLabel, 0, 0, 1, 1);
     lay->addWidget(new QLabel(message, wid), 0, 1, 1, 1);
     QListWidget *list=new QListWidget(wid);
     lay->addWidget(list, 1, 0, 1, 2);
     list->insertItems(0, strlist);
     dlg->setMainWidget(wid);
+    #ifdef ENABLE_KDE_SUPPORT
     dlg->exec();
+    #else
+    return QDialog::Accepted==dlg->exec() ? Yes : No;
+    #endif
 }
diff --git a/support/messagebox.h b/support/messagebox.h
index 70d60b8..bed287e 100644
--- a/support/messagebox.h
+++ b/support/messagebox.h
@@ -40,6 +40,11 @@ namespace MessageBox {
         No=QMessageBox::No,
         Cancel=QMessageBox::Cancel
     };
+    enum Type {
+        Error,
+        Question,
+        Warning
+    };
 
     extern ButtonCode questionYesNoCancel(QWidget *parent, const QString &message, const QString &title=QString(),
                                           const GuiItem &yesText=StdGuiItem::yes(), const GuiItem &noText=StdGuiItem::no(), bool showCancel=true, bool isWarning=false);
@@ -59,11 +64,20 @@ namespace MessageBox {
     inline void information(QWidget *parent, const QString &message, const QString &title=QString()) {
         QMessageBox::information(parent, title.isEmpty() ? i18n("Information") : title, message);
     }
-    extern void errorListEx(QWidget *parent, const QString &message, const QStringList &strlist, const QString &title=QString());
+    extern ButtonCode msgListEx(QWidget *parent, Type type, const QString &message, const QStringList &strlist, const QString &title=QString());
+    inline void errorListEx(QWidget *parent, const QString &message, const QStringList &strlist, const QString &title=QString()) {
+        msgListEx(parent, Error, message, strlist, title);
+    }
     inline void errorList(QWidget *parent, const QString &message, const QStringList &strlist, const QString &title=QString()) {
-        errorListEx(parent, message, strlist, title);
+        msgListEx(parent, Error, message, strlist, title);
     }
-};
+    inline ButtonCode questionYesNoList(QWidget *parent, const QString &message, const QStringList &strlist, const QString &title=QString()) {
+        return msgListEx(parent, Question, message, strlist, title);
+    }
+    inline ButtonCode warningYesNoList(QWidget *parent, const QString &message, const QStringList &strlist, const QString &title=QString()) {
+        return msgListEx(parent, Warning, message, strlist, title);
+    }
+}
 #endif
 
 #endif
diff --git a/support/messagewidget.cpp b/support/messagewidget.cpp
index 841c05a..d710dce 100644
--- a/support/messagewidget.cpp
+++ b/support/messagewidget.cpp
@@ -33,30 +33,33 @@ MessageWidget::~MessageWidget()
 {
 }
 
-#if defined ENABLE_KDE_SUPPORT
-#if KDE_IS_VERSION(4, 9, 4) && !KDE_IS_VERSION(4, 9, 5)
-// BUG:142
-#define NO_ANIMATED_SHOW
-#endif
-#endif
+//#if defined ENABLE_KDE_SUPPORT
+//#if KDE_IS_VERSION(4, 9, 4) && !KDE_IS_VERSION(4, 9, 5)
+//// BUG:142
+//#define NO_ANIMATED_SHOW
+//#endif
+//#endif
 
-void MessageWidget::setMessage(const QString &msg, bool isError)
+void MessageWidget::setMessage(const QString &msg, MessageType type, bool showCloseButton)
 {
     if (msg.isEmpty() && isVisible()) {
         setVisible(false);
         return;
     }
-    QString text=msg;
-    if (text.length()>154) {
-        text=text.left(150)+QLatin1String("...");
-    }
-    if (msg.length()>500) {
-        setToolTip(msg.left(500)+QLatin1String("..."));
-    } else {
-        setToolTip(msg);
-    }
-    setText(text);
-    setMessageType(isError ? Error : Information);
+//    QString text=msg;
+//    if (text.length()>154) {
+//        text=text.left(150)+QLatin1String("...");
+//    }
+//    if (msg.length()>500) {
+//        setToolTip(msg.left(500)+QLatin1String("..."));
+//    } else {
+//        setToolTip(msg);
+//    }
+//    setText(text);
+    setText(msg);
+    setToolTip(msg);
+    setMessageType(type);
+    setCloseButtonVisible(showCloseButton);
     #if defined NO_ANIMATED_SHOW
     setVisible(true);
     #else
@@ -75,3 +78,23 @@ void MessageWidget::setVisible(bool v)
     KMsgWidget::setVisible(v);
     emit visible(v);
 }
+
+void MessageWidget::removeAllActions()
+{
+     QList<QAction *> acts=actions();
+     foreach (QAction *a, acts) {
+         removeAction(a);
+     }
+}
+
+void MessageWidget::setActions(const QList<QAction *> acts)
+{
+    if (acts==actions()) {
+        return;
+    }
+
+    removeAllActions();
+    foreach (QAction *a, acts) {
+        addAction(a);
+    }
+}
diff --git a/support/messagewidget.h b/support/messagewidget.h
index f270f7e..6ac4c82 100644
--- a/support/messagewidget.h
+++ b/support/messagewidget.h
@@ -24,34 +24,40 @@
 #ifndef MESSAGEWIDGET_H
 #define MESSAGEWIDGET_H
 
-#ifdef ENABLE_KDE_SUPPORT
-#include <kdeversion.h>
-#if KDE_IS_VERSION(4, 7, 0)
-#include <KDE/KMessageWidget>
-typedef KMessageWidget KMsgWidget;
-#else // KDE_IS_VERSION(4, 7, 0)
+//#ifdef ENABLE_KDE_SUPPORT
+//#include <kdeversion.h>
+//#if KDE_IS_VERSION(4, 7, 0)
+//#include <KDE/KMessageWidget>
+//typedef KMessageWidget KMsgWidget;
+//#else // KDE_IS_VERSION(4, 7, 0)
+//#include "kmessagewidget.h"
+//#endif // KDE_IS_VERSION(4, 7, 0)
+//#else // ENABLE_KDE_SUPPORT
 #include "kmessagewidget.h"
-#endif // KDE_IS_VERSION(4, 7, 0)
-#else // ENABLE_KDE_SUPPORT
-#include "kmessagewidget.h"
-#endif // ENABLE_KDE_SUPPORT
+//#endif // ENABLE_KDE_SUPPORT
+
+#include <QList>
 
 class MessageWidget : public KMsgWidget
 {
     Q_OBJECT
 public:
+
     MessageWidget(QWidget *parent);
     virtual ~MessageWidget();
-    void setError(const QString &msg) { setMessage(msg, true); }
-    void setInformation(const QString &msg) { setMessage(msg, false); }
+    void setError(const QString &msg, bool showCloseButton=true) { setMessage(msg, Error, showCloseButton); }
+    void setInformation(const QString &msg, bool showCloseButton=true) { setMessage(msg, Information, showCloseButton); }
+    void setWarning(const QString &msg, bool showCloseButton=true) { setMessage(msg, Warning, showCloseButton); }
     void setVisible(bool v);
     bool isActive() const { return active; }
+    void removeAllActions();
+    void setActions(const QList<QAction *> acts);
 
 Q_SIGNALS:
     void visible(bool);
 
 private:
-    void setMessage(const QString &msg, bool isError);
+    void setMessage(const QString &msg, MessageType type, bool showCloseButton);
 
 private:
     bool active;
diff --git a/support/pagewidget.cpp b/support/pagewidget.cpp
index 01fcf66..ae0222f 100644
--- a/support/pagewidget.cpp
+++ b/support/pagewidget.cpp
@@ -23,13 +23,205 @@
 
 #include "pagewidget.h"
 #include "icon.h"
+#include "gtkstyle.h"
+#include <QListWidget>
+#include <QStackedWidget>
 #include <QBoxLayout>
 #include <QLabel>
 #include <QSizePolicy>
 #include <QApplication>
+#include <QFontMetrics>
+#include <QTextLayout>
+#include <QPainter>
+
+static int layoutText(QTextLayout *layout, int maxWidth)
+{
+    qreal height = 0;
+    int textWidth = 0;
+    layout->beginLayout();
+    while (true) {
+        QTextLine line = layout->createLine();
+        if (!line.isValid()) {
+            break;
+        }
+        line.setLineWidth(maxWidth);
+        line.setPosition(QPointF(0, height));
+        height += line.height();
+        textWidth = qMax(textWidth, qRound(line.naturalTextWidth() + 0.5));
+    }
+    layout->endLayout();
+    return textWidth;
+}
+
+class PageWidgetItemDelegate : public QAbstractItemDelegate
+{
+public:
+    PageWidgetItemDelegate(QObject *parent)
+        : QAbstractItemDelegate(parent)
+    {
+        int height=QApplication::fontMetrics().height();
+        iconSize=height>22 ? Icon::stdSize(height*2.5) : 32;
+    }
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
+    {
+        if (!index.isValid()) {
+            return;
+        }
+        bool mouseOver=option.state&QStyle::State_MouseOver;
+        bool gtk=mouseOver && GtkStyle::isActive();
+        bool selected=option.state&QStyle::State_Selected;
+        bool drawBgnd=true;
+
+        if (!underMouse) {
+            if (mouseOver && !selected) {
+                drawBgnd=false;
+            }
+            mouseOver=false;
+        }
+
+        const QString text = index.model()->data(index, Qt::DisplayRole).toString();
+        const QIcon icon = index.model()->data(index, Qt::DecorationRole).value<QIcon>();
+        const QPixmap pixmap = icon.pixmap(iconSize, iconSize);
+
+        QFontMetrics fm = painter->fontMetrics();
+        int wp = pixmap.width();
+        int hp = pixmap.height();
+
+        QTextLayout iconTextLayout(text, option.font);
+        QTextOption textOption(Qt::AlignHCenter);
+        iconTextLayout.setTextOption(textOption);
+        int maxWidth = qMax(3 * wp, 8 * fm.height());
+        layoutText(&iconTextLayout, maxWidth);
+
+        QPen pen = painter->pen();
+        QPalette::ColorGroup cg = option.state & QStyle::State_Enabled
+                ? QPalette::Normal : QPalette::Disabled;
+        if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) {
+            cg = QPalette::Inactive;
+        }
+
+        QStyleOptionViewItemV4 opt(option);
+        opt.showDecorationSelected = true;
+        QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
+
+        if (drawBgnd) {
+            if (mouseOver && gtk) {
+                GtkStyle::drawSelection(opt, painter, selected ? 0.75 : 0.25);
+            } else {
+                style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
+            }
+        }
+
+        if (selected) {
+            painter->setPen(option.palette.color(cg, QPalette::HighlightedText));
+        } else {
+            painter->setPen(option.palette.color(cg, QPalette::Text));
+        }
+
+        painter->drawPixmap(option.rect.x() + (option.rect.width()/2)-(wp/2), option.rect.y() + 5, pixmap);
+        if (!text.isEmpty()) {
+            iconTextLayout.draw(painter, QPoint(option.rect.x() + (option.rect.width()/2)-(maxWidth/2), option.rect.y() + hp+7));
+        }
+        painter->setPen(pen);
+        drawFocus(painter, option, option.rect);
+    }
+
+    QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
+    {
+        if (!index.isValid()) {
+            return QSize(0, 0);
+        }
+
+        const QString text = index.model()->data(index, Qt::DisplayRole).toString();
+        const QIcon icon = index.model()->data(index, Qt::DecorationRole).value<QIcon>();
+        const QPixmap pixmap = icon.pixmap(iconSize, iconSize);
+
+        QFontMetrics fm = option.fontMetrics;
+        int gap = fm.height();
+        int wp = pixmap.width();
+        int hp = pixmap.height();
+
+        if (hp == 0) {
+            /**
+            * No pixmap loaded yet, we'll use the default icon size in this case.
+            */
+            hp = iconSize;
+            wp = iconSize;
+        }
+
+        QTextLayout iconTextLayout(text, option.font);
+        int wt = layoutText(&iconTextLayout, qMax(3 * wp, 8 * fm.height()));
+        int ht = iconTextLayout.boundingRect().height();
+
+        int width, height;
+        if (text.isEmpty()) {
+            height = hp;
+        } else {
+            height = hp + ht + 10;
+
+        }
+
+        width = qMax(wt, wp) + gap;
+        return QSize(width, height);
+    }
+
+    void drawFocus(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const
+    {
+        if (option.state & QStyle::State_HasFocus) {
+            QStyleOptionFocusRect o;
+            o.QStyleOption::operator=(option);
+            o.rect = rect;
+            o.state |= QStyle::State_KeyboardFocusChange;
+            QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled)
+                    ? QPalette::Normal : QPalette::Disabled;
+            o.backgroundColor = option.palette.color(cg, (option.state & QStyle::State_Selected)
+                                                      ? QPalette::Highlight : QPalette::Background);
+            QApplication::style()->drawPrimitive(QStyle::PE_FrameFocusRect, &o, painter);
+        }
+    }
+
+    void setUnderMouse(bool u) { underMouse=u; }
+
+private:
+    int iconSize;
+    bool underMouse;
+};
+
+class PageWidgetViewEventHandler : public QObject
+{
+public:
+    PageWidgetViewEventHandler(PageWidgetItemDelegate *d, QListWidget *v)
+        : QObject(v)
+        , delegate(d)
+        , view(v)
+    {
+    }
+
+protected:
+    bool eventFilter(QObject *obj, QEvent *event)
+    {
+        if (delegate) {
+            if (QEvent::Enter==event->type()) {
+                delegate->setUnderMouse(true);
+                view->viewport()->update();
+            } else if (QEvent::Leave==event->type()) {
+                delegate->setUnderMouse(false);
+                view->viewport()->update();
+            }
+        }
+        return QObject::eventFilter(obj, event);
+    }
+
+protected:
+    PageWidgetItemDelegate *delegate;
+    QListWidget *view;
+};
 
 PageWidgetItem::PageWidgetItem(QWidget *p, const QString &header, const Icon &icon, QWidget *cfg)
-    : QWidget(p) {
+    : QWidget(p)
+    , wid(cfg)
+{
     static int size=-1;
 
     if (-1==size) {
@@ -52,26 +244,94 @@ PageWidgetItem::PageWidgetItem(QWidget *p, const QString &header, const Icon &ic
     layout->addLayout(titleLayout);
     layout->addItem(new QSpacerItem(8, 8, QSizePolicy::Fixed, QSizePolicy::Fixed));
     layout->addWidget(cfg);
+    layout->setMargin(0);
     cfg->setParent(this);
     cfg->adjustSize();
     adjustSize();
 }
 
 PageWidget::PageWidget(QWidget *p)
-    : FancyTabWidget(p, false, true)
+    : QWidget(p)
 {
+    QBoxLayout *layout=new QBoxLayout(QBoxLayout::LeftToRight, this);
+    list = new QListWidget(p);
+    stack = new QStackedWidget(p);
+    connect(list, SIGNAL(currentRowChanged(int)), stack, SLOT(setCurrentIndex(int)));
+    layout->addWidget(list);
+    layout->addWidget(stack);
+    layout->setMargin(0);
+    list->setViewMode(QListView::ListMode);
+    list->setVerticalScrollMode(QListView::ScrollPerPixel);
+    list->setMovement(QListView::Static);
+    PageWidgetItemDelegate *delegate=new PageWidgetItemDelegate(list);
+    list->setItemDelegate(delegate);
+    list->setSelectionBehavior(QAbstractItemView::SelectItems);
+    list->setSelectionMode(QAbstractItemView::SingleSelection);
+    list->setAttribute(Qt::WA_MouseTracking);
+    list->installEventFilter(new PageWidgetViewEventHandler(delegate, list));
 }
 
 PageWidgetItem * PageWidget::addPage(QWidget *widget, const QString &name, const Icon &icon, const QString &header)
 {
-    PageWidgetItem *item=new PageWidgetItem(parentWidget(), header, icon, widget);
-    AddTab(item, icon, name);
-    return item;
+    PageWidgetItem *page=new PageWidgetItem(stack, header, icon, widget);
+    QListWidgetItem *listItem=new QListWidgetItem(name, list);
+    listItem->setIcon(icon);
+    stack->addWidget(page);
+    list->addItem(listItem);
+
+    int rows = list->model()->rowCount();
+    int width = 0;
+    int height = 0;
+    for (int i = 0; i < rows; ++i) {
+        QSize rowSize=list->sizeHintForIndex(list->model()->index(i, 0));
+        width = qMax(width, rowSize.width());
+        height += rowSize.height();
+    }
+    width+=25;
+    list->setFixedWidth(width);
+    list->setMinimumHeight(height);
+
+    QSize stackSize = stack->size();
+    for (int i = 0; i < stack->count(); ++i) {
+        const QWidget *widget = stack->widget(i);
+        if (widget) {
+            stackSize = stackSize.expandedTo(widget->minimumSizeHint());
+        }
+    }
+    stack->setMinimumSize(stackSize);
+
+    QSize sz=size();
+    sz=sz.expandedTo(stackSize);
+    sz=sz.expandedTo(QSize(width, height));
+    setMinimumSize(sz);
+    list->setCurrentRow(0);
+    stack->setCurrentIndex(0);
+    pages.insert(listItem, page);
+    return page;
 }
 
-void PageWidget::allPagesAdded()
+int PageWidget::count()
 {
-    SetMode(FancyTabWidget::Mode_LargeSidebar);
-    adjustSize();
-    setMinimumHeight(count()*tabSize().height());
+    return list->count();
+}
+
+PageWidgetItem * PageWidget::currentPage() const
+{
+    return static_cast<PageWidgetItem *>(stack->currentWidget());
+}
+
+void PageWidget::setCurrentPage(PageWidgetItem *item)
+{
+    if (!item) {
+        return;
+    }
+
+    QMap<QListWidgetItem *, PageWidgetItem*>::ConstIterator it(pages.constBegin());
+    QMap<QListWidgetItem *, PageWidgetItem*>::ConstIterator end(pages.constEnd());
+
+    for (; it!=end; ++it) {
+        if (it.value()==item) {
+            list->setCurrentItem(it.key());
+        }
+    }
 }
diff --git a/support/pagewidget.h b/support/pagewidget.h
index 14bf22b..e77ab23 100644
--- a/support/pagewidget.h
+++ b/support/pagewidget.h
@@ -42,25 +42,41 @@ public:
         adjustSize();
         return item;
     }
-    void allPagesAdded() { }
 };
 
 #else
-#include "fancytabwidget.h"
+#include <QWidget>
+#include <QMap>
+
+class QListWidget;
+class QListWidgetItem;
+class QStackedWidget;
+
 class PageWidgetItem : public QWidget
 {
 public:
     PageWidgetItem(QWidget *p, const QString &header, const Icon &icon, QWidget *cfg);
     virtual ~PageWidgetItem() { }
+    QWidget * widget() const { return wid; }
+
+private:
+    QWidget *wid;
 };
 
-class PageWidget : public FancyTabWidget
+class PageWidget : public QWidget
 {
 public:
     PageWidget(QWidget *p);
     virtual ~PageWidget() { }
     PageWidgetItem * addPage(QWidget *widget, const QString &name, const Icon &icon, const QString &header);
-    void allPagesAdded();
+    int count();
+    PageWidgetItem * currentPage() const;
+    void setCurrentPage(PageWidgetItem *item);
+
+private:
+    QListWidget *list;
+    QStackedWidget *stack;
+    QMap<QListWidgetItem *, PageWidgetItem*> pages;
 };
 
 #endif
diff --git a/support/shortcutsmodel.cpp b/support/shortcutsmodel.cpp
index b532068..2adbab7 100644
--- a/support/shortcutsmodel.cpp
+++ b/support/shortcutsmodel.cpp
@@ -21,22 +21,7 @@
 #include "shortcutsmodel.h"
 #include "action.h"
 #include "actioncollection.h"
-
-static QString stripAcceleratorMarkers(const QString &label_) {
-  QString label = label_;
-  int p = 0;
-  forever {
-    p = label.indexOf('&', p);
-    if(p < 0 || p + 1 >= label.length())
-      break;
-
-    if(label.at(p + 1).isLetterOrNumber() || label.at(p + 1) == '&')
-      label.remove(p, 1);
-
-    ++p;
-  }
-  return label;
-}
+#include "utils.h"
 
 ShortcutsModel::ShortcutsModel(const QHash<QString, ActionCollection *> &actionCollections, QObject *parent)
   : QAbstractItemModel(parent),
@@ -155,7 +140,7 @@ QVariant ShortcutsModel::data(const QModelIndex &index, int role) const {
   case Qt::DisplayRole:
     switch(index.column()) {
     case 0:
-      return stripAcceleratorMarkers(action->text());
+      return Utils::stripAcceleratorMarkers(action->text());
     case 1:
       return item->shortcut.toString(QKeySequence::NativeText);
     default:
diff --git a/support/shortcutssettingspage.cpp b/support/shortcutssettingswidget.cpp
similarity index 91%
rename from support/shortcutssettingspage.cpp
rename to support/shortcutssettingswidget.cpp
index 1091d1b..2e9d5e1 100644
--- a/support/shortcutssettingspage.cpp
+++ b/support/shortcutssettingswidget.cpp
@@ -21,7 +21,7 @@
 
 #include <QTimer>
 
-#include "shortcutssettingspage.h"
+#include "shortcutssettingswidget.h"
 #include "action.h"
 #include "actioncollection.h"
 #include "shortcutsmodel.h"
@@ -53,7 +53,7 @@ bool ShortcutsFilter::filterAcceptsRow(int source_row, const QModelIndex &source
 
 /****************************************************************************/
 
-ShortcutsSettingsPage::ShortcutsSettingsPage(const QHash<QString, ActionCollection *> &actionCollections, QWidget *parent)
+ShortcutsSettingsWidget::ShortcutsSettingsWidget(const QHash<QString, ActionCollection *> &actionCollections, QWidget *parent)
   : QWidget(parent),
   _shortcutsModel(new ShortcutsModel(actionCollections, this)),
   _shortcutsFilter(new ShortcutsFilter(this))
@@ -87,12 +87,12 @@ ShortcutsSettingsPage::ShortcutsSettingsPage(const QHash<QString, ActionCollecti
   QTimer::singleShot(0, searchEdit, SLOT(setFocus()));
 }
 
-QTreeView * ShortcutsSettingsPage::view()
+QTreeView * ShortcutsSettingsWidget::view()
 {
     return shortcutsView;
 }
 
-void ShortcutsSettingsPage::setWidgetStates() {
+void ShortcutsSettingsWidget::setWidgetStates() {
   if(shortcutsView->currentIndex().isValid() && shortcutsView->currentIndex().parent().isValid()) {
     QKeySequence active = shortcutsView->currentIndex().data(ShortcutsModel::ActiveShortcutRole).value<QKeySequence>();
     QKeySequence def = shortcutsView->currentIndex().data(ShortcutsModel::DefaultShortcutRole).value<QKeySequence>();
@@ -113,11 +113,11 @@ void ShortcutsSettingsPage::setWidgetStates() {
   }
 }
 
-void ShortcutsSettingsPage::on_searchEdit_textChanged(const QString &text) {
+void ShortcutsSettingsWidget::on_searchEdit_textChanged(const QString &text) {
   _shortcutsFilter->setFilterString(text);
 }
 
-void ShortcutsSettingsPage::keySequenceChanged(const QKeySequence &seq, const QModelIndex &conflicting) {
+void ShortcutsSettingsWidget::keySequenceChanged(const QKeySequence &seq, const QModelIndex &conflicting) {
   if(conflicting.isValid())
     _shortcutsModel->setData(conflicting, QKeySequence(), ShortcutsModel::ActiveShortcutRole);
 
@@ -127,7 +127,7 @@ void ShortcutsSettingsPage::keySequenceChanged(const QKeySequence &seq, const QM
   setWidgetStates();
 }
 
-void ShortcutsSettingsPage::toggledCustomOrDefault() {
+void ShortcutsSettingsWidget::toggledCustomOrDefault() {
   if(!shortcutsView->currentIndex().isValid())
     return;
 
@@ -142,6 +142,6 @@ void ShortcutsSettingsPage::toggledCustomOrDefault() {
   setWidgetStates();
 }
 
-void ShortcutsSettingsPage::save() {
+void ShortcutsSettingsWidget::save() {
   _shortcutsModel->commit();
 }
diff --git a/support/shortcutssettingspage.h b/support/shortcutssettingswidget.h
similarity index 88%
rename from support/shortcutssettingspage.h
rename to support/shortcutssettingswidget.h
index d4b2763..4d75b7f 100644
--- a/support/shortcutssettingspage.h
+++ b/support/shortcutssettingswidget.h
@@ -18,11 +18,11 @@
  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
  ***************************************************************************/
 
-#ifndef SHORTCUTSSETTINGSPAGE_H
-#define SHORTCUTSSETTINGSPAGE_H
+#ifndef SHORTCUTSSETTINGSWIDGET_H
+#define SHORTCUTSSETTINGSWIDGET_H
 
 #include <QSortFilterProxyModel>
-#include "ui_shortcutssettingspage.h"
+#include "ui_shortcutssettingswidget.h"
 
 class ActionCollection;
 class ShortcutsModel;
@@ -42,10 +42,10 @@ private:
     QString _filterString;
 };
 
-class ShortcutsSettingsPage : public QWidget, private Ui::ShortcutsSettingsPage {
+class ShortcutsSettingsWidget : public QWidget, private Ui::ShortcutsSettingsWidget {
     Q_OBJECT
 public:
-    ShortcutsSettingsPage(const QHash<QString, ActionCollection *> &actionCollections, QWidget *parent = 0);
+    ShortcutsSettingsWidget(const QHash<QString, ActionCollection *> &actionCollections, QWidget *parent = 0);
 
     inline bool hasDefaults() const { return true; }
     QTreeView * view();
diff --git a/support/shortcutssettingspage.ui b/support/shortcutssettingswidget.ui
similarity index 97%
rename from support/shortcutssettingspage.ui
rename to support/shortcutssettingswidget.ui
index 623e203..b81fe91 100644
--- a/support/shortcutssettingspage.ui
+++ b/support/shortcutssettingswidget.ui
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <ui version="4.0">
- <class>ShortcutsSettingsPage</class>
- <widget class="QWidget" name="ShortcutsSettingsPage">
+ <class>ShortcutsSettingsWidget</class>
+ <widget class="QWidget" name="ShortcutsSettingsWidget">
   <property name="geometry">
    <rect>
     <x>0</x>
diff --git a/support/spinbox.cpp b/support/spinbox.cpp
index ad63678..e696989 100644
--- a/support/spinbox.cpp
+++ b/support/spinbox.cpp
@@ -51,7 +51,7 @@ static QPixmap createPixmap(int size, QColor &col, double opacity, bool isPlus)
     p.setPen(QPen(col, lineWidth));
     p.setOpacity(opacity);
 
-    int offset=lineWidth*2;
+    int offset=size<=16 ? 4 : size<=22 ? 6 : 8; // lineWidth*2;
     int pos=(size/2);
     p.drawLine(offset, pos, size-offset, pos);
     if (isPlus) {
@@ -95,8 +95,30 @@ 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);
@@ -105,12 +127,13 @@ SpinBox::SpinBox(QWidget *p)
     connect(spin, SIGNAL(valueChanged(int)), SIGNAL(valueChanged(int)));
     if (GtkStyle::mimicWidgets()) {
         spin->setButtonSymbols(QAbstractSpinBox::NoButtons);
-        decButton=new QToolButton(this);
-        incButton=new QToolButton(this);
+        decButton=new SpinBoxButton(this);
+        incButton=new SpinBoxButton(this);
         layout->addWidget(spin);
         layout->addWidget(decButton);
         layout->addWidget(incButton);
-        layout->addItem(new QSpacerItem(0, 0, QSizePolicy::Expanding, QSizePolicy::Minimum));
+        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()));
@@ -142,6 +165,17 @@ void SpinBox::setValue(int v)
     }
 }
 
+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());
diff --git a/support/spinbox.h b/support/spinbox.h
index f8db320..9dba96e 100644
--- a/support/spinbox.h
+++ b/support/spinbox.h
@@ -63,9 +63,14 @@ private:
 };
 
 #ifdef Q_WS_WIN
-typedef EmptySpinBox SpinBox;
+class SpinBox : public EmptySpinBox
+{
+public:
+    SpinBox(QWidget *p) : EmptySpinBox(p) { }
+};
 #else
-class QToolButton;
+class SpinBoxButton;
+class QSpacerItem;
 
 class SpinBox : public QWidget
 {
@@ -87,6 +92,7 @@ public:
     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);
@@ -102,8 +108,9 @@ private:
 
 private:
     EmptySpinBox *spin;
-    QToolButton *incButton;
-    QToolButton *decButton;
+    SpinBoxButton *incButton;
+    SpinBoxButton *decButton;
+    QSpacerItem *spacer;
 };
 #endif // Q_WS_WIN
 
diff --git a/support/squeezedtextlabel.cpp b/support/squeezedtextlabel.cpp
new file mode 100644
index 0000000..ec21269
--- /dev/null
+++ b/support/squeezedtextlabel.cpp
@@ -0,0 +1,68 @@
+/*
+ * 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 "squeezedtextlabel.h"
+
+#ifdef ENABLE_KDE_SUPPORT
+
+SqueezedTextLabel::SqueezedTextLabel(QWidget *p)
+        : KSqueezedTextLabel(p)
+{
+    bool rtl=Qt::RightToLeft==layoutDirection();
+    setTextElideMode(rtl ? Qt::ElideLeft : Qt::ElideRight);
+    setAlignment((rtl ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignVCenter);
+}
+
+#else
+
+SqueezedTextLabel::SqueezedTextLabel(QWidget *p)
+    : QLabel(p)
+{
+    bool rtl=Qt::RightToLeft==layoutDirection();
+
+    setTextElideMode(rtl ? Qt::ElideLeft : Qt::ElideRight);
+    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+}
+
+void SqueezedTextLabel::setTextElideMode(Qt::TextElideMode mode)
+{
+    elideMode=mode;
+    setAlignment((elideMode&Qt::ElideLeft ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignVCenter);
+}
+
+void SqueezedTextLabel::elideText()
+{
+    QFontMetrics fm(fontMetrics());
+    int labelWidth = size().width();
+    int lineWidth = fm.width(originalText);
+
+    if (lineWidth > labelWidth) {
+        QLabel::setText(fm.elidedText(originalText, elideMode, labelWidth));
+        setToolTip(originalText);
+    } else {
+        QLabel::setText(originalText);
+        setToolTip(QString());
+    }
+}
+
+#endif
diff --git a/support/squeezedtextlabel.h b/support/squeezedtextlabel.h
index 2d71771..67afb91 100644
--- a/support/squeezedtextlabel.h
+++ b/support/squeezedtextlabel.h
@@ -29,12 +29,7 @@
 class SqueezedTextLabel : public KSqueezedTextLabel
 {
 public:
-    SqueezedTextLabel(QWidget *p)
-        : KSqueezedTextLabel(p) {
-        bool rtl=Qt::RightToLeft==layoutDirection();
-        setTextElideMode(rtl ? Qt::ElideLeft : Qt::ElideRight);
-        setAlignment((rtl ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignVCenter);
-    }
+    SqueezedTextLabel(QWidget *p);
 };
 #else
 #include <QLabel>
@@ -44,18 +39,11 @@ class QResizeEvent;
 class SqueezedTextLabel : public QLabel
 {
 public:
-    SqueezedTextLabel(QWidget *p)
-        : QLabel(p) {
-        bool rtl=Qt::RightToLeft==layoutDirection();
-        elideMode=rtl ? Qt::ElideLeft : Qt::ElideRight;
-        setAlignment((rtl ? Qt::AlignRight : Qt::AlignLeft) | Qt::AlignVCenter);
-        setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
-    }
+    SqueezedTextLabel(QWidget *p);
 
-    void setText(const QString &text) {
-        fullText=text;
-        elideText();
-    }
+    void setText(const QString &text) { originalText=text; elideText(); }
+    const QString & fullText() const { return originalText; }
+    void setTextElideMode(Qt::TextElideMode mode);
 
 protected:
     QSize minimumSizeHint() const {
@@ -64,47 +52,16 @@ protected:
         return sh;
     }
 
-    QSize sizeHint() const {
-        return QSize(fontMetrics().width(fullText), QLabel::sizeHint().height());
-    }
-
-    void resizeEvent(QResizeEvent *) {
-        elideText();
-    }
+    QSize sizeHint() const { return QSize(fontMetrics().width(originalText), QLabel::sizeHint().height()); }
+    void resizeEvent(QResizeEvent *) { elideText(); }
 
 private:
-    void elideText() {
-        QFontMetrics fm(fontMetrics());
-        int labelWidth = size().width();
-        int lineWidth = fm.width(fullText);
-
-        if (lineWidth > labelWidth) {
-            QLabel::setText(fm.elidedText(fullText, elideMode, labelWidth));
-            setToolTip(fullText);
-        } else {
-            QLabel::setText(fullText);
-            setToolTip(QString());
-        }
-    }
+    void elideText();
 
 private:
-    QString fullText;
+    QString originalText;
     Qt::TextElideMode elideMode;
 };
 #endif
 
-class PaddedSqueezedTextLabel : public SqueezedTextLabel
-{
-public:
-    PaddedSqueezedTextLabel(QWidget *p)
-        : SqueezedTextLabel(p) {
-    }
-
-protected:
-    QSize sizeHint() const {
-        QSize sh(SqueezedTextLabel::sizeHint());;
-        return QSize(sh.width(), qMax((int)((fontMetrics().height()*1.1)+0.5), sh.height()));
-    }
-};
-
 #endif // SQUEEZEDTEXTLABEL_H
diff --git a/support/themes/ambiance-dt.css b/support/themes/ambiance-dt.css
index bca3144..fc78f0a 100644
--- a/support/themes/ambiance-dt.css
+++ b/support/themes/ambiance-dt.css
@@ -1,35 +1,52 @@
 /* drag:toolbar scrollbar:overlay symbolic-icons:true light-icons:true*/
+QToolBar,
 ToolBar {
   background-color: #3c3b37;
   border: 0px;
 }
 
+QToolBar:active,
 ToolBar:active {
   background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #3c3b37, stop: 1 #575651);
   border: 0px;
 }
 
+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);
@@ -37,6 +54,16 @@ ToolBar QToolButton:checked {
   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;
diff --git a/support/themes/ambiance.css b/support/themes/ambiance.css
index bca3144..fc78f0a 100644
--- a/support/themes/ambiance.css
+++ b/support/themes/ambiance.css
@@ -1,35 +1,52 @@
 /* drag:toolbar scrollbar:overlay symbolic-icons:true light-icons:true*/
+QToolBar,
 ToolBar {
   background-color: #3c3b37;
   border: 0px;
 }
 
+QToolBar:active,
 ToolBar:active {
   background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #3c3b37, stop: 1 #575651);
   border: 0px;
 }
 
+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);
@@ -37,6 +54,16 @@ ToolBar QToolButton:checked {
   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;
diff --git a/support/themes/faience.css b/support/themes/faience.css
index 19195c6..2b966cf 100644
--- a/support/themes/faience.css
+++ b/support/themes/faience.css
@@ -1,35 +1,45 @@
 /* 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;
 }
 
+QToolBar:active,
 ToolBar:active {
   background-color: qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1,  stop: 0 #cccccc, stop: 1 #b0b0b0);
   border: 0px;
 }
 
+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);
diff --git a/support/themes/radiance-dt.css b/support/themes/radiance-dt.css
index 74060b1..0d0d06e 100644
--- a/support/themes/radiance-dt.css
+++ b/support/themes/radiance-dt.css
@@ -1,35 +1,45 @@
 /* drag:toolbar scrollbar:overlay*/
+QToolBar,
 ToolBar {
   background-color: #dfd7d0;
   border: 0px;
 }
 
+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);
diff --git a/support/themes/radiance.css b/support/themes/radiance.css
index 74060b1..0d0d06e 100644
--- a/support/themes/radiance.css
+++ b/support/themes/radiance.css
@@ -1,35 +1,45 @@
 /* drag:toolbar scrollbar:overlay*/
+QToolBar,
 ToolBar {
   background-color: #dfd7d0;
   border: 0px;
 }
 
+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);
diff --git a/support/urllabel.cpp b/support/urllabel.cpp
index d9f5a11..5eacb04 100644
--- a/support/urllabel.cpp
+++ b/support/urllabel.cpp
@@ -23,12 +23,16 @@
 
 #include "urllabel.h"
 #include <QVariant>
+#include <QMouseEvent>
+#include <QApplication>
+#include <QCursor>
 
 UrlLabel::UrlLabel(QWidget *p)
     : QLabel(p)
     , pressed(false)
 {
     setCursor(QCursor(Qt::PointingHandCursor));
+    setContextMenuPolicy(Qt::NoContextMenu);
 }
 
 void UrlLabel::setText(const QString &t)
@@ -43,15 +47,19 @@ void UrlLabel::setProperty(const char *name, const QVariant &value)
     }
 }
 
-void UrlLabel::mousePressEvent(QMouseEvent *)
+void UrlLabel::mousePressEvent(QMouseEvent *ev)
 {
-    pressed=true;
+    if (Qt::LeftButton==ev->buttons()) {
+        pressed=true;
+    }
 }
 
 void UrlLabel::mouseReleaseEvent(QMouseEvent *)
 {
     if (pressed) {
         pressed=false;
-        emit leftClickedUrl();
+        if (this==QApplication::widgetAt(QCursor::pos())) {
+            emit leftClickedUrl();
+        }
     }
 }
diff --git a/support/urllabel.h b/support/urllabel.h
index 820d327..55eb3e0 100644
--- a/support/urllabel.h
+++ b/support/urllabel.h
@@ -46,7 +46,7 @@ Q_SIGNALS:
     void leftClickedUrl();
 
 protected:
-    void mousePressEvent(QMouseEvent *);
+    void mousePressEvent(QMouseEvent *ev);
     void mouseReleaseEvent(QMouseEvent *);
 
 private:
diff --git a/support/utils.cpp b/support/utils.cpp
index d994d85..2a09ad9 100644
--- a/support/utils.cpp
+++ b/support/utils.cpp
@@ -23,15 +23,15 @@
 
 #include "utils.h"
 #include "config.h"
-#include "mpdparseutils.h"
-#include "covers.h"
 #include "localize.h"
 #include <QFile>
+#include <QFileInfo>
 #include <QDir>
 #include <QSet>
 #include <QThread>
 #include <QApplication>
 #include <QDateTime>
+#include <QTime>
 #include <QWidget>
 #include <QStyle>
 #ifdef ENABLE_KDE_SUPPORT
@@ -50,6 +50,12 @@
 #include <sys/types.h>
 #include <utime.h>
 
+QLatin1Char Utils::constDirSep('/');
+QLatin1String Utils::constDirSepStr("/");
+const char * Utils::constDirSepCharStr="/";
+
+static const QLatin1String constHttp("http://");
+
 QString Utils::strippedText(QString s)
 {
     s.remove(QString::fromLatin1("..."));
@@ -68,25 +74,78 @@ QString Utils::strippedText(QString s)
     return s.trimmed();
 }
 
+QString Utils::stripAcceleratorMarkers(QString label)
+{
+    int p = 0;
+    forever {
+        p = label.indexOf('&', p);
+        if(p < 0 || p + 1 >= label.length()) {
+            break;
+        }
+
+        if(label.at(p + 1).isLetterOrNumber() || label.at(p + 1) == '&') {
+            label.remove(p, 1);
+        }
+
+        ++p;
+    }
+    return label;
+}
+
 QString Utils::fixPath(const QString &dir)
 {
     QString d(dir);
 
-    if (!d.isEmpty() && !d.startsWith(QLatin1String("http://"))) {
-        d.replace(QLatin1String("//"), QChar('/'));
+    if (!d.isEmpty() && !d.startsWith(constHttp)) {
+        #ifdef Q_OS_WIN
+        // Windows shares can be \\host\share (which gets converted to //host/share)
+        // so if th epath starts with // we need to keep this double slash.
+        bool startsWithDoubleSlash=d.length()>2 && d.startsWith(QLatin1String("//"));
+        #endif
+        d.replace(QLatin1String("//"), constDirSepStr);
+        #ifdef Q_OS_WIN
+        if (startsWithDoubleSlash) { // Re add first slash
+            d=QLatin1Char('/')+d;
+        }
+        #endif
     }
-    d.replace(QLatin1String("/./"), QChar('/'));
-    if (!d.isEmpty() && !d.endsWith('/')) {
-        d+='/';
+    d.replace(QLatin1String("/./"), constDirSepStr);
+    if (!d.isEmpty() && !d.endsWith(constDirSep)) {
+        d+=constDirSep;
     }
     return d;
 }
 
+QString Utils::convertDirForDisplay(const QString &dir)
+{
+    if (dir.isEmpty() || dir.startsWith(constHttp)) {
+        return dir;
+    }
+
+    QString d(dir);
+    if (d.endsWith(constDirSep)) {
+        d=d.left(d.length()-1);
+    }
+    return QDir::toNativeSeparators(d);
+}
+
+QString Utils::convertDirFromDisplay(const QString &dir)
+{
+    QString d=dir.trimmed();
+    if (d.isEmpty()) {
+        return d;
+    }
+
+    if (d.startsWith(constHttp)) {
+        return fixPath(d);
+    }
+    return fixPath(QDir::fromNativeSeparators(d));
+}
+
 QString Utils::getDir(const QString &file)
 {
     QString d(file);
-
-    int slashPos(d.lastIndexOf('/'));
+    int slashPos(d.lastIndexOf(constDirSep));
 
     if(slashPos!=-1) {
         d.remove(slashPos+1, d.length());
@@ -98,7 +157,7 @@ QString Utils::getDir(const QString &file)
 QString Utils::getFile(const QString &file)
 {
     QString d(file);
-    int slashPos=d.lastIndexOf('/');
+    int slashPos=d.lastIndexOf(constDirSep);
 
     if (-1!=slashPos) {
         d.remove(0, slashPos+1);
@@ -197,37 +256,33 @@ void Utils::setFilePerms(const QString &file, const char *groupName)
  * Create directory, and set its permissions.
  * If user is a memeber of "audio" group, then set dir as owned by and writeable by "audio" group.
  */
-bool Utils::createDir(const QString &dir, const QString &base, const char *groupName)
+bool Utils::createWorldReadableDir(const QString &dir, const QString &base, const char *groupName)
 {
     #ifdef Q_OS_WIN
     Q_UNUSED(base);
     Q_UNUSED(groupName);
+    return makeDir(dir, 0775);
     #else
     //
     // Clear any umask before dir is created
     mode_t oldMask(umask(0000));
     gid_t gid=base.isEmpty() ? 0 : getGroupId(groupName);
-    #endif
-    #ifdef ENABLE_KDE_SUPPORT
-    bool status(KStandardDirs::makeDir(dir, 0==gid ? 0755 : 0775));
-    #else
-    bool status(QDir(dir).mkpath(dir));
-    #endif
-    #ifndef Q_OS_WIN
+    bool status(makeDir(dir, 0==gid ? 0755 : 0775));
+
     if (status && 0!=gid && dir.startsWith(base)) {
-        QStringList parts=dir.mid(base.length()).split('/');
+        QStringList parts=dir.mid(base.length()).split(constDirSep);
         QString d(base);
 
         foreach (const QString &p, parts) {
-            d+='/'+p;
+            d+=constDirSep+p;
             int rv=::chown(QFile::encodeName(d).constData(), geteuid(), gid);
             Q_UNUSED(rv);
         }
     }
     // Reset umask
     ::umask(oldMask);
-    #endif
     return status;
+    #endif
 }
 
 struct Thread : public QThread
@@ -243,6 +298,70 @@ void Utils::msleep(int msecs)
 #ifndef ENABLE_KDE_SUPPORT
 // Copied from KDE... START
 #include <QLocale>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+// kde_file.h
+#ifndef Q_WS_WIN
+#if (defined _LFS64_LARGEFILE) && (defined _LARGEFILE64_SOURCE) && (!defined _GNU_SOURCE) && (!defined __sun)
+#define KDE_stat                ::stat64
+#define KDE_lstat               ::lstat64
+#define KDE_struct_stat         struct stat64
+#define KDE_mkdir               ::mkdir
+#else
+#define KDE_stat                ::stat
+#define KDE_lstat               ::lstat
+#define KDE_struct_stat         struct stat
+#define KDE_mkdir               ::mkdir
+#endif
+#endif // Q_WS_WIN
+
+// kstandarddirs.h
+extern bool Utils::makeDir(const QString &dir, int mode)
+{
+    // we want an absolute path
+    if (QDir::isRelativePath(dir)) {
+        return false;
+    }
+
+    #ifdef Q_WS_WIN
+    Q_UNUSED(mode)
+    return QDir().mkpath(dir);
+    #else
+    QString target = dir;
+    uint len = target.length();
+
+    // append trailing slash if missing
+    if (dir.at(len - 1) != QLatin1Char('/')) {
+        target += QLatin1Char('/');
+    }
+
+    QString base;
+    uint i = 1;
+
+    while ( i < len ) {
+        KDE_struct_stat st;
+        int pos = target.indexOf(QLatin1Char('/'), i);
+        base += target.mid(i - 1, pos - i + 1);
+        QByteArray baseEncoded = QFile::encodeName(base);
+        // bail out if we encountered a problem
+        if (KDE_stat(baseEncoded, &st) != 0) {
+            // Directory does not exist....
+            // Or maybe a dangling symlink ?
+            if (KDE_lstat(baseEncoded, &st) == 0)
+                (void)unlink(baseEncoded); // try removing
+
+            if (KDE_mkdir(baseEncoded, static_cast<mode_t>(mode)) != 0) {
+                baseEncoded.prepend( "trying to create local folder " );
+                perror(baseEncoded.constData());
+                return false; // Couldn't create it :-(
+            }
+        }
+        i = pos + 1;
+    }
+    return true;
+    #endif
+}
 
 QString Utils::formatByteSize(double size)
 {
@@ -295,7 +414,7 @@ QString Utils::formatByteSize(double size)
 
 static inline QString equalizePath(QString &str)
 {
-    #ifdef Q_WS_WIN
+    #ifdef Q_OS_WIN
     // filter pathes through QFileInfo to have always
     // the same case for drive letters
     QFileInfo f(str);
@@ -464,45 +583,118 @@ QString Utils::findExe(const QString &appname, const QString &pstr)
 
 #endif
 
+QString Utils::formatDuration(const quint32 totalseconds)
+{
+    //Get the days,hours,minutes and seconds out of the total seconds
+    quint32 days = totalseconds / 86400;
+    quint32 rest = totalseconds - (days * 86400);
+    quint32 hours = rest / 3600;
+    rest = rest - (hours * 3600);
+    quint32 minutes = rest / 60;
+    quint32 seconds = rest - (minutes * 60);
+
+    //Convert hour,minutes and seconds to a QTime for easier parsing
+    QTime time(hours, minutes, seconds);
+
+    #ifdef ENABLE_KDE_SUPPORT
+    return 0==days
+            ? time.toString("h:mm:ss")
+            : i18np("1 day %2", "%1 days %2", days, time.toString("h:mm:ss"));
+    #else
+    return 0==days
+            ? time.toString("h:mm:ss")
+            : QString("%1:%2").arg(days).arg(time.toString("hh:mm:ss"));
+    #endif
+}
+
 QString Utils::cleanPath(const QString &p)
 {
     QString path(p);
-    while(path.contains("//")) {
-        path.replace("//", "/");
+    while (path.contains("//")) {
+        path.replace("//", constDirSepStr);
     }
     return fixPath(path);
 }
 
+static QString userDir(const QString &mainDir, const QString &sub, bool create)
+{
+    QString dir=mainDir;
+    if (!sub.isEmpty()) {
+        dir+=sub;
+    }
+    dir=Utils::cleanPath(dir);
+    QDir d(dir);
+    return d.exists() || (create && d.mkpath(dir)) ? dir : QString();
+}
+
 QString Utils::configDir(const QString &sub, bool create)
 {
     #if defined Q_OS_WIN
-    QString dir = QDesktopServices::storageLocation(QDesktopServices::DataLocation)+"/";
+    return userDir(QDesktopServices::storageLocation(QDesktopServices::DataLocation)+constDirSep, sub, create);
     #else
     QString env = qgetenv("XDG_CONFIG_HOME");
-    QString dir = (env.isEmpty() ? QDir::homePath() + "/.config/" : env) + "/"+QCoreApplication::applicationName()+"/";
+    return userDir((env.isEmpty() ? QDir::homePath() + "/.config" : env) + constDirSep+QCoreApplication::applicationName()+constDirSep, sub, create);
+    #endif
+}
+
+QString Utils::dataDir(const QString &sub, bool create)
+{
+    #if defined Q_OS_WIN
+    return userDir(QDesktopServices::storageLocation(QDesktopServices::DataLocation)+constDirSep, sub, create);
+    #else
+    QString env = qgetenv("XDG_DATA_HOME");
+    return userDir((env.isEmpty() ? QDir::homePath() + "/.local/share" : env) + constDirSep+QCoreApplication::applicationName()+constDirSep, sub, create);
     #endif
-    if(!sub.isEmpty()) {
-        dir+=sub;
-    }
-    dir=Utils::fixPath(dir);
-    QDir d(dir);
-    return d.exists() || (create && d.mkpath(dir)) ? QDir::toNativeSeparators(dir) : QString();
 }
 
 QString Utils::cacheDir(const QString &sub, bool create)
 {
     #if defined Q_OS_WIN
-    QString dir = QDesktopServices::storageLocation(QDesktopServices::CacheLocation)+"/";
+    return userDir(QDesktopServices::storageLocation(QDesktopServices::CacheLocation)+constDirSep, sub, create);
     #else
     QString env = qgetenv("XDG_CACHE_HOME");
-    QString dir = (env.isEmpty() ? QDir::homePath() + "/.cache/" : env)+ "/"+QCoreApplication::applicationName()+"/";
+    return userDir((env.isEmpty() ? QDir::homePath() + "/.cache" : env) + constDirSep+QCoreApplication::applicationName()+constDirSep, sub, create);
     #endif
-    if(!sub.isEmpty()) {
-        dir+=sub;
+}
+
+void 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);
     }
-    dir=Utils::fixPath(dir);
-    QDir d(dir);
-    return d.exists() || (create && d.mkpath(dir)) ? QDir::toNativeSeparators(dir) : QString();
+}
+
+void Utils::moveDir(const QString &from, const QString &to)
+{
+    if (from.isEmpty() || to.isEmpty() || from==to) {
+        return;
+    }
+
+    QDir f(from);
+    if (!f.exists()) {
+        return;
+    }
+
+    QDir t(to);
+    if (!t.exists()) {
+        return;
+    }
+
+    QFileInfoList files=f.entryInfoList(QStringList() << "*", QDir::Files|QDir::Dirs|QDir::NoDotAndDotDot);
+    foreach (const QFileInfo &file, files) {
+        if (file.isDir()) {
+            QString dest=to+file.fileName()+constDirSep;
+            if (!QDir(dest).exists()) {
+                t.mkdir(file.fileName());
+            }
+            moveDir(from+file.fileName()+constDirSep, dest);
+        } else {
+            QFile::rename(from+file.fileName(), to+file.fileName());
+        }
+    }
+
+    f.cdUp();
+    f.rmdir(from);
 }
 
 void Utils::clearOldCache(const QString &sub, int maxAge)
@@ -512,8 +704,11 @@ void Utils::clearOldCache(const QString &sub, int maxAge)
     }
 
     QString d=cacheDir(sub, false);
-    QDir dir(d);
+    if (d.isEmpty()) {
+        return;
+    }
 
+    QDir dir(d);
     if (dir.exists()) {
         QFileInfoList files=dir.entryInfoList(QDir::Files|QDir::NoDotAndDotDot);
         if (files.count()) {
@@ -532,11 +727,60 @@ void Utils::touchFile(const QString &fileName)
     ::utime(QFile::encodeName(fileName).constData(), 0);
 }
 
+bool Utils::isDirReadable(const QString &dir)
+{
+    #ifdef Q_OS_WIN32
+    if (dir.isEmpty()) {
+        return false;
+    } else {
+        QDir d(dir);
+        bool dirReadable=d.isReadable();
+        // Handle cases where dir is set to \\server\ (i.e. no shared folder is set in path)
+        if (!dirReadable && dir.startsWith(QLatin1String("//")) && d.isRoot() && (dir.length()-1)==dir.indexOf(Utils::constDirSep, 2)) {
+            dirReadable=true;
+        }
+        return dirReadable;
+    }
+    #else
+    return dir.isEmpty() ? false : QDir(dir).isReadable();
+    #endif
+}
+
 extern int Utils::layoutSpacing(QWidget *w)
 {
     int spacing=(w ? w->style() : qApp->style())->layoutSpacing(QSizePolicy::DefaultType, QSizePolicy::DefaultType, Qt::Vertical);
     if (spacing<0) {
-        spacing=QApplication::fontMetrics().height()>20 ? 8 : 4;
+        spacing=isHighDpi() ? 8 : 4;
     }
     return spacing;
 }
+
+extern bool Utils::isHighDpi()
+{
+    static int fontHeight=-1;
+    if (-1==fontHeight) {
+        fontHeight=QApplication::fontMetrics().height();
+    }
+    return fontHeight>22;
+}
+
+#if !defined Q_OS_WIN32 && !defined Q_OS_MAC
+Utils::Desktop Utils::currentDe()
+{
+    QByteArray desktop=qgetenv("XDG_CURRENT_DESKTOP").toLower();
+    if ("unity"==desktop) {
+        return Unity;
+    }
+    if ("kde"==desktop) {
+        return KDE;
+    }
+    if ("gnome"==desktop) {
+        return Gnome;
+    }
+    QByteArray kde=qgetenv("KDE_FULL_SESSION");
+    if ("true"==kde) {
+        return KDE;
+    }
+    return Other;
+}
+#endif
diff --git a/support/utils.h b/support/utils.h
index 3ba573f..885387f 100644
--- a/support/utils.h
+++ b/support/utils.h
@@ -28,24 +28,47 @@
 #include <sys/types.h>
 #include <qglobal.h>
 #include <QString>
+#include <QLatin1Char>
+#include <QDir>
 #ifdef ENABLE_KDE_SUPPORT
 #include <KDE/KGlobal>
 #include <KDE/KLocale>
 #include <KDE/KStandardDirs>
 #endif
+#include <stdlib.h>
+#ifdef Q_OS_WIN32
+#include <time.h>
+#endif
 
 class QString;
 class QWidget;
 
 namespace Utils
 {
+    extern QLatin1Char constDirSep;
+    extern QLatin1String constDirSepStr;
+    extern const char * constDirSepCharStr;
+
     inline bool equal(double d1, double d2, double precision=0.0001)
     {
         return (fabs(d1 - d2) < precision);
     }
+    inline int random(int max)
+    {
+        #ifdef Q_OS_WIN32
+        return ::rand()%max;
+        #else
+        return ::random()%max;
+        #endif
+    }
 
     extern QString strippedText(QString s);
+    extern QString stripAcceleratorMarkers(QString label);
     extern QString fixPath(const QString &d);
+    // Convert directory to a format suitable fo rUI - e.g. use native separators, and remove any traling separator
+    extern QString convertDirForDisplay(const QString &dir);
+    // Convert directory from a UI field - convert to / separators, and add a trailing separator
+    extern QString convertDirFromDisplay(const QString &dir);
     extern QString getDir(const QString &file);
     extern QString getFile(const QString &file);
     extern QString changeExtension(const QString &file, const QString &extension);
@@ -53,7 +76,12 @@ namespace Utils
     extern gid_t getGroupId(const char *groupName="users"); // Return 0 if user is not in group, otherwise returns group ID
     #endif
     extern void setFilePerms(const QString &file, const char *groupName="users");
-    extern bool createDir(const QString &dir, const QString &base, const char *groupName="users");
+    #ifdef ENABLE_KDE_SUPPORT
+    inline bool makeDir(const QString &dir, int mode) { return KStandardDirs::makeDir(dir, mode); }
+    #else
+    extern bool makeDir(const QString &dir, int mode);
+    #endif
+    extern bool createWorldReadableDir(const QString &dir, const QString &base, const char *groupName="users");
     extern void msleep(int msecs);
     inline void sleep() { msleep(100); }
 
@@ -64,14 +92,30 @@ namespace Utils
     extern QString findExe(const QString &appname, const QString &pathstr=QString());
     extern QString formatByteSize(double size);
     #endif
+    extern QString formatDuration(const quint32 totalseconds);
 
     extern QString cleanPath(const QString &p);
     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 void moveDir(const QString &from, const QString &to);
     extern void clearOldCache(const QString &sub, int maxAge);
     extern void touchFile(const QString &fileName);
+    extern bool isDirReadable(const QString &dir);
 
     extern int layoutSpacing(QWidget *w);
-};
+    extern bool isHighDpi();
+
+    #if !defined Q_OS_WIN32 && !defined Q_OS_MAC
+    enum Desktop {
+        KDE,
+        Gnome,
+        Unity,
+        Other
+    };
+    extern Desktop currentDe();
+    #endif
+}
 
 #endif
diff --git a/tags/CMakeLists.txt b/tags/CMakeLists.txt
new file mode 100644
index 0000000..cafcc85
--- /dev/null
+++ b/tags/CMakeLists.txt
@@ -0,0 +1,23 @@
+include_directories(${QTINCLUDES} ${TAGLIB_INCLUDES} ${CMAKE_SOURCE_DIR}/tags)
+set(CANTATA_TAGS_SRCS main.cpp tagserver.cpp tags.cpp filetyperesolver.cpp ../mpd/song.cpp)
+
+if (ENABLE_KDE_SUPPORT)
+    kde4_add_executable(cantata-tags ${CANTATA_TAGS_SRCS} ${CANTATA_TAGS_MOC_SRCS})
+    install(TARGETS cantata-tags RUNTIME DESTINATION lib/cantata)
+else (ENABLE_KDE_SUPPORT)
+    if (WIN32)
+        set(CMAKE_BUILD_TYPE "Release")
+        ADD_EXECUTABLE(cantata-tags WIN32 ${CANTATA_TAGS_SRCS} ${CANTATA_TAGS_MOC_SRCS})
+        install(TARGETS cantata-tags DESTINATION ${CMAKE_INSTALL_PREFIX})
+    else (WIN32)
+        ADD_EXECUTABLE(cantata-tags ${CANTATA_TAGS_SRCS} ${CANTATA_TAGS_MOC_SRCS})
+        install(TARGETS cantata-tags RUNTIME DESTINATION lib/cantata)
+    endif (WIN32)
+endif (ENABLE_KDE_SUPPORT)
+
+add_definitions(-DCANTATA_NO_SONG_TIME_FUNCTION -DCANTATA_TAG_SERVER)
+target_link_libraries(cantata-tags ${TAGLIB_LIBRARIES} ${QTGUILIBS} ${QTCORELIBS} ${QTNETWORKLIBS})
+if (TAGLIB-EXTRAS_FOUND)
+    target_link_libraries(cantata-tags ${TAGLIB-EXTRAS_LIBRARIES})
+    include_directories(${TAGLIB-EXTRAS_INCLUDES})
+endif (TAGLIB-EXTRAS_FOUND)
diff --git a/tags/filetyperesolver.cpp b/tags/filetyperesolver.cpp
index 4e18b5f..05906e9 100644
--- a/tags/filetyperesolver.cpp
+++ b/tags/filetyperesolver.cpp
@@ -46,6 +46,9 @@
 #include <taglib/vorbisfile.h>
 #include <taglib/wavfile.h>
 #include <taglib/wavpackfile.h>
+#ifdef TAGLIB_OPUS_FOUND
+#include <taglib/opusfile.h>
+#endif
 
 TagLib::File *Meta::Tag::FileTypeResolver::createFile(TagLib::FileName fileName,
         bool readProperties,
@@ -75,6 +78,11 @@ TagLib::File *Meta::Tag::FileTypeResolver::createFile(TagLib::FileName fileName,
         result = new TagLibExtras::RealMedia::File(fileName, readProperties, propertiesStyle);
     }
     #endif
+    #ifdef TAGLIB_OPUS_FOUND
+    else if (mimetype->is(QLatin1String("audio/opus")) || mimetype->is(QLatin1String("audio/x-opus+ogg"))) {
+        result = new TagLib::Ogg::Opus::File(fileName, readProperties, propertiesStyle);
+    }
+    #endif
     else if (mimetype->is(QLatin1String("audio/x-vorbis+ogg"))) {
         result = new TagLib::Ogg::Vorbis::File(fileName, readProperties, propertiesStyle);
     } else if (mimetype->is(QLatin1String("audio/x-flac+ogg"))) {
@@ -115,6 +123,12 @@ TagLib::File *Meta::Tag::FileTypeResolver::createFile(TagLib::FileName fileName,
             delete result;
             result = new TagLib::TrueAudio::File(fileName, readProperties, propertiesStyle);
         }
+        #ifdef TAGLIB_OPUS_FOUND
+        if (!result->isValid()) {
+            delete result;
+            result = new TagLib::Ogg::Opus::File(fileName, readProperties, propertiesStyle);
+        }
+        #endif
     }
     #endif //
     else if (suffix == QLatin1String("m4a") || suffix == QLatin1String("m4b")
@@ -138,6 +152,11 @@ TagLib::File *Meta::Tag::FileTypeResolver::createFile(TagLib::FileName fileName,
     } else if (suffix == QLatin1String("mpc") || suffix == QLatin1String("mpp") || suffix == QLatin1String("mp+")) {
         result = new TagLib::MPC::File(fileName, readProperties, propertiesStyle);
     }
+    #ifdef TAGLIB_OPUS_FOUND
+    else if (suffix == QLatin1String("opus")) {
+        result = new TagLib::Ogg::Opus::File(fileName, readProperties, propertiesStyle);
+    }
+    #endif
 
 // #ifndef Q_OS_WIN
 //      if (!result)
diff --git a/devices/mounter/main.cpp b/tags/main.cpp
similarity index 90%
copy from devices/mounter/main.cpp
copy to tags/main.cpp
index fb9350f..a1eb93c 100644
--- a/devices/mounter/main.cpp
+++ b/tags/main.cpp
@@ -21,13 +21,11 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#include "mounter.h"
 #include <QCoreApplication>
+#include "tagserver.h"
 
 int main(int argc, char *argv[])
 {
-    QCoreApplication app(argc, argv);
-    Mounter srv;
-
-    return app.exec();
+    TagServer server;
+    return server.process();
 }
diff --git a/tags/tagclient.cpp b/tags/tagclient.cpp
new file mode 100644
index 0000000..a19521f
--- /dev/null
+++ b/tags/tagclient.cpp
@@ -0,0 +1,291 @@
+/*
+ * 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, readStatusite to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "tagclient.h"
+#include "tags.h"
+#include "config.h"
+#include <QMutex>
+#include <QMutexLocker>
+#include <QProcess>
+#include <QDataStream>
+#include <QApplication>
+#include <signal.h>
+
+#include <QDebug>
+static bool debugEnabled=false;
+#define DBUG if (debugEnabled) qWarning() << "TagClient" << __FUNCTION__
+
+void TagClient::enableDebug()
+{
+    debugEnabled=true;
+}
+
+static void stopHelper();
+
+static void signalHandler(int signum)
+{
+    stopHelper();
+    exit(signum);
+}
+
+static struct TagClientClose { ~TagClientClose() { stopHelper(); } } closer;
+
+static const int constMaxWait=5000;
+static QMutex mutex;
+static QProcess *proc=0;
+
+static void init()
+{
+    static bool initialised=false;
+    if (!initialised) {
+        // Need to stop helper if Cantata crashes...
+        QList<int> sig=QList<int>() << SIGINT << SIGILL << SIGTRAP << SIGTRAP << SIGABRT << SIGBUS << SIGFPE << SIGSEGV << SIGTERM;
+        foreach (int s, sig) {
+            signal(s, signalHandler);
+        }
+        initialised=true;
+    }
+}
+
+enum ReadStatus {
+    Read_Ok,
+    Read_Timeout,
+    Read_Closed,
+    Read_Error
+};
+
+static bool running()
+{
+    return proc && QProcess::Running==proc->state() && proc->isOpen();
+}
+
+static void stopHelper()
+{
+    if (!proc) {
+        return;
+    }
+    DBUG << (void *)proc;
+    QProcess *p=proc;
+
+    proc=0;
+    if (p) {
+        p->terminate();
+        p->kill();
+        p->deleteLater();
+    }
+}
+
+static bool startHelper()
+{
+    DBUG << (void *)proc;
+    if (!running()) {
+        init();
+        stopHelper();
+        for (int i=0; i<5; ++i) { // Max5 start attempts...
+            DBUG << "start process";
+            proc=new QProcess;
+            proc->setProcessChannelMode(QProcess::SeparateChannels);
+            proc->setReadChannel(QProcess::StandardOutput);
+            #ifdef Q_OS_WIN
+            proc->start(qApp->applicationDirPath()+"/cantata-tags.exe");
+            #else
+            proc->start(INSTALL_PREFIX"/lib/cantata/cantata-tags");
+            #endif
+            if (proc->waitForStarted(constMaxWait)) {
+                DBUG << "started";
+                return true;
+            } else {
+                DBUG << "failed to start";
+                stopHelper();
+            }
+        }
+        return false;
+    }
+    return true;
+}
+
+static ReadStatus readReply(QByteArray &data)
+{
+    DBUG << (void *)proc;
+    if (!running()) {
+        DBUG << "not running?";
+        stopHelper();
+        return Read_Closed;
+    }
+    if (proc->waitForReadyRead(constMaxWait)) {
+        data=proc->readAllStandardOutput();
+        DBUG << "read reply, bytes:" << data.length();
+        return data.isEmpty() ? Read_Error : Read_Ok;
+    }
+    DBUG << "wait for read failed " << running() << (proc ? (int)proc->state() : 12345);
+    stopHelper();
+    return !running() ? Read_Closed : Read_Timeout;
+}
+
+Song TagClient::read(const QString &fileName)
+{
+    QMutexLocker locker(&mutex);
+    Song resp;
+    if (startHelper()) {
+        QDataStream outStream(proc);
+        DBUG << __FUNCTION__ << fileName;
+        outStream << QString(__FUNCTION__) << fileName;
+        QByteArray data;
+        if (Read_Ok==readReply(data)) {
+            QDataStream inStream(data);
+            inStream >> resp;
+        }
+    }
+    return resp;
+}
+
+QImage TagClient::readImage(const QString &fileName)
+{
+    QMutexLocker locker(&mutex);
+    QImage resp;
+    if (startHelper()) {
+        QDataStream outStream(proc);
+        DBUG << __FUNCTION__ << fileName;
+        outStream << QString(__FUNCTION__) << fileName;
+        QByteArray data;
+        if (Read_Ok==readReply(data)) {
+            QDataStream inStream(data);
+            inStream >> resp;
+        }
+    }
+    return resp;
+}
+
+QString TagClient::readLyrics(const QString &fileName)
+{
+    QMutexLocker locker(&mutex);
+    QString resp;
+    if (startHelper()) {
+        QDataStream outStream(proc);
+        DBUG << __FUNCTION__ << fileName;
+        outStream << QString(__FUNCTION__) << fileName;
+        QByteArray data;
+        if (Read_Ok==readReply(data)) {
+            QDataStream inStream(data);
+            inStream >> resp;
+        }
+    }
+    return resp;
+}
+
+int TagClient::updateArtistAndTitle(const QString &fileName, const Song &song)
+{
+    QMutexLocker locker(&mutex);
+    int resp=Tags::Update_Failed;
+    if (startHelper()) {
+        QDataStream outStream(proc);
+        DBUG << __FUNCTION__ << fileName;
+        outStream << QString(__FUNCTION__) << fileName << song;
+        QByteArray data;
+        ReadStatus readStatus=readReply(data);
+        if (Read_Ok==readStatus) {
+            QDataStream inStream(data);
+            inStream >> resp;
+        } else {
+            resp=Read_Timeout==readStatus ? Tags::Update_Timedout : Tags::Update_BadFile;
+        }
+    }
+    return resp;
+}
+
+int TagClient::update(const QString &fileName, const Song &from, const Song &to, int id3Ver)
+{
+    QMutexLocker locker(&mutex);
+    int resp=Tags::Update_Failed;
+    if (startHelper()) {
+        QDataStream outStream(proc);
+        DBUG << __FUNCTION__ << fileName;
+        outStream << QString(__FUNCTION__) << fileName << from << to << id3Ver;
+        QByteArray data;
+        ReadStatus readStatus=readReply(data);
+        if (Read_Ok==readStatus) {
+            QDataStream inStream(data);
+            inStream >> resp;
+        } else {
+            resp=Read_Timeout==readStatus ? Tags::Update_Timedout : Tags::Update_BadFile;
+        }
+    }
+    return resp;
+}
+
+Tags::ReplayGain TagClient::readReplaygain(const QString &fileName)
+{
+    QMutexLocker locker(&mutex);
+    Tags::ReplayGain resp;
+    if (startHelper()) {
+        QDataStream outStream(proc);
+        DBUG << __FUNCTION__ << fileName;
+        outStream << QString(__FUNCTION__) << fileName;
+        QByteArray data;
+        if (Read_Ok==readReply(data)) {
+            QDataStream inStream(data);
+            inStream >> resp;
+        }
+    }
+    return resp;
+}
+
+int TagClient::updateReplaygain(const QString &fileName, const Tags::ReplayGain &rg)
+{
+    QMutexLocker locker(&mutex);
+    int resp=Tags::Update_Failed;
+    if (startHelper()) {
+        QDataStream outStream(proc);
+        DBUG << __FUNCTION__ << fileName;
+        outStream << QString(__FUNCTION__) << fileName << rg;
+        QByteArray data;
+        ReadStatus readStatus=readReply(data);
+        if (Read_Ok==readStatus) {
+            QDataStream inStream(data);
+            inStream >> resp;
+        } else {
+            resp=Read_Timeout==readStatus ? Tags::Update_Timedout : Tags::Update_BadFile;
+        }
+    }
+    return resp;
+}
+
+int TagClient::embedImage(const QString &fileName, const QByteArray &cover)
+{
+    QMutexLocker locker(&mutex);
+    int resp=Tags::Update_Failed;
+    if (startHelper()) {
+        QDataStream outStream(proc);
+        DBUG << __FUNCTION__ << fileName;
+        outStream << QString(__FUNCTION__) << fileName << cover;
+        QByteArray data;
+        ReadStatus readStatus=readReply(data);
+        if (Read_Ok==readStatus) {
+            QDataStream inStream(data);
+            inStream >> resp;
+        } else {
+            resp=Read_Timeout==readStatus ? Tags::Update_Timedout : Tags::Update_BadFile;
+        }
+    }
+    return resp;
+}
diff --git a/devices/cdalbum.h b/tags/tagclient.h
similarity index 55%
copy from devices/cdalbum.h
copy to tags/tagclient.h
index 2c99f09..cf03491 100644
--- a/devices/cdalbum.h
+++ b/tags/tagclient.h
@@ -21,23 +21,29 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef CDALBUM_H
-#define CDALBUM_H
+#ifndef TAG_CLIENT_H
+#define TAG_CLIENT_H
 
-#include <QString>
-#include <QList>
 #include "song.h"
+#include <QImage>
+#include <QString>
+
+namespace Tags
+{
+    struct ReplayGain;
+}
 
-struct CdAlbum {
-    CdAlbum() : isDefault(false), year(0), disc(0)  { }
-    bool isNull() const { return 0==year && 0==disc && tracks.isEmpty() && name.isEmpty() && artist.isEmpty() && genre.isEmpty(); }
-    bool isDefault;
-    QString name;
-    QString artist;
-    QString genre;
-    int year;
-    int disc;
-    QList<Song> tracks;
-};
+namespace TagClient
+{
+    extern void enableDebug();
+    extern Song read(const QString &fileName);
+    extern QImage readImage(const QString &fileName);
+    extern QString readLyrics(const QString &fileName);
+    extern int updateArtistAndTitle(const QString &fileName, const Song &song);
+    extern int update(const QString &fileName, const Song &from, const Song &to, int id3Ver);
+    extern Tags::ReplayGain readReplaygain(const QString &fileName);
+    extern int updateReplaygain(const QString &fileName, const Tags::ReplayGain &rg);
+    extern int embedImage(const QString &fileName, const QByteArray &cover);
+}
 
 #endif
diff --git a/tags/tageditor.cpp b/tags/tageditor.cpp
index 00030b3..d566b46 100644
--- a/tags/tageditor.cpp
+++ b/tags/tageditor.cpp
@@ -31,6 +31,7 @@
 #include "localize.h"
 #include "trackorganiser.h"
 #include "cuefile.h"
+#include "utils.h"
 #ifdef ENABLE_DEVICES_SUPPORT
 #include "devicesmodel.h"
 #include "device.h"
@@ -40,12 +41,18 @@
 #include <QCoreApplication>
 #include <QEventLoop>
 #include <QDir>
+#include <QDebug>
 
-static bool equalTags(const Song &a, const Song &b, bool compareCommon)
+#define REMOVE(w) \
+    w->setVisible(false); \
+    w->deleteLater(); \
+    w=0;
+
+static bool equalTags(const Song &a, const Song &b, bool compareCommon, bool composerSupport)
 {
     return (compareCommon || a.track==b.track) && a.year==b.year && a.disc==b.disc &&
            a.artist==b.artist && a.genre==b.genre && a.album==b.album &&
-           a.albumartist==b.albumartist && (compareCommon || a.title==b.title);
+           a.albumartist==b.albumartist && (!composerSupport || a.composer==b.composer) && (compareCommon || a.title==b.title);
 }
 
 static void setString(QString &str, const QString &v, bool skipEmpty) {
@@ -62,9 +69,9 @@ int TagEditor::instanceCount()
 }
 
 TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
-                     const QSet<QString> &existingArtists, const QSet<QString> &existingAlbumArtists,
+                     const QSet<QString> &existingArtists, const QSet<QString> &existingAlbumArtists, const QSet<QString> &existingComposers,
                      const QSet<QString> &existingAlbums, const QSet<QString> &existingGenres, const QString &udi)
-    : Dialog(parent, "TagEditor", QSize(500, 200))
+    : SongDialog(parent, "TagEditor", QSize(500, 200))
     #ifdef ENABLE_DEVICES_SUPPORT
     , deviceUdi(udi)
     #endif
@@ -72,9 +79,11 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
     , updating(false)
     , haveArtists(false)
     , haveAlbumArtists(false)
+    , haveComposers(false)
     , haveAlbums(false)
     , haveGenres(false)
     , saving(false)
+    , composerSupport(true)
 {
     iCount++;
     foreach (const Song &s, songs) {
@@ -98,6 +107,7 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
     #ifdef ENABLE_DEVICES_SUPPORT
     if (deviceUdi.isEmpty()) {
         baseDir=MPDConnection::self()->getDetails().dir;
+        composerSupport=MPDConnection::self()->composerTagSupported();
     } else {
         Device *dev=getDevice(udi, parentWidget());
 
@@ -109,11 +119,15 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
         baseDir=dev->path();
     }
     #else
-    Q_UNUSED(udi)
     baseDir=MPDConnection::self()->getDetails().dir;
+    composerSupport=MPDConnection::self()->composerTagSupported();
     #endif
     qSort(original);
 
+    if (!songsOk(original, baseDir, udi.isEmpty())) {
+        return;
+    }
+
     QWidget *mainWidet = new QWidget(this);
     setupUi(mainWidet);
     track->setAllowEmpty();
@@ -157,6 +171,16 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
     albumArtist->clear();
     albumArtist->insertItems(0, strings);
 
+    if (composerSupport) {
+        strings=existingComposers.toList();
+        strings.sort();
+        composer->clear();
+        composer->insertItems(0, strings);
+    } else {
+        REMOVE(composer)
+        REMOVE(composerLabel)
+    }
+
     strings=existingAlbums.toList();
     strings.sort();
     album->clear();
@@ -176,6 +200,7 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
         QSet<QString> songAlbumArtists;
         QSet<QString> songAlbums;
         QSet<QString> songGenres;
+        QSet<QString> songComposers;
         QSet<int> songYears;
         QSet<int> songDiscs;
 
@@ -192,9 +217,13 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
             if (!s.genre.isEmpty()) {
                 songGenres.insert(s.genre);
             }
+            if (!s.composer.isEmpty()) {
+                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) {
+            if (songArtists.count()>1 && songAlbumArtists.count()>1 && songAlbums.count()>1 &&
+                songGenres.count()>1 && songYears.count()>1 && songDiscs.count()>1 && songComposers.count()>=1) {
                 break;
             }
         }
@@ -203,6 +232,7 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
         all.title.clear();
         all.track=0;
         all.artist=1==songArtists.count() ? *(songArtists.begin()) : QString();
+        all.composer=1==songComposers.count() ? *(songComposers.begin()) : QString();
         all.albumartist=1==songAlbumArtists.count() ? *(songAlbumArtists.begin()) : QString();
         all.album=1==songAlbums.count() ? *(songAlbums.begin()) : QString();
         all.genre=1==songGenres.count() ? *(songGenres.begin()) : QString();
@@ -214,6 +244,7 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
         haveAlbumArtists=!songAlbumArtists.isEmpty();
         haveAlbums=!songAlbums.isEmpty();
         haveGenres=!songGenres.isEmpty();
+        haveComposers=!songComposers.isEmpty();
     } else {
         title->setFocus();
     }
@@ -233,6 +264,10 @@ TagEditor::TagEditor(QWidget *parent, const QList<Song> &songs,
     connect(artist, SIGNAL(editTextChanged(const QString &)), SLOT(checkChanged()));
     connect(albumArtist, SIGNAL(activated(int)), SLOT(checkChanged()));
     connect(albumArtist, SIGNAL(editTextChanged(const QString &)), SLOT(checkChanged()));
+    if (composerSupport) {
+        connect(composer, SIGNAL(activated(int)), SLOT(checkChanged()));
+        connect(composer, SIGNAL(editTextChanged(const QString &)), SLOT(checkChanged()));
+    }
     connect(album, SIGNAL(activated(int)), SLOT(checkChanged()));
     connect(album, SIGNAL(editTextChanged(const QString &)), SLOT(checkChanged()));
     connect(genre, SIGNAL(activated(int)), SLOT(checkChanged()));
@@ -242,12 +277,6 @@ 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()));
-
-    if (original.count()>0) {
-        saveable=QDir(baseDir).isReadable();
-    } else {
-        saveable=false;
-    }
 }
 
 TagEditor::~TagEditor()
@@ -266,6 +295,10 @@ void TagEditor::fillSong(Song &s, bool isAll, bool skipEmpty) const
     setString(s.artist, artist->text().trimmed(), skipEmpty && (!haveAll || all.artist.isEmpty()));
     setString(s.album, album->text().trimmed(), skipEmpty && (!haveAll || all.album.isEmpty()));
     setString(s.albumartist, albumArtist->text().trimmed(), skipEmpty && (!haveAll || all.albumartist.isEmpty()));
+    if (composerSupport) {
+        setString(s.composer, composer->text().trimmed(), skipEmpty && (!haveAll || all.composer.isEmpty()));
+    }
+
     if (!isAll) {
         s.track=track->value();
     }
@@ -283,16 +316,15 @@ void TagEditor::setPlaceholderTexts()
         artist->setPlaceholderText(all.artist.isEmpty() && haveArtists ? various : QString());
         album->setPlaceholderText(all.album.isEmpty() && haveAlbums ? various : QString());
         albumArtist->setPlaceholderText(all.albumartist.isEmpty() && haveAlbumArtists ? various : QString());
+        if (composerSupport) {
+            composer->setPlaceholderText(all.composer.isEmpty() && haveComposers ? various : QString());
+        }
         genre->setPlaceholderText(all.genre.isEmpty() && haveGenres ? various : QString());
     }
 }
 
 void TagEditor::enableOkButton()
 {
-    if (!saveable) {
-        return;
-    }
-
     enableButton(Ok, (editedIndexes.count()>1) ||
                      (1==original.count() && 1==editedIndexes.count()) ||
                      (1==editedIndexes.count() && !editedIndexes.contains(0)) );
@@ -307,6 +339,9 @@ void TagEditor::setLabelStates()
 
     titleLabel->setOn(!isAll && o.title!=e.title);
     artistLabel->setOn(o.artist!=e.artist);
+    if (composerSupport) {
+        composerLabel->setOn(o.composer!=e.composer);
+    }
     albumArtistLabel->setOn(o.albumartist!=e.albumartist);
     albumLabel->setOn(o.album!=e.album);
     trackLabel->setOn(!isAll && o.track!=e.track);
@@ -554,7 +589,7 @@ void TagEditor::updateEditedStatus(int index)
 {
     bool isAll=0==index && original.count()>1;
     Song s=edited.at(index);
-    if (equalTags(s, original.at(index), isAll)) {
+    if (equalTags(s, original.at(index), isAll, composerSupport)) {
         if (editedIndexes.contains(index)) {
             editedIndexes.remove(index);
             updateTrackName(index, false);
@@ -584,6 +619,9 @@ void TagEditor::updateEdited(bool isFromAll)
         if (all.albumartist.isEmpty() && s.albumartist.isEmpty() && !o.albumartist.isEmpty()) {
             s.albumartist=o.albumartist;
         }
+        if (composerSupport && all.composer.isEmpty() && s.composer.isEmpty() && !o.composer.isEmpty()) {
+            s.composer=o.composer;
+        }
         if (all.album.isEmpty() && s.album.isEmpty() && !o.album.isEmpty()) {
             s.album=o.album;
         }
@@ -592,7 +630,7 @@ void TagEditor::updateEdited(bool isFromAll)
         }
     }
 
-    if (equalTags(s, original.at(currentSongIndex), isFromAll || isAll)) {
+    if (equalTags(s, original.at(currentSongIndex), isFromAll || isAll, composerSupport)) {
         if (editedIndexes.contains(currentSongIndex)) {
             editedIndexes.remove(currentSongIndex);
             updateTrackName(currentSongIndex, false);
@@ -612,6 +650,9 @@ void TagEditor::setSong(const Song &s)
     title->setText(s.title);
     artist->setText(s.artist);
     albumArtist->setText(s.albumartist);
+    if (composerSupport) {
+        composer->setText(s.composer);
+    }
     album->setText(s.album);
     track->setValue(s.track);
     disc->setValue(s.disc);
@@ -656,7 +697,7 @@ void TagEditor::setIndex(int idx)
     updating=false;
 }
 
-void TagEditor::applyUpdates()
+bool TagEditor::applyUpdates()
 {
     bool skipFirst=original.count()>1;
     QStringList failed;
@@ -667,7 +708,7 @@ void TagEditor::applyUpdates()
     if (!deviceUdi.isEmpty()) {
         dev=getDevice(deviceUdi, this);
         if (!dev) {
-            return;
+            return true;
         }
         opts=dev->options();
         udi=dev->id();
@@ -690,6 +731,7 @@ void TagEditor::applyUpdates()
     progress->setRange(1, toSave);
 
     int count=0;
+    bool someTimedout=false;
     foreach (int idx, editedIndexes) {
         progress->setValue(progress->value()+1);
 
@@ -702,7 +744,7 @@ void TagEditor::applyUpdates()
         }
         Song orig=original.at(idx);
         Song edit=edited.at(idx);
-        if (equalTags(orig, edit, false)) {
+        if (equalTags(orig, edit, false, composerSupport)) {
             continue;
         }
 
@@ -730,6 +772,15 @@ void TagEditor::applyUpdates()
         case Tags::Update_Failed:
             failed.append(orig.file);
             break;
+        #ifdef ENABLE_EXTERNAL_TAGS
+        case Tags::Update_Timedout:
+            failed.append(i18nc("filename (Timeout)", "%1 (Timeout)", orig.file));
+            someTimedout=true;
+            break;
+        case Tags::Update_BadFile:
+            failed.append(i18nc("filename (Corrupt tags?)", "%1 (Corrupt tags?)", orig.file));
+            break;
+        #endif
         default:
             break;
         }
@@ -758,14 +809,17 @@ void TagEditor::applyUpdates()
             dlg->show(updatedSongs, udi);
         }
     }
+
+    return !someTimedout;
 }
 
 void TagEditor::slotButtonClicked(int button)
 {
     switch (button) {
     case Ok: {
-        applyUpdates();
-        accept();
+        if (applyUpdates()) {
+            accept();
+        }
         break;
     }
     case Reset: // Reset
diff --git a/tags/tageditor.h b/tags/tageditor.h
index 179f01a..c9bce04 100644
--- a/tags/tageditor.h
+++ b/tags/tageditor.h
@@ -25,9 +25,8 @@
 #define TAG_EDITOR_H
 
 #include "config.h"
-#include "dialog.h"
+#include "songdialog.h"
 #include "ui_tageditor.h"
-#include "song.h"
 #include <QSet>
 #include <QList>
 
@@ -35,7 +34,7 @@
 class Device;
 #endif
 
-class TagEditor : public Dialog, Ui::TagEditor
+class TagEditor : public SongDialog, Ui::TagEditor
 {
     Q_OBJECT
 
@@ -43,7 +42,7 @@ public:
     static int instanceCount();
 
     TagEditor(QWidget *parent, const QList<Song> &songs,
-              const QSet<QString> &existingArtists, const QSet<QString> &existingAlbumArtists,
+              const QSet<QString> &existingArtists, const QSet<QString> &existingAlbumArtists, const QSet<QString> &existingComposers,
               const QSet<QString> &existingAlbums, const QSet<QString> &existingGenres, const QString &udi);
     virtual ~TagEditor();
 
@@ -59,7 +58,7 @@ private:
     void slotButtonClicked(int button);
     void updateTrackName(int index, bool edited);
     void updateEditedStatus(int index);
-    void applyUpdates();
+    bool applyUpdates();
     #ifdef ENABLE_DEVICES_SUPPORT
     Device * getDevice(const QString &udi, QWidget *p);
     #endif
@@ -86,12 +85,13 @@ private:
     int currentSongIndex;
     QSet<int> editedIndexes;
     bool updating;
-    bool saveable;
     bool haveArtists;
     bool haveAlbumArtists;
+    bool haveComposers;
     bool haveAlbums;
     bool haveGenres;
     bool saving;
+    bool composerSupport;
 };
 
 #endif
diff --git a/tags/tageditor.ui b/tags/tageditor.ui
index c1fc193..0f8c22b 100644
--- a/tags/tageditor.ui
+++ b/tags/tageditor.ui
@@ -16,6 +16,9 @@
    </property>
    <item>
   <layout class="QFormLayout" name="formLayout">
+   <property name="fieldGrowthPolicy">
+    <enum>QFormLayout::ExpandingFieldsGrow</enum>
+   </property>
    <item row="0" column="0">
     <widget class="StateLabel" name="trackNameLabel">
      <property name="text">
@@ -69,6 +72,19 @@
     <widget class="CompletionCombo" name="albumArtist"/>
    </item>
    <item row="4" column="0">
+    <widget class="StateLabel" name="composerLabel">
+     <property name="text">
+      <string>Composer:</string>
+     </property>
+     <property name="buddy">
+      <cstring>composer</cstring>
+     </property>
+    </widget>
+   </item>
+   <item row="4" column="1">
+    <widget class="CompletionCombo" name="composer"/>
+   </item>
+   <item row="5" column="0">
     <widget class="StateLabel" name="albumLabel">
      <property name="text">
       <string>Album:</string>
@@ -78,10 +94,10 @@
      </property>
     </widget>
    </item>
-   <item row="4" column="1">
+   <item row="5" column="1">
     <widget class="CompletionCombo" name="album"/>
    </item>
-   <item row="5" column="0">
+   <item row="6" column="0">
     <widget class="StateLabel" name="trackLabel">
      <property name="text">
       <string>Track number:</string>
@@ -91,10 +107,10 @@
      </property>
     </widget>
    </item>
-   <item row="5" column="1">
+   <item row="6" column="1">
     <widget class="SpinBox" name="track"/>
    </item>
-   <item row="6" column="0">
+   <item row="7" column="0">
     <widget class="StateLabel" name="discLabel">
      <property name="text">
       <string>Disc number:</string>
@@ -104,10 +120,10 @@
      </property>
     </widget>
    </item>
-   <item row="6" column="1">
+   <item row="7" column="1">
     <widget class="SpinBox" name="disc"/>
    </item>
-   <item row="7" column="0">
+   <item row="8" column="0">
     <widget class="StateLabel" name="genreLabel">
      <property name="text">
       <string>Genre:</string>
@@ -117,10 +133,10 @@
      </property>
     </widget>
    </item>
-   <item row="7" column="1">
+   <item row="8" column="1">
     <widget class="CompletionCombo" name="genre"/>
    </item>
-   <item row="8" column="0">
+   <item row="9" column="0">
     <widget class="StateLabel" name="yearLabel">
      <property name="text">
       <string>Year:</string>
@@ -130,7 +146,7 @@
      </property>
     </widget>
    </item>
-   <item row="8" column="1">
+   <item row="9" column="1">
     <widget class="SpinBox" name="year"/>
    </item>
   </layout>
diff --git a/tags/tags.cpp b/tags/tags.cpp
index 6f3e41f..bc5be30 100644
--- a/tags/tags.cpp
+++ b/tags/tags.cpp
@@ -33,8 +33,6 @@
 #include <ios>
 #include <QPair>
 #include <QFile>
-#include <QMutex>
-#include <QMutexLocker>
 #include <QString>
 #include <QStringList>
 #include <QTextCodec>
@@ -47,6 +45,9 @@
 #ifdef TAGLIB_MP4_FOUND
 #include <taglib/mp4file.h>
 #endif
+#ifdef TAGLIB_OPUS_FOUND
+#include <taglib/opusfile.h>
+#endif
 #include <taglib/mpcfile.h>
 #include <taglib/mpegfile.h>
 #include <taglib/oggfile.h>
@@ -63,6 +64,7 @@
 #include <taglib/apetag.h>
 #include <taglib/id3v2tag.h>
 #include <taglib/id3v1tag.h>
+#include <taglib/id3v1genres.h>
 #ifdef TAGLIB_MP4_FOUND
 #include <taglib/mp4tag.h>
 #endif
@@ -76,6 +78,16 @@
 #include <taglib-extras/realmediafiletyperesolver.h>
 #endif
 
+#ifdef ENABLE_EXTERNAL_TAGS
+// Mutex is locked in client, and server (that accesses this class) is single threaded
+#define LOCK_MUTEX
+#else
+#include <QMutex>
+#include <QMutexLocker>
+static QMutex mutex;
+#define LOCK_MUTEX QMutexLocker locker(&mutex);
+#endif
+
 namespace Tags
 {
 
@@ -109,11 +121,6 @@ static double parseRgString(const TagLib::String &str) {
     return ok ? v : 0.0;
 }
 
-bool ReplayGain::isEmpty() const
-{
-    return Utils::equal(trackGain, 0.0) && Utils::equal(trackPeak, 0.0) && Utils::equal(albumGain, 0.0) && Utils::equal(albumPeak, 0.0);
-}
-
 struct RgTags : public ReplayGain
 {
     RgTags(const ReplayGain &r)
@@ -144,19 +151,6 @@ struct RgTagsStrings
     std::string trackGain, trackPeak, albumGain, albumPeak;
 };
 
-static TagLib::FileRef getFileRef(const QString &path)
-{
-    #ifdef Q_OS_WIN32
-    const wchar_t *encodedName = reinterpret_cast< const wchar_t * >(path.utf16());
-    #elif defined COMPLEX_TAGLIB_FILENAME
-    const wchar_t *encodedName = reinterpret_cast< const wchar_t * >(path.utf16());
-    #else
-    QByteArray fileName = QFile::encodeName(path);
-    const char *encodedName = fileName.constData(); // valid as long as fileName exists
-    #endif
-    return TagLib::FileRef(encodedName, true, TagLib::AudioProperties::Fast);
-}
-
 static void ensureFileTypeResolvers()
 {
     static bool alreadyAdded = false;
@@ -171,6 +165,17 @@ static void ensureFileTypeResolvers()
     }
 }
 
+static TagLib::FileRef getFileRef(const QString &path)
+{
+    ensureFileTypeResolvers();
+
+    #ifdef Q_OS_WIN32
+    return TagLib::FileRef(reinterpret_cast<const wchar_t*>(path.constData()), true, TagLib::AudioProperties::Fast);
+    #else
+    return TagLib::FileRef(QFile::encodeName(path).constData(), true, TagLib::AudioProperties::Fast);
+    #endif
+}
+
 static QPair<int, int> splitDiscNumber(const QString &value)
 {
     int disc;
@@ -191,7 +196,8 @@ static QPair<int, int> splitDiscNumber(const QString &value)
 }
 
 // -- taken from rgtag.cpp from libebur128 -- START
-static bool clearTxxxTag(TagLib::ID3v2::Tag* tag, TagLib::String tagName) {
+static bool clearTxxxTag(TagLib::ID3v2::Tag *tag, TagLib::String tagName)
+{
     TagLib::ID3v2::FrameList l = tag->frameList("TXXX");
     for (TagLib::ID3v2::FrameList::Iterator it = l.begin(); it != l.end(); ++it) {
         TagLib::ID3v2::UserTextIdentificationFrame *fr=dynamic_cast<TagLib::ID3v2::UserTextIdentificationFrame*>(*it);
@@ -203,7 +209,8 @@ static bool clearTxxxTag(TagLib::ID3v2::Tag* tag, TagLib::String tagName) {
     return false;
 }
 
-static bool clearRva2Tag(TagLib::ID3v2::Tag* tag, TagLib::String tagName) {
+static bool clearRva2Tag(TagLib::ID3v2::Tag *tag, TagLib::String tagName)
+{
     TagLib::ID3v2::FrameList l = tag->frameList("RVA2");
     for (TagLib::ID3v2::FrameList::Iterator it = l.begin(); it != l.end(); ++it) {
         TagLib::ID3v2::RelativeVolumeFrame *fr=dynamic_cast<TagLib::ID3v2::RelativeVolumeFrame*>(*it);
@@ -212,10 +219,11 @@ static bool clearRva2Tag(TagLib::ID3v2::Tag* tag, TagLib::String tagName) {
             return true;
         }
     }
-  return false;
+    return false;
 }
 
-static void setTxxxTag(TagLib::ID3v2::Tag* tag, const std::string &tagName, const std::string &value) {
+static void setTxxxTag(TagLib::ID3v2::Tag *tag, const std::string &tagName, const std::string &value)
+{
     TagLib::ID3v2::UserTextIdentificationFrame *frame = TagLib::ID3v2::UserTextIdentificationFrame::find(tag, tagName);
     if (!frame) {
         frame = new TagLib::ID3v2::UserTextIdentificationFrame;
@@ -225,13 +233,14 @@ static void setTxxxTag(TagLib::ID3v2::Tag* tag, const std::string &tagName, cons
     frame->setText(value);
 }
 
-static void setRva2Tag(TagLib::ID3v2::Tag* tag, const std::string &tagName, double gain, double peak) {
+static void setRva2Tag(TagLib::ID3v2::Tag *tag, const std::string &tagName, double gain, double peak)
+{
     TagLib::ID3v2::RelativeVolumeFrame *frame = NULL;
     TagLib::ID3v2::FrameList frameList = tag->frameList("RVA2");
     TagLib::ID3v2::FrameList::ConstIterator it = frameList.begin();
     for (; it != frameList.end(); ++it) {
         TagLib::ID3v2::RelativeVolumeFrame *fr=dynamic_cast<TagLib::ID3v2::RelativeVolumeFrame*>(*it);
-        if (fr->identification() == tagName) {
+        if (fr && fr->identification() == tagName) {
             frame = fr;
             break;
         }
@@ -262,6 +271,12 @@ static void readID3v2Tags(TagLib::ID3v2::Tag *tag, Song *song, ReplayGain *rg, Q
             song->albumartist=tString2QString(albumArtist.front()->toString());
         }
 
+        const TagLib::ID3v2::FrameList &composer = tag->frameListMap()["TCOM"];
+
+        if (!composer.isEmpty()) {
+            song->composer=tString2QString(composer.front()->toString());
+        }
+
         const TagLib::ID3v2::FrameList &disc = tag->frameListMap()["TPOS"];
 
         if (!disc.isEmpty()) {
@@ -375,6 +390,9 @@ static bool writeID3v2Tags(TagLib::ID3v2::Tag *tag, const Song &from, const Song
         if (from.albumartist!=to.albumartist && updateID3v2Tag(tag, "TPE2", to.albumartist)) {
             changed=true;
         }
+        if (from.composer!=to.composer && updateID3v2Tag(tag, "TCOM", to.composer)) {
+            changed=true;
+        }
         if (from.disc!=to.disc&& updateID3v2Tag(tag, "TPOS", 0==to.disc ? QString() : QString::number(to.disc))) {
             changed=true;
         }
@@ -424,7 +442,9 @@ static void readAPETags(TagLib::APE::Tag *tag, Song *song, ReplayGain *rg)
         if (map.contains("Album Artist")) {
             song->albumartist=tString2QString(map["Album Artist"].toString());
         }
-
+        if (map.contains("Composer")) {
+            song->composer=tString2QString(map["Composer"].toString());
+        }
         if (map.contains("Disc")) {
             song->disc=splitDiscNumber(tString2QString(map["Disc"].toString())).first;
         }
@@ -470,6 +490,9 @@ static bool writeAPETags(TagLib::APE::Tag *tag, const Song &from, const Song &to
         if (from.albumartist!=to.albumartist && updateAPETag(tag, "Album Artist", to.albumartist)) {
             changed=true;
         }
+        if (from.composer!=to.composer && updateAPETag(tag, "Composer", to.composer)) {
+            changed=true;
+        }
         if (from.disc!=to.disc && updateAPETag(tag, "Disc", 0==to.disc ? QString() : QString::number(to.disc))) {
             changed=true;
         }
@@ -511,7 +534,10 @@ static void readVorbisCommentTags(TagLib::Ogg::XiphComment *tag, Song *song, Rep
         if (str.isEmpty()) {
             song->albumartist=tString2QString(str);
         }
-
+        str=readVorbisTag(tag, "COMPOSER");
+        if (str.isEmpty()) {
+            song->composer=tString2QString(str);
+        }
         str=readVorbisTag(tag, "DISCNUMBER");
         if (str.isEmpty()) {
             song->disc=splitDiscNumber(tString2QString(str)).first;
@@ -573,6 +599,9 @@ static bool writeVorbisCommentTags(TagLib::Ogg::XiphComment *tag, const Song &fr
         if (from.albumartist!=to.albumartist && updateVorbisCommentTag(tag, "ALBUMARTIST", to.albumartist)) {
             changed=true;
         }
+        if (from.composer!=to.composer && updateVorbisCommentTag(tag, "COMPOSER", to.composer)) {
+            changed=true;
+        }
         if (from.disc!=to.disc && updateVorbisCommentTag(tag, "DISCNUMBER", 0==to.disc ? QString() : QString::number(to.disc))) {
             changed=true;
         }
@@ -612,6 +641,9 @@ static void readMP4Tags(TagLib::MP4::Tag *tag, Song *song, ReplayGain *rg, QImag
         if (map.contains("aART") && !map["aART"].toStringList().isEmpty()) {
             song->albumartist=tString2QString(map["aART"].toStringList().front());
         }
+        if (map.contains("\xA9wrt") && !map["\xA9wrt"].toStringList().isEmpty()) {
+            song->composer=tString2QString(map["\xA9wrt"].toStringList().front());
+        }
         if (map.contains("disk")) {
             song->disc=map["disk"].toIntPair().first;
         }
@@ -666,6 +698,9 @@ static bool writeMP4Tags(TagLib::MP4::Tag *tag, const Song &from, const Song &to
         if (from.albumartist!=to.albumartist && updateMP4Tag(tag, "aART", to.albumartist)) {
             changed=true;
         }
+        if (from.composer!=to.composer && updateMP4Tag(tag, "\xA9wrt", to.composer)) {
+            changed=true;
+        }
         if (from.disc!=to.disc && updateMP4Tag(tag, "disk", 0==to.disc ? QString() : QString::number(to.disc))) {
             changed=true;
         }
@@ -711,7 +746,9 @@ static void readASFTags(TagLib::ASF::Tag *tag, Song *song, ReplayGain *rg)
         if (map.contains("WM/AlbumTitle") && !map["WM/AlbumTitle"].isEmpty()) {
             song->albumartist=tString2QString(map["WM/AlbumTitle"].front().toString());
         }
-
+        if (map.contains("WM/Composer") && !map["WM/Composer"].isEmpty()) {
+            song->composer=tString2QString(map["WM/Composer"].front().toString());
+        }
         if (map.contains("WM/PartOfSet")) {
             song->albumartist=map["WM/PartOfSet"].front().toUInt();
         }
@@ -743,6 +780,9 @@ static bool writeASFTags(TagLib::ASF::Tag *tag, const Song &from, const Song &to
         if (from.albumartist!=to.albumartist && updateASFTag(tag, "WM/AlbumTitle", to.albumartist)) {
             changed=true;
         }
+        if (from.composer!=to.composer && updateASFTag(tag, "WM/Composer", to.composer)) {
+            changed=true;
+        }
         if (from.disc!=to.disc && updateASFTag(tag, "WM/PartOfSet", 0==to.disc ? QString() : QString::number(to.disc))) {
             changed=true;
         }
@@ -764,7 +804,7 @@ static void readTags(const TagLib::FileRef fileref, Song *song, ReplayGain *rg,
     }
 
     if (TagLib::MPEG::File *file = dynamic_cast< TagLib::MPEG::File * >(fileref.file())) {
-        if (file->ID3v2Tag()) {
+        if (file->ID3v2Tag() && !file->ID3v2Tag()->isEmpty()) {
             readID3v2Tags(file->ID3v2Tag(), song, rg, img, lyrics);
         } else if (file->APETag()) {
             readAPETags(file->APETag(), song, rg);
@@ -783,6 +823,12 @@ static void readTags(const TagLib::FileRef fileref, Song *song, ReplayGain *rg,
         if (file->tag()) {
             readVorbisCommentTags(file->tag(), song, rg, img);
         }
+    #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);
+        }
+    #endif
     } else if (TagLib::FLAC::File *file = dynamic_cast< TagLib::FLAC::File * >(fileref.file())) {
         if (file->xiphComment()) {
             readVorbisCommentTags(file->xiphComment(), song, rg, img);
@@ -791,7 +837,7 @@ static void readTags(const TagLib::FileRef fileref, Song *song, ReplayGain *rg,
                 readFlacPicture(file->pictureList(), img);
             }
             #endif
-        } else if (file->ID3v2Tag()) {
+        } else if (file->ID3v2Tag() && !file->ID3v2Tag()->isEmpty()) {
             readID3v2Tags(file->ID3v2Tag(), song, rg, img, lyrics);
 //         } else if (file->ID3v1Tag()) {
 //             readID3v1Tags(fileref, song, rg);
@@ -870,7 +916,7 @@ static bool writeTags(const TagLib::FileRef fileref, const Song &from, const Son
         }
     }
     if (TagLib::MPEG::File *file = dynamic_cast< TagLib::MPEG::File * >(fileref.file())) {
-        if (file->ID3v2Tag()) {
+        if (file->ID3v2Tag() && !file->ID3v2Tag()->isEmpty()) {
             changed=writeID3v2Tags(file->ID3v2Tag(), from, to, rg, img) || changed;
         } else if (file->APETag()) {
             changed=writeAPETags(file->APETag(), from, to, rg) || changed;
@@ -891,10 +937,16 @@ static bool writeTags(const TagLib::FileRef fileref, const Song &from, const Son
         if (file->tag()) {
             changed=writeVorbisCommentTags(file->tag(), from, to, rg, img) || changed;
         }
+    #ifdef TAGLIB_OPUS_FOUND
+    } else if (TagLib::Ogg::Opus::File *file = dynamic_cast< TagLib::Ogg::Opus::File * >(fileref.file())) {
+        if (file->tag()) {
+            changed=writeVorbisCommentTags(file->tag(), from, to, rg, img) || changed;
+        }
+    #endif
     } else if (TagLib::FLAC::File *file = dynamic_cast< TagLib::FLAC::File * >(fileref.file())) {
         if (file->xiphComment()) {
             changed=writeVorbisCommentTags(file->xiphComment(), from, to, rg, img) || changed;
-        } else if (file->ID3v2Tag()) {
+        } else if (file->ID3v2Tag() && !file->ID3v2Tag()->isEmpty()) {
             changed=writeID3v2Tags(file->ID3v2Tag(), from, to, rg, img) || changed;
 //         } else if (file->ID3v1Tag()) {
 //             changed=writeID3v1Tags(fileref, from, to, rg, img) || changed;
@@ -946,16 +998,11 @@ static bool writeTags(const TagLib::FileRef fileref, const Song &from, const Son
     return changed;
 }
 
-static QMutex mutex;
-
 Song read(const QString &fileName)
 {
-    QMutexLocker locker(&mutex);
-    ensureFileTypeResolvers();
-
+    LOCK_MUTEX
     Song song;
     TagLib::FileRef fileref = getFileRef(fileName);
-
     if (fileref.isNull()) {
         return song;
     }
@@ -968,12 +1015,9 @@ Song read(const QString &fileName)
 
 QImage readImage(const QString &fileName)
 {
-    QMutexLocker locker(&mutex);
-    ensureFileTypeResolvers();
-
+    LOCK_MUTEX
     QImage img;
     TagLib::FileRef fileref = getFileRef(fileName);
-
     if (fileref.isNull()) {
         return img;
     }
@@ -984,12 +1028,9 @@ QImage readImage(const QString &fileName)
 
 QString readLyrics(const QString &fileName)
 {
-    QMutexLocker locker(&mutex);
-    ensureFileTypeResolvers();
-
+    LOCK_MUTEX
     QString lyrics;
     TagLib::FileRef fileref = getFileRef(fileName);
-
     if (fileref.isNull()) {
         return lyrics;
     }
@@ -1022,11 +1063,8 @@ static Update update(const TagLib::FileRef fileref, const Song &from, const Song
 
 Update updateArtistAndTitle(const QString &fileName, const Song &song)
 {
-    QMutexLocker locker(&mutex);
-    ensureFileTypeResolvers();
-
+    LOCK_MUTEX
     TagLib::FileRef fileref = getFileRef(fileName);
-
     if (fileref.isNull()) {
         return Update_Failed;
     }
@@ -1052,20 +1090,15 @@ Update updateArtistAndTitle(const QString &fileName, const Song &song)
 
 Update update(const QString &fileName, const Song &from, const Song &to, int id3Ver)
 {
-    QMutexLocker locker(&mutex);
-    ensureFileTypeResolvers();
-
+    LOCK_MUTEX
     TagLib::FileRef fileref = getFileRef(fileName);
     return fileref.isNull() ? Update_Failed : update(fileref, from, to, RgTags(), QByteArray(), id3Ver);
 }
 
 ReplayGain readReplaygain(const QString &fileName)
 {
-    QMutexLocker locker(&mutex);
-    ensureFileTypeResolvers();
-
+    LOCK_MUTEX
     TagLib::FileRef fileref = getFileRef(fileName);
-
     if (fileref.isNull()) {
         return false;
     }
@@ -1077,20 +1110,55 @@ ReplayGain readReplaygain(const QString &fileName)
 
 Update updateReplaygain(const QString &fileName, const ReplayGain &rg)
 {
-    QMutexLocker locker(&mutex);
-    ensureFileTypeResolvers();
-
+    LOCK_MUTEX
     TagLib::FileRef fileref = getFileRef(fileName);
     return fileref.isNull() ? Update_Failed : update(fileref, Song(), Song(), RgTags(rg), QByteArray());
 }
 
 Update embedImage(const QString &fileName, const QByteArray &cover)
 {
-    QMutexLocker locker(&mutex);
-    ensureFileTypeResolvers();
-
+    LOCK_MUTEX
     TagLib::FileRef fileref = getFileRef(fileName);
     return fileref.isNull() ? Update_Failed : update(fileref, Song(), Song(), RgTags(), cover);
 }
 
+QString oggMimeType(const QString &fileName)
+{
+    LOCK_MUTEX
+    #ifdef Q_OS_WIN32
+    const wchar_t*encodedName=reinterpret_cast<const wchar_t*>(fileName.constData());
+    #else
+    const char *encodedName=QFile::encodeName(fileName).constData();
+    #endif
+
+    TagLib::Ogg::Vorbis::File vorbis(encodedName, false, TagLib::AudioProperties::Fast);
+    if (vorbis.isValid()) {
+        return QLatin1String("audio/x-vorbis+ogg");
+    }
+
+    TagLib::Ogg::FLAC::File flac(encodedName, false, TagLib::AudioProperties::Fast);
+    if (flac.isValid()) {
+        return QLatin1String("audio/x-flac+ogg");
+    }
+
+    TagLib::Ogg::Speex::File speex(encodedName, false, TagLib::AudioProperties::Fast);
+    if (speex.isValid()) {
+        return QLatin1String("audio/x-speex+ogg");
+    }
+
+    #ifdef TAGLIB_OPUS_FOUND
+    TagLib::Ogg::Opus::File opus(encodedName, false, TagLib::AudioProperties::Fast);
+    if (opus.isValid()) {
+        return QLatin1String("audio/x-opus+ogg");
+    }
+    #endif
+    return QLatin1String("audio/ogg");
+}
+
+QString id3Genre(int id)
+{
+    // Clementine: In theory, genre 0 is "blues"; in practice it's invalid.
+    return 0==id ? QString() : tString2QString(TagLib::ID3v1::genre(id));
+}
+
 }
diff --git a/tags/tags.h b/tags/tags.h
index ad391d3..9375e3b 100644
--- a/tags/tags.h
+++ b/tags/tags.h
@@ -25,7 +25,14 @@
 #define TAGS_H
 
 #include "song.h"
+#include "utils.h"
+#include "config.h"
 #include <QImage>
+#include <QMetaType>
+
+#if defined ENABLE_EXTERNAL_TAGS && !defined CANTATA_TAG_SERVER
+#include "tagclient.h"
+#endif
 
 namespace Tags
 {
@@ -38,7 +45,10 @@ namespace Tags
             , albumPeak(ap) {
         }
 
-        bool isEmpty() const;
+        bool isEmpty() const
+        {
+            return Utils::equal(trackGain, 0.0) && Utils::equal(trackPeak, 0.0) && Utils::equal(albumGain, 0.0) && Utils::equal(albumPeak, 0.0);
+        }
 
         double trackGain;
         double albumGain;
@@ -51,8 +61,22 @@ namespace Tags
         Update_Failed,
         Update_None,
         Update_Modified
+        #ifdef ENABLE_EXTERNAL_TAGS
+        , Update_Timedout
+        , Update_BadFile
+        #endif
     };
 
+    #if defined ENABLE_EXTERNAL_TAGS && !defined CANTATA_TAG_SERVER
+    inline Song read(const QString &fileName) { return TagClient::read(fileName); }
+    inline QImage readImage(const QString &fileName) { return TagClient::readImage(fileName); }
+    inline QString readLyrics(const QString &fileName) { return TagClient::readLyrics(fileName); }
+    inline Update updateArtistAndTitle(const QString &fileName, const Song &song) { return (Update)TagClient::updateArtistAndTitle(fileName, song); }
+    inline Update update(const QString &fileName, const Song &from, const Song &to, int id3Ver=-1) { return (Update)TagClient::update(fileName, from, to, id3Ver); }
+    inline ReplayGain readReplaygain(const QString &fileName) { return TagClient::readReplaygain(fileName); }
+    inline Update updateReplaygain(const QString &fileName, const ReplayGain &rg) { return (Update)TagClient::updateReplaygain(fileName, rg); }
+    inline Update embedImage(const QString &fileName, const QByteArray &cover) { return (Update)TagClient::embedImage(fileName, cover); }
+    #else
     extern Song read(const QString &fileName);
     extern QImage readImage(const QString &fileName);
     extern QString readLyrics(const QString &fileName);
@@ -61,6 +85,25 @@ namespace Tags
     extern ReplayGain readReplaygain(const QString &fileName);
     extern Update updateReplaygain(const QString &fileName, const ReplayGain &rg);
     extern Update embedImage(const QString &fileName, const QByteArray &cover);
-};
+    extern QString oggMimeType(const QString &fileName);
+    #endif
+    extern QString id3Genre(int id);
+}
+
+#ifdef ENABLE_EXTERNAL_TAGS
+Q_DECLARE_METATYPE(Tags::ReplayGain)
+
+inline QDataStream & operator<<(QDataStream &stream, const Tags::ReplayGain &rg)
+{
+    stream << rg.trackGain << rg.albumGain << rg.trackPeak << rg.albumPeak;
+    return stream;
+}
+
+inline QDataStream & operator>>(QDataStream &stream, Tags::ReplayGain &rg)
+{
+    stream >> rg.trackGain >> rg.albumGain >> rg.trackPeak >> rg.albumPeak;
+    return stream;
+}
+#endif
 
 #endif
diff --git a/tags/tagserver.cpp b/tags/tagserver.cpp
new file mode 100644
index 0000000..1f4eea9
--- /dev/null
+++ b/tags/tagserver.cpp
@@ -0,0 +1,92 @@
+/*
+ * 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 "tagserver.h"
+#include "tags.h"
+#include <QDataStream>
+#include <QVariant>
+#include <QCoreApplication>
+#include <QFile>
+
+TagServer::TagServer()
+{
+    in=new QFile(0);
+    in->open(stdin, QIODevice::ReadOnly);
+    out=new QFile(0);
+    out->open(stdout, QIODevice::WriteOnly);
+}
+
+TagServer::~TagServer()
+{
+    delete in;
+    delete out;
+}
+
+int TagServer::process()
+{
+    while (in->isReadable() && out->isWritable()) {
+        QString request;
+        QString fileName;
+        QDataStream inStream(in);
+        QDataStream outStream(out);
+
+        inStream >> request >> fileName;
+
+        if (QLatin1String("read")==request) {
+            outStream << Tags::read(fileName);
+            out->flush();
+        } else if (QLatin1String("readImage")==request) {
+            outStream << Tags::readImage(fileName);
+            out->flush();
+        } else if (QLatin1String("readLyrics")==request) {
+            outStream << Tags::readLyrics(fileName);
+            out->flush();
+        } else if (QLatin1String("updateArtistAndTitle")==request) {
+            Song song;
+            outStream << (int)Tags::updateArtistAndTitle(fileName, song);
+            out->flush();
+        } else if (QLatin1String("update")==request) {
+            Song from;
+            Song to;
+            int id3Ver;
+            inStream >> from >> to >> id3Ver;
+            outStream << (int)Tags::update(fileName, from, to, id3Ver);
+            out->flush();
+        } else if (QLatin1String("readReplaygain")==request) {
+            Tags::ReplayGain rg=Tags::readReplaygain(fileName);
+            outStream << rg;
+            out->flush();
+        } else if (QLatin1String("updateReplaygain")==request) {
+            Tags::ReplayGain rg;
+            inStream >> rg;
+            outStream << (int)Tags::updateReplaygain(fileName, rg);
+            out->flush();
+        } else if (QLatin1String("embedImage")==request) {
+            QByteArray cover;
+            inStream >> cover;
+            outStream << (int)Tags::embedImage(fileName, cover);
+            out->flush();
+        }
+    }
+    return 0;
+}
diff --git a/support/proxystyle.h b/tags/tagserver.h
similarity index 84%
copy from support/proxystyle.h
copy to tags/tagserver.h
index d105e46..54129d9 100644
--- a/support/proxystyle.h
+++ b/tags/tagserver.h
@@ -21,17 +21,22 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef PROXYSTYLE_H
-#define PROXYSTYLE_H
+#ifndef TAG_SERVER_H
+#define TAG_SERVER_H
 
-#include <QProxyStyle>
+class QFile;
 
-class ProxyStyle : public QProxyStyle
+class TagServer
 {
 public:
-    ProxyStyle() { }
+    TagServer();
+    ~TagServer();
 
-    void polish(QWidget *widget);
+    int process();
+
+private:
+    QFile *in;
+    QFile *out;
 };
 
 #endif
diff --git a/tags/trackorganiser.cpp b/tags/trackorganiser.cpp
index 7c71384..f5a9a7e 100644
--- a/tags/trackorganiser.cpp
+++ b/tags/trackorganiser.cpp
@@ -50,7 +50,7 @@ int TrackOrganiser::instanceCount()
 }
 
 TrackOrganiser::TrackOrganiser(QWidget *parent)
-    : Dialog(parent, "TrackOrganiser",  QSize(800, 500))
+    : SongDialog(parent, "TrackOrganiser",  QSize(800, 500))
     , schemeDlg(0)
 {
     iCount++;
@@ -94,8 +94,10 @@ void TrackOrganiser::show(const QList<Song> &songs, const QString &udi)
         return;
     }
 
+    QString musicFolder;
     #ifdef ENABLE_DEVICES_SUPPORT
     if (udi.isEmpty()) {
+        musicFolder=MPDConnection::self()->getDetails().dir;
         opts.load(MPDConnectionDetails::configGroupName(MPDConnection::self()->getDetails().name), true);
     } else {
         deviceUdi=udi;
@@ -107,10 +109,11 @@ void TrackOrganiser::show(const QList<Song> &songs, const QString &udi)
         }
 
         opts=dev->options();
+        musicFolder=dev->path();
     }
     #else
-    Q_UNUSED(udi)
     opts.load(MPDConnectionDetails::configGroupName(MPDConnection::self()->getDetails().name), true);
+    musicFolder=MPDConnection::self()->getDetails().dir;
     #endif
     qSort(origSongs);
 
@@ -126,6 +129,10 @@ void TrackOrganiser::show(const QList<Song> &songs, const QString &udi)
     connect(asciiOnly, SIGNAL(stateChanged(int)), this, SLOT(updateView()));
     connect(ignoreThe, SIGNAL(stateChanged(int)), this, SLOT(updateView()));
 
+    if (!songsOk(origSongs, musicFolder, udi.isEmpty())) {
+        return;
+    }
+
     Dialog::show();
     enableButtonOk(false);
     updateView();
@@ -249,8 +256,26 @@ void TrackOrganiser::renameFile()
         QString source=musicFolder+s.file;
         QString dest=musicFolder+modified;
         bool skip=false;
+        if (!QFile::exists(source)) {
+            if (autoSkip) {
+                skip=true;
+            } else {
+                switch(MessageBox::questionYesNoCancel(this, i18n("Source file does not exist!<br/>%1", dest),
+                                                       QString(), GuiItem(i18n("Skip")), GuiItem(i18n("Auto Skip")))) {
+                case MessageBox::Yes:
+                    skip=true;
+                    break;
+                case MessageBox::No:
+                    autoSkip=skip=true;
+                    break;
+                case MessageBox::Cancel:
+                    finish(false);
+                    return;
+                }
+            }
+        }
         // Check if dest exists...
-        if (QFile::exists(dest)) {
+        if (!skip && QFile::exists(dest)) {
             if (autoSkip) {
                 skip=true;
             } else {
@@ -272,7 +297,7 @@ void TrackOrganiser::renameFile()
         // Create dest folder...
         if (!skip) {
             QDir dir(Utils::getDir(dest));
-            if(!dir.exists() && !Utils::createDir(dir.absolutePath(), musicFolder)) {
+            if(!dir.exists() && !Utils::createWorldReadableDir(dir.absolutePath(), musicFolder)) {
                 if (autoSkip) {
                     skip=true;
                 } else {
diff --git a/tags/trackorganiser.h b/tags/trackorganiser.h
index 95d3452..caa17ff 100644
--- a/tags/trackorganiser.h
+++ b/tags/trackorganiser.h
@@ -25,8 +25,7 @@
 #define TRACKORGANISER_H
 
 #include "ui_trackorganiser.h"
-#include "dialog.h"
-#include "song.h"
+#include "songdialog.h"
 #include "config.h"
 #ifdef ENABLE_DEVICES_SUPPORT
 #include "device.h"
@@ -37,7 +36,7 @@
 class FilenameSchemeDialog;
 class Action;
 
-class TrackOrganiser : public Dialog, Ui::TrackOrganiser
+class TrackOrganiser : public SongDialog, Ui::TrackOrganiser
 {
     Q_OBJECT
 
diff --git a/widgets/actionitemdelegate.cpp b/widgets/actionitemdelegate.cpp
index 2464b93..2ac1506 100644
--- a/widgets/actionitemdelegate.cpp
+++ b/widgets/actionitemdelegate.cpp
@@ -190,6 +190,11 @@ bool ActionItemDelegate::helpEvent(QHelpEvent *e, QAbstractItemView *view, const
 
 QAction * ActionItemDelegate::getAction(const QModelIndex &index) const
 {
+    QList<Action *> actions=index.data(ItemView::Role_Actions).value<QList<Action *> >();
+    if (actions.isEmpty()) {
+        return 0;
+    }
+
     QAbstractItemView *view=(QAbstractItemView *)parent();
     bool rtl = Qt::RightToLeft==QApplication::layoutDirection();
     QListView *lv=qobject_cast<QListView *>(view);
@@ -215,11 +220,11 @@ QAction * ActionItemDelegate::getAction(const QModelIndex &index) const
     QRect actionRect=calcActionRect(rtl, actionPos, rect);
     QRect actionRect2(actionRect);
     ActionItemDelegate::adjustActionRect(rtl, actionPos, actionRect2, iconSize);
-    QList<Action *> actions=index.data(ItemView::Role_Actions).value<QList<Action *> >();
+    QPoint cursorPos=QCursor::pos();
 
     foreach (const QPointer<Action> &a, actions) {
         actionRect=actionPos ? actionRect.adjusted(0, -2, 0, 2) : actionRect.adjusted(-2, 0, 2, 0);
-        if (actionRect.contains(QCursor::pos())) {
+        if (actionRect.contains(cursorPos)) {
             return a;
         }
 
diff --git a/widgets/actionlabel.cpp b/widgets/actionlabel.cpp
index 32ba8f8..8ce5284 100644
--- a/widgets/actionlabel.cpp
+++ b/widgets/actionlabel.cpp
@@ -22,7 +22,7 @@
  */
 
 #include "actionlabel.h"
-#include "icon.h"
+#include "icons.h"
 #include <QLabel>
 #include <QTimer>
 #include <QPixmap>
@@ -61,7 +61,7 @@ ActionLabel::ActionLabel(QWidget *parent)
     setAlignment(Qt::AlignCenter);
 
     if(0==theUsageCount++) {
-        QImage img(Icon::fromTheme("audio-x-generic").pixmap(iconSize, iconSize).toImage());
+        QImage img(Icons::self()->audioFileIcon.pixmap(iconSize, iconSize).toImage());
         double increment=360.0/constNumIcons;
 
         for(int i=0; i<constNumIcons; ++i) {
diff --git a/widgets/coverwidget.cpp b/widgets/coverwidget.cpp
index 20fa32a..88055f2 100644
--- a/widgets/coverwidget.cpp
+++ b/widgets/coverwidget.cpp
@@ -161,14 +161,18 @@ const QPixmap & CoverWidget::stdPixmap(bool stream)
         int iconSize=s.width()<=128 ? 128 : 256;
         pix = (stream ? Icons::self()->streamIcon : Icons::self()->albumIcon).pixmap(iconSize, iconSize).scaled(s, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
 
-        #ifndef Q_OS_WIN
         QString &file=stream ? noStreamCoverFileName : noCoverFileName;
         if (stream &file.isEmpty()) {
+            #ifdef Q_OS_WIN
+            QString iconFile=QCoreApplication::applicationDirPath()+"/icons/stream.png";
+            #else
             QString iconFile=QString(INSTALL_PREFIX"/share/")+QCoreApplication::applicationName()+"/icons/stream.png";
+            #endif
             if (QFile::exists(iconFile)) {
                 file=iconFile;
             }
         }
+        #ifndef Q_OS_WIN
         if (file.isEmpty()) {
             file=findIcon(stream ? QStringList() << "applications-internet" : QStringList() << "media-optical" << "media-optical-audio");
         }
@@ -198,7 +202,7 @@ void CoverWidget::update(const Song &s)
         current=s;
         bool isStream=current.isStream() && !current.isCantataStream() && !current.isCdda();
         if (!s.albumArtist().isEmpty() && !s.album.isEmpty() && !isStream) {
-            Covers::Image cImg=Covers::self()->requestImage(s);
+            Covers::Image cImg=Covers::self()->requestImage(s, true);
             valid=!cImg.img.isNull();
             if (valid) {
                 update(cImg.img);
@@ -259,9 +263,12 @@ bool CoverWidget::eventFilter(QObject *object, QEvent *event)
         }
         QString toolTip=QLatin1String("<table>");
 
+        if (Song::useComposer() && !current.composer.isEmpty() && current.composer!=current.albumArtist()) {
+            toolTip+=i18n("<tr><td align=\"right\"><b>Composer:</b></td><td>%1</td></tr>", current.composer);
+        }
         toolTip+=i18n("<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>", current.artist, current.album, current.year);
+                      "<tr><td align=\"right\"><b>Year:</b></td><td>%3</td></tr>", current.albumArtist(), current.album, QString::number(current.year));
         toolTip+="</table>";
         if (!img.isNull()) {
             if (img.size().width()>Covers::constMaxSize.width() || img.size().height()>Covers::constMaxSize.height() ||
diff --git a/widgets/genrecombo.cpp b/widgets/genrecombo.cpp
index 6863270..2999864 100644
--- a/widgets/genrecombo.cpp
+++ b/widgets/genrecombo.cpp
@@ -22,10 +22,8 @@
  */
 
 #include "genrecombo.h"
+#include "toolbutton.h"
 #include "localize.h"
-#ifndef Q_OS_WIN
-#include "gtkproxystyle.h"
-#endif
 
 // Max number of items before we try to force a scrollbar in popup menu...
 static const int constPopupItemCount=32;
@@ -36,9 +34,6 @@ GenreCombo::GenreCombo(QWidget *p)
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
     update(QSet<QString>());
     setEditable(false);
-    #ifndef Q_OS_WIN
-    setProperty(GtkProxyStyle::constSlimComboProperty, true);
-    #endif
 }
 
 void GenreCombo::update(const QSet<QString> &g)
@@ -91,4 +86,17 @@ void GenreCombo::update(const QSet<QString> &g)
             }
         }
     }
+    setEnabled(count()>1);
+    // If we are 'hidden' then we need to ingore mouse events - so that these get passed to parent widget.
+    // The Oxygen's window drag still functions...
+    setAttribute(Qt::WA_TransparentForMouseEvents, count()<2);
+}
+
+void GenreCombo::paintEvent(QPaintEvent *e)
+{
+    if (count()>1) {
+        ComboBox::paintEvent(e);
+    } else {
+        QWidget::paintEvent(e);
+    }
 }
diff --git a/widgets/genrecombo.h b/widgets/genrecombo.h
index 9e69ad3..2660380 100644
--- a/widgets/genrecombo.h
+++ b/widgets/genrecombo.h
@@ -36,6 +36,8 @@ public:
 
     const QSet<QString> & entries() const { return genres; }
 
+    void paintEvent(QPaintEvent *e);
+
 public Q_SLOTS:
     void update(const QSet<QString> &g);
 
diff --git a/widgets/groupedview.cpp b/widgets/groupedview.cpp
index 9c2d1c6..36ea569 100644
--- a/widgets/groupedview.cpp
+++ b/widgets/groupedview.cpp
@@ -131,12 +131,6 @@ public:
         return QStyledItemDelegate::sizeHint(option, index);
     }
 
-    inline QString formatNumber(int num) const
-    {
-        QString text=QString::number(num);
-        return num<10 ? "0"+text : text;
-    }
-
     static void drawFadedLine(QPainter *p, const QRect &r, const QColor &col)
     {
         QPoint start(r.x(), r.y());
@@ -259,29 +253,37 @@ public:
             } else if (isEmpty) {
                 title=i18n("Unknown");
                 track=trackTitle;
+            } else if (song.album.isEmpty()) {
+                title=song.artistOrComposer();
+                track=song.trackAndTitleStr(song.isVariousArtists());
             } else {
                 quint16 year=Song::albumYear(song);
 
                 if (year>0) {
                     if (song.isFromOnlineService()) {
-                        title=song.album+QLatin1String(" (")+QString::number(year)+QLatin1Char(')');
+                        title=i18nc("album (albumYear)", "%1 (%2)", song.album, QString::number(year));
                     } else {
-                        title=i18nc("artist - album (albumYear)", "%1 - %2 (%3)", song.albumArtist(), song.album, QString::number(year));
+                        title=i18nc("artist - album (albumYear)", "%1 - %2 (%3)", song.artistOrComposer(), song.albumName(), QString::number(year));
+                    }
+                    if (Song::useComposer()) {
+                        while (title.contains(") (")) {
+                            title=title.replace(") (", ", ");
+                        }
                     }
                 } else {
                     if (song.isFromOnlineService()) {
                         title=song.album;
                     } else {
-                        title=i18nc("artist - album", "%1 - %2", song.albumArtist(), song.album);
+                        title=i18nc("artist - album", "%1 - %2", song.artistOrComposer(), song.albumName());
                     }
                 }
-                track=song.track ? formatNumber(song.track)+QChar(' ')+trackTitle : trackTitle;
+                track=song.trackAndTitleStr(song.isVariousArtists());
             }
         } else {
             if (stream) {
                 track=streamText(song, trackTitle);
             } else {
-                track=song.track ? formatNumber(song.track)+QChar(' ')+trackTitle : trackTitle;
+                track=song.trackAndTitleStr(song.isVariousArtists());
             }
         }
 
@@ -794,7 +796,7 @@ void GroupedView::itemClicked(const QModelIndex &idx)
             }
             if (list.count()) {
                 #if 0 // Commendted out as (as noted below) unselection is not working, and we always add to 'unsel' above (because of playlists)
-                if (unsel.isEmpty()) { // TODO: This is not working!!!
+                if (unsel.isEmpty()) { // TODO: This is not working!!!   CHECK selModel if re-add!!!
                     foreach(const QModelIndex &i, list) {
                         selModel->select(i, QItemSelectionModel::Deselect|QItemSelectionModel::Rows);
                     }
@@ -804,7 +806,7 @@ void GroupedView::itemClicked(const QModelIndex &idx)
                     }
                 }
                 #else
-                if (!unsel.isEmpty()) {
+                if (!unsel.isEmpty() && selModel) {
                     foreach(const QModelIndex &i, unsel) {
                         selModel->select(i, QItemSelectionModel::Select|QItemSelectionModel::Rows);
                     }
@@ -815,14 +817,16 @@ void GroupedView::itemClicked(const QModelIndex &idx)
     }
 }
 
-void GroupedView::expand(const QModelIndex &idx)
+void GroupedView::expand(const QModelIndex &idx, bool singleOnly)
 {
     if (idx.isValid()) {
         if (idx.data(GroupedView::Role_IsCollection).toBool()) {
             setExpanded(idx, true);
-            quint32 count=model()->rowCount(idx);
-            for (quint32 i=0; i<count; ++i) {
-                expand(idx.child(i, 0));
+            if (!singleOnly) {
+                quint32 count=model()->rowCount(idx);
+                for (quint32 i=0; i<count; ++i) {
+                    expand(idx.child(i, 0));
+                }
             }
         }
         else if (AlbumHeader==getType(idx)) {
diff --git a/widgets/groupedview.h b/widgets/groupedview.h
index ee1e62d..7683c97 100644
--- a/widgets/groupedview.h
+++ b/widgets/groupedview.h
@@ -82,7 +82,7 @@ public:
     QModelIndexList selectedIndexes(bool sorted) const;
     void dropEvent(QDropEvent *event);
     void collectionRemoved(quint32 key);
-    void expand(const QModelIndex &idx);
+    void expand(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 f1759ea..6b4b026 100644
--- a/widgets/icons.cpp
+++ b/widgets/icons.cpp
@@ -32,7 +32,7 @@
 #include <QDir>
 #include <QFile>
 #include <math.h>
-#ifndef Q_OS_WIN
+#if !defined Q_OS_WIN && !defined Q_OS_MAC
 #include "gtkstyle.h"
 #endif
 
@@ -361,7 +361,12 @@ Icons::Icons()
     consumeIcon=createConsumeIcon(stdColor, highlightColor);
     menuIcon=createMenuIcon(stdColor, highlightColor);
     streamCategoryIcon=Icon(QLatin1String("oxygen")==Icon::currentTheme().toLower() ? "inode-directory" : "folder-music");
+
+    #ifdef Q_OS_WIN
+    QString iconFile=QCoreApplication::applicationDirPath()+"/icons/stream.png";
+    #else
     QString iconFile=QString(INSTALL_PREFIX"/share/")+QCoreApplication::applicationName()+"/icons/stream.png";
+    #endif
     if (QFile::exists(iconFile)) {
         streamIcon.addFile(iconFile);
     }
@@ -369,8 +374,11 @@ Icons::Icons()
         streamIcon=Icon("applications-internet");
     }
     albumIcon=Icon("media-optical");
+    podcastIcon=Icon("inode-directory");
+    downloadedPodcastEpisodeIcon=Icon("document-save-as");
     audioFileIcon=Icon("audio-x-generic");
     playlistIcon=Icon("view-media-playlist");
+    folderIcon=Icon("inode-directory");
     dynamicRuleIcon=Icon("media-playlist-shuffle");
     configureIcon=Icon("configure");
     connectIcon=Icon("dialog-ok");
@@ -403,7 +411,7 @@ Icons::Icons()
     appIcon.addFile(":cantata.svg");
 
     shortcutsIcon=Icon("preferences-desktop-keyboard");
-    #ifndef Q_OS_WIN
+    #if !defined Q_OS_WIN && !defined Q_OS_MAC
     if (shortcutsIcon.isNull()) {
         shortcutsIcon=Icon("keyboard");
     }
@@ -431,7 +439,7 @@ Icons::Icons()
     if (playlistIcon.isNull()) {
         playlistIcon=Icon("audio-x-mp3-playlist");
         if (playlistIcon.isNull()) {
-            playlistIcon=Icon("audio-x-generic");
+            playlistIcon=audioFileIcon;
         }
     }
     if (editIcon.isNull()) {
@@ -446,7 +454,7 @@ Icons::Icons()
     if (cancelIcon.isNull()) {
         cancelIcon=Icon("gtk-cancel");
     }
-    #endif // Q_OS_WIN
+    #endif // Q_OS_WIN && Q_OS_MAC
     #endif // ENABLE_KDE_SUPPORT
 
     if (streamCategoryIcon.isNull()) {
@@ -492,7 +500,7 @@ void Icons::initSidebarIcons()
     }
 }
 
-#if !defined ENABLE_KDE_SUPPORT && !defined Q_OS_WIN
+#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...
@@ -540,17 +548,13 @@ void Icons::initToolbarIcons(const QColor &color, bool forceLight)
         toolbarMenuIcon=menuIcon;
     }
 
-    #ifndef Q_OS_WIN
+    #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");
-        toolbarVolumeMutedIcon=Icon("audio-volume-muted-symbolic");
-        toolbarVolumeLowIcon=Icon("audio-volume-low-symbolic");
-        toolbarVolumeMediumIcon=Icon("audio-volume-medium-symbolic");
-        toolbarVolumeHighIcon=Icon("audio-volume-high-symbolic");
         QColor col(196, 196, 196);
         infoIcon=loadSidebarIcon("info", col, col);
     } else
@@ -564,7 +568,7 @@ void Icons::initToolbarIcons(const QColor &color, bool forceLight)
         infoIcon=Icon("dialog-information");
     }
 
-    #if !defined ENABLE_KDE_SUPPORT && !defined Q_OS_WIN
+    #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);
         contextIcon=loadSidebarIcon("info", col, col);
@@ -597,16 +601,4 @@ void Icons::initToolbarIcons(const QColor &color, bool forceLight)
     } else {
         setDisabledOpacity(toolbarNextIcon);
     }
-    if (toolbarVolumeMutedIcon.isNull()) {
-        toolbarVolumeMutedIcon=Icon("audio-volume-muted");
-    }
-    if (toolbarVolumeLowIcon.isNull()) {
-        toolbarVolumeLowIcon=Icon("audio-volume-low");
-    }
-    if (toolbarVolumeMediumIcon.isNull()) {
-        toolbarVolumeMediumIcon=Icon("audio-volume-medium");
-    }
-    if (toolbarVolumeHighIcon.isNull()) {
-        toolbarVolumeHighIcon=Icon("audio-volume-high");
-    }
 }
diff --git a/widgets/icons.h b/widgets/icons.h
index aac9851..f87f718 100644
--- a/widgets/icons.h
+++ b/widgets/icons.h
@@ -43,6 +43,9 @@ public:
     #endif
     Icon artistIcon;
     Icon albumIcon;
+    Icon podcastIcon;
+    Icon downloadedPodcastEpisodeIcon;
+    Icon folderIcon;
     Icon audioFileIcon;
     Icon playlistIcon;
     Icon dynamicRuleIcon;
@@ -89,10 +92,6 @@ public:
     Icon toolbarPauseIcon;
     Icon toolbarNextIcon;
     Icon toolbarStopIcon;
-    Icon toolbarVolumeMutedIcon;
-    Icon toolbarVolumeLowIcon;
-    Icon toolbarVolumeMediumIcon;
-    Icon toolbarVolumeHighIcon;
 };
 
 #endif
diff --git a/widgets/itemview.cpp b/widgets/itemview.cpp
index c63df04..a99c85a 100644
--- a/widgets/itemview.cpp
+++ b/widgets/itemview.cpp
@@ -190,7 +190,7 @@ public:
         painter->save();
         painter->setClipRect(r);
 
-        QFont textFont(QApplication::font());
+        QFont textFont(index.data(Qt::FontRole).value<QFont>());
         QFontMetrics textMetrics(textFont);
         int textHeight=textMetrics.height();
 
@@ -481,10 +481,12 @@ ItemView::ItemView(QWidget *p)
     backAction->setIcon(Icon("go-previous"));
     backButton->setDefaultAction(backAction);
     backAction->setShortcut(Qt::AltModifier+(Qt::LeftToRight==layoutDirection() ? Qt::Key_Left : Qt::Key_Right));
+    Action::updateToolTip(backAction);
     homeAction = new QAction(i18n("Go Home"), this);
     homeAction->setIcon(Icon("go-home"));
     homeButton->setDefaultAction(homeAction);
     homeAction->setShortcut(Qt::AltModifier+Qt::Key_Up);
+    Action::updateToolTip(homeAction);
     listView->addAction(backAction);
     listView->addAction(homeAction);
     listView->addDefaultAction(backAction);
@@ -813,7 +815,9 @@ void ItemView::showIndex(const QModelIndex &idx, bool scrollTo)
         }
     }
 
-    view()->selectionModel()->select(idx, QItemSelectionModel::Select|QItemSelectionModel::Rows);
+    if (view()->selectionModel()) {
+        view()->selectionModel()->select(idx, QItemSelectionModel::Select|QItemSelectionModel::Rows);
+    }
 }
 
 void ItemView::focusSearch()
@@ -821,6 +825,11 @@ void ItemView::focusSearch()
     searchWidget->activate();
 }
 
+void ItemView::focusView()
+{
+    view()->setFocus();
+}
+
 void ItemView::setSearchLabelText(const QString &text)
 {
     searchWidget->setLabel(text);
@@ -836,6 +845,13 @@ bool ItemView::isSearchActive() const
     return searchWidget->isActive();
 }
 
+void ItemView::closeSearch()
+{
+    if (searchWidget->isActive()) {
+        searchWidget->close();
+    }
+}
+
 void ItemView::setStartClosed(bool sc)
 {
     if (groupedView) {
@@ -871,12 +887,12 @@ void ItemView::expandAll(const QModelIndex &index)
     }
 }
 
-void ItemView::expand(const QModelIndex &index)
+void ItemView::expand(const QModelIndex &index, bool singleOnly)
 {
     if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
-        treeView->expand(index);
+        treeView->expand(index, singleOnly);
     } else if (Mode_GroupedTree==mode && groupedView) {
-        groupedView->expand(index);
+        groupedView->expand(index, singleOnly);
     }
 }
 
@@ -901,6 +917,26 @@ void ItemView::setBackgroundImage(const QIcon &icon)
     }
 }
 
+bool ItemView::isAnimated() const
+{
+    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+        return treeView->isAnimated();
+    }
+    if (Mode_GroupedTree==mode && groupedView) {
+        return groupedView->isAnimated();
+    }
+    return false;
+}
+
+void ItemView::setAnimated(bool a)
+{
+    if (Mode_SimpleTree==mode || Mode_DetailedTree==mode) {
+        treeView->setAnimated(a);
+    } else if (Mode_GroupedTree==mode && groupedView) {
+        groupedView->setAnimated(a);
+    }
+}
+
 void ItemView::showSpinner(bool v)
 {
     if (v) {
diff --git a/widgets/itemview.h b/widgets/itemview.h
index e5647b6..16887a8 100644
--- a/widgets/itemview.h
+++ b/widgets/itemview.h
@@ -119,18 +119,21 @@ public:
     void setDeleteAction(QAction *act);
     void setRootIsDecorated(bool v) { treeView->setRootIsDecorated(v); }
     void showIndex(const QModelIndex &idx, bool scrollTo);
-    void focusSearch();
     void setSearchLabelText(const QString &text);
     void setSearchVisible(bool v);
     bool isSearchActive() const;
     void setStartClosed(bool sc);
     bool isStartClosed();
     void expandAll(const QModelIndex &index=QModelIndex());
-    void expand(const QModelIndex &index);
+    void expand(const QModelIndex &index, bool singleOnly=false);
     void showMessage(const QString &message, int timeout);
     void setBackgroundImage(const QIcon &icon);
+    bool isAnimated() const;
+    void setAnimated(bool a);
 
 public Q_SLOTS:
+    void focusSearch();
+    void focusView();
     void showSpinner(bool v=true);
     void hideSpinner();
     void collectionRemoved(quint32 key);
@@ -139,6 +142,7 @@ public Q_SLOTS:
     void backActivated();
     void homeActivated();
     void setExpanded(const QModelIndex &idx, bool exp=true);
+    void closeSearch();
 
 Q_SIGNALS:
     void searchItems();
diff --git a/widgets/itemview.ui b/widgets/itemview.ui
index ea78410..1036d55 100644
--- a/widgets/itemview.ui
+++ b/widgets/itemview.ui
@@ -14,6 +14,9 @@
    <property name="margin">
     <number>0</number>
    </property>
+   <property name="spacing">
+    <number>2</number>
+   </property>
    <item>
     <widget class="QStackedWidget" name="stackedWidget">
      <property name="currentIndex">
diff --git a/widgets/listview.cpp b/widgets/listview.cpp
index 98c22af..63b9a5d 100644
--- a/widgets/listview.cpp
+++ b/widgets/listview.cpp
@@ -26,6 +26,7 @@
 #include "treeview.h"
 #include "config.h"
 #include "icons.h"
+#include "utils.h"
 #include <QMimeData>
 #include <QDrag>
 #include <QMouseEvent>
@@ -63,13 +64,13 @@ void ListView::selectionChanged(const QItemSelection &selected, const QItemSelec
 bool ListView::haveSelectedItems() const
 {
     // Dont need the sorted type of 'selectedIndexes' here...
-    return selectionModel()->selectedIndexes().count()>0;
+    return selectionModel() && selectionModel()->selectedIndexes().count()>0;
 }
 
 bool ListView::haveUnSelectedItems() const
 {
     // Dont need the sorted type of 'selectedIndexes' here...
-    return selectionModel()->selectedIndexes().count()!=model()->rowCount();
+    return selectionModel() && selectionModel()->selectedIndexes().count()!=model()->rowCount();
 }
 
 void ListView::startDrag(Qt::DropActions supportedActions)
@@ -93,10 +94,11 @@ void ListView::startDrag(Qt::DropActions supportedActions)
                 pix=QPixmap::fromImage(img);
             }
         }
+        int pixSize=Utils::isHighDpi() ? 64 : 32;
         if (pix.isNull()) {
-            drag->setPixmap(Icons::self()->albumIcon.pixmap(64, 64));
+            drag->setPixmap(Icons::self()->audioFileIcon.pixmap(pixSize, pixSize));
         } else {
-            drag->setPixmap(pix.width()<64 ? pix : pix.scaled(QSize(64, 64), Qt::KeepAspectRatio, Qt::SmoothTransformation));
+            drag->setPixmap(pix.width()<pixSize ? pix : pix.scaled(QSize(pixSize, pixSize), Qt::KeepAspectRatio, Qt::SmoothTransformation));
         }
         drag->start(supportedActions);
     }
@@ -111,7 +113,7 @@ void ListView::mouseReleaseEvent(QMouseEvent *event)
 
 QModelIndexList ListView::selectedIndexes(bool sorted) const
 {
-    QModelIndexList indexes=selectionModel()->selectedIndexes();
+    QModelIndexList indexes=selectionModel() ? selectionModel()->selectedIndexes() : QModelIndexList();
     if (sorted) {
         qSort(indexes);
     }
@@ -165,6 +167,10 @@ void ListView::paintEvent(QPaintEvent *e)
 // Workaround for https://bugreports.qt-project.org/browse/QTBUG-18009
 void ListView::correctSelection()
 {
+    if (!selectionModel()) {
+        return;
+    }
+
     QItemSelection s = selectionModel()->selection();
     setCurrentIndex(currentIndex());
     selectionModel()->select(s, QItemSelectionModel::SelectCurrent);
diff --git a/widgets/menubutton.cpp b/widgets/menubutton.cpp
index 72ce220..1092865 100644
--- a/widgets/menubutton.cpp
+++ b/widgets/menubutton.cpp
@@ -27,13 +27,16 @@
 #include "localize.h"
 #include <QAction>
 #include <QMenu>
+#include <QEvent>
+#include <QApplication>
+#include <QDesktopWidget>
 
 MenuButton::MenuButton(QWidget *parent)
     : ToolButton(parent)
 {
     setPopupMode(QToolButton::InstantPopup);
     setIcon(Icons::self()->menuIcon);
-    setToolTip(i18n("Other Actions"));
+    setToolTip(i18n("Menu"));
 }
 
 void MenuButton::controlState()
@@ -42,10 +45,43 @@ void MenuButton::controlState()
         return;
     }
     foreach (QAction *a, menu()->actions()) {
-        if (a->isEnabled()) {
+        if (a->isEnabled() && a->isVisible() && !a->isSeparator()) {
             setEnabled(true);
             return;
         }
     }
     setEnabled(false);
 }
+
+void MenuButton::setAlignedMenu(QMenu *m)
+{
+    QToolButton::setMenu(m);
+    m->installEventFilter(this);
+}
+
+bool MenuButton::eventFilter(QObject *o, QEvent *e)
+{
+    if (QEvent::Show==e->type() && qobject_cast<QMenu *>(o)) {
+        QMenu *mnu=static_cast<QMenu *>(o);
+        QPoint p=parentWidget()->mapToGlobal(pos());
+        int newPos=Qt::RightToLeft==layoutDirection()
+                    ? p.x()
+                    : ((p.x()+width())-mnu->width());
+
+        if (newPos<0) {
+            newPos=0;
+        } else {
+            QDesktopWidget *dw=QApplication::desktop();
+            if (dw) {
+                QRect geo=dw->availableGeometry(this);
+                int maxWidth=geo.x()+geo.width();
+                if (maxWidth>0 && (newPos+mnu->width())>maxWidth) {
+                    newPos=maxWidth-mnu->width();
+                }
+            }
+        }
+        mnu->move(newPos, mnu->y());
+    }
+
+    return ToolButton::eventFilter(o, e);
+}
diff --git a/widgets/menubutton.h b/widgets/menubutton.h
index 7b5553f..e2f0d27 100644
--- a/widgets/menubutton.h
+++ b/widgets/menubutton.h
@@ -31,6 +31,10 @@ class MenuButton : public ToolButton
 public:
     explicit MenuButton(QWidget *parent = 0);
     void controlState();
+    void setAlignedMenu(QMenu *m);
+
+private:
+    bool eventFilter(QObject *o, QEvent *e);
 };
 
 #endif // MENUBUTTON_H
diff --git a/widgets/playqueueview.cpp b/widgets/playqueueview.cpp
index 4fcc74d..28491c6 100644
--- a/widgets/playqueueview.cpp
+++ b/widgets/playqueueview.cpp
@@ -84,27 +84,23 @@ void PlayQueueGroupedView::paintEvent(QPaintEvent *e)
     GroupedView::paintEvent(e);
 }
 
-#if QT_VERSION < 0x050000
 static inline void setResizeMode(QHeaderView *hdr, int idx, QHeaderView::ResizeMode mode)
 {
+    #if QT_VERSION < 0x050000
     hdr->setResizeMode(idx, mode);
-}
-
-static inline void setResizeMode(QHeaderView *hdr, QHeaderView::ResizeMode mode)
-{
-    hdr->setResizeMode(mode);
-}
-#else
-static inline void setResizeMode(QHeaderView *hdr, int idx, QHeaderView::ResizeMode 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
 }
-#endif
 
 void PlayQueueTreeView::initHeader()
 {
@@ -349,8 +345,12 @@ bool PlayQueueView::haveUnSelectedItems()
 
 void PlayQueueView::clearSelection()
 {
-    groupedView->selectionModel()->clear();
-    treeView->selectionModel()->clear();
+    if (groupedView->selectionModel()) {
+        groupedView->selectionModel()->clear();
+    }
+    if (treeView->selectionModel()) {
+        treeView->selectionModel()->clear();
+    }
 }
 
 QHeaderView * PlayQueueView::header()
diff --git a/widgets/searchwidget.cpp b/widgets/searchwidget.cpp
index 0d4269d..877bed4 100644
--- a/widgets/searchwidget.cpp
+++ b/widgets/searchwidget.cpp
@@ -56,14 +56,14 @@ SearchWidget::SearchWidget(QWidget *p)
 {
     QGridLayout *l=new QGridLayout(this);
     l->setMargin(0);
-    l->setSpacing(0);
+    l->setSpacing(1);
     label=new SqueezedTextLabel(this);
     edit=new LineEdit(this);
     edit->setPlaceholderText(i18n("Search..."));
     l->addWidget(label, 0, 0, 1, 2);
     l->addWidget(edit, 1, 0);
     closeButton=new ToolButton(this);
-    closeButton->setToolTip(i18n("Close Search Bar"));
+    closeButton->setToolTip(i18n("Close Search Bar")+QLatin1String(" (")+QKeySequence(Qt::Key_Escape).toString()+QLatin1Char(')'));
     l->addWidget(closeButton, 1, 1);
     Icon icon=Icon("dialog-close");
     if (icon.isNull()) {
@@ -99,16 +99,23 @@ void SearchWidget::toggle()
 
 void SearchWidget::activate()
 {
+    bool wasActive=widgetIsActive;
     widgetIsActive=true;
+    edit->selectAll();
     show();
     setFocus();
-    emit active(widgetIsActive);
+    if (wasActive!=widgetIsActive) {
+        emit active(widgetIsActive);
+    }
 }
 
 void SearchWidget::close()
 {
+    bool wasActive=widgetIsActive;
     widgetIsActive=false;
     setVisible(false);
     edit->setText(QString());
-    emit active(widgetIsActive);
+    if (wasActive!=widgetIsActive) {
+        emit active(widgetIsActive);
+    }
 }
diff --git a/widgets/servicestatuslabel.cpp b/widgets/servicestatuslabel.cpp
new file mode 100644
index 0000000..57b6f48
--- /dev/null
+++ b/widgets/servicestatuslabel.cpp
@@ -0,0 +1,79 @@
+/*
+ * 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 "servicestatuslabel.h"
+#include "localize.h"
+#include <QPalette>
+#include <QStyle>
+#include <QApplication>
+#include <QCursor>
+
+ServiceStatusLabel::ServiceStatusLabel(QWidget *p)
+    : QLabel(p)
+    , pressed(false)
+{
+    QFont f(font());
+    f.setBold(true);
+    setFont(f);
+}
+
+void ServiceStatusLabel::setText(const QString &txt, const QString &name)
+{
+    QLabel::setText(txt);
+    onTooltip=i18n("Logged into %1", name);
+    offTooltip=i18n("<b>NOT</b> logged into %1", name);
+}
+
+void ServiceStatusLabel::setStatus(bool on)
+{
+    setVisible(true);
+    setToolTip(on ? onTooltip : offTooltip);
+    QString col=on
+            ? palette().highlight().color().name()
+            : palette().color(QPalette::Disabled, QPalette::WindowText).name();
+
+    int margin=style()->pixelMetric(QStyle::PM_DefaultFrameWidth, 0, this);
+    if (margin<2) {
+        margin=2;
+    }
+    setStyleSheet(QString("QLabel { color : %1; border-radius: %4px; border: 2px solid %2; margin: %3px}")
+                  .arg(col).arg(col).arg(margin).arg(margin*2));
+}
+
+void ServiceStatusLabel::mousePressEvent(QMouseEvent *ev)
+{
+    QLabel::mousePressEvent(ev);
+    pressed=true;
+}
+
+void ServiceStatusLabel::mouseReleaseEvent(QMouseEvent *ev)
+{
+    QLabel::mouseReleaseEvent(ev);
+    if (pressed) {
+        pressed=false;
+        if (this==QApplication::widgetAt(QCursor::pos())) {
+            emit clicked();
+        }
+    }
+}
+
diff --git a/widgets/volumecontrol.h b/widgets/servicestatuslabel.h
similarity index 66%
copy from widgets/volumecontrol.h
copy to widgets/servicestatuslabel.h
index 1aaffaf..dfb811b 100644
--- a/widgets/volumecontrol.h
+++ b/widgets/servicestatuslabel.h
@@ -21,35 +21,33 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef VOLUMECONTROL_H
-#define VOLUMECONTROL_H
+#ifndef SERVICE_STATUS_LABEL_H
+#define SERVICE_STATUS_LABEL_H
 
-#include <QMenu>
+#include <QLabel>
 
-class QSlider;
-
-class VolumeControl : public QMenu
+class ServiceStatusLabel : public QLabel
 {
     Q_OBJECT
 
 public:
-    VolumeControl(QWidget *parent);
-    virtual ~VolumeControl();
-
-    void installSliderEventFilter(QObject *filter);
-
-public Q_SLOTS:
-    void increaseVolume();
-    void decreaseVolume();
-    void setValue(int v);
+    ServiceStatusLabel(QWidget *p);
+    virtual ~ServiceStatusLabel() { }
 
-    QSlider * sliderWidget() { return slider; }
+    void setText(const QString &txt, const QString &name);
+    void setStatus(bool on);
 
 Q_SIGNALS:
-    void valueChanged(int v);
+    void clicked();
+
+private:
+    void mousePressEvent(QMouseEvent *ev);
+    void mouseReleaseEvent(QMouseEvent *ev);
 
 private:
-    QSlider *slider;
+    bool pressed;
+    QString onTooltip;
+    QString offTooltip;
 };
 
 #endif
diff --git a/support/thread.cpp b/widgets/sizegrip.cpp
similarity index 52%
copy from support/thread.cpp
copy to widgets/sizegrip.cpp
index ca6fbf2..f0528e3 100644
--- a/support/thread.cpp
+++ b/widgets/sizegrip.cpp
@@ -21,42 +21,30 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#include "thread.h"
-//#include <QDebug>
-#ifdef ENABLE_KDE_SUPPORT
-#include <KDE/KGlobal>
-K_GLOBAL_STATIC(ThreadCleaner, instance)
-#endif
+#include "sizegrip.h"
+#include "sizewidget.h"
+#include <QIcon>
 
-ThreadCleaner * ThreadCleaner::self()
+// Some styles, such as MacOSX, do not have a size-grip.
+// However, we still want the same space taken up on the toolbar - so that 'clear playqueue'
+// is not right in the bottom-right corner.
+//
+// Also, we want the size-grip to have the same height as a toolbutton - so that it is aligned
+// to the bottom of the main window.
+//
+// This class attempts to rectify these issues...
+SizeGrip::SizeGrip(QWidget *parent)
+    : QSizeGrip(parent)
 {
-    #ifdef ENABLE_KDE_SUPPORT
-    return instance;
-    #else
-    static ThreadCleaner *instance=0;
-    if(!instance) {
-        instance=new ThreadCleaner;
-    }
-    return instance;
-    #endif
+    setFixedHeight(SizeWidget::standardHeight());
 }
 
-void ThreadCleaner::threadFinished()
+QSize SizeGrip::sizeHint() const
 {
-    QThread *thread=qobject_cast<QThread *>(sender());
-    if (thread) {
-        thread->deleteLater();
+    if (!sh.isValid()) {
+        int itemHeight=SizeWidget::standardHeight();
+        sh=QSizeGrip::sizeHint();
+        sh=QSize(sh.width()>2 ? sh.width() : itemHeight, itemHeight);
     }
-}
-
-Thread::Thread(const QString &name, QObject *p)
-    : QThread(p)
-{
-    setObjectName(name);
-    connect(this, SIGNAL(finished()), ThreadCleaner::self(), SLOT(threadFinished()));
-}
-
-Thread::~Thread()
-{
-//    qWarning() << objectName() << "destroyed";
+    return sh;
 }
diff --git a/widgets/toolbutton.h b/widgets/sizegrip.h
similarity index 78%
copy from widgets/toolbutton.h
copy to widgets/sizegrip.h
index cb24c07..42473a9 100644
--- a/widgets/toolbutton.h
+++ b/widgets/sizegrip.h
@@ -21,22 +21,20 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef TOOLBUTTON_H
-#define TOOLBUTTON_H
+#ifndef SIZEGRIP_H
+#define SIZEGRIP_H
 
-#include <QToolButton>
+#include <QSizeGrip>
 
-class QMenu;
-class ToolButton : public QToolButton
+class SizeGrip : public QSizeGrip
 {
 public:
-    explicit ToolButton(QWidget *parent = 0);
+    explicit SizeGrip(QWidget *parent = 0);
     QSize sizeHint() const;
-    void setMenu(QMenu *m);
-    void paintEvent(QPaintEvent *e);
+    QSize minimumSizeHint() const { return sizeHint(); }
 
 private:
     mutable QSize sh;
 };
 
-#endif // MENUBUTTON_H
+#endif
diff --git a/widgets/toolbar.cpp b/widgets/sizewidget.cpp
similarity index 60%
copy from widgets/toolbar.cpp
copy to widgets/sizewidget.cpp
index 706711c..c22be9a 100644
--- a/widgets/toolbar.cpp
+++ b/widgets/sizewidget.cpp
@@ -21,24 +21,32 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#include "toolbar.h"
-#include <QStyleOption>
-#include <QStyle>
-#include <QPainter>
+#include "sizewidget.h"
+#include "genrecombo.h"
+#include "toolbutton.h"
+#include <QIcon>
 
-ToolBar::ToolBar(QWidget *parent)
-    : QWidget(parent)
+static int stdHeight=-1;
+
+int SizeWidget::standardHeight()
 {
-    //setStyleSheet("ToolBar{ background-color : qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #3c3b37, stop: 1 #474641); }");
+    if (-1==stdHeight)
+    {
+        GenreCombo combo(0);
+        combo.ensurePolished();
+        ToolButton tb(0);
+        tb.setToolButtonStyle(Qt::ToolButtonIconOnly);
+        tb.setIcon(QIcon::fromTheme("ok"));
+        tb.ensurePolished();
+        stdHeight=qMax(tb.sizeHint().height(), combo.sizeHint().height());
+    }
+
+    return stdHeight;
 }
 
-void ToolBar::paintEvent(QPaintEvent *e)
+SizeWidget::SizeWidget(QWidget *parent)
+    : QWidget(parent)
 {
-    QWidget::paintEvent(e);
-    QStyleOption opt;
-    opt.init(this);
-    QPainter p(this);
-    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+    setFixedHeight(stdHeight);
+    setFixedWidth(0);
 }
-
-
diff --git a/support/proxystyle.h b/widgets/sizewidget.h
similarity index 83%
copy from support/proxystyle.h
copy to widgets/sizewidget.h
index d105e46..f2861d9 100644
--- a/support/proxystyle.h
+++ b/widgets/sizewidget.h
@@ -21,17 +21,16 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef PROXYSTYLE_H
-#define PROXYSTYLE_H
+#ifndef SIZEWIDGET_H
+#define SIZEWIDGET_H
 
-#include <QProxyStyle>
+#include <QWidget>
 
-class ProxyStyle : public QProxyStyle
+class SizeWidget : public QWidget
 {
 public:
-    ProxyStyle() { }
-
-    void polish(QWidget *widget);
+    static int standardHeight();
+    explicit SizeWidget(QWidget *parent = 0);
 };
 
 #endif
diff --git a/widgets/songdialog.cpp b/widgets/songdialog.cpp
new file mode 100644
index 0000000..9374b32
--- /dev/null
+++ b/widgets/songdialog.cpp
@@ -0,0 +1,64 @@
+/*
+ * 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 "songdialog.h"
+#include "messagebox.h"
+#include "localize.h"
+#include <QFile>
+
+#include <QDebug>
+static bool debugEnabled=false;
+#define DBUG if (debugEnabled) qWarning() << metaObject()->className() << __FUNCTION__
+void SongDialog::enableDebug()
+{
+    debugEnabled=true;
+}
+
+static const int constNumToCheck=10;
+
+bool SongDialog::songsOk(const QList<Song> &songs, const QString &base, bool isMpd)
+{
+    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";
+            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>"));
+            } else {
+                MessageBox::error(wid, i18n("<p>Cannot access song files!<br/><br/>"
+                                            "Please check that the device is still attached.</p>"));
+            }
+            deleteLater();
+            return false;
+        }
+        if (++checked>constNumToCheck) {
+            break;
+        }
+    }
+    DBUG << "Checked" << checked << "files";
+
+    return true;
+}
diff --git a/context/lyricsdialog.h b/widgets/songdialog.h
similarity index 71%
copy from context/lyricsdialog.h
copy to widgets/songdialog.h
index f27d543..fad577a 100644
--- a/context/lyricsdialog.h
+++ b/widgets/songdialog.h
@@ -21,29 +21,23 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef LYRICSDIALOG_H
-#define LYRICSDIALOG_H
+#ifndef SONG_DIALOG_H
+#define SONG_DIALOG_H
 
 #include "dialog.h"
-#include "lineedit.h"
 #include "song.h"
 
-class LyricsDialog : public Dialog
+class SongDialog : public Dialog
 {
-    Q_OBJECT
-
 public:
-    LyricsDialog(const Song &s, QWidget *parent);
-
-    Song song() const;
+    static void enableDebug();
 
-private Q_SLOTS:
-    void changed();
+    SongDialog(QWidget *parent, const QString &name=QString(), const QSize &defSize=QSize())
+        : Dialog(parent, name, defSize) { }
+    virtual ~SongDialog() { }
 
-private:
-    Song prev;
-    LineEdit *titleEntry;
-    LineEdit *artistEntry;
+protected:
+    bool songsOk(const QList<Song> &songs, const QString &base, bool isMpd);
 };
 
 #endif
diff --git a/widgets/toolbar.cpp b/widgets/spacerwidget.cpp
similarity index 56%
copy from widgets/toolbar.cpp
copy to widgets/spacerwidget.cpp
index 706711c..ae2b9c0 100644
--- a/widgets/toolbar.cpp
+++ b/widgets/spacerwidget.cpp
@@ -21,24 +21,38 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#include "toolbar.h"
-#include <QStyleOption>
-#include <QStyle>
+#include "spacerwidget.h"
+#include "toolbutton.h"
 #include <QPainter>
+#include <QLinearGradient>
 
-ToolBar::ToolBar(QWidget *parent)
+static int fixedWidth=0;
+
+SpacerWidget::SpacerWidget(QWidget *parent)
     : QWidget(parent)
 {
-    //setStyleSheet("ToolBar{ background-color : qlineargradient(x1: 0, y1: 0, x2: 0, y2: 1, stop: 0 #3c3b37, stop: 1 #474641); }");
+    if (0==fixedWidth) {
+        ToolButton tb(parent);
+        tb.ensurePolished();
+        fixedWidth=tb.sizeHint().width()*0.75;
+    }
+    setFixedWidth(fixedWidth);
 }
 
-void ToolBar::paintEvent(QPaintEvent *e)
+void SpacerWidget::paintEvent(QPaintEvent *e)
 {
     QWidget::paintEvent(e);
-    QStyleOption opt;
-    opt.init(this);
     QPainter p(this);
-    style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
+    QColor col(palette().text().color());
+    col.setAlphaF(0.333);
+    QPoint start(width()/2, 0);
+    QPoint end(width()/2, height()-1);
+    QLinearGradient grad(start, end);
+    grad.setColorAt(0.4, col);
+    grad.setColorAt(0.6, col);
+    col.setAlphaF(0);
+    grad.setColorAt(0.1, col);
+    grad.setColorAt(0.9, col);
+    p.setPen(QPen(QBrush(grad), 1));
+    p.drawLine(start, end);
 }
-
-
diff --git a/widgets/toolbar.h b/widgets/spacerwidget.h
similarity index 82%
copy from widgets/toolbar.h
copy to widgets/spacerwidget.h
index 393cd52..13f3692 100644
--- a/widgets/toolbar.h
+++ b/widgets/spacerwidget.h
@@ -21,19 +21,18 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef TOOLBAR_H
-#define TOOLBAR_H
+#ifndef SPACER_WIDGET_H
+#define SPACER_WIDGET_H
 
 #include <QWidget>
 
-class ToolBar : public QWidget
+class SpacerWidget : public QWidget
 {
-    Q_OBJECT
 public:
-    ToolBar(QWidget *parent = 0);
-    virtual ~ToolBar() { }
+    SpacerWidget(QWidget *parent = 0);
+    virtual ~SpacerWidget() { }
 
-    void paintEvent(QPaintEvent *);
+    void paintEvent(QPaintEvent *e);
 };
 
 #endif // TOOLBAR_H
diff --git a/widgets/timeslider.cpp b/widgets/timeslider.cpp
index e4e864d..9d91f9c 100644
--- a/widgets/timeslider.cpp
+++ b/widgets/timeslider.cpp
@@ -25,11 +25,12 @@
 #include "song.h"
 #include "settings.h"
 #include <QLabel>
-#include <QGridLayout>
+#include <QHBoxLayout>
 #include <QProxyStyle>
 #include <QTimer>
 #include <QApplication>
 #include <QMouseEvent>
+#include <QSlider>
 
 class ProxyStyle : public QProxyStyle
 {
@@ -50,6 +51,8 @@ public:
     }
 };
 
+static const QLatin1String constEmptyTime("0:00:00");
+
 class TimeLabel : public QLabel
 {
 public:
@@ -57,18 +60,8 @@ public:
         : QLabel(p)
         , slider(s)
         , visible(true)
-        , pressed(false)
-        , showRemaining(Settings::self()->showTimeRemaining())
     {
         setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Fixed);
-        setAttribute(Qt::WA_Hover, true);
-    }
-
-    virtual ~TimeLabel() { }
-
-    void saveConfig()
-    {
-        Settings::self()->saveShowTimeRemaining(showRemaining);
     }
 
     void setEnabled(bool e)
@@ -76,10 +69,69 @@ public:
         if (e!=visible) {
             visible=e;
             QLabel::setEnabled(e);
-            setStyleSheet(e ? QString() : QLatin1String("QLabel { color : transparent; }"));
+            if (e) {
+                setStyleSheet(QString());
+            } else {
+                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));
+            }
+        }
+    }
+
+    void updateTime()
+    {
+        if (visible) {
+            updateTimeDisplay();
+        } else {
+            setText(constEmptyTime);
         }
     }
 
+private:
+    virtual void updateTimeDisplay()=0;
+
+protected:
+    QSlider *slider;
+    bool visible;
+};
+
+class TimeTakenLabel : public TimeLabel
+{
+public:
+    TimeTakenLabel(QWidget *p, QSlider *s)
+        : TimeLabel(p, s)
+    {
+        setAlignment((Qt::RightToLeft==layoutDirection() ? Qt::AlignLeft : Qt::AlignRight)|Qt::AlignVCenter);
+        setMinimumWidth(fontMetrics().width(constEmptyTime));
+    }
+    virtual ~TimeTakenLabel() { }
+
+    virtual void updateTimeDisplay()
+    {
+        setText(Song::formattedTime(slider->value()));
+    }
+};
+
+class RemainingTimeLabel : public TimeLabel
+{
+public:
+    RemainingTimeLabel(QWidget *p, QSlider *s)
+        : TimeLabel(p, s)
+        , pressed(false)
+        , showRemaining(Settings::self()->showTimeRemaining())
+    {
+        setAttribute(Qt::WA_Hover, true);
+        setAlignment((Qt::RightToLeft==layoutDirection() ? Qt::AlignRight : Qt::AlignLeft)|Qt::AlignVCenter);
+        setMinimumWidth(fontMetrics().width(QLatin1String("-")+constEmptyTime));
+    }
+
+    virtual ~RemainingTimeLabel() { }
+
+    void saveConfig()
+    {
+        Settings::self()->saveShowTimeRemaining(showRemaining);
+    }
+
     bool event(QEvent *e)
     {
         switch (e->type()) {
@@ -91,7 +143,7 @@ public:
         case QEvent::MouseButtonRelease:
             if (visible && pressed) {
                 showRemaining=!showRemaining;
-                updateTimes();
+                updateTime();
             }
             pressed=false;
             break;
@@ -111,59 +163,135 @@ public:
         return QLabel::event(e);
     }
 
-    void updateTimes()
+    void updateTimeDisplay()
     {
-        int value=showRemaining ? slider->maximum()-slider->value() : slider->value();
+        int value=showRemaining ? slider->maximum()-slider->value() : slider->maximum();
         QString prefix=showRemaining && value ? QLatin1String("-") : QString();
-        setText(prefix+Song::formattedTime(value)+" / "+Song::formattedTime(slider->maximum()));
+        setText(prefix+Song::formattedTime(value));
     }
 
 private:
-    QSlider *slider;
-    bool visible;
     bool pressed;
     bool showRemaining;
 };
 
-class PosSlider : public QSlider
+PosSlider::PosSlider(QWidget *p)
+    : QSlider(p)
+    , isActive(false)
+    , shown(false)
 {
-public:
-    PosSlider(QWidget *p)
-        : QSlider(p)
-    {
-        setPageStep(0);
-        setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-        // Set minimum height to help with some Gtk themes.
-        // BUG:179
-        setMinimumHeight(24);
-        setFocusPolicy(Qt::NoFocus);
-        setStyle(new ProxyStyle());
+    setPageStep(0);
+    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+    setFocusPolicy(Qt::NoFocus);
+    setStyle(new ProxyStyle());
+    int h=fontMetrics().height()*0.5;
+    setMinimumHeight(h);
+    setMaximumHeight(h);
+    updateStyleSheet();
+}
+
+void PosSlider::showEvent(QShowEvent *e)
+{
+    QSlider::showEvent(e);
+    if (!shown) {
+        updateStyleSheet();
+        shown=true;
     }
+}
 
-    virtual ~PosSlider() { }
+void PosSlider::updateStyleSheet()
+{
+    int lineWidth=maximumHeight()>12 ? 2 : 1;
 
-    bool event(QEvent *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));
-            }
+    QString boderFormat=QLatin1String("QSlider::groove:horizontal { border: %1px solid rgba(%2, %3, %4, %5); "
+                                      "background: transparent; "
+                                      "border-radius: %6px } ");
+    QString fillFormat=QLatin1String("QSlider::")+QLatin1String(Qt::RightToLeft==layoutDirection() ? "add" : "sub")+
+            QLatin1String("-page:horizontal {border: %1px solid rgb(%2, %3, %4); "
+                          "background: qlineargradient(x1:0, y1:0, x2:0, y2:1, stop:0 rgb(%5, %6, %7), stop:1 rgb(%8, %9, %10)); "
+                          "border-radius: %11px; margin: %12px;}");
+    QLabel lbl(parentWidget());
+    lbl.ensurePolished();
+    QColor textColor=lbl.palette().text().color();
+    int alpha=textColor.value()<32 ? 96 : 64;
+    QColor fillBorder=QApplication::palette().highlight().color();
+    QColor fillTop=fillBorder.lighter(120);
+    QColor fillBot=fillBorder.lighter(80);
+
+    inactiveStyleSheet=boderFormat.arg(lineWidth).arg(textColor.red()).arg(textColor.green()).arg(textColor.blue()).arg(alpha/2).arg(lineWidth*2);
+    activeStyleSheet=boderFormat.arg(lineWidth).arg(textColor.red()).arg(textColor.green()).arg(textColor.blue()).arg(alpha).arg(lineWidth*2);
+    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);
+}
+
+bool PosSlider::event(QEvent *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));
         }
+    }
+
+    return QSlider::event(e);
+}
 
-        return QSlider::event(e);
+void PosSlider::wheelEvent(QWheelEvent *ev)
+{
+    if (!isActive) {
+        return;
     }
 
-    void setRange(int min, int max)
-    {
-        QSlider::setRange(min, max);
-        setValue(min);
-        if (min==max) {
-            setToolTip(QString());
+    static const int constStep=5;
+    int numDegrees = ev->delta() / 8;
+    int numSteps = numDegrees / 15;
+    int val=value();
+    if (numSteps > 0) {
+        int max=maximum();
+        if (val!=max) {
+            for (int i = 0; i < numSteps; ++i) {
+                val+=constStep;
+                if (val>max) {
+                    val=max;
+                    break;
+                }
+            }
+        }
+    } else {
+        int min=minimum();
+        if (val!=min) {
+            for (int i = 0; i > numSteps; --i) {
+                val-=constStep;
+                if (val<min) {
+                    val=min;
+                    break;
+                }
+            }
         }
     }
-};
+    if (val!=value()) {
+        setValue(val);
+        emit positionSet();
+    }
+}
+
+void PosSlider::setRange(int min, int max)
+{
+    bool active=min!=max;
+    QSlider::setRange(min, max);
+    setValue(min);
+    if (!active) {
+        setToolTip(QString());
+    }
+
+    if (active!=isActive) {
+        isActive=active;
+        setStyleSheet(isActive ? activeStyleSheet : inactiveStyleSheet);
+    }
+}
 
 TimeSlider::TimeSlider(QWidget *p)
     : QWidget(p)
@@ -171,15 +299,16 @@ TimeSlider::TimeSlider(QWidget *p)
     , lastVal(0)
 {
     slider=new PosSlider(this);
-    label=new TimeLabel(this, slider);
-    label->setAlignment((Qt::RightToLeft==layoutDirection() ? Qt::AlignRight : Qt::AlignLeft)|Qt::AlignVCenter);
-    QGridLayout *layout=new QGridLayout(this);
-    layout->setSpacing(0);
+    timeTaken=new TimeTakenLabel(this, slider);
+    timeLeft=new RemainingTimeLabel(this, slider);
+    QBoxLayout *layout=new QBoxLayout(QBoxLayout::LeftToRight, this);
     layout->setMargin(0);
-    layout->addWidget(label, 0, 0, 1, 1);
-    layout->addWidget(slider, 1, 0, 1, 2);
+    layout->addWidget(timeTaken);
+    layout->addWidget(slider);
+    layout->addWidget(timeLeft);
     connect(slider, SIGNAL(sliderPressed()), this, SLOT(pressed()));
     connect(slider, SIGNAL(sliderReleased()), this, SLOT(released()));
+    connect(slider, SIGNAL(positionSet()), this, SIGNAL(sliderReleased()));
     connect(slider, SIGNAL(valueChanged(int)), this, SLOT(updateTimes()));
     setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
     clearTimes();
@@ -215,7 +344,8 @@ void TimeSlider::setValue(int v)
 void TimeSlider::setRange(int min, int max)
 {
     slider->setRange(min, max);
-    label->setEnabled(min!=max);
+    timeTaken->setEnabled(min!=max);
+    timeLeft->setEnabled(min!=max);
     updateTimes();
 }
 
@@ -224,8 +354,10 @@ void TimeSlider::clearTimes()
     stopTimer();
     lastVal=0;
     slider->setRange(0, 0);
-    label->setEnabled(false);
-    label->updateTimes();
+    timeTaken->setEnabled(false);
+    timeLeft->setEnabled(false);
+    timeTaken->updateTime();
+    timeLeft->updateTime();
 }
 
 void TimeSlider::setOrientation(Qt::Orientation o)
@@ -240,13 +372,14 @@ int TimeSlider::value() const
 
 void TimeSlider::saveConfig()
 {
-    label->saveConfig();
+    timeLeft->saveConfig();
 }
 
 void TimeSlider::updateTimes()
 {
     if (slider->value()<172800 && slider->value() != slider->maximum()) {
-        label->updateTimes();
+        timeTaken->updateTime();
+        timeLeft->updateTime();
     }
 }
 
diff --git a/widgets/timeslider.h b/widgets/timeslider.h
index 04e1e30..37397d9 100644
--- a/widgets/timeslider.h
+++ b/widgets/timeslider.h
@@ -25,11 +25,35 @@
 #define TIMESLIDER_H
 
 #include <QWidget>
-#include <QSlider>
 #include <QTime>
+#include <QSlider>
+
 class QTimer;
-class TimeLabel;
-class PosSlider;
+class RemainingTimeLabel;
+class TimeTakenLabel;
+
+class PosSlider : public QSlider
+{
+    Q_OBJECT
+public:
+    PosSlider(QWidget *p);
+    virtual ~PosSlider() { }
+
+    void showEvent(QShowEvent *e);
+    void updateStyleSheet();
+    bool event(QEvent *e);
+    void wheelEvent(QWheelEvent *ev);
+    void setRange(int min, int max);
+
+Q_SIGNALS:
+    void positionSet();
+
+private:
+    bool isActive;
+    bool shown;
+    QString activeStyleSheet;
+    QString inactiveStyleSheet;
+};
 
 class TimeSlider : public QWidget
 {
@@ -56,7 +80,8 @@ private Q_SLOTS:
     void released();
 
 private:
-    TimeLabel *label;
+    RemainingTimeLabel *timeLeft;
+    TimeTakenLabel *timeTaken;
     PosSlider *slider;
     QTimer *timer;
     QTime startTime;
diff --git a/widgets/toolbutton.cpp b/widgets/toolbutton.cpp
index d913a16..88e3ca9 100644
--- a/widgets/toolbutton.cpp
+++ b/widgets/toolbutton.cpp
@@ -34,6 +34,9 @@ ToolButton::ToolButton(QWidget *parent)
 {
     Icon::init(this);
     setAutoRaise(true);
+    #ifdef Q_OS_MAC
+    setStyleSheet("QToolButton {border: 0}");
+    #endif
 }
 
 void ToolButton::paintEvent(QPaintEvent *e)
diff --git a/widgets/treeview.cpp b/widgets/treeview.cpp
index 569384b..ecb58ab 100644
--- a/widgets/treeview.cpp
+++ b/widgets/treeview.cpp
@@ -26,6 +26,7 @@
 #include "icons.h"
 #include "config.h"
 #include "basicitemdelegate.h"
+#include "utils.h"
 #include <QMouseEvent>
 #include <QPaintEvent>
 #include <QPainter>
@@ -141,13 +142,13 @@ void TreeView::selectionChanged(const QItemSelection &selected, const QItemSelec
 bool TreeView::haveSelectedItems() const
 {
     // Dont need the sorted type of 'selectedIndexes' here...
-    return selectionModel()->selectedIndexes().count()>0;
+    return selectionModel() && selectionModel()->selectedIndexes().count()>0;
 }
 
 bool TreeView::haveUnSelectedItems() const
 {
     // Dont need the sorted type of 'selectedIndexes' here...
-    return selectionModel()->selectedIndexes().count()!=model()->rowCount();
+    return selectionModel() && selectionModel()->selectedIndexes().count()!=model()->rowCount();
 }
 
 void TreeView::startDrag(Qt::DropActions supportedActions)
@@ -171,10 +172,11 @@ void TreeView::startDrag(Qt::DropActions supportedActions)
                 pix=QPixmap::fromImage(img);
             }
         }
+        int pixSize=Utils::isHighDpi() ? 64 : 32;
         if (pix.isNull()) {
-            drag->setPixmap(Icons::self()->albumIcon.pixmap(32, 32));
+            drag->setPixmap(Icons::self()->audioFileIcon.pixmap(pixSize, pixSize));
         } else {
-            drag->setPixmap(pix.width()<32 ? pix : pix.scaled(QSize(32, 32), Qt::KeepAspectRatio, Qt::SmoothTransformation));
+            drag->setPixmap(pix.width()<pixSize ? pix : pix.scaled(QSize(pixSize, pixSize), Qt::KeepAspectRatio, Qt::SmoothTransformation));
         }
         drag->start(supportedActions);
     }
@@ -189,9 +191,13 @@ void TreeView::mouseReleaseEvent(QMouseEvent *event)
 
 QModelIndexList TreeView::selectedIndexes(bool sorted) const
 {
+    if (!selectionModel()) {
+        return QModelIndexList();
+    }
+
     if (sorted) {
         return sortIndexes(selectionModel()->selectedIndexes());
-    } else if (model()->columnCount()>1) {
+    } else if (model() && model()->columnCount()>1) {
         QModelIndexList list=selectionModel()->selectedIndexes();
         QModelIndexList sel;
         foreach (const QModelIndex &idx, list) {
@@ -270,13 +276,15 @@ void TreeView::expandAll(const QModelIndex &idx)
     }
 }
 
-void TreeView::expand(const QModelIndex &idx)
+void TreeView::expand(const QModelIndex &idx, bool singleOnly)
 {
     if (idx.isValid()) {
         setExpanded(idx, true);
-        quint32 count=model()->rowCount(idx);
-        for (quint32 i=0; i<count; ++i) {
-            expand(idx.child(i, 0));
+        if (!singleOnly) {
+            quint32 count=model()->rowCount(idx);
+            for (quint32 i=0; i<count; ++i) {
+                expand(idx.child(i, 0));
+            }
         }
     }
 }
@@ -334,6 +342,10 @@ void TreeView::setModel(QAbstractItemModel *m)
 // Workaround for https://bugreports.qt-project.org/browse/QTBUG-18009
 void TreeView::correctSelection()
 {
+    if (!selectionModel()) {
+        return;
+    }
+
     QItemSelection s = selectionModel()->selection();
     setCurrentIndex(currentIndex());
     selectionModel()->select(s, QItemSelectionModel::SelectCurrent);
diff --git a/widgets/treeview.h b/widgets/treeview.h
index f383db2..dbb4cfc 100644
--- a/widgets/treeview.h
+++ b/widgets/treeview.h
@@ -54,7 +54,7 @@ public:
     QModelIndexList selectedIndexes() const { return selectedIndexes(true); }
     QModelIndexList selectedIndexes(bool sorted) const;
     void expandAll(const QModelIndex &idx=QModelIndex());
-    virtual void expand(const QModelIndex &idx);
+    virtual void expand(const QModelIndex &idx, bool singleOnly=false);
     virtual void setModel(QAbstractItemModel *m);
     bool checkBoxClicked(const QModelIndex &idx) const;
     void setUseSimpleDelegate();
diff --git a/widgets/volumecontrol.cpp b/widgets/volumecontrol.cpp
deleted file mode 100644
index 82b7487..0000000
--- a/widgets/volumecontrol.cpp
+++ /dev/null
@@ -1,91 +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 "volumecontrol.h"
-#include "icon.h"
-#include <QFrame>
-#include <QSlider>
-#include <QLabel>
-#include <QVBoxLayout>
-#include <QApplication>
-
-VolumeControl::VolumeControl(QWidget *parent)
-    : QMenu(parent)
-{
-    QFrame *w = new QFrame(this);
-    slider = new QSlider(w);
-
-    QLabel *increase = new QLabel(QLatin1String("+"), w);
-    QLabel *decrease = new QLabel(QLatin1String("-"), w);
-    increase->setAlignment(Qt::AlignHCenter);
-    decrease->setAlignment(Qt::AlignHCenter);
-
-    QVBoxLayout *l = new QVBoxLayout(w);
-    l->setMargin(3);
-    l->setSpacing(0);
-    l->addWidget(increase);
-    l->addWidget(slider);
-    l->addWidget(decrease);
-
-    QHBoxLayout *layout = new QHBoxLayout(this);
-    layout->setMargin(0);
-    layout->addWidget(w);
-    connect(slider, SIGNAL(valueChanged(int)), SIGNAL(valueChanged(int)));
-    int size=Icon::stdSize(QApplication::fontMetrics().height());
-
-    slider->setMinimumHeight(size*12);
-    slider->setMaximumHeight(size*12);
-    slider->setMinimumWidth(size*1.5);
-    slider->setMaximumWidth(size*1.5);
-    slider->setOrientation(Qt::Vertical);
-    slider->setMinimum(0);
-    slider->setMaximum(100);
-    slider->setPageStep(5);
-
-    adjustSize();
-}
-
-VolumeControl::~VolumeControl()
-{
-}
-
-void VolumeControl::installSliderEventFilter(QObject *filter)
-{
-    slider->installEventFilter(filter);
-}
-
-void VolumeControl::increaseVolume()
-{
-    slider->triggerAction(QAbstractSlider::SliderPageStepAdd);
-}
-
-void VolumeControl::decreaseVolume()
-{
-    slider->triggerAction(QAbstractSlider::SliderPageStepSub);
-}
-
-void VolumeControl::setValue(int v)
-{
-    slider->setValue(v);
-}
-
diff --git a/widgets/volumeslider.cpp b/widgets/volumeslider.cpp
new file mode 100644
index 0000000..b3c9641
--- /dev/null
+++ b/widgets/volumeslider.cpp
@@ -0,0 +1,334 @@
+/*
+ * 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 "volumeslider.h"
+#include "localize.h"
+#include "mpdconnection.h"
+#include "mpdstatus.h"
+#include "action.h"
+#include "actioncollection.h"
+#include "stdactions.h"
+#include "utils.h"
+#include "settings.h"
+#include <QStyle>
+#include <QPainter>
+#include <QPainterPath>
+#include <QProxyStyle>
+#include <QApplication>
+#include <QLabel>
+#include <QMouseEvent>
+#include <QWheelEvent>
+#include <QMenu>
+#ifdef ENABLE_KDE_SUPPORT
+#include <KDE/KShortcut>
+#endif
+
+class ProxyStyle : public QProxyStyle
+{
+public:
+    ProxyStyle()
+        : QProxyStyle()
+    {
+        setBaseStyle(qApp->style());
+    }
+
+    int styleHint(StyleHint stylehint, const QStyleOption *opt, const QWidget *widget, QStyleHintReturn *returnData) const
+    {
+        if (SH_Slider_AbsoluteSetButtons==stylehint) {
+            return Qt::LeftButton|QProxyStyle::styleHint(stylehint, opt, widget, returnData);
+        } else {
+            return QProxyStyle::styleHint(stylehint, opt, widget, returnData);
+        }
+    }
+};
+
+
+static const int constWidthStep=4;
+static const int constHeightStep=2;
+
+static QColor clampColor(const QColor &col)
+{
+    static const int constMin=64;
+    static const int constMax=196;
+
+    if (col.value()<constMin) {
+        return QColor(constMin, constMin, constMin);
+    } else if (col.value()>constMax) {
+        return QColor(constMax, constMax, constMax);
+    }
+    return col;
+}
+
+VolumeSlider::VolumeSlider(QWidget *p)
+    : QSlider(p)
+    , lineWidth(0)
+    , shown(false)
+    , down(false)
+    , fadingStop(false)
+    , muteAction(0)
+    , menu(0)
+{
+    setRange(0, 100);
+    setPageStep(Settings::self()->volumeStep());
+    lineWidth=Utils::isHighDpi() ? 2 : 1;
+
+    int w=lineWidth*constWidthStep*19;
+    int h=lineWidth*constHeightStep*10;
+    setFixedHeight(h+1);
+    setFixedWidth(w);
+    setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
+    setOrientation(Qt::Horizontal);
+    setFocusPolicy(Qt::NoFocus);
+    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));
+    textCol=clampColor(palette().color(QPalette::Active, QPalette::Text));
+    generatePixmaps();
+}
+
+void VolumeSlider::initActions()
+{
+    if (muteAction) {
+        return;
+    }
+    muteAction = ActionCollection::get()->createAction("mute", i18n("Mute"));
+    addAction(muteAction);
+    #ifdef ENABLE_KDE_SUPPORT
+    muteAction->setGlobalShortcut(KShortcut(Qt::Key_VolumeMute));
+    StdActions::self()->increaseVolumeAction->setGlobalShortcut(KShortcut(Qt::Key_VolumeUp));
+    StdActions::self()->decreaseVolumeAction->setGlobalShortcut(KShortcut(Qt::Key_VolumeDown));
+    #endif
+    connect(muteAction, SIGNAL(triggered(bool)), MPDConnection::self(), SLOT(toggleMute()));
+    connect(MPDStatus::self(), SIGNAL(updated()), this, SLOT(updateMpdStatus()));
+    connect(StdActions::self()->increaseVolumeAction, SIGNAL(triggered(bool)), this, SLOT(increaseVolume()));
+    connect(StdActions::self()->decreaseVolumeAction, SIGNAL(triggered(bool)), this, SLOT(decreaseVolume()));
+    connect(this, SIGNAL(valueChanged(int)), MPDConnection::self(), SLOT(setVolume(int)));
+    addAction(StdActions::self()->increaseVolumeAction);
+    addAction(StdActions::self()->decreaseVolumeAction);
+}
+
+void VolumeSlider::showEvent(QShowEvent *ev)
+{
+    if (!shown) {
+        shown=true;
+        QLabel lbl(parentWidget());
+        lbl.ensurePolished();
+        QColor col=clampColor(lbl.palette().text().color());
+
+        if (col!=textCol) {
+            textCol=col;
+            generatePixmaps();
+        }
+    }
+    QSlider::showEvent(ev);
+}
+
+void VolumeSlider::paintEvent(QPaintEvent *)
+{
+    bool reverse=Qt::RightToLeft==layoutDirection();
+    QPainter p(this);
+    bool muted=MPDConnection::self()->isMuted();
+    if (muted) {
+        p.setOpacity(0.25);
+    }
+
+    p.drawPixmap(0, 0, pixmaps[0]);
+    #if 1
+    int steps=(value()/10.0)+0.5;
+    if (steps>0) {
+        if (steps<10) {
+            int wStep=constWidthStep*lineWidth;
+            p.setClipRect(reverse
+                            ? QRect(width()-((steps*wStep*2)-wStep), 0, width(), height())
+                            : QRect(0, 0, (steps*wStep*2)-wStep, height()));
+            p.setClipping(true);
+        }
+        p.drawPixmap(0, 0, pixmaps[1]);
+        if (steps<10) {
+            p.setClipping(false);
+        }
+    }
+    #else // Partial filling of each block?
+    if (value()>0) {
+        if (value()<100) {
+            int fillWidth=(width()*(0.01*value()))+0.5;
+            p.setClipRect(reverse
+                            ? QRect(width()-fillWidth, 0, width(), height())
+                            : QRect(0, 0, fillWidth, height()));
+            p.setClipping(true);
+        }
+        p.drawPixmap(0, 0, *(pixmaps[1]));
+        if (value()<100) {
+            p.setClipping(false);
+        }
+    }
+    #endif
+
+    if (muted) {
+        p.setOpacity(1.0);
+    }
+    p.setPen(textCol);
+    QFont f(font());
+    f.setPixelSize(height()/2.0);
+    p.setFont(f);
+
+    if (muted) {
+        QFontMetrics fm(p.fontMetrics());
+        QString text(fm.elidedText(i18n("Muted"), Qt::ElideRight, width(), QPalette::WindowText));
+        p.drawText(rect(), Qt::AlignLeft, text);
+    } else {
+        p.drawText(rect(), Qt::AlignLeft, QString("%1%").arg(value()));
+    }
+}
+
+void VolumeSlider::mousePressEvent(QMouseEvent *ev)
+{
+    if (Qt::MiddleButton==ev->buttons()) {
+        down=true;
+    } else {
+        QSlider::mousePressEvent(ev);
+    }
+}
+
+void VolumeSlider::mouseReleaseEvent(QMouseEvent *ev)
+{
+    if (down) {
+        down=false;
+        muteAction->trigger();
+        update();
+    } else {
+        QSlider::mouseReleaseEvent(ev);
+    }
+}
+
+void VolumeSlider::contextMenuEvent(QContextMenuEvent *ev)
+{
+    static const char *constValProp="val";
+    if (!menu) {
+        menu=new QMenu(this);
+        muteMenuAction=menu->addAction(i18n("Mute"));
+        muteMenuAction->setProperty(constValProp, -1);
+        for (int i=0; i<11; ++i) {
+            menu->addAction(QString("%1%").arg(i*10))->setProperty(constValProp, i*10);
+        }
+    }
+
+    muteMenuAction->setText(MPDConnection::self()->isMuted() ? i18n("Unmute") : i18n("Mute"));
+    QAction *ret = menu->exec(mapToGlobal(ev->pos()));
+    if (ret) {
+        int val=ret->property(constValProp).toInt();
+        if (-1==val) {
+            muteAction->trigger();
+        } else {
+            setValue(val);
+        }
+    }
+}
+
+void VolumeSlider::wheelEvent(QWheelEvent *ev)
+{
+    int numDegrees = ev->delta() / 8;
+    int numSteps = numDegrees / 15;
+    if (numSteps > 0) {
+        for (int i = 0; i < numSteps; ++i) {
+            increaseVolume();
+        }
+    } else {
+        for (int i = 0; i > numSteps; --i) {
+            decreaseVolume();
+        }
+    }
+}
+
+void VolumeSlider::updateMpdStatus()
+{
+    if (fadingStop) {
+        return;
+    }
+
+    int volume=MPDStatus::self()->volume();
+
+    blockSignals(true);
+    if (volume<0) {
+        setEnabled(false);
+        setToolTip(i18n("Volume Disabled"));
+        setValue(0);
+    } else {
+        int unmuteVolume=-1;
+        if (0==volume) {
+            unmuteVolume=MPDConnection::self()->unmuteVolume();
+            if (unmuteVolume>0) {
+                volume=unmuteVolume;
+            }
+        }
+        setEnabled(true);
+        setToolTip(unmuteVolume>0 ? i18n("Volume %1% (Muted)", volume) : i18n("Volume %1%", volume));
+        setValue(volume);
+    }
+    update();
+    muteAction->setEnabled(isEnabled());
+    StdActions::self()->increaseVolumeAction->setEnabled(isEnabled());
+    StdActions::self()->decreaseVolumeAction->setEnabled(isEnabled());
+    blockSignals(false);
+}
+
+void VolumeSlider::increaseVolume()
+{
+    triggerAction(QAbstractSlider::SliderPageStepAdd);
+}
+
+void VolumeSlider::decreaseVolume()
+{
+    triggerAction(QAbstractSlider::SliderPageStepSub);
+}
+
+void VolumeSlider::generatePixmaps()
+{
+    pixmaps[0]=generatePixmap(false);
+    pixmaps[1]=generatePixmap(true);
+}
+
+QPixmap VolumeSlider::generatePixmap(bool filled)
+{
+    bool reverse=Qt::RightToLeft==layoutDirection();
+    QPixmap pix(size());
+    pix.fill(Qt::transparent);
+    QPainter p(&pix);
+    p.setPen(textCol);
+    for (int i=0; i<10; ++i) {
+        int barHeight=(lineWidth*constHeightStep)*(i+1);
+        QRect r(reverse ? pix.width()-(constWidthStep+(i*lineWidth*constWidthStep*2))
+                        : i*lineWidth*constWidthStep*2,
+                pix.height()-(barHeight+1), (lineWidth*constWidthStep)-1, barHeight);
+        if (filled) {
+            p.fillRect(r.adjusted(1, 1, 0, 0), textCol);
+        } else if (lineWidth>1) {
+            p.drawRect(r);
+            p.drawRect(r.adjusted(1, 1, -1, -1));
+        } else {
+            p.drawRect(r);
+        }
+    }
+    return pix;
+}
diff --git a/widgets/volumecontrol.h b/widgets/volumeslider.h
similarity index 52%
rename from widgets/volumecontrol.h
rename to widgets/volumeslider.h
index 1aaffaf..3271da2 100644
--- a/widgets/volumecontrol.h
+++ b/widgets/volumeslider.h
@@ -21,35 +21,53 @@
  * Boston, MA 02110-1301, USA.
  */
 
-#ifndef VOLUMECONTROL_H
-#define VOLUMECONTROL_H
+#ifndef VOLUMESLIDER_H
+#define VOLUMESLIDER_H
 
-#include <QMenu>
+#include <QSlider>
+#include <QColor>
 
-class QSlider;
+class QPixmap;
+class QMenu;
+class Action;
+class QAction;
 
-class VolumeControl : public QMenu
+class VolumeSlider : public QSlider
 {
     Q_OBJECT
 
 public:
-    VolumeControl(QWidget *parent);
-    virtual ~VolumeControl();
+    VolumeSlider(QWidget *p=0);
+    virtual ~VolumeSlider() { }
 
-    void installSliderEventFilter(QObject *filter);
+    void initActions();
+    void setFadingStop(bool f) { fadingStop=f; }
+    void showEvent(QShowEvent *ev);
+    void paintEvent(QPaintEvent *ev);
+    void mousePressEvent(QMouseEvent *ev);
+    void mouseReleaseEvent(QMouseEvent *ev);
+    void contextMenuEvent(QContextMenuEvent *ev);
+    void wheelEvent(QWheelEvent *ev);
 
-public Q_SLOTS:
+private Q_SLOTS:
+    void updateMpdStatus();
     void increaseVolume();
     void decreaseVolume();
-    void setValue(int v);
 
-    QSlider * sliderWidget() { return slider; }
-
-Q_SIGNALS:
-    void valueChanged(int v);
+private:
+    void generatePixmaps();
+    QPixmap generatePixmap(bool filled);
 
 private:
-    QSlider *slider;
+    int lineWidth;
+    bool shown;
+    bool down;
+    bool fadingStop;
+    QColor textCol;
+    QPixmap pixmaps[2];
+    Action *muteAction;
+    QAction *muteMenuAction;
+    QMenu *menu;
 };
 
 #endif
diff --git a/windows/icons/CMakeLists.txt b/windows/icons/CMakeLists.txt
index d909b93..3b61e76 100644
--- a/windows/icons/CMakeLists.txt
+++ b/windows/icons/CMakeLists.txt
@@ -47,13 +47,9 @@ set(OXYGEN_ICONS
 32x32/actions/configure-shortcuts.png
 32x32/actions/document-export.png
 32x32/actions/edit-clear-locationbar-ltr.png
-32x32/status/audio-volume-low.png
 32x32/status/media-playlist-shuffle.png
-32x32/status/audio-volume-muted.png
-32x32/status/audio-volume-high.png
 32x32/status/dialog-error.png
 32x32/status/dialog-warning.png
-32x32/status/audio-volume-medium.png
 32x32/status/dialog-information.png
 32x32/status/object-locked.png
 32x32/mimetypes/inode-directory.png
@@ -126,13 +122,9 @@ set(OXYGEN_ICONS
 22x22/actions/configure-shortcuts.png
 22x22/actions/document-export.png
 22x22/actions/edit-clear-locationbar-ltr.png
-22x22/status/audio-volume-low.png
 22x22/status/media-playlist-shuffle.png
-22x22/status/audio-volume-muted.png
-22x22/status/audio-volume-high.png
 22x22/status/dialog-error.png
 22x22/status/dialog-warning.png
-22x22/status/audio-volume-medium.png
 22x22/status/dialog-information.png
 22x22/status/object-locked.png
 22x22/mimetypes/inode-directory.png
@@ -195,13 +187,9 @@ set(OXYGEN_ICONS
 16x16/actions/configure-shortcuts.png
 16x16/actions/document-export.png
 16x16/actions/edit-clear-locationbar-ltr.png
-16x16/status/audio-volume-low.png
 16x16/status/media-playlist-shuffle.png
-16x16/status/audio-volume-muted.png
-16x16/status/audio-volume-high.png
 16x16/status/dialog-error.png
 16x16/status/dialog-warning.png
-16x16/status/audio-volume-medium.png
 16x16/status/dialog-information.png
 16x16/status/object-locked.png
 16x16/mimetypes/inode-directory.png
@@ -217,13 +205,9 @@ set(OXYGEN_ICONS
 16x16/apps/preferences-desktop-keyboard.png
 48x48/actions/view-fullscreen.png
 48x48/actions/configure-shortcuts.png
-48x48/status/audio-volume-low.png
 48x48/status/media-playlist-shuffle.png
-48x48/status/audio-volume-muted.png
-48x48/status/audio-volume-high.png
 48x48/status/dialog-error.png
 48x48/status/dialog-warning.png
-48x48/status/audio-volume-medium.png
 48x48/status/dialog-information.png
 48x48/status/object-locked.png
 48x48/categories/preferences-system-network.png

-- 
cantata packaging



More information about the pkg-multimedia-commits mailing list