[SCM] kodi/experimental: Imported Upstream version 17.0~beta3+dfsg1

rbalint at users.alioth.debian.org rbalint at users.alioth.debian.org
Fri Oct 7 08:49:16 UTC 2016


The following commit has been merged in the experimental branch:
commit 11b147a8610c1cb184a47354a335cce9acc95e33
Author: Balint Reczey <balint at balintreczey.hu>
Date:   Thu Oct 6 22:24:12 2016 +0200

    Imported Upstream version 17.0~beta3+dfsg1

diff --git a/.mention-bot b/.mention-bot
new file mode 100644
index 0000000..7597a87
--- /dev/null
+++ b/.mention-bot
@@ -0,0 +1,18 @@
+{
+  "maxReviewers": 3, 
+  "numFilesToCheck": 5, 
+  "message": "@pullRequester, thank you for improving Kodi! According to the last 5 commits, we found the potential reviewers: @reviewers. Final approval needs to be given by the component maintainer.",
+  "findPotentialReviewers": true, 
+  "userBlacklist": [ "FernetMenta" ], 
+  "userBlacklistForPR": [], 
+  "requiredOrgs": [], 
+  "actions": ["opened"], 
+  "skipAlreadyAssignedPR": true, 
+  "skipAlreadyMentionedPR": true, 
+  "assignToReviewer": false, 
+  "skipTitle": "", 
+  "withLabel": "", 
+  "delayed": false, 
+  "delayedUntil": "2h", 
+  "skipCollaboratorPR": false
+}
diff --git a/Kodi.xcodeproj/project.pbxproj b/Kodi.xcodeproj/project.pbxproj
index c6cdb0e..e82f094 100644
--- a/Kodi.xcodeproj/project.pbxproj
+++ b/Kodi.xcodeproj/project.pbxproj
@@ -2009,7 +2009,6 @@
 		E499143E174E605900741B6D /* AlarmClock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E230D25F9FD00618676 /* AlarmClock.cpp */; };
 		E499143F174E605900741B6D /* AliasShortcutUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5A9D3081097C9370050490F /* AliasShortcutUtils.cpp */; };
 		E4991440174E605900741B6D /* Archive.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E250D25F9FD00618676 /* Archive.cpp */; };
-		E4991441174E605900741B6D /* AsyncFileCopy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5FDF51C0E7218950005B0A6 /* AsyncFileCopy.cpp */; };
 		E4991443174E605900741B6D /* Base64.cpp in Sources */ = {isa = PBXBuildFile; fileRef = DF52769A151BAEDA00B5B63B /* Base64.cpp */; };
 		E4991444174E605900741B6D /* BitstreamConverter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F56353BD16E9BB3500D21BAD /* BitstreamConverter.cpp */; };
 		E4991445174E605900741B6D /* BitstreamStats.cpp in Sources */ = {isa = PBXBuildFile; fileRef = E38E1E270D25F9FD00618676 /* BitstreamStats.cpp */; };
@@ -2303,7 +2302,6 @@
 		F5F245EE1112C9AB009126C6 /* FileUtils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5F245EC1112C9AB009126C6 /* FileUtils.cpp */; };
 		F5F2EF4B0E593E0D0092C37F /* DVDFileInfo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5F2EF4A0E593E0D0092C37F /* DVDFileInfo.cpp */; };
 		F5F8E1E80E427F6700A8E96F /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5F8E1E60E427F6700A8E96F /* md5.cpp */; };
-		F5FDF51D0E7218950005B0A6 /* AsyncFileCopy.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F5FDF51C0E7218950005B0A6 /* AsyncFileCopy.cpp */; };
 /* End PBXBuildFile section */
 
 /* Begin PBXContainerItemProxy section */
@@ -5067,8 +5065,6 @@
 		F5F2EF4A0E593E0D0092C37F /* DVDFileInfo.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = DVDFileInfo.cpp; sourceTree = "<group>"; };
 		F5F8E1E60E427F6700A8E96F /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = "<group>"; };
 		F5F8E1E70E427F6700A8E96F /* md5.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = "<group>"; };
-		F5FDF51B0E7218950005B0A6 /* AsyncFileCopy.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = AsyncFileCopy.h; sourceTree = "<group>"; };
-		F5FDF51C0E7218950005B0A6 /* AsyncFileCopy.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = AsyncFileCopy.cpp; sourceTree = "<group>"; };
 /* End PBXFileReference section */
 
 /* Begin PBXFrameworksBuildPhase section */
@@ -8794,8 +8790,6 @@
 				F5A9D3071097C9370050490F /* AliasShortcutUtils.h */,
 				E38E1E250D25F9FD00618676 /* Archive.cpp */,
 				E38E1E260D25F9FD00618676 /* Archive.h */,
-				F5FDF51C0E7218950005B0A6 /* AsyncFileCopy.cpp */,
-				F5FDF51B0E7218950005B0A6 /* AsyncFileCopy.h */,
 				7C908892196358A8003D0619 /* auto_buffer.cpp */,
 				7C908893196358A8003D0619 /* auto_buffer.h */,
 				DF52769A151BAEDA00B5B63B /* Base64.cpp */,
@@ -10141,7 +10135,6 @@
 				F506297A0E57B9680066625A /* MultiPathFile.cpp in Sources */,
 				DFEB902819E9337200728978 /* AEResampleFactory.cpp in Sources */,
 				F5F2EF4B0E593E0D0092C37F /* DVDFileInfo.cpp in Sources */,
-				F5FDF51D0E7218950005B0A6 /* AsyncFileCopy.cpp in Sources */,
 				DF29BD021B5D913B00904347 /* EventsDirectory.cpp in Sources */,
 				E4E91BB80E7F7338001F0546 /* NptXbmcFile.cpp in Sources */,
 				DF29BCEE1B5D911800904347 /* BaseEvent.cpp in Sources */,
@@ -11610,7 +11603,6 @@
 				DF4BF01E1A4EF3410053AC56 /* DVDDemuxCC.cpp in Sources */,
 				E499143F174E605900741B6D /* AliasShortcutUtils.cpp in Sources */,
 				E4991440174E605900741B6D /* Archive.cpp in Sources */,
-				E4991441174E605900741B6D /* AsyncFileCopy.cpp in Sources */,
 				E4991443174E605900741B6D /* Base64.cpp in Sources */,
 				E4991444174E605900741B6D /* BitstreamConverter.cpp in Sources */,
 				E4991445174E605900741B6D /* BitstreamStats.cpp in Sources */,
diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..85b7ee8
--- /dev/null
+++ b/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,31 @@
+<!--- Provide a general summary of your change in the Title above -->
+
+## Description
+<!--- Describe your change in detail -->
+
+## Motivation and Context
+<!--- Why is this change required? What problem does it solve? -->
+<!--- If it fixes an open issue, please link to the issue here -->
+
+## How Has This Been Tested?
+<!--- Please describe in detail how you tested your change -->
+<!--- Include details of your testing environment, and the tests you ran to -->
+<!--- see how your change affects other areas of the code, etc -->
+
+## Screenshots (if appropriate):
+
+## Types of change
+<!--- What type of change does your code introduce? Put an `x` in all the boxes that apply: -->
+- [ ] Bug fix (non-breaking change which fixes an issue)
+- [ ] New feature (non-breaking change which adds functionality)
+- [ ] Breaking change (fix or feature that would cause existing functionality to change)
+
+## Checklist:
+<!--- Go over all the following points, and put an `x` in all the boxes that apply -->
+<!--- If you're unsure about any of these, don't hesitate to ask. We're here to help! -->
+- [ ] My code follows the [Code guidelines](https://codedocs.xyz/xbmc/xbmc/code_guidelines.html) of this project 
+- [ ] My change requires a change to the documentation, either Doxygen or wiki
+- [ ] I have updated the documentation accordingly
+- [ ] I have read the [CONTRIBUTING](https://github.com/xbmc/xbmc/blob/master/CONTRIBUTING.md) document
+- [ ] I have added tests to cover my change
+- [ ] All new and existing tests passed
\ No newline at end of file
diff --git a/addons/game.controller.default/addon.xml b/addons/game.controller.default/addon.xml
index 310b88a..ead5c9e 100644
--- a/addons/game.controller.default/addon.xml
+++ b/addons/game.controller.default/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="game.controller.default"
         name="Default Controller"
-        version="1.0.0"
+        version="1.0.3"
         provider-name="Team Kodi">
     <requires>
     </requires>
diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po
index 7a3854a..7d8a53c 100644
--- a/addons/resource.language.en_gb/resources/strings.po
+++ b/addons/resource.language.en_gb/resources/strings.po
@@ -1581,7 +1581,7 @@ msgstr ""
 
 #: system/settings/settings.xml
 msgctxt "#348"
-msgid "Enable passthrough"
+msgid "Allow passthrough"
 msgstr ""
 
 #: system/settings/settings.xml
@@ -7771,7 +7771,12 @@ msgctxt "#14260"
 msgid "Debug"
 msgstr ""
 
-#empty strings from id 14261 to 14269
+#: system/settings/settings.xml
+msgctxt "#14261"
+msgid "Configure skin..."
+msgstr ""
+
+#empty strings from id 14262 to 14269
 
 #: system/settings/settings.xml
 msgctxt "#14270"
@@ -8689,10 +8694,7 @@ msgctxt "#16313"
 msgid "VDPAU - Sharpness"
 msgstr ""
 
-#: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
-msgctxt "#16314"
-msgid "Inverse telecine"
-msgstr ""
+#empty string with id 16314
 
 #: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
 msgctxt "#16315"
@@ -8721,13 +8723,10 @@ msgstr ""
 
 #: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
 msgctxt "#16320"
-msgid "DXVA - Bob"
+msgid "DXVA"
 msgstr ""
 
-#: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
-msgctxt "#16321"
-msgid "DXVA - Best"
-msgstr ""
+#empty string with id 16321
 
 #: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
 msgctxt "#16322"
@@ -8749,11 +8748,6 @@ msgctxt "#16325"
 msgid "VDPAU - Bob"
 msgstr ""
 
-#: xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.cpp
-msgctxt "#16326"
-msgid "DXVA-HD"
-msgstr ""
-
 #: xbmc/video/dialogs/GUIDialogVideoSettings.cpp
 msgctxt "#16327"
 msgid "VAAPI - Bob"
@@ -9185,6 +9179,7 @@ msgstr ""
 #. Label for a context menu entry to open the timer settings dialog
 #: xbmc/pvr/windows/GUIWindowPVRGuide.cpp
 #: xbmc/pvr/windows/GUIWindowPVRSearch.cpp
+#: addons/skin.estuary/1080i/DialogPVRInfo.xml
 msgctxt "#19061"
 msgid "Add timer"
 msgstr ""
@@ -14649,7 +14644,19 @@ msgctxt "#24149"
 msgid "The following add-ons are incompatible with this version of Kodi and have been automatically disabled: %s."
 msgstr ""
 
-#empty strings from id 24150 to 24990
+#. Progress text on splash screen
+#: xbmc/Application.cpp
+msgctxt "#24150"
+msgid "Database migration in progress - please wait..."
+msgstr ""
+
+#. Progress text on splash screen
+#: xbmc/Application.cpp
+msgctxt "#24151"
+msgid "Add-on migration in progress - please wait..."
+msgstr ""
+
+#empty strings from id 24152 to 24990
 
 #. Used as error message in add-on browser when add-on repository data could not be downloaded
 #: xbmc/filesystem/AddonsDirectory.cpp
@@ -14685,6 +14692,7 @@ msgid "Manage dependencies"
 msgstr ""
 
 #: xbmc/filesystem/AddonsDirectory.cpp
+#: system/settings/settings.xml
 msgctxt "#24997"
 msgid "Look and feel"
 msgstr ""
@@ -17942,7 +17950,7 @@ msgstr ""
 #. Description of setting with label #348 "Enable passthrough"
 #: system/settings/settings.xml
 msgctxt "#36368"
-msgid "Select to enable the passthrough audio options for playback of encoded audio such as Dolby Digital (AC3), DTS, etc."
+msgid "Select to allow passthrough audio for playback of compressed audio such as Dolby Digital (AC3), DTS, etc. The Client of the AudioEngine, for example Videoplayer, might decide to decode the audio stream under certain conditions. In Videoplayer case, passthrough won't be used for live streams and when you sync playback to display."
 msgstr ""
 
 #. Description of setting with label #349 "TrueHD capable receiver"
@@ -18688,7 +18696,7 @@ msgstr ""
 #. Description of setting "System -> Video output -> 3D LUT" with label #36564
 #: system/settings/settings.xml
 msgctxt "#36565"
-msgid "TODO: 3D LUT filename description"
+msgid "Select the 3DLUT file to be used by default. If you place multiple 3DLUT files in the same directory, then you can switch between them in the OSD menu during video playback. This allows for multiple display profiles to account for different viewing environments and source materials, for example gamma 2.2 for daytime viewing and 2.4 for nighttime."
 msgstr ""
 
 #: system/settings/settings.xml
@@ -18699,7 +18707,7 @@ msgstr ""
 #. Description of setting "System -> Video output -> ICC display profile" with label #36566
 #: system/settings/settings.xml
 msgctxt "#36567"
-msgid "TODO: ICC display profile filename description"
+msgid "By providing a display profile, you can modify video parameters such as gamma, color primaries and whitepoint during playback. An ICC source profile is created based on the parameters and linked with the display ICC profile set here. This support is experimental and lacks near black adjustment towards display native black (causing raised black level) and white level scaling when a different whitepoint from display native is selected (as a workaround, adjust video brightness down to avoid clipping)."
 msgstr ""
 
 #: system/settings/settings.xml
@@ -18710,7 +18718,7 @@ msgstr ""
 #. Description of setting "System -> Video output -> Whitepoint" with label #36568
 #: system/settings/settings.xml
 msgctxt "#36569"
-msgid "TODO: Whitepoint selection description"
+msgid "Changing video whitepoint to D93 is mainly useful for older Japanese NTSC material which looks too red when played back on a D65 display. Adjust video brightness setting down to avoid clipping to display native whitepoint."
 msgstr ""
 
 #: system/settings/settings.xml
@@ -18721,7 +18729,7 @@ msgstr ""
 #. Description of setting "System -> Video output -> Primaries" with label #36570
 #: system/settings/settings.xml
 msgctxt "#36571"
-msgid "TODO: Primary coordinates description"
+msgid "Select the primary color coordinates according to source material. Older HD material may have been mastered on displays with BT.601 primaries."
 msgstr ""
 
 #: system/settings/settings.xml
@@ -18732,7 +18740,7 @@ msgstr ""
 #. Description of setting "System -> Video output -> Gamma mode" with label #36572
 #: system/settings/settings.xml
 msgctxt "#36573"
-msgid "TODO: Gamma mode description"
+msgid "Select the gamma curve formula. Use BT.1886 for gamma curve that accounts for display black and white levels and avoids perceptual clipping. Use input offset for a similar curve with a manually specified effective gamma. Output offset allows for perceptual clipping, but can be used to compensate for incorrect mastering monitor settings that lead to too bright dark details. Absolute gamma does not account for display black at all and will clip the lowest levels to display black on any display with higher than zero black level."
 msgstr ""
 
 #: system/settings/settings.xml
@@ -18743,7 +18751,7 @@ msgstr ""
 #. Description of setting "System -> Video output -> Gamma" with label #36574
 #: system/settings/settings.xml
 msgctxt "#36575"
-msgid "TODO: Gamma description"
+msgid "Gamma for selected gamma curve type. For input and output offset, the result at 50% will match an absolute gamma curve with this gamma value."
 msgstr ""
 
 #: system/settings/settings.xml
@@ -18754,7 +18762,7 @@ msgstr ""
 #. Description of setting "System -> Video output -> Lookup table size" with label #36576
 #: system/settings/settings.xml
 msgctxt "#36577"
-msgid "TODO: Lookup table size description"
+msgid "Specify the resolution for the 3D lookup table. Use a lower resolution for quick preview and higher resolution for more accurate picture. Using a high resolution may take seconds to prepare when parameters are changed or a new video is started."
 msgstr ""
 
 #empty strings from id 36578 to 36579
@@ -19464,7 +19472,31 @@ msgctxt "#38042"
 msgid "[Missing]"
 msgstr ""
 
-#empty strings from id 38043 to 38099
+#. Title album artists node
+#: system/library/music/musicroles/albumartists.xml
+msgctxt "#38043"
+msgid "Album artists"
+msgstr ""
+
+#. Title all artists node
+#: system/library/music/musicroles/allartists.xml
+msgctxt "#38044"
+msgid "Song & album artists"
+msgstr ""
+
+#. Title all contributors node (any role)
+#: system/library/music/musicroles/allcontributors.xml
+msgctxt "#38045"
+msgid "All contributors"
+msgstr ""
+
+#. Title all roles node
+#: system/library/music/musicroles/allroles.xml
+msgctxt "#38046"
+msgid "All roles"
+msgstr ""
+
+#empty strings from id 38047 to 38099
 
 #. Description of section #14200 "Player""
 #: system/settings/settings.xml
@@ -19593,3 +19625,8 @@ msgstr ""
 msgctxt "#39009"
 msgid "Zoom - 110% width"
 msgstr ""
+
+#: view/GUIViewState.cpp
+msgctxt "#39010"
+msgid "Select sort method"
+msgstr ""
diff --git a/addons/skin.estouchy/xml/Home.xml b/addons/skin.estouchy/xml/Home.xml
index 373e001..09beb79 100644
--- a/addons/skin.estouchy/xml/Home.xml
+++ b/addons/skin.estouchy/xml/Home.xml
@@ -211,7 +211,7 @@
 				<content>
 					<item>
 						<label>13012</label>
-						<onclick>Quit</onclick>
+						<onclick>Shutdown</onclick>
 						<icon>icon_button_shutdown.png</icon>
 					</item>
 					<item>
diff --git a/addons/skin.estuary/1080i/Custom_1107_SearchDialog.xml b/addons/skin.estuary/1080i/Custom_1107_SearchDialog.xml
index fc2ef61..059deef 100644
--- a/addons/skin.estuary/1080i/Custom_1107_SearchDialog.xml
+++ b/addons/skin.estuary/1080i/Custom_1107_SearchDialog.xml
@@ -3,13 +3,13 @@
 	<defaultcontrol always="true">5000</defaultcontrol>
 	<coordinates>
 		<left>660</left>
-		<top>300</top>
+		<top>270</top>
 	</coordinates>
 	<include>Animation_DialogPopupOpenClose</include>
 	<controls>
 		<include content="DialogBackgroundCommons">
 			<param name="DialogBackgroundWidth" value="600" />
-			<param name="DialogBackgroundHeight" value="340" />
+			<param name="DialogBackgroundHeight" value="410" />
 			<param name="DialogHeaderLabel" value="$LOCALIZE[137]" />
 			<param name="DialogHeaderId" value="" />
 		</include>
@@ -35,6 +35,11 @@
 					<onclick condition="!System.hasAddon(script.globalsearch)">InstallAddon(script.globalsearch)</onclick>
 				</item>
 				<item>
+					<label>$LOCALIZE[31145]</label>
+					<onclick>Dialog.Close(all)</onclick>
+					<onclick>ActivateWindow(addonbrowser,addons://search/,return)</onclick>
+				</item>
+				<item>
 					<label>$LOCALIZE[31114]</label>
 					<onclick>Dialog.Close(all)</onclick>
 					<onclick condition="System.hasAddon(plugin.video.youtube)">ActivateWindow(videos,plugin://plugin.video.youtube/kodion/search/input/,return)</onclick>
diff --git a/addons/skin.estuary/1080i/Custom_1109_TopBarOverlay.xml b/addons/skin.estuary/1080i/Custom_1109_TopBarOverlay.xml
index 937f01b..5f57170 100644
--- a/addons/skin.estuary/1080i/Custom_1109_TopBarOverlay.xml
+++ b/addons/skin.estuary/1080i/Custom_1109_TopBarOverlay.xml
@@ -40,7 +40,7 @@
 				<left>85</left>
 				<shadowcolor>text_shadow</shadowcolor>
 				<height>100</height>
-				<width>auto</width>
+				<width>1400</width>
 			</control>
 			<control type="group">
 				<visible>!Window.IsVisible(extendedprogressdialog)</visible>
diff --git a/addons/skin.estuary/1080i/DialogFavourites.xml b/addons/skin.estuary/1080i/DialogFavourites.xml
index 0f12dc2..60507e9 100644
--- a/addons/skin.estuary/1080i/DialogFavourites.xml
+++ b/addons/skin.estuary/1080i/DialogFavourites.xml
@@ -48,7 +48,7 @@
 					<width>320</width>
 					<height>320</height>
 					<aspectratio>scale</aspectratio>
-					<texture border="4" fallback="DefaultAddon.png">$INFO[ListItem.Art(thumb)]</texture>
+					<texture border="4" fallback="DefaultFavourites.png">$INFO[ListItem.Art(thumb)]</texture>
 					<bordertexture colordiffuse="border_alpha">colors/black.png</bordertexture>
 					<bordersize>4</bordersize>
 				</control>
@@ -77,7 +77,7 @@
 					<width>320</width>
 					<height>320</height>
 					<aspectratio>scale</aspectratio>
-					<texture border="4" fallback="DefaultAddon.png">$INFO[ListItem.Art(thumb)]</texture>
+					<texture border="4" fallback="DefaultFavourites.png">$INFO[ListItem.Art(thumb)]</texture>
 					<bordertexture colordiffuse="border_alpha">colors/black.png</bordertexture>
 					<bordersize>4</bordersize>
 				</control>
diff --git a/addons/skin.estuary/1080i/DialogMusicInfo.xml b/addons/skin.estuary/1080i/DialogMusicInfo.xml
index 20605c1..9192683 100644
--- a/addons/skin.estuary/1080i/DialogMusicInfo.xml
+++ b/addons/skin.estuary/1080i/DialogMusicInfo.xml
@@ -76,7 +76,7 @@
 			<control type="group">
 				<visible>!Integer.IsEqual(Container(50).NumItems,0) | !String.IsEmpty(Control.GetLabel(400))</visible>
 				<top>454</top>
-				<control type="button" id="130">
+				<control type="button">
 					<onup>50</onup>
 					<ondown>9000</ondown>
 					<left>586</left>
diff --git a/addons/skin.estuary/1080i/DialogPVRInfo.xml b/addons/skin.estuary/1080i/DialogPVRInfo.xml
index 93524e1..17b51fb 100644
--- a/addons/skin.estuary/1080i/DialogPVRInfo.xml
+++ b/addons/skin.estuary/1080i/DialogPVRInfo.xml
@@ -90,6 +90,12 @@
 					<param name="visible" value="Window.IsActive(PVRGuideInfo)" />
 				</include>
 				<include content="InfoDialogButton">
+					<param name="id" value="9" />
+					<param name="icon" value="icons/infodialogs/timer.png" />
+					<param name="label" value="$LOCALIZE[19061]" />
+					<param name="visible" value="Window.IsActive(PVRGuideInfo)" />
+				</include>
+				<include content="InfoDialogButton">
 					<param name="id" value="440" />
 					<param name="icon" value="icons/infodialogs/trailer.png" />
 					<param name="label" value="$LOCALIZE[31114]" />
diff --git a/addons/skin.estuary/1080i/DialogVideoInfo.xml b/addons/skin.estuary/1080i/DialogVideoInfo.xml
index 4aa7bf9..22887aa 100644
--- a/addons/skin.estuary/1080i/DialogVideoInfo.xml
+++ b/addons/skin.estuary/1080i/DialogVideoInfo.xml
@@ -28,7 +28,7 @@
 					<texture fallback="DefaultVideo.png">$VAR[InfoDialogPosterVar]</texture>
 				</control>
 				<control type="group">
-					<visible>String.IsEqual(ListItem.DBType,episode)</visible>
+					<visible>String.IsEqual(ListItem.DBType,episode) | String.IsEqual(ListItem.DBType,video)</visible>
 					<visible>!String.IsEmpty(ListItem.Thumb) + !String.IsEqual(ListItem.Thumb,ListItem.Art(poster))</visible>
 					<control type="image">
 						<left>4</left>
@@ -261,7 +261,7 @@
 								<top>0</top>
 								<width>264</width>
 								<height>317</height>
-								<texture>DefaultActor.png</texture>
+								<texture>DefaultActorSolid.png</texture>
 								<aspectratio aligny="center">scale</aspectratio>
 								<bordertexture border="20">overlays/shadow.png</bordertexture>
 								<bordersize>20</bordersize>
@@ -271,7 +271,7 @@
 								<left>20</left>
 								<width>224</width>
 								<height>277</height>
-								<texture fallback="DefaultActorSolid.png" background="true">$INFO[ListItem.Thumb]</texture>
+								<texture background="true">$INFO[ListItem.Thumb]</texture>
 								<aspectratio aligny="center">scale</aspectratio>
 							</control>
 							<control type="image">
@@ -323,7 +323,7 @@
 								<left>20</left>
 								<width>224</width>
 								<height>277</height>
-								<texture fallback="DefaultActorSolid.png" background="true">$INFO[ListItem.Thumb]</texture>
+								<texture background="true">$INFO[ListItem.Thumb]</texture>
 								<aspectratio aligny="center">scale</aspectratio>
 							</control>
 							<control type="image">
@@ -411,7 +411,7 @@
 					</include>
 					<control type="group" id="400">
 						<width>262</width>
-						<visible>Control.IsEnabled(7) | !IsEmpty(ListItem.UserRating)</visible>
+						<visible>Control.IsEnabled(7) | !String.IsEmpty(ListItem.UserRating)</visible>
 						<control type="button" id="7">
 							<include content="VideoInfoButtonsCommon">
 								<param name="icon" value="" />
@@ -420,7 +420,7 @@
 							<onleft>440</onleft>
 							<onright>101</onright>
 							<onup>140</onup>
-							<enable>IsEmpty(Container.PluginName)</enable>
+							<enable>String.IsEmpty(Container.PluginName)</enable>
 							<ondown condition="Integer.IsEqual(Container(5000).CurrentItem,1)">SetFocus(50,0)</ondown>
 							<ondown condition="Integer.IsEqual(Container(5000).CurrentItem,2)">SetFocus(50,1)</ondown>
 							<ondown condition="Integer.IsEqual(Container(5000).CurrentItem,3)">SetFocus(50,2)</ondown>
diff --git a/addons/skin.estuary/1080i/Font.xml b/addons/skin.estuary/1080i/Font.xml
index b20618f..99bdf07 100644
--- a/addons/skin.estuary/1080i/Font.xml
+++ b/addons/skin.estuary/1080i/Font.xml
@@ -95,9 +95,9 @@
 			<size>120</size>
 		</font>
 		<font>
-			<name>Mono30</name>
+			<name>Mono28</name>
 			<filename>AnonymousPro.ttf</filename>
-			<size>30</size>
+			<size>28</size>
 		</font>
 	</fontset>
 	<fontset id="Arial" idloc="31053">
@@ -199,9 +199,9 @@
 			<style>bold</style>
 		</font>
 		<font>
-			<name>Mono30</name>
+			<name>Mono28</name>
 			<filename>arial.ttf</filename>
-			<size>30</size>
+			<size>28</size>
 		</font>
 	</fontset>
 </fonts>
diff --git a/addons/skin.estuary/1080i/Home.xml b/addons/skin.estuary/1080i/Home.xml
index e3dfa1a..f4325ea 100644
--- a/addons/skin.estuary/1080i/Home.xml
+++ b/addons/skin.estuary/1080i/Home.xml
@@ -377,14 +377,20 @@
 						<include content="SubMenu">
 							<param name="list_id" value="8900"/>
 							<param name="ondown_id" value="8100"/>
-							<param name="item1_onclick" value="ActivateWindow(addonbrowser,root)" />
-							<param name="item1_icon" value="add-ons.png" />
-							<param name="item1_label" value="$LOCALIZE[10040]" />
-							<param name="item2_onclick" value="ActivateWindow(systemsettings,addons)" />
-							<param name="item2_icon" value="settings.png" />
-							<param name="item2_label" value="$LOCALIZE[5]" />
-							<param name="item3_vis" value="False" />
-							<param name="item4_vis" value="False" />
+							<param name="item1_onclick" value="ActivateWindow(addonbrowser,addons://user/,return)" />
+							<param name="item1_icon" value="recordings.png" />
+							<param name="item1_label" value="$LOCALIZE[31146]" />
+							<param name="item2_onclick" value="ActivateWindow(addonbrowser,addons://repos/,return)" />
+							<param name="item2_icon" value="add-ons.png" />
+							<param name="item2_label" value="$LOCALIZE[31147]" />
+							<param name="item3_onclick" value="ActivateWindow(addonbrowser,addons://search/,return)" />
+							<param name="item3_icon" value="tv-search.png" />
+							<param name="item3_label" value="$LOCALIZE[137]" />
+							<param name="item3_vis" value="true" />
+							<param name="item4_onclick" value="ActivateWindow(systemsettings,addons)" />
+							<param name="item4_icon" value="settings.png" />
+							<param name="item4_label" value="$LOCALIZE[5]" />
+							<param name="item4_vis" value="true" />
 							<param name="item5_vis" value="False" />
 							<param name="item6_vis" value="False" />
 							<param name="item7_vis" value="False" />
@@ -455,6 +461,16 @@
 							<param name="main_label" value=""/>
 							<param name="sub_label" value=""/>
 						</include>
+						<include content="ImageWidget">
+							<param name="image_path" value="special://skin/extras/home-images/add-ons.jpg"/>
+							<param name="text_label" value="$LOCALIZE[31119]" />
+							<param name="button_label" value="$LOCALIZE[31118]" />
+							<param name="button_onclick" value="ActivateWindow(addonbrowser)"/>
+							<param name="button_id" value="8600"/>
+							<param name="onup_id" value="8100"/>
+							<param name="visible" value="!Integer.IsGreater(Container(8100).NumItems,0) + !Integer.IsGreater(Container(8200).NumItems,0) + !Integer.IsGreater(Container(8300).NumItems,0) + !Integer.IsGreater(Container(8400).NumItems,0) + !Integer.IsGreater(Container(8500).NumItems,0)"/>
+							<param name="button2_onclick" value="Skin.SetBool(HomeMenuNoProgramsButton)"/>
+						</include>
 					</control>
 				</control>
 				<control type="group" id="11000">
@@ -809,7 +825,7 @@
 								<width>800</width>
 								<align>right</align>
 								<font>font14</font>
-								<label>$INFO[Weather.Conditions] - $INFO[Weather.Temperature]</label>
+								<label>$INFO[Weather.Conditions] ∙ $INFO[Weather.Temperature]</label>
 							</control>
 							<control type="label">
 								<left>990</left>
@@ -824,6 +840,7 @@
 							<control type="grouplist">
 								<top>215</top>
 								<left>540</left>
+								<width>1330</width>
 								<orientation>horizontal</orientation>
 								<align>justify</align>
 								<itemgap>-50</itemgap>
@@ -1062,7 +1079,7 @@
 								<font>font14</font>
 								<label>$INFO[ListItem.Label]</label>
 								<shadowcolor>text_shadow</shadowcolor>
-								<visible>IsEmpty(ListItem.Label2)</visible>
+								<visible>String.IsEmpty(ListItem.Label2)</visible>
 							</control>
 							<control type="label">
 								<left>74</left>
@@ -1169,7 +1186,8 @@
 							</item>
 							<item>
 								<label>$LOCALIZE[8]</label>
-								<onclick>ActivateWindow(Weather)</onclick>
+								<onclick condition="!String.IsEmpty(Weather.Plugin)">ActivateWindow(Weather)</onclick>
+								<onclick condition="String.IsEmpty(Weather.Plugin)">ReplaceWindow(servicesettings,weather)</onclick>
 								<thumb>icons/home/weather.png</thumb>
 								<property name="id">weather</property>
 								<visible>!Skin.HasSetting(HomeMenuNoWeatherButton)</visible>
diff --git a/addons/skin.estuary/1080i/Includes.xml b/addons/skin.estuary/1080i/Includes.xml
index 3038c43..835afff 100644
--- a/addons/skin.estuary/1080i/Includes.xml
+++ b/addons/skin.estuary/1080i/Includes.xml
@@ -261,29 +261,6 @@
 			</focusedlayout>
 		</control>
 	</include>
-	<include name="LeftRightAlignedInfoLine">
-		<control type="group">
-			<height>30</height>
-			<control type="label">
-				<left>0</left>
-				<width>250</width>
-				<height>40</height>
-				<align>right</align>
-				<aligny>center</aligny>
-				<label>$PARAM[label]:</label>
-				<font>font12</font>
-				<textcolor>button_focus</textcolor>
-			</control>
-			<control type="label">
-				<left>270</left>
-				<width>1000</width>
-				<height>40</height>
-				<aligny>center</aligny>
-				<label>$PARAM[value]</label>
-				<font>font12</font>
-			</control>
-		</control>
-	</include>
 	<include name="PicsInfoLine">
 		<control type="grouplist">
 			<visible>!String.IsEmpty($PARAM[value])</visible>
@@ -574,40 +551,47 @@
 		</definition>
 	</include>
 	<include name="AddonLauncherPanel">
-		<control type="panel" id="$PARAM[container_id]">
-			<left>520</left>
-			<top>175</top>
-			<width>1360</width>
-			<height>720</height>
-			<onleft>9000</onleft>
-			<onright>531</onright>
-			<include>Visible_Right_Delayed</include>
-			<visible>$PARAM[visible]</visible>
-			<onup>$PARAM[container_id]</onup>
-			<ondown>$PARAM[container_id]</ondown>
-			<preloaditems>1</preloaditems>
-			<pagecontrol>531</pagecontrol>
-			<scrolltime tween="cubic" easing="out">500</scrolltime>
-			<itemlayout height="360" width="320">
-				<include>InfoWallMusicLayout</include>
-			</itemlayout>
-			<focusedlayout height="360" width="320">
-				<control type="group">
-					<animation effect="zoom" start="100" end="105" time="200" tween="sine" easing="inout" center="160,180">Focus</animation>
-					<animation effect="zoom" start="105" end="100" time="200" tween="sine" easing="inout" center="160,180">UnFocus</animation>
-					<include>InfoWallMusicLayout</include>
-					<control type="image">
-						<left>15</left>
-						<top>5</top>
-						<width>288</width>
-						<height>348</height>
-						<texture border="8" colordiffuse="button_focus">buttons/thumbnail_focused.png</texture>
-						<animation effect="fade" start="100" end="0" time="200">Unfocus</animation>
+		<param name="fallback_image">DefaultFolder.png</param>
+		<definition>
+			<control type="panel" id="$PARAM[container_id]">
+				<left>520</left>
+				<top>175</top>
+				<width>1360</width>
+				<height>720</height>
+				<onleft>9000</onleft>
+				<onright>531</onright>
+				<include>Visible_Right_Delayed</include>
+				<visible>$PARAM[visible]</visible>
+				<onup>$PARAM[container_id]</onup>
+				<ondown>$PARAM[container_id]</ondown>
+				<preloaditems>1</preloaditems>
+				<pagecontrol>531</pagecontrol>
+				<scrolltime tween="cubic" easing="out">500</scrolltime>
+				<itemlayout height="360" width="320">
+					<include content="InfoWallMusicLayout">
+						<param name="fallback_image" value="DefaultAddon.png" />
+					</include>
+				</itemlayout>
+				<focusedlayout height="360" width="320">
+					<control type="group">
+						<animation effect="zoom" start="100" end="105" time="200" tween="sine" easing="inout" center="160,180">Focus</animation>
+						<animation effect="zoom" start="105" end="100" time="200" tween="sine" easing="inout" center="160,180">UnFocus</animation>
+						<include content="InfoWallMusicLayout">
+							<param name="fallback_image" value="DefaultAddon.png" />
+						</include>
+						<control type="image">
+							<left>15</left>
+							<top>5</top>
+							<width>288</width>
+							<height>348</height>
+							<texture border="8" colordiffuse="button_focus">buttons/thumbnail_focused.png</texture>
+							<animation effect="fade" start="100" end="0" time="200">Unfocus</animation>
+						</control>
 					</control>
-				</control>
-			</focusedlayout>
-			<content sortby="lastused" sortorder="descending" target="$PARAM[container_target]">$PARAM[container_path]</content>
-		</control>
+				</focusedlayout>
+				<content sortby="lastused" sortorder="descending" target="$PARAM[container_target]">$PARAM[container_path]</content>
+			</control>
+		</definition>
 	</include>
 	<include name="LeftAlignedInfo">
 		<param name="id">33333</param>
@@ -714,35 +698,6 @@
 			</control>
 		</definition>
 	</include>
-	<include name="UpDownArrowsHome">
-		<control type="group">
-			<visible>Control.IsVisible($PARAM[container_id])</visible>
-			<animation effect="fade" start="0" end="100" delay="1000" time="200">Visible</animation>
-			<animation effect="fade" start="0" end="100" time="0">Hidden</animation>
-			<control type="image">
-				<left>1860</left>
-				<top>950</top>
-				<width>36</width>
-				<height>18</height>
-				<texture colordiffuse="button_focus">overlays/arrowdown.png</texture>
-				<animation effect="fade" time="200">VisibleChange</animation>
-				<animation effect="slide" start="150" end="0" delay="640" time="320" tween="cubic">WindowOpen</animation>
-				<animation effect="zoom" start="100,100" end="100,0" center="0,890" time="200">WindowClose</animation>
-				<visible>Container($PARAM[container_id]).HasNext</visible>
-			</control>
-			<control type="image">
-				<left>1860</left>
-				<top>94</top>
-				<width>36</width>
-				<height>18</height>
-				<texture colordiffuse="button_focus" flipy="true">overlays/arrowdown.png</texture>
-				<animation effect="fade" time="200">VisibleChange</animation>
-				<animation effect="slide" start="150" end="0" delay="640" time="320" tween="cubic">WindowOpen</animation>
-				<animation effect="zoom" start="100,100" end="100,0" center="0,180" time="200">WindowClose</animation>
-				<visible>Container($PARAM[container_id]).HasPrevious</visible>
-			</control>
-		</control>
-	</include>
 	<include name="LeftRightArrows">
 		<param name="left_posx">445</param>
 		<param name="right_posx">1843</param>
diff --git a/addons/skin.estuary/1080i/Includes_Buttons.xml b/addons/skin.estuary/1080i/Includes_Buttons.xml
index 3830398..93b4b78 100644
--- a/addons/skin.estuary/1080i/Includes_Buttons.xml
+++ b/addons/skin.estuary/1080i/Includes_Buttons.xml
@@ -76,16 +76,6 @@
 		<textcolor>button_focus</textcolor>
 		<shadowcolor>black</shadowcolor>
 	</include>
-	<include name="DefaultBorderedSettingButton">
-		<height>100</height>
-		<aligny>center</aligny>
-		<textcolor>white</textcolor>
-		<textoffsetx>40</textoffsetx>
-		<invalidcolor>invalid</invalidcolor>
-		<selectedcolor>selected</selectedcolor>
-		<texturenofocus border="40">buttons/dialogbutton-nofo.png</texturenofocus>
-		<texturefocus border="40" colordiffuse="button_focus">buttons/dialogbutton-fo.png</texturefocus>
-	</include>
 	<include name="DefaultDialogButton">
 		<param name="width">300</param>
 		<param name="height">90</param>
@@ -217,6 +207,31 @@
 			</control>
 		</definition>
 	</include>
+	<include name="BottomMainMenuToggleItem">
+		<param name="height">110</param>
+		<definition>
+			<control type="radiobutton" id="$PARAM[control_id]">
+				<width>118</width>
+				<height>$PARAM[height]</height>
+				<align>center</align>
+				<aligny>center</aligny>
+				<onclick>$PARAM[onclick]</onclick>
+				<font></font>
+				<label>$PARAM[label]</label>
+				<texturefocus border="40" colordiffuse="button_focus">buttons/button-fo.png</texturefocus>
+				<texturenofocus border="40">buttons/button-nofo.png</texturenofocus>
+				<radioposx>38</radioposx>
+				<radioposy>0</radioposy>
+				<radiowidth>40</radiowidth>
+				<radioheight>40</radioheight>
+				<textureradioonfocus>$PARAM[icon_on]</textureradioonfocus>
+				<textureradioonnofocus>$PARAM[icon_on]</textureradioonnofocus>
+				<textureradioofffocus>$PARAM[icon_off]</textureradioofffocus>
+				<textureradiooffnofocus>$PARAM[icon_off]</textureradiooffnofocus>
+				<selected>$PARAM[selected]</selected>
+			</control>
+		</definition>
+	</include>
 	<include name="VideoInfoButtonsCommon">
 		<param name="width">262</param>
 		<definition>
diff --git a/addons/skin.estuary/1080i/Includes_Home.xml b/addons/skin.estuary/1080i/Includes_Home.xml
index 238129e..8b9f828 100644
--- a/addons/skin.estuary/1080i/Includes_Home.xml
+++ b/addons/skin.estuary/1080i/Includes_Home.xml
@@ -197,6 +197,18 @@
 							<bordertexture border="20">overlays/shadow.png</bordertexture>
 							<bordersize>20</bordersize>
 						</control>
+						<control type="textbox">
+							<left>20</left>
+							<top>210</top>
+							<width>200</width>
+							<height>100</height>
+							<label>$INFO[ListItem.Label]</label>
+							<font>font12_title</font>
+							<shadowcolor>text_shadow</shadowcolor>
+							<align>center</align>
+							<aligny>center</aligny>
+							<visible>String.IsEmpty(ListItem.Art(poster))</visible>
+						</control>
 					</control>
 				</itemlayout>
 				<focusedlayout width="277" height="400">
@@ -217,6 +229,20 @@
 							<bordertexture border="20">overlays/shadow.png</bordertexture>
 							<bordersize>20</bordersize>
 						</control>
+						<control type="textbox">
+							<left>20</left>
+							<top>210</top>
+							<width>200</width>
+							<height>100</height>
+							<label>$INFO[ListItem.Label]</label>
+							<font>font12_title</font>
+							<shadowcolor>text_shadow</shadowcolor>
+							<align>center</align>
+							<aligny>center</aligny>
+							<visible>String.IsEmpty(ListItem.Art(poster))</visible>
+							<animation effect="fade" start="0" end="100" time="200" reversible="true">Unfocus</animation>
+							<animation effect="fade" start="100" end="0" time="0" reversible="true">Focus</animation>
+						</control>
 						<control type="group">
 							<left>20</left>
 							<top>20</top>
@@ -886,7 +912,7 @@
 							<left>42</left>
 							<width>260</width>
 							<height>200</height>
-							<texture fallback="DefaultTVShowsSquare.png">$PARAM[icon]</texture>
+							<texture fallback="DefaultTVShows.png">$PARAM[icon]</texture>
 							<aspectratio>keep</aspectratio>
 						</control>
 						<control type="textbox">
@@ -938,7 +964,7 @@
 								<left>42</left>
 								<width>260</width>
 								<height>200</height>
-								<texture fallback="DefaultTVShowsSquare.png">$PARAM[icon]</texture>
+								<texture fallback="DefaultTVShows.png">$PARAM[icon]</texture>
 								<aspectratio>keep</aspectratio>
 							</control>
 							<control type="textbox">
@@ -1021,7 +1047,7 @@
 							<left>42</left>
 							<width>260</width>
 							<height>200</height>
-							<texture fallback="DefaultTVShowsSquare.png">$PARAM[icon]</texture>
+							<texture fallback="DefaultTVShows.png">$PARAM[icon]</texture>
 							<aspectratio>keep</aspectratio>
 						</control>
 						<control type="textbox">
@@ -1073,7 +1099,7 @@
 								<left>42</left>
 								<width>260</width>
 								<height>200</height>
-								<texture fallback="DefaultTVShowsSquare.png">$PARAM[icon]</texture>
+								<texture fallback="DefaultTVShows.png">$PARAM[icon]</texture>
 								<aspectratio>keep</aspectratio>
 							</control>
 							<control type="textbox">
@@ -1348,31 +1374,10 @@
 			</include>
 		</content>
 	</include>
-	<!-- <include content="WeatherDailyItem">
-	     <item id="$PARAM[item_index]">
-	     <label>$INFO[Window(weather).Property(Daily.$PARAM[item_index].LongDay)]</label>
-	     <label2>$INFO[Window(weather).Property(Daily.$PARAM[item_index].LongDate)]</label2>
-	     <property name="Humidity">$INFO[Window(weather).Property(Daily.$PARAM[item_index].Humidity)]</property>
-	     <property name="Pressure">$INFO[Window(weather).Property(Daily.$PARAM[item_index].Pressure)]</property>
-	     <property name="DewPoint">$INFO[Window(weather).Property(Daily.$PARAM[item_index].DewPoint)]</property>
-	     <property name="FeelsLike">$INFO[Window(weather).Property(Daily.$PARAM[item_index].FeelsLike)]</property>
-	     <property name="Rain">$INFO[Window(weather).Property(Daily.$PARAM[item_index].Rain)]</property>
-	     <property name="Snow">$INFO[Window(weather).Property(Daily.$PARAM[item_index].Snow)]</property>
-	     <property name="TempMorn">$INFO[Window(weather).Property(Daily.$PARAM[item_index].TempMorn)]</property>
-	     <property name="TempEve">$INFO[Window(weather).Property(Daily.$PARAM[item_index].TempEve)]</property>
-	     <property name="TempNight">$INFO[Window(weather).Property(Daily.$PARAM[item_index].TempNight)]</property>
-	     <property name="WindSpeed">$INFO[Window(weather).Property(Daily.$PARAM[item_index].WindSpeed)]</property>
-	     <property name="WindGust">$INFO[Window(weather).Property(Daily.$PARAM[item_index].WindGust)]</property>
-	     <property name="WindDirection">$INFO[Window(weather).Property(Daily.$PARAM[item_index].WindDirection)]</property>
-	     <property name="Precipitation">$INFO[Window(weather).Property(Daily.$PARAM[item_index].Precipitation)]</property>
-	     <onclick>SetProperty(FocusedItem,$PARAM[item_index])</onclick>
-	     <icon>$INFO[Window(weather).Property(Daily.$PARAM[item_index].OutlookIcon)]</icon>
-	     </item>
-	     </include> -->
 	<include name="WeatherHourlyItem">
 		<item>
 			<label>$INFO[Window(weather).Property(Hourly.$PARAM[item_index].Time)]</label>
-			<label2>$INFO[Window(weather).Property(Hourly.$PARAM[item_index].Temperature)] - $INFO[Window(weather).Property(Hourly.$PARAM[item_index].Precipitation)]</label2>
+			<label2>$INFO[Window(weather).Property(Hourly.$PARAM[item_index].Temperature)] ∙ $INFO[Window(weather).Property(Hourly.$PARAM[item_index].Precipitation)]</label2>
 			<property name="Temperature">$INFO[Window(weather).Property(Hourly.$PARAM[item_index].Temperature)]</property>
 			<property name="Outlook">$INFO[Window(weather).Property(Hourly.$PARAM[item_id].Outlook)]</property>
 			<property name="Cloudiness">$INFO[Window(weather).Property(Hourly.$PARAM[item_index].Cloudiness)]</property>
@@ -1386,7 +1391,7 @@
 	<include name="WeatherDailyItem">
 		<item>
 			<label>$INFO[Window(weather).Property(Daily.$PARAM[item_index].ShortDay)]</label>
-			<label2>[COLOR blue]$INFO[Window(weather).Property(Daily.$PARAM[item_index].LowTemperature)][/COLOR] - [COLOR red]$INFO[Window(weather).Property(Daily.$PARAM[item_index].HighTemperature)][/COLOR]</label2>
+			<label2>[COLOR blue]$INFO[Window(weather).Property(Daily.$PARAM[item_index].LowTemperature)][/COLOR] ∙ [COLOR red]$INFO[Window(weather).Property(Daily.$PARAM[item_index].HighTemperature)][/COLOR]</label2>
 			<property name="LongDay">$INFO[Window(weather).Property(Daily.$PARAM[item_index].LongDay)]</property>
 			<property name="TempDay">$INFO[Window(weather).Property(Daily.$PARAM[item_index].TempDay)]</property>
 			<property name="Cloudiness">$INFO[Window(weather).Property(Daily.$PARAM[item_index].Cloudiness)]</property>
diff --git a/addons/skin.estuary/1080i/Includes_MediaMenu.xml b/addons/skin.estuary/1080i/Includes_MediaMenu.xml
index 802b47e..8b85fa9 100644
--- a/addons/skin.estuary/1080i/Includes_MediaMenu.xml
+++ b/addons/skin.estuary/1080i/Includes_MediaMenu.xml
@@ -162,13 +162,6 @@
 					<onclick>Container.SetSortDirection</onclick>
 					<visible>!Window.IsActive(MyPVRGuide.xml)</visible>
 				</control>
-				<control type="button" id="6051">
-					<include>MediaMenuItemsCommon</include>
-					<label>$LOCALIZE[456]</label>
-					<label2>[B]$INFO[Container.Viewmode][/B]</label2>
-					<onclick>Container.NextViewMode</onclick>
-					<visible>Window.IsActive(MyPVRGuide.xml)</visible>
-				</control>
 				<control type="label" id="300">
 					<label>$LOCALIZE[31021]</label>
 					<include>MediaMenuLabelCommon</include>
@@ -218,11 +211,13 @@
 						<ondown>6056</ondown>
 						<visible>Player.HasMedia + [$EXP[sidebar_focused]]</visible>
 						<visible>!System.HasModalDialog</visible>
-						<include content="BottomMainMenuItem">
+						<include content="BottomMainMenuToggleItem">
 							<param name="control_id" value="14101" />
 							<param name="height" value="95" />
-							<param name="onclick" value="Pause" />
-							<param name="icon" value="icons/now-playing/pause.png" />
+							<param name="onclick" value="PlayerControl(Play)" />
+							<param name="icon_on" value="icons/now-playing/play.png" />
+							<param name="icon_off" value="icons/now-playing/pause.png" />
+							<param name="selected" value="Player.Paused" />
 						</include>
 						<include content="BottomMainMenuItem">
 							<param name="control_id" value="14102" />
@@ -293,11 +288,13 @@
 			<onleft>14100</onleft>
 			<visible>Player.HasMedia + [$EXP[sidebar_focused]]</visible>
 			<visible>!System.HasModalDialog</visible>
-			<include content="BottomMainMenuItem">
+			<include content="BottomMainMenuToggleItem">
 				<param name="control_id" value="14101" />
 				<param name="height" value="95" />
-				<param name="onclick" value="Pause" />
-				<param name="icon" value="icons/now-playing/pause.png" />
+				<param name="onclick" value="PlayerControl(Play)" />
+				<param name="icon_on" value="icons/now-playing/play.png" />
+				<param name="icon_off" value="icons/now-playing/pause.png" />
+				<param name="selected" value="Player.Paused" />
 			</include>
 			<include content="BottomMainMenuItem">
 				<param name="control_id" value="14102" />
diff --git a/addons/skin.estuary/1080i/Includes_PVR.xml b/addons/skin.estuary/1080i/Includes_PVR.xml
index af88b09..7812686 100644
--- a/addons/skin.estuary/1080i/Includes_PVR.xml
+++ b/addons/skin.estuary/1080i/Includes_PVR.xml
@@ -122,185 +122,6 @@
 			<orientation>vertical</orientation>
 		</control>
 	</include>
-	<include name="PVRGuideListViewtype">
-		<control type="group">
-			<visible>Control.IsVisible($PARAM[container_id])</visible>
-			<top>180</top>
-			<left>110</left>
-			<include>OpenClose_Left</include>
-			<include>Visible_Left</include>
-			<control type="image">
-				<left>-20</left>
-				<top>-20</top>
-				<width>1090</width>
-				<height>746</height>
-				<texture border="22">dialogs/dialog-bg.png</texture>
-			</control>
-			<control type="group">
-				<left>0</left>
-				<top>0</top>
-				<width>1740</width>
-				<height>600</height>
-				<visible>Control.IsVisible($PARAM[container_id])</visible>
-				<control type="list" id="$PARAM[container_id]">
-					<top>0</top>
-					<width>1740</width>
-					<height>700</height>
-					<onup>$PARAM[container_id]</onup>
-					<ondown>$PARAM[container_id]</ondown>
-					<onleft>9000</onleft>
-					<onright>76</onright>
-					<viewtype label="$PARAM[container_name]">list</viewtype>
-					<pagecontrol>76</pagecontrol>
-					<scrolltime>200</scrolltime>
-					<itemlayout height="58">
-						<control type="image">
-							<left>0</left>
-							<top>0</top>
-							<width>1050</width>
-							<height>58</height>
-							<texture border="90,3,90,3">lists/separator.png</texture>
-						</control>
-						<control type="image">
-							<left>5</left>
-							<top>5</top>
-							<width>48</width>
-							<height>48</height>
-							<texture fallback="DefaultTVShowsSquare.png">$INFO[Listitem.Icon]</texture>
-							<fadetime>200</fadetime>
-							<aspectratio>keep</aspectratio>
-						</control>
-						<control type="label">
-							<left>65</left>
-							<width>285</width>
-							<height>58</height>
-							<aligny>center</aligny>
-							<label>$INFO[ListItem.ChannelName]</label>
-						</control>
-						<control type="label">
-							<left>378</left>
-							<top>2</top>
-							<width>300</width>
-							<height>58</height>
-							<aligny>top</aligny>
-							<font>font12</font>
-							<label>$INFO[ListItem.StartTime,, - ]$INFO[ListItem.EndTime]</label>
-						</control>
-						<control type="progress">
-							<left>380</left>
-							<top>35</top>
-							<width>220</width>
-							<height>12</height>
-							<info>ListItem.Progress</info>
-						</control>
-						<control type="label">
-							<left>620</left>
-							<width>430</width>
-							<height>58</height>
-							<textcolor>button_focus</textcolor>
-							<aligny>center</aligny>
-							<label>$INFO[ListItem.Label]</label>
-						</control>
-						<control type="image">
-							<left>1000</left>
-							<top>15</top>
-							<width>35</width>
-							<height>35</height>
-							<texture>$VAR[PVRStatusImageVar]</texture>
-						</control>
-					</itemlayout>
-					<focusedlayout height="58">
-						<control type="image">
-							<left>0</left>
-							<top>0</top>
-							<width>1050</width>
-							<height>58</height>
-							<texture border="90,3,90,3">lists/separator.png</texture>
-							<visible>!Control.HasFocus($PARAM[container_id])</visible>
-						</control>
-						<control type="image">
-							<left>0</left>
-							<top>0</top>
-							<width>1050</width>
-							<height>58</height>
-							<texture colordiffuse="button_focus">lists/focus.png</texture>
-							<visible>Control.HasFocus($PARAM[container_id])</visible>
-						</control>
-						<control type="image">
-							<left>5</left>
-							<top>5</top>
-							<width>48</width>
-							<height>48</height>
-							<texture fallback="DefaultTVShowsSquare.png">$INFO[Listitem.Icon]</texture>
-							<aspectratio>keep</aspectratio>
-						</control>
-						<control type="label">
-							<left>65</left>
-							<width>285</width>
-							<height>58</height>
-							<aligny>center</aligny>
-							<label>$INFO[ListItem.ChannelName]</label>
-						</control>
-						<control type="label">
-							<left>378</left>
-							<top>2</top>
-							<width>300</width>
-							<height>58</height>
-							<aligny>top</aligny>
-							<font>font12</font>
-							<label>$INFO[ListItem.StartTime,, - ]$INFO[ListItem.EndTime]</label>
-						</control>
-						<control type="progress">
-							<left>380</left>
-							<top>35</top>
-							<width>220</width>
-							<height>12</height>
-							<info>ListItem.Progress</info>
-							<midtexture border="3">progress/texturebg_white.png</midtexture>
-						</control>
-						<control type="label">
-							<left>620</left>
-							<width>430</width>
-							<height>58</height>
-							<textcolor>white</textcolor>
-							<aligny>center</aligny>
-							<label>$INFO[ListItem.Label]</label>
-						</control>
-						<control type="image">
-							<left>1000</left>
-							<top>15</top>
-							<width>35</width>
-							<height>35</height>
-							<texture>$VAR[PVRStatusImageVar]</texture>
-						</control>
-					</focusedlayout>
-				</control>
-			</control>
-			<include content="UpDownArrows">
-				<param name="container_id" value="$PARAM[container_id]" />
-				<param name="posx" value="830" />
-				<param name="up_posy" value="-50" />
-				<param name="down_posy" value="730" />
-			</include>
-			<control type="scrollbar" id="76">
-				<left>1055</left>
-				<top>2</top>
-				<width>12</width>
-				<height>703</height>
-				<onleft>$PARAM[container_id]</onleft>
-				<onright>$PARAM[container_id]</onright>
-			</control>
-		</control>
-		<control type="group">
-			<left>1220</left>
-			<top>180</top>
-			<visible>!String.IsEmpty(ListItem.Date)</visible>
-			<visible>Control.IsVisible($PARAM[container_id])</visible>
-			<include>Visible_Right</include>
-			<include>OpenClose_Right</include>
-			<include>PVRInfoPanel</include>
-		</control>
-	</include>
 	<include name="PVRInfoPanel">
 		<control type="image">
 			<left>-40</left>
diff --git a/addons/skin.estuary/1080i/MyMusicNav.xml b/addons/skin.estuary/1080i/MyMusicNav.xml
index a7a139f..53a5e4e 100644
--- a/addons/skin.estuary/1080i/MyMusicNav.xml
+++ b/addons/skin.estuary/1080i/MyMusicNav.xml
@@ -79,7 +79,7 @@
 						<include>MediaMenuItemsCommon</include>
 						<label>$LOCALIZE[653]</label>
 						<onclick>UpdateLibrary(music)</onclick>
-						<visible>!Container.Content(addons)</visible>
+						<visible>!Container.Content(addons)+ String.IsEmpty(Container.PluginName)</visible>
 						<altlabel>$LOCALIZE[13353]</altlabel>
 						<usealttexture>library.isscanningmusic</usealttexture>
 					</control>
@@ -110,7 +110,7 @@
 						<label>$LOCALIZE[31117]</label>
 						<onclick condition="System.HasAddon(plugin.library.node.editor)">ActivateWindow(programs,plugin://plugin.library.node.editor/?ltype=music,return)</onclick>
 						<onclick condition="!System.HasAddon(plugin.library.node.editor)">InstallAddon(plugin.library.node.editor)</onclick>
-						<visible>IsEmpty(Container.FolderPath) + String.IsEmpty(Container.PluginName)</visible>
+						<visible>String.IsEmpty(Container.FolderPath) + String.IsEmpty(Container.PluginName)</visible>
 					</control>
 					<include>MediaMenuNowPlaying</include>
 				</control>
diff --git a/addons/skin.estuary/1080i/MyPVRChannels.xml b/addons/skin.estuary/1080i/MyPVRChannels.xml
index 39403f2..b2d88d3 100644
--- a/addons/skin.estuary/1080i/MyPVRChannels.xml
+++ b/addons/skin.estuary/1080i/MyPVRChannels.xml
@@ -337,7 +337,9 @@
 				<param name="breadcrumbs_label" value="$VAR[BreadcrumbsPVRChannelsVar]" />
 				<param name="breadcrumbs_icon" value="icons/settings/tvremote.png" />
 			</include>
-			<include>BottomBar</include>
+			<include content="BottomBar">
+				<param name="info_visible" value="true" />
+			</include>
 		</control>
 		<control type="label" id="29">
 			<font></font>
diff --git a/addons/skin.estuary/1080i/MyPVRGuide.xml b/addons/skin.estuary/1080i/MyPVRGuide.xml
index 6a1cd6a..037a281 100644
--- a/addons/skin.estuary/1080i/MyPVRGuide.xml
+++ b/addons/skin.estuary/1080i/MyPVRGuide.xml
@@ -2,7 +2,7 @@
 <window>
 	<defaultcontrol always="true">10</defaultcontrol>
 	<backgroundcolor>background</backgroundcolor>
-	<views>10,11,12,13</views>
+	<views>10</views>
 	<menucontrol>9000</menucontrol>
 	<controls>
 		<include>DefaultBackground</include>
@@ -39,7 +39,7 @@
 					<progresstexture border="0,60,18,14" colordiffuse="button_focus">windows/pvr/epg_progress.png</progresstexture>
 					<rulerlayout height="45" width="1400">
 						<control type="label">
-							<width>500</width>
+							<width>365</width>
 							<height>45</height>
 							<font>font12</font>
 							<label>$INFO[ListItem.Label]</label>
@@ -47,7 +47,7 @@
 							<textcolor>button_focus</textcolor>
 						</control>
 					</rulerlayout>
-					<channellayout height="58" width="330">
+					<channellayout height="58" width="350">
 						<control type="label">
 							<left>2</left>
 							<top>-2</top>
@@ -69,7 +69,7 @@
 							<textoffsetx>10</textoffsetx>
 						</control>
 					</channellayout>
-					<focusedchannellayout height="58" width="330">
+					<focusedchannellayout height="58" width="350">
 						<control type="label">
 							<left>2</left>
 							<top>-2</top>
@@ -164,6 +164,7 @@
 					<onright>10</onright>
 					<orientation>vertical</orientation>
 					<texturesliderbackground colordiffuse="22FFFFFF">colors/white.png</texturesliderbackground>
+					<animation effect="fade" start="100" end="40" time="0" condition="!system.getbool(input.enablemouse)">Conditional</animation>
 				</control>
 				<control type="group">
 					<top>540</top>
@@ -213,133 +214,6 @@
 					</control>
 				</control>
 			</control>
-			<include content="PVRGuideListViewtype">
-				<param name="container_id" value="11" />
-				<param name="container_name" value="19030" />
-			</include>
-			<include content="PVRGuideListViewtype">
-				<param name="container_id" value="12" />
-				<param name="container_name" value="19031" />
-			</include>
-			<control type="group">
-				<description>TV Guide Channel</description>
-				<visible>Control.IsVisible(13)</visible>
-				<include>Visible_Left</include>
-				<include>OpenClose_Left</include>
-				<top>30</top>
-				<control type="group">
-					<left>80</left>
-					<top>150</top>
-					<control type="image">
-						<left>-20</left>
-						<top>-20</top>
-						<width>1130</width>
-						<height>746</height>
-						<texture border="22">dialogs/dialog-bg.png</texture>
-					</control>
-					<control type="list" id="13">
-						<top>0</top>
-						<width>1740</width>
-						<height>700</height>
-						<onup>13</onup>
-						<ondown>13</ondown>
-						<onleft>9000</onleft>
-						<onright>75</onright>
-						<viewtype label="19029">list</viewtype>
-						<pagecontrol>75</pagecontrol>
-						<scrolltime>200</scrolltime>
-						<itemlayout height="58">
-							<control type="image">
-								<left>0</left>
-								<width>1090</width>
-								<height>58</height>
-								<texture border="10">lists/separator.png</texture>
-							</control>
-							<control type="label">
-								<left>20</left>
-								<width>350</width>
-								<height>58</height>
-								<label>$INFO[ListItem.StartTime,, - ]$INFO[ListItem.EndTime]</label>
-								<font>font12</font>
-								<aligny>center</aligny>
-							</control>
-							<control type="label">
-								<left>378</left>
-								<width>825</width>
-								<height>58</height>
-								<textcolor>button_focus</textcolor>
-								<aligny>center</aligny>
-								<label>$INFO[ListItem.Label]</label>
-							</control>
-							<control type="image">
-								<left>1000</left>
-								<top>15</top>
-								<width>35</width>
-								<height>35</height>
-								<texture>$VAR[PVRStatusImageVar]</texture>
-							</control>
-						</itemlayout>
-						<focusedlayout height="58">
-							<control type="image">
-								<left>0</left>
-								<width>1090</width>
-								<height>58</height>
-								<texture border="10">lists/separator.png</texture>
-								<visible>!Control.HasFocus(13)</visible>
-							</control>
-							<control type="image">
-								<left>0</left>
-								<width>1090</width>
-								<height>58</height>
-								<texture colordiffuse="button_focus">lists/focus.png</texture>
-								<visible>Control.HasFocus(13)</visible>
-							</control>
-							<control type="label">
-								<left>20</left>
-								<width>350</width>
-								<height>58</height>
-								<label>$INFO[ListItem.StartTime,, - ]$INFO[ListItem.EndTime]</label>
-								<aligny>center</aligny>
-								<font>font12</font>
-							</control>
-							<control type="label">
-								<left>378</left>
-								<width>825</width>
-								<height>58</height>
-								<aligny>center</aligny>
-								<label>$INFO[ListItem.Label]</label>
-							</control>
-							<control type="image">
-								<left>1000</left>
-								<top>15</top>
-								<width>35</width>
-								<height>35</height>
-								<texture>$VAR[PVRStatusImageVar]</texture>
-							</control>
-						</focusedlayout>
-					</control>
-					<control type="scrollbar" id="75">
-						<left>1095</left>
-						<top>5</top>
-						<width>12</width>
-						<height>700</height>
-						<onleft>13</onleft>
-						<onright>13</onright>
-					</control>
-				</control>
-			</control>
-			<control type="group">
-				<left>1220</left>
-				<top>150</top>
-				<visible>!String.IsEmpty(ListItem.ChannelName)</visible>
-				<visible>Control.IsVisible(13)</visible>
-				<include>Visible_Right</include>
-				<include>OpenClose_Right</include>
-				<include content="PVRInfoPanel">
-					<param name="bottom_label1" value="$INFO[ListItem.NextTitle,[COLOR button_focus]$LOCALIZE[19031]:[/COLOR] ]" />
-					<param name="bottom_label2" value="$INFO[ListItem.NextStartTime]" />
-				</include>
-			</control>
 			<control type="group">
 				<include>MediaMenuCommon</include>
 				<include content="PVRSideBar">
@@ -352,6 +226,7 @@
 			</include>
 			<include content="BottomBar">
 				<param name="PageLabel" value="$INFO[Container.NumItems,$LOCALIZE[19019]: ]" />
+				<param name="info_visible" value="true" />
 			</include>
 		</control>
 		<control type="label" id="29">
diff --git a/addons/skin.estuary/1080i/MyPVRRecordings.xml b/addons/skin.estuary/1080i/MyPVRRecordings.xml
index 06d90d0..61cbac0 100644
--- a/addons/skin.estuary/1080i/MyPVRRecordings.xml
+++ b/addons/skin.estuary/1080i/MyPVRRecordings.xml
@@ -276,7 +276,9 @@
 				<font></font>
 				<include>HiddenObject</include>
 			</control>
-			<include>BottomBar</include>
+			<include content="BottomBar">
+				<param name="info_visible" value="true" />
+			</include>
 		</control>
 	</controls>
 </window>
diff --git a/addons/skin.estuary/1080i/MyPVRSearch.xml b/addons/skin.estuary/1080i/MyPVRSearch.xml
index f3339b8..f8fde2d 100644
--- a/addons/skin.estuary/1080i/MyPVRSearch.xml
+++ b/addons/skin.estuary/1080i/MyPVRSearch.xml
@@ -184,7 +184,9 @@
 				<param name="breadcrumbs_label" value="$VAR[BreadcrumbsPVRSearchVar]" />
 				<param name="breadcrumbs_icon" value="icons/settings/tvguide.png" />
 			</include>
-			<include>BottomBar</include>
+			<include content="BottomBar">
+				<param name="info_visible" value="true" />
+			</include>
 		</control>
 	</controls>
 </window>
diff --git a/addons/skin.estuary/1080i/MyPVRTimers.xml b/addons/skin.estuary/1080i/MyPVRTimers.xml
index 4400ecc..4aa49ae 100644
--- a/addons/skin.estuary/1080i/MyPVRTimers.xml
+++ b/addons/skin.estuary/1080i/MyPVRTimers.xml
@@ -53,7 +53,7 @@
 							<control type="label">
 								<left>30</left>
 								<top>10</top>
-								<width>680</width>
+								<width>630</width>
 								<height>100</height>
 								<aligny>top</aligny>
 								<label>$INFO[ListItem.ChannelName][COLOR button_focus]$INFO[ListItem.Label, - ][/COLOR]</label>
@@ -72,7 +72,7 @@
 								<top>13</top>
 								<width>260</width>
 								<height>70</height>
-								<font>font12</font>
+								<font>font10</font>
 								<align>center</align>
 								<aligny>center</aligny>
 								<label>$INFO[ListItem.Timertype]</label>
@@ -82,7 +82,7 @@
 								<top>13</top>
 								<width>120</width>
 								<height>75</height>
-								<font>font12</font>
+								<font>font10</font>
 								<align>center</align>
 								<aligny>center</aligny>
 								<label>$INFO[ListItem.Comment]</label>
@@ -121,7 +121,7 @@
 							<control type="label">
 								<left>30</left>
 								<top>10</top>
-								<width>680</width>
+								<width>630</width>
 								<height>100</height>
 								<aligny>top</aligny>
 								<label>$INFO[ListItem.ChannelName]$INFO[ListItem.Label, - ]</label>
@@ -140,7 +140,7 @@
 								<top>13</top>
 								<width>260</width>
 								<height>70</height>
-								<font>font12</font>
+								<font>font10</font>
 								<align>center</align>
 								<aligny>center</aligny>
 								<label>$INFO[ListItem.Timertype]</label>
@@ -150,7 +150,7 @@
 								<top>13</top>
 								<width>120</width>
 								<height>75</height>
-								<font>font12</font>
+								<font>font10</font>
 								<align>center</align>
 								<aligny>center</aligny>
 								<label>$INFO[ListItem.Comment]</label>
@@ -188,7 +188,9 @@
 			<param name="breadcrumbs_label" value="$VAR[BreadcrumbsPVRTimersVar]" />
 			<param name="breadcrumbs_icon" value="icons/settings/tvguide.png" />
 		</include>
-		<include>BottomBar</include>
+		<include content="BottomBar">
+			<param name="info_visible" value="true" />
+		</include>
 		<control type="label" id="29">
 			<font>-</font>
 			<include>HiddenObject</include>
diff --git a/addons/skin.estuary/1080i/MyVideoNav.xml b/addons/skin.estuary/1080i/MyVideoNav.xml
index 5960eb3..d632a53 100644
--- a/addons/skin.estuary/1080i/MyVideoNav.xml
+++ b/addons/skin.estuary/1080i/MyVideoNav.xml
@@ -213,7 +213,7 @@
 						<description>Unlock Shares</description>
 						<include>MediaMenuItemsCommon</include>
 						<label>$LOCALIZE[20336]</label>
-						<onclick>xbmc.mastermode</onclick>
+						<onclick>mastermode</onclick>
 						<selected>system.ismaster</selected>
 						<visible>system.haslocks</visible>
 					</control>
@@ -222,7 +222,7 @@
 						<include>MediaMenuItemsCommon</include>
 						<label>$LOCALIZE[653]</label>
 						<onclick>UpdateLibrary(video)</onclick>
-						<visible>!Container.Content(addons)</visible>
+						<visible>!Container.Content(addons)+ String.IsEmpty(Container.PluginName)</visible>
 						<altlabel>$LOCALIZE[13353]</altlabel>
 						<usealttexture>library.isscanningvideo</usealttexture>
 					</control>
diff --git a/addons/skin.estuary/1080i/Settings.xml b/addons/skin.estuary/1080i/Settings.xml
index 3cf35b3..7a04be0 100644
--- a/addons/skin.estuary/1080i/Settings.xml
+++ b/addons/skin.estuary/1080i/Settings.xml
@@ -3,6 +3,18 @@
 	<defaultcontrol always="true">9000</defaultcontrol>
 	<controls>
 		<include>DefaultBackground</include>
+		<control type="multiimage">
+			<depth>DepthBackground</depth>
+			<include>FullScreenDimensions</include>
+			<aspectratio>scale</aspectratio>
+			<fadetime>600</fadetime>
+			<animation effect="zoom" center="auto" end="102,102" time="0" condition="Integer.IsGreater(System.StereoscopicMode,0)">conditional</animation>
+			<animation effect="fade" start="0" end="100" time="400">WindowOpen</animation>
+			<animation effect="fade" start="100" end="0" time="300">WindowClose</animation>
+			<animation effect="fade" time="400">VisibleChange</animation>
+			<imagepath background="true" colordiffuse="35FFFFFF">$INFO[Skin.String(HomeFanart.path)]settings$INFO[Skin.String(HomeFanart.ext)]</imagepath>
+			<visible>!Player.HasMedia + !String.IsEmpty(Skin.String(HomeFanart.path))</visible>
+		</control>
 		<control type="panel" id="9000">
 			<left>92</left>
 			<top>140</top>
@@ -138,6 +150,21 @@
 					<onclick>ActivateWindow(systeminfo)</onclick>
 					<icon>icons/settings/sysinfo.png</icon>
 				</item>
+				<item>
+					<label>$LOCALIZE[31067]</label>
+					<onclick>ActivateWindow(eventlog)</onclick>
+					<icon>icons/settings/eventlog.png</icon>
+				</item>
+				<item>
+					<label>$LOCALIZE[10003]</label>
+					<onclick>ActivateWindow(filemanager)</onclick>
+					<icon>icons/settings/filemanager.png</icon>
+				</item>
+<!-- 				<item>
+					<label>$LOCALIZE[24001]</label>
+					<onclick>ActivateWindow(addonbrowser)</onclick>
+					<icon>icons/settings/addons.png</icon>
+				</item> -->
 			</content>
 		</control>
 		<include content="TopBar">
diff --git a/addons/skin.estuary/1080i/SettingsCategory.xml b/addons/skin.estuary/1080i/SettingsCategory.xml
index 573331c..5926302 100644
--- a/addons/skin.estuary/1080i/SettingsCategory.xml
+++ b/addons/skin.estuary/1080i/SettingsCategory.xml
@@ -3,6 +3,18 @@
 	<defaultcontrol>3</defaultcontrol>
 	<controls>
 		<include>DefaultBackground</include>
+		<control type="multiimage">
+			<depth>DepthBackground</depth>
+			<include>FullScreenDimensions</include>
+			<aspectratio>scale</aspectratio>
+			<fadetime>600</fadetime>
+			<animation effect="zoom" center="auto" end="102,102" time="0" condition="Integer.IsGreater(System.StereoscopicMode,0)">conditional</animation>
+			<animation effect="fade" start="0" end="100" time="400">WindowOpen</animation>
+			<animation effect="fade" start="100" end="0" time="300">WindowClose</animation>
+			<animation effect="fade" time="400">VisibleChange</animation>
+			<imagepath background="true" colordiffuse="35FFFFFF">$INFO[Skin.String(HomeFanart.path)]settings$INFO[Skin.String(HomeFanart.ext)]</imagepath>
+			<visible>!Player.HasMedia + !String.IsEmpty(Skin.String(HomeFanart.path))</visible>
+		</control>
 		<control type="group">
 			<left>110</left>
 			<include>OpenClose_Left</include>
diff --git a/addons/skin.estuary/1080i/SettingsProfile.xml b/addons/skin.estuary/1080i/SettingsProfile.xml
index 16e825b..b5adf22 100644
--- a/addons/skin.estuary/1080i/SettingsProfile.xml
+++ b/addons/skin.estuary/1080i/SettingsProfile.xml
@@ -4,6 +4,18 @@
 	<backgroundcolor>background</backgroundcolor>
 	<controls>
 		<include>DefaultBackground</include>
+		<control type="multiimage">
+			<depth>DepthBackground</depth>
+			<include>FullScreenDimensions</include>
+			<aspectratio>scale</aspectratio>
+			<fadetime>600</fadetime>
+			<animation effect="zoom" center="auto" end="102,102" time="0" condition="Integer.IsGreater(System.StereoscopicMode,0)">conditional</animation>
+			<animation effect="fade" start="0" end="100" time="400">WindowOpen</animation>
+			<animation effect="fade" start="100" end="0" time="300">WindowClose</animation>
+			<animation effect="fade" time="400">VisibleChange</animation>
+			<imagepath background="true" colordiffuse="35FFFFFF">$INFO[Skin.String(HomeFanart.path)]settings$INFO[Skin.String(HomeFanart.ext)]</imagepath>
+			<visible>!Player.HasMedia + !String.IsEmpty(Skin.String(HomeFanart.path))</visible>
+		</control>
 		<control type="group">
 			<include>OpenClose_Left</include>
 			<control type="image">
diff --git a/addons/skin.estuary/1080i/SettingsSystemInfo.xml b/addons/skin.estuary/1080i/SettingsSystemInfo.xml
index 27bc021..453055f 100644
--- a/addons/skin.estuary/1080i/SettingsSystemInfo.xml
+++ b/addons/skin.estuary/1080i/SettingsSystemInfo.xml
@@ -92,56 +92,62 @@
 			<control type="grouplist">
 				<left>480</left>
 				<top>105</top>
+				<height>500</height>
 				<orientation>vertical</orientation>
 				<control type="label" id="2">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="3">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="4">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="5">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="6">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="7">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="8">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="9">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="10">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
 				</control>
 				<control type="label" id="11">
-					<height>45</height>
+					<height>41</height>
 					<width>1220</width>
-					<font>Mono30</font>
+					<font>Mono28</font>
+				</control>
+				<control type="label" id="12">
+					<height>41</height>
+					<width>1220</width>
+					<font>Mono28</font>
 				</control>
 			</control>
 			<control type="grouplist">
diff --git a/addons/skin.estuary/1080i/SkinSettings.xml b/addons/skin.estuary/1080i/SkinSettings.xml
index 0d6906b..b1604a8 100644
--- a/addons/skin.estuary/1080i/SkinSettings.xml
+++ b/addons/skin.estuary/1080i/SkinSettings.xml
@@ -4,6 +4,18 @@
 	<backgroundcolor>background</backgroundcolor>
 	<controls>
 		<include>DefaultBackground</include>
+		<control type="multiimage">
+			<depth>DepthBackground</depth>
+			<include>FullScreenDimensions</include>
+			<aspectratio>scale</aspectratio>
+			<fadetime>600</fadetime>
+			<animation effect="zoom" center="auto" end="102,102" time="0" condition="Integer.IsGreater(System.StereoscopicMode,0)">conditional</animation>
+			<animation effect="fade" start="0" end="100" time="400">WindowOpen</animation>
+			<animation effect="fade" start="100" end="0" time="300">WindowClose</animation>
+			<animation effect="fade" time="400">VisibleChange</animation>
+			<imagepath background="true" colordiffuse="35FFFFFF">$INFO[Skin.String(HomeFanart.path)]settings$INFO[Skin.String(HomeFanart.ext)]</imagepath>
+			<visible>!Player.HasMedia + !String.IsEmpty(Skin.String(HomeFanart.path))</visible>
+		</control>
 		<control type="group">
 			<left>110</left>
 			<include>OpenClose_Left</include>
@@ -121,6 +133,15 @@
 					<onclick condition="!System.HasAddon(script.image.resource.select)">InstallAddon(script.image.resource.select)</onclick>
 					<enable>!Skin.HasSetting(no_fanart)</enable>
 				</control>
+				<control type="button" id="609">
+					<label>$LOCALIZE[31062]</label>
+					<label2>$INFO[Skin.String(WeatherFanart.name)]</label2>
+					<width>1256</width>
+					<include>DefaultSettingButton</include>
+					<onclick condition="System.HasAddon(script.image.resource.select)">RunScript(script.image.resource.select,property=WeatherFanart&type=resource.images.weatherfanart)</onclick>
+					<onclick condition="!System.HasAddon(script.image.resource.select)">InstallAddon(script.image.resource.select)</onclick>
+					<enable>!Skin.HasSetting(no_fanart)</enable>
+				</control>
 				<control type="radiobutton" id="606">
 					<label>$LOCALIZE[31108]</label>
 					<width>1256</width>
diff --git a/addons/skin.estuary/1080i/Variables.xml b/addons/skin.estuary/1080i/Variables.xml
index 27b134e..3d8a5b2 100644
--- a/addons/skin.estuary/1080i/Variables.xml
+++ b/addons/skin.estuary/1080i/Variables.xml
@@ -1,9 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <includes>
-	<variable name="TVTimerRadioButtonTexture">
-		<value condition="!String.IsEqual(ListItem.Comment,$LOCALIZE[305])">buttons/radio-button-on.png</value>
-		<value>buttons/radio-button-off.png</value>
-	</variable>
 	<variable name="PVRStatusImageVar">
 		<value condition="ListItem.IsRecording">windows/pvr/record.png</value>
 		<value condition="ListItem.HasTimer + !ListItem.IsRecording + !ListItem.HasTimerSchedule">windows/pvr/timer.png</value>
@@ -118,7 +114,7 @@
 		<value>$INFO[ListItem.Art(fanart)]</value>
 	</variable>
 	<variable name="ListBoxInfoVar">
-		<value condition="Stringcompare(Container.FolderPath,addons://outdated/) + !IsEmpty(ListItem.Addonnews)">$INFO[ListItem.Addonnews]</value>
+		<value condition="String.IsEqual(Container.FolderPath,addons://outdated/) + !String.IsEmpty(ListItem.Addonnews)">$INFO[ListItem.Addonnews]</value>
 		<value condition="Container.Content(addons)">$INFO[ListItem.AddonDescription]</value>
 		<value condition="Container.Content(albums)">$INFO[ListItem.Property(album_description)]</value>
 		<value condition="Container.Content(mixed) | Container.Content(videos)">$INFO[ListItem.Genre,[COLOR button_focus]$LOCALIZE[515]: [/COLOR],[CR]]$INFO[ListItem.Plot]</value>
@@ -249,8 +245,8 @@
 		<value>$INFO[ListItem.Label]$INFO[ListItem.Year, ([COLOR grey],[/COLOR])]</value>
 	</variable>
 	<variable name="VideoInfoSubLabelVar">
-		<value condition="Stringcompare(ListItem.DBType,episode)">$INFO[ListItem.Season]$INFO[ListItem.Episode,[COLOR grey]x[/COLOR],: ]$INFO[ListItem.TVShowTitle]</value>
-		<value condition="Stringcompare(ListItem.DBType,movie)">$INFO[ListItem.Tagline]</value>
+		<value condition="String.IsEqual(ListItem.DBType,episode)">$INFO[ListItem.Season]$INFO[ListItem.Episode,[COLOR grey]x[/COLOR],: ]$INFO[ListItem.TVShowTitle]</value>
+		<value condition="String.IsEqual(ListItem.DBType,movie)">$INFO[ListItem.Tagline]</value>
 		<value>$INFO[ListItem.Genre]</value>
 	</variable>
 	<variable name="OSDSubLabelVar">
@@ -291,6 +287,11 @@
 		<value condition="!String.IsEmpty(Container(8500).ListItem.Art(fanart)) + Control.HasFocus(8500)">$INFO[Container(8500).ListItem.Art(fanart)]</value>
 		<value condition="!String.IsEmpty(Container(15100).ListItem.Property(FanartCode)) + Control.HasFocus(15100)">$INFO[Skin.String(WeatherFanart.path)]$INFO[Container(15100).ListItem.Property(FanartCode)]</value>
 		<value condition="!String.IsEmpty(Container(15200).ListItem.Property(FanartCode)) + Control.HasFocus(15200)">$INFO[Skin.String(WeatherFanart.path)]$INFO[Container(15200).ListItem.Property(FanartCode)]</value>
+		<value condition="!String.IsEmpty(Skin.String(HomeFanart.path)) + Control.HasFocus(804)">$INFO[Skin.String(HomeFanart.path)]power$INFO[Skin.String(HomeFanart.ext)]</value>
+		<value condition="!String.IsEmpty(Skin.String(HomeFanart.path)) + Control.HasFocus(802)">$INFO[Skin.String(HomeFanart.path)]settings$INFO[Skin.String(HomeFanart.ext)]</value>
+		<value condition="!String.IsEmpty(Skin.String(HomeFanart.path)) + Control.HasFocus(803)">$INFO[Skin.String(HomeFanart.path)]favorites$INFO[Skin.String(HomeFanart.ext)]</value>
+		<value condition="!String.IsEmpty(Skin.String(HomeFanart.path)) + Control.HasFocus(801)">$INFO[Skin.String(HomeFanart.path)]filemanager$INFO[Skin.String(HomeFanart.ext)]</value>
+		<value condition="!String.IsEmpty(Skin.String(HomeFanart.path)) + Control.HasFocus(900)">$INFO[Skin.String(HomeFanart.path)]search$INFO[Skin.String(HomeFanart.ext)]</value>
 		<value condition="!String.IsEmpty(Skin.String(HomeFanart.path))">$INFO[Skin.String(HomeFanart.path)]$INFO[Container(9000).ListItem.Property(id)]$INFO[Skin.String(HomeFanart.ext)]</value>
 	</variable>
 	<variable name="MediaFanartVar">
@@ -299,12 +300,12 @@
 		<value condition="Window.IsActive(pictures) + String.IsEmpty(ListItem.Art(fanart))">$INFO[ListItem.FolderPath]</value>
 		<value condition="!String.IsEmpty(Container.Art(tvshow.fanart))">$INFO[Container.Art(tvshow.fanart)]</value>
 		<value condition="!String.IsEmpty(Container.Art(artist.fanart))">$INFO[Container.Art(artist.fanart)]</value>
-		<value condition="!String.IsEmpty(Container.Art(fanart))">$INFO[Container.Art(fanart)]</value>
-		<value>$INFO[ListItem.Art(fanart)]</value>
+		<value condition="!String.IsEmpty(ListItem.Art(fanart))">$INFO[ListItem.Art(fanart)]</value>
+		<value>$INFO[Container.Art(fanart)]</value>
 	</variable>
 	<variable name="WeatherFanartVar">
-		<value condition="!String.IsEmpty(Window(weather).Property(current.fanartcode)) + Skin.HasSetting(WeatherFanart.multi)">$INFO[Skin.String(WeatherFanart.path)]$INFO[Window(weather).Property(current.fanartcode)]</value>
-		<value>$INFO[Skin.String(WeatherFanart.path)]$INFO[Window(weather).Property(fanartcode)]$INFO[Skin.String(WeatherFanart.ext)]</value>
+		<value condition="!String.IsEmpty(Window(weather).Property(current.fanartcode)) + !String.IsEmpty(Skin.String(weatherfanart.path))">$INFO[Skin.String(weatherfanart.path)]$INFO[Window(Weather).Property(Current.FanartCode)]$INFO[Skin.String(weatherfanart.ext)]</value>
+		<value condition="!String.IsEmpty(Skin.String(HomeFanart.path))">$INFO[Skin.String(HomeFanart.path)]weather$INFO[Skin.String(HomeFanart.ext)]</value>
 	</variable>
 	<variable name="ListWatchedIconVar">
 		<value condition="ListItem.IsPlaying">overlays/watched/OverlayPlaying-List.png</value>
@@ -335,8 +336,8 @@
 		<value>$LOCALIZE[19021] / $LOCALIZE[19019] / $INFO[Control.GetLabel(29)]</value>
 	</variable>
 	<variable name="BreadcrumbsPVRGuideVar">
-		<value condition="Window.IsActive(TVGuide)">$LOCALIZE[19020] / $LOCALIZE[19069] / $INFO[Control.GetLabel(29)] - $INFO[Control.GetLabel(30)]</value>
-		<value>$LOCALIZE[19021] / $LOCALIZE[19069] / $INFO[Control.GetLabel(29)] - $INFO[Control.GetLabel(30)]</value>
+		<value condition="Window.IsActive(TVGuide)">$LOCALIZE[19020] / $INFO[Control.GetLabel(29)] - $INFO[Control.GetLabel(30)]</value>
+		<value>$LOCALIZE[19021] / $INFO[Control.GetLabel(29)] - $INFO[Control.GetLabel(30)]</value>
 	</variable>
 	<variable name="BreadcrumbsPVRRecordingsVar">
 		<value condition="Window.IsActive(TVRecordings)">$LOCALIZE[19020] / $LOCALIZE[19017]$INFO[Control.GetLabel(30), / ]</value>
diff --git a/addons/skin.estuary/1080i/VideoOSD.xml b/addons/skin.estuary/1080i/VideoOSD.xml
index b8face2..61976a5 100644
--- a/addons/skin.estuary/1080i/VideoOSD.xml
+++ b/addons/skin.estuary/1080i/VideoOSD.xml
@@ -260,7 +260,7 @@
 						<textureslidernibfocus colordiffuse="button_focus">osd/progress/nub_leftright.png</textureslidernibfocus>
 						<info>Player.Progress</info>
 						<action>seek</action>
-						<visible>!Control.HasFocus(87)</visible>
+						<visible>!Control.HasFocus(87) + Player.SeekEnabled</visible>
 					</control>
 					<control type="slider">
 						<left>30</left>
@@ -274,7 +274,7 @@
 						<textureslidernibfocus colordiffuse="button_focus">osd/progress/nub_leftright.png</textureslidernibfocus>
 						<info>Player.Progress</info>
 						<action>seek</action>
-						<visible>Control.HasFocus(87)</visible>
+						<visible>Control.HasFocus(87) + Player.SeekEnabled</visible>
 					</control>
 				</control>
 			</control>
diff --git a/addons/skin.estuary/1080i/View_500_SmallThumb.xml b/addons/skin.estuary/1080i/View_500_SmallThumb.xml
index 9fccad5..3ef7615 100644
--- a/addons/skin.estuary/1080i/View_500_SmallThumb.xml
+++ b/addons/skin.estuary/1080i/View_500_SmallThumb.xml
@@ -326,14 +326,40 @@
 						</control>
 					</control>
 				</focusedlayout>
-				<itemlayout height="360" width="350" condition="Container.Content(artists) | Container.Content(albums) | Container.Content(musicvideos) | Container.Content(addons)">
-					<include>InfoWallMusicLayout</include>
+				<itemlayout height="360" width="350" condition="Container.Content(artists) | Container.Content(albums) | Container.Content(musicvideos)">
+					<include content="InfoWallMusicLayout">
+						<param name="fallback_image" value="DefaultMusicSongs.png" />
+					</include>
 				</itemlayout>
-				<focusedlayout height="360" width="350" condition="Container.Content(artists) | Container.Content(albums) | Container.Content(musicvideos) | Container.Content(addons)">
+				<focusedlayout height="360" width="350" condition="Container.Content(artists) | Container.Content(albums) | Container.Content(musicvideos)">
 					<control type="group">
 						<animation effect="zoom" start="100" end="105" time="200" tween="sine" easing="inout" center="160,180">Focus</animation>
 						<animation effect="zoom" start="105" end="100" time="200" tween="sine" easing="inout" center="160,180">UnFocus</animation>
-						<include>InfoWallMusicLayout</include>
+						<include content="InfoWallMusicLayout">
+							<param name="fallback_image" value="DefaultMusicSongs.png" />
+						</include>
+						<control type="image">
+							<left>15</left>
+							<top>5</top>
+							<width>288</width>
+							<height>348</height>
+							<texture border="8" colordiffuse="button_focus">buttons/thumbnail_focused.png</texture>
+							<animation effect="fade" start="100" end="0" time="200">Unfocus</animation>
+						</control>
+					</control>
+				</focusedlayout>
+				<itemlayout height="360" width="350" condition="Container.Content(addons)">
+					<include content="InfoWallMusicLayout">
+						<param name="fallback_image" value="DefaultAddon.png" />
+					</include>
+				</itemlayout>
+				<focusedlayout height="360" width="350" condition="Container.Content(addons)">
+					<control type="group">
+						<animation effect="zoom" start="100" end="105" time="200" tween="sine" easing="inout" center="160,180">Focus</animation>
+						<animation effect="zoom" start="105" end="100" time="200" tween="sine" easing="inout" center="160,180">UnFocus</animation>
+						<include content="InfoWallMusicLayout">
+							<param name="fallback_image" value="DefaultAddon.png" />
+						</include>
 						<control type="image">
 							<left>15</left>
 							<top>5</top>
diff --git a/addons/skin.estuary/1080i/View_501_Banner.xml b/addons/skin.estuary/1080i/View_501_Banner.xml
index ddae285..0393842 100644
--- a/addons/skin.estuary/1080i/View_501_Banner.xml
+++ b/addons/skin.estuary/1080i/View_501_Banner.xml
@@ -36,6 +36,18 @@
 						<bordertexture colordiffuse="border_alpha">colors/black.png</bordertexture>
 						<bordersize>4</bordersize>
 					</control>
+					<control type="label">
+						<left>30</left>
+						<top>20</top>
+						<width>700</width>
+						<height>145</height>
+						<label>$INFO[ListItem.Label]</label>
+						<font>font35_title</font>
+						<shadowcolor>text_shadow</shadowcolor>
+						<align>left</align>
+						<aligny>center</aligny>
+						<visible>String.IsEmpty(ListItem.Art(banner)) + !Listitem.IsParentFolder</visible>
+					</control>
 					<control type="group">
 						<left>770</left>
 						<top>20</top>
@@ -56,6 +68,18 @@
 							<bordertexture colordiffuse="border_alpha">colors/black.png</bordertexture>
 							<bordersize>4</bordersize>
 						</control>
+						<control type="label">
+							<left>30</left>
+							<top>20</top>
+							<width>700</width>
+							<height>145</height>
+							<label>$INFO[ListItem.Label]</label>
+							<font>font35_title</font>
+							<shadowcolor>text_shadow</shadowcolor>
+							<align>left</align>
+							<aligny>center</aligny>
+							<visible>String.IsEmpty(ListItem.Art(banner)) + !Listitem.IsParentFolder</visible>
+						</control>
 						<control type="group">
 							<left>770</left>
 							<top>20</top>
diff --git a/addons/skin.estuary/1080i/View_51_Poster.xml b/addons/skin.estuary/1080i/View_51_Poster.xml
index 68c63ea..1aa6d5e 100644
--- a/addons/skin.estuary/1080i/View_51_Poster.xml
+++ b/addons/skin.estuary/1080i/View_51_Poster.xml
@@ -51,6 +51,18 @@
 							<bordertexture border="20">overlays/shadow.png</bordertexture>
 							<bordersize>20</bordersize>
 						</control>
+						<control type="textbox">
+							<left>51</left>
+							<top>252</top>
+							<width>214</width>
+							<height>100</height>
+							<label>$INFO[ListItem.Label]</label>
+							<font>font12_title</font>
+							<shadowcolor>text_shadow</shadowcolor>
+							<align>center</align>
+							<aligny>center</aligny>
+							<visible>String.IsEmpty(ListItem.Art(poster)) + !Listitem.IsParentFolder</visible>
+						</control>
 						<control type="group">
 							<left>230</left>
 							<top>30</top>
@@ -70,6 +82,18 @@
 							<animation effect="fade" time="300" start="100" end="0">Focus</animation>
 							<visible>Control.IsVisible(20000)</visible>
 						</control>
+						<control type="textbox">
+							<left>51</left>
+							<top>252</top>
+							<width>214</width>
+							<height>100</height>
+							<label>$INFO[ListItem.Label]</label>
+							<font>font12_title</font>
+							<shadowcolor>text_shadow</shadowcolor>
+							<align>center</align>
+							<aligny>center</aligny>
+							<visible>String.IsEmpty(ListItem.Art(poster)) + !Listitem.IsParentFolder</visible>
+						</control>
 						<control type="group">
 							<animation effect="fade" time="300" start="100" end="0">Focus</animation>
 							<visible>Control.IsVisible(20000)</visible>
diff --git a/addons/skin.estuary/1080i/View_54_InfoWall.xml b/addons/skin.estuary/1080i/View_54_InfoWall.xml
index 8117389..d41cf0e 100644
--- a/addons/skin.estuary/1080i/View_54_InfoWall.xml
+++ b/addons/skin.estuary/1080i/View_54_InfoWall.xml
@@ -37,44 +37,47 @@
 		</control>
 	</include>
 	<include name="InfoWallMusicLayout">
-		<control type="image">
-			<top>-10</top>
-			<width>320</width>
-			<height>380</height>
-			<texture border="40">buttons/button-nofo.png</texture>
-		</control>
-		<control type="image">
-			<left>35</left>
-			<top>21</top>
-			<width>250</width>
-			<height>250</height>
-			<texture border="2" fallback="DefaultFolderSquare.png" background="true">$VAR[ShiftThumbVar]</texture>
-			<aspectratio>keep</aspectratio>
-			<bordertexture colordiffuse="border_alpha">colors/black.png</bordertexture>
-			<bordersize>4</bordersize>
-		</control>
-		<control type="image">
-			<left>20</left>
-			<top>278</top>
-			<width>278</width>
-			<height>70</height>
-			<texture>colors/black.png</texture>
-		</control>
-		<control type="textbox">
-			<left>28</left>
-			<top>278</top>
-			<width>262</width>
-			<height>70</height>
-			<font>font12</font>
-			<align>center</align>
-			<aligny>center</aligny>
-			<label>$INFO[ListItem.Year,[COLOR button_focus], - [/COLOR]]$INFO[ListItem.Label]</label>
-		</control>
-		<control type="group">
-			<left>230</left>
-			<top>28</top>
-			<include>UserRatingCircle</include>
-		</control>
+		<param name="fallback_image">DefaultFolder.png</param>
+		<definition>
+			<control type="image">
+				<top>-10</top>
+				<width>320</width>
+				<height>380</height>
+				<texture border="40">buttons/button-nofo.png</texture>
+			</control>
+			<control type="image">
+				<left>35</left>
+				<top>21</top>
+				<width>250</width>
+				<height>250</height>
+				<texture border="2" fallback="$PARAM[fallback_image]" background="true">$VAR[ShiftThumbVar]</texture>
+				<aspectratio>keep</aspectratio>
+				<bordertexture colordiffuse="border_alpha">colors/black.png</bordertexture>
+				<bordersize>4</bordersize>
+			</control>
+			<control type="image">
+				<left>20</left>
+				<top>278</top>
+				<width>278</width>
+				<height>70</height>
+				<texture>colors/black.png</texture>
+			</control>
+			<control type="textbox">
+				<left>28</left>
+				<top>278</top>
+				<width>262</width>
+				<height>70</height>
+				<font>font12</font>
+				<align>center</align>
+				<aligny>center</aligny>
+				<label>$INFO[ListItem.Year,[COLOR button_focus], - [/COLOR]]$INFO[ListItem.Label]</label>
+			</control>
+			<control type="group">
+				<left>230</left>
+				<top>28</top>
+				<include>UserRatingCircle</include>
+			</control>
+		</definition>
 	</include>
 	<include name="View_54_InfoWall">
 		<include content="UpDownArrows">
@@ -120,6 +123,18 @@
 						<bordertexture border="20">overlays/shadow.png</bordertexture>
 						<bordersize>20</bordersize>
 					</control>
+					<control type="textbox">
+						<left>20</left>
+						<top>220</top>
+						<width>209</width>
+						<height>100</height>
+						<label>$INFO[ListItem.Label]</label>
+						<font>font12_title</font>
+						<shadowcolor>text_shadow</shadowcolor>
+						<align>center</align>
+						<aligny>center</aligny>
+						<visible>String.IsEmpty(ListItem.Art(poster)) + !Listitem.IsParentFolder</visible>
+					</control>
 					<control type="group">
 						<left>179</left>
 						<top>30</top>
@@ -139,6 +154,18 @@
 							<bordertexture border="20">overlays/shadow.png</bordertexture>
 							<bordersize>20</bordersize>
 						</control>
+						<control type="textbox">
+							<left>20</left>
+							<top>220</top>
+							<width>209</width>
+							<height>100</height>
+							<label>$INFO[ListItem.Label]</label>
+							<font>font12_title</font>
+							<shadowcolor>text_shadow</shadowcolor>
+							<align>center</align>
+							<aligny>center</aligny>
+							<visible>String.IsEmpty(ListItem.Art(poster)) + !Listitem.IsParentFolder</visible>
+						</control>
 						<control type="group">
 							<left>179</left>
 							<top>30</top>
diff --git a/addons/skin.estuary/language/resource.language.en_gb/strings.po b/addons/skin.estuary/language/resource.language.en_gb/strings.po
index b1519b1..83ded0c 100644
--- a/addons/skin.estuary/language/resource.language.en_gb/strings.po
+++ b/addons/skin.estuary/language/resource.language.en_gb/strings.po
@@ -16,77 +16,77 @@ msgstr ""
 "Language: en_GB\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
-#: /1080i/Home.xml:920 /1080i/Home.xml:520 /1080i/DialogFullScreenInfo.xml:44
+#: /1080i/Home.xml /1080i/DialogFullScreenInfo.xml
 msgctxt "#31000"
 msgid "Now playing"
 msgstr ""
 
-#: /1080i/Home.xml:775
+#: /1080i/Home.xml
 msgctxt "#31001"
 msgid "Search..."
 msgstr ""
 
-#: /1080i/SkinSettings.xml:125
+#: /1080i/SkinSettings.xml
 msgctxt "#31002"
 msgid "Show media fanart as background"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:431
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31003"
 msgid "Cinema mode"
 msgstr ""
 
-#: /1080i/VideoOSD.xml:409
+#: /1080i/VideoOSD.xml
 msgctxt "#31004"
 msgid "Change mode"
 msgstr ""
 
-#: /1080i/VideoOSD.xml:416
+#: /1080i/VideoOSD.xml
 msgctxt "#31005"
 msgid "Watch as 2D"
 msgstr ""
 
-#: /1080i/Home.xml:93
+#: /1080i/Home.xml
 msgctxt "#31006"
 msgid "Random movies"
 msgstr ""
 
-#: /1080i/Home.xml:102
+#: /1080i/Home.xml
 msgctxt "#31007"
 msgid "Unwatched movies"
 msgstr ""
 
-#: /1080i/DialogAddonInfo.xml:32
+#: /1080i/DialogAddonInfo.xml
 msgctxt "#31008"
 msgid "No disclaimer"
 msgstr ""
 
-#: /1080i/MyVideoNav.xml:278
+#: /1080i/MyVideoNav.xml
 msgctxt "#31009"
 msgid "Download icons"
 msgstr ""
 
-#: /1080i/Home.xml:75
+#: /1080i/Home.xml
 msgctxt "#31010"
 msgid "In progress movies"
 msgstr ""
 
-#: /1080i/Home.xml:194
+#: /1080i/Home.xml
 msgctxt "#31011"
 msgid "Most played albums"
 msgstr ""
 
-#: /1080i/Home.xml:210
+#: /1080i/Home.xml
 msgctxt "#31012"
 msgid "Random albums"
 msgstr ""
 
-#: /1080i/Home.xml:218
+#: /1080i/Home.xml
 msgctxt "#31013"
 msgid "Random artists"
 msgstr ""
 
-#: /1080i/Home.xml:227
+#: /1080i/Home.xml
 msgctxt "#31014"
 msgid "Unplayed albums"
 msgstr ""
@@ -103,7 +103,7 @@ msgctxt "#31016"
 msgid "Recently played channels"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:265
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31017"
 msgid "Rated"
 msgstr ""
@@ -114,572 +114,572 @@ msgctxt "#31018"
 msgid "Recently played channels"
 msgstr ""
 
-#: /1080i/Home.xml:675 /1080i/MyWeather.xml:52
+#: /1080i/Home.xml /1080i/MyWeather.xml
 msgctxt "#31019"
 msgid "Forecast"
 msgstr ""
 
-#: /1080i/MyMusicNav.xml:43 /1080i/MyPics.xml:40 /1080i/MyVideoNav.xml:98
+#: /1080i/MyMusicNav.xml /1080i/MyPics.xml /1080i/MyVideoNav.xml
 msgctxt "#31020"
 msgid "Actions"
 msgstr ""
 
-#: /1080i/AddonBrowser.xml:35 /1080i/DialogPVRChannelManager.xml:203 /1080i/Includes_MediaMenu.xml:116 /1080i/EventLog.xml:228
+#: /1080i/AddonBrowser.xml /1080i/DialogPVRChannelManager.xml /1080i/Includes_MediaMenu.xml /1080i/EventLog.xml
 msgctxt "#31021"
 msgid "Misc options"
 msgstr ""
 
-#: /1080i/Includes_MediaMenu.xml:97 /1080i/Includes_MediaMenu.xml:221 /1080i/Includes.xml:1109
+#: /1080i/Includes_MediaMenu.xml /1080i/Includes.xml
 msgctxt "#31022"
 msgid "Sort by"
 msgstr ""
 
-#: /1080i/Includes_MediaMenu.xml:213 /1080i/Includes_MediaMenu.xml:89
+#: /1080i/Includes_MediaMenu.xml
 msgctxt "#31023"
 msgid "Viewtype"
 msgstr ""
 
-#: /1080i/MusicVisualisation.xml:143
+#: /1080i/MusicVisualisation.xml
 msgctxt "#31024"
 msgid "Next tracks"
 msgstr ""
 
-#: /1080i/DialogFavourites.xml:117
+#: /1080i/DialogFavourites.xml
 msgctxt "#31025"
 msgid "No favourites found. You can add any item from media views to this list by using the context menu."
 msgstr ""
 
-#: /1080i/DialogAlbumInfo.xml:122
+#: /1080i/DialogAlbumInfo.xml
 msgctxt "#31026"
 msgid "Go to albums"
 msgstr ""
 
-#: /1080i/DialogAlbumInfo.xml:131
+#: /1080i/DialogAlbumInfo.xml
 msgctxt "#31027"
 msgid "Go to songs"
 msgstr ""
 
-#: /1080i/DialogAlbumInfo.xml:140 /1080i/DialogVideoInfo.xml:280
+#: /1080i/DialogAlbumInfo.xml /1080i/DialogVideoInfo.xml
 msgctxt "#31028"
 msgid "Show fanart"
 msgstr ""
 
-#: /1080i/SettingsProfile.xml:115
+#: /1080i/SettingsProfile.xml
 msgctxt "#31029"
 msgid "Last logged in"
 msgstr ""
 
-#: /1080i/SettingsSystemInfo.xml:172
+#: /1080i/SettingsSystemInfo.xml
 msgctxt "#31030"
 msgid "Memory used"
 msgstr ""
 
-#: /1080i/SettingsSystemInfo.xml:191
+#: /1080i/SettingsSystemInfo.xml
 msgctxt "#31031"
 msgid "Version info"
 msgstr ""
 
-#: /1080i/EventLog.xml:25 /1080i/Includes_MediaMenu.xml:216 /1080i/SmartPlaylistEditor.xml:67 /1080i/EventLog.xml:220 /1080i/Includes_MediaMenu.xml:139
+#: /1080i/EventLog.xml /1080i/Includes_MediaMenu.xml /1080i/SmartPlaylistEditor.xml
 msgctxt "#31032"
 msgid "Order"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:238 /1080i/DialogSongInfo.xml:232
+#: /1080i/DialogVideoInfo.xml /1080i/DialogSongInfo.xml
 msgctxt "#31033"
 msgid "Your rating"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:263
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31034"
 msgid "Extended info"
 msgstr ""
 
-#: /1080i/DialogPVRChannelManager.xml:279 /1080i/DialogPVRChannelsOSD.xml:291 /1080i/DialogPVRGuideOSD.xml:171 /1080i/Variables.xml:41 /1080i/FileBrowser.xml:238
+#: /1080i/DialogPVRChannelManager.xml /1080i/DialogPVRChannelsOSD.xml /1080i/DialogPVRGuideOSD.xml /1080i/Variables.xml /1080i/FileBrowser.xml
 msgctxt "#31035"
 msgid "Pages"
 msgstr ""
 
-#: /1080i/FileBrowser.xml:238 /1080i/Variables.xml:41 /1080i/MyPVRRecordings.xml:242
+#: /1080i/FileBrowser.xml /1080i/Variables.xml /1080i/MyPVRRecordings.xml
 msgctxt "#31036"
 msgid "items"
 msgstr ""
 
-#: /1080i/Variables.xml:55
+#: /1080i/Variables.xml
 msgctxt "#31037"
 msgid "Tracklist"
 msgstr ""
 
-#: /1080i/Variables.xml:112
+#: /1080i/Variables.xml
 msgctxt "#31038"
 msgid "Rewind"
 msgstr ""
 
-#: /1080i/Variables.xml:111
+#: /1080i/Variables.xml
 msgctxt "#31039"
 msgid "Fast forward"
 msgstr ""
 
-#: /1080i/Variables.xml:200
+#: /1080i/Variables.xml
 msgctxt "#31040"
 msgid "Cancel update"
 msgstr ""
 
-#: /1080i/Variables.xml:14 /1080i/MyPics.xml:95
+#: /1080i/Variables.xml /1080i/MyPics.xml
 msgctxt "#31041"
 msgid "Camera manufacturer"
 msgstr ""
 
-#: /1080i/SmartPlaylistEditor.xml:46
+#: /1080i/SmartPlaylistEditor.xml
 msgctxt "#31042"
 msgid "Playlist options"
 msgstr ""
 
-#: /1080i/SmartPlaylistEditor.xml:126
+#: /1080i/SmartPlaylistEditor.xml
 msgctxt "#31043"
 msgid "Set the type and add rules to create a smart playlist. These playlists are dynamic and include all media items from your database which apply to your chosen rules."
 msgstr ""
 
-#: /1080i/DialogPVRGroupManager.xml:31
+#: /1080i/DialogPVRGroupManager.xml
 msgctxt "#31044"
 msgid "Add group"
 msgstr ""
 
-#: /1080i/DialogPVRGroupManager.xml:37
+#: /1080i/DialogPVRGroupManager.xml
 msgctxt "#31045"
 msgid "Rename group"
 msgstr ""
 
-#: /1080i/DialogPVRGroupManager.xml:49
+#: /1080i/DialogPVRGroupManager.xml
 msgctxt "#31046"
 msgid "Delete group"
 msgstr ""
 
-#: /1080i/View_50_List.xml:43
+#: /1080i/View_50_List.xml
 msgctxt "#31047"
 msgid "Read more..."
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:62
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31048"
 msgid "Available"
 msgstr ""
 
-#: /1080i/Variables.xml:119
+#: /1080i/Variables.xml
 msgctxt "#31049"
 msgid "Press [B]Up[/B] to rewind or fast-forward"
 msgstr ""
 
-#: /1080i/Variables.xml:120
+#: /1080i/Variables.xml
 msgctxt "#31050"
 msgid "Press [B]OK[/B] to stop"
 msgstr ""
 
-#: /1080i/VideoOSD.xml:361
+#: /1080i/VideoOSD.xml
 msgctxt "#31051"
 msgid "Toggle language"
 msgstr ""
 
-#: /1080i/Includes.xml:1102
+#: /1080i/Includes.xml
 msgctxt "#31052"
 msgid "filtered"
 msgstr ""
 
-#: /1080i/Font.xml:99
+#: /1080i/Font.xml
 msgctxt "#31053"
 msgid "Arial based"
 msgstr ""
 
-#: /1080i/Variables.xml:127
+#: /1080i/Variables.xml
 msgctxt "#31054"
 msgid "Press [B]Left[/B] to rewind, or [B]Right[/B] to fast-forward"
 msgstr ""
 
-#: /1080i/Variables.xml:126
+#: /1080i/Variables.xml
 msgctxt "#31055"
 msgid "Subtitle download"
 msgstr ""
 
-#: /1080i/MyMusicNav.xml:58 /1080i/MyVideoNav.xml:125
+#: /1080i/MyMusicNav.xml /1080i/MyVideoNav.xml
 msgctxt "#31056"
 msgid "Go to playlist"
 msgstr ""
 
-#: /1080i/SettingsProfile.xml:189
+#: /1080i/SettingsProfile.xml
 msgctxt "#31057"
 msgid "Show login screen on startup"
 msgstr ""
 
-#: /1080i/SettingsProfile.xml:194
+#: /1080i/SettingsProfile.xml
 msgctxt "#31058"
 msgid "Automatic Login on startup"
 msgstr ""
 
-#: /1080i/Includes.xml:579
+#: /1080i/Includes.xml
 msgctxt "#31059"
 msgid "Updates available"
 msgstr ""
 
-#: /1080i/Variables.xml:35 /1080i/DialogVideoInfo.xml:193
+#: /1080i/Variables.xml /1080i/DialogVideoInfo.xml
 msgctxt "#31060"
 msgid "minutes"
 msgstr ""
 
-#: /1080i/SkinSettings.xml:42
+#: /1080i/SkinSettings.xml
 msgctxt "#31061"
 msgid "Main menu items"
 msgstr ""
 
-#: /1080i/Custom_1103_SourcesDialog.xml:24
+#: /1080i/SkinSettings.xml
 msgctxt "#31062"
-msgid "Shortcuts to the \"Files\" sections of each media type. Go there to add additional sources for your databases."
+msgid "Choose weather fanart pack"
 msgstr ""
 
-#: /1080i/Includes_MediaMenu.xml:74
+#: /1080i/Includes_MediaMenu.xml
 msgctxt "#31063"
 msgid "Sections"
 msgstr ""
 
-#: /1080i/Variables.xml:36
+#: /1080i/Variables.xml
 msgctxt "#31064"
 msgid "unwatched"
 msgstr ""
 
-#: /1080i/MyVideoPlaylist.xml:29
+#: /1080i/MyVideoPlaylist.xml
 msgctxt "#31065"
 msgid "Video playlist"
 msgstr ""
 
-#: /1080i/MyMusicPlaylist.xml:19
+#: /1080i/MyMusicPlaylist.xml
 msgctxt "#31066"
 msgid "Music playlist"
 msgstr ""
 
-#: /1080i/EventLog.xml:251
+#: /1080i/EventLog.xml
 msgctxt "#31067"
 msgid "Event log"
 msgstr ""
 
-#: /1080i/Custom_1105_MusicOSDSettings.xml:41
+#: /1080i/Custom_1105_MusicOSDSettings.xml
 msgctxt "#31068"
 msgid "Choose presets"
 msgstr ""
 
-#: /1080i/AddonBrowser.xml:75
+#: /1080i/AddonBrowser.xml
 msgctxt "#31069"
 msgid "Last Updated"
 msgstr ""
 
-#: /1080i/Custom_1103_SourcesDialog.xml:13
+#: /1080i/Custom_1103_SourcesDialog.xml
 msgctxt "#31070"
 msgid "Add media sources"
 msgstr ""
 
-#: /1080i/DialogAddonInfo.xml:90
+#: /1080i/DialogAddonInfo.xml
 msgctxt "#31071"
 msgid "by"
 msgstr ""
 
-#: /1080i/DialogButtonMenu.xml:13 /1080i/LoginScreen.xml:140
+#: /1080i/DialogButtonMenu.xml /1080i/LoginScreen.xml
 msgctxt "#31072"
 msgid "Power Options"
 msgstr ""
 
-#: /1080i/Home.xml:132
+#: /1080i/Home.xml
 msgctxt "#31073"
 msgid "Titles"
 msgstr ""
 
-#: /1080i/Home.xml:74 /1080i/Home.xml:337
+#: /1080i/Home.xml
 msgctxt "#31074"
 msgid "Library root"
 msgstr ""
 
-#: /1080i/Home.xml:62
+#: /1080i/Home.xml
 msgctxt "#31075"
 msgid "Movie sets"
 msgstr ""
 
-#: /1080i/Home.xml:333
+#: /1080i/Home.xml
 msgctxt "#31076"
 msgid "Play optical disc"
 msgstr ""
 
-#: /1080i/Home.xml:499
+#: /1080i/Home.xml
 msgctxt "#31077"
 msgid "Previous location"
 msgstr ""
 
-#: /1080i/Home.xml:502
+#: /1080i/Home.xml
 msgctxt "#31078"
 msgid "Next location"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:110
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31079"
 msgid "Cast not available"
 msgstr ""
 
-#: /1080i/VideoOSD.xml:287
+#: /1080i/VideoOSD.xml
 msgctxt "#31080"
 msgid "Ends at"
 msgstr ""
 
-#: /1080i/DialogSongInfo.xml:203
+#: /1080i/DialogSongInfo.xml
 msgctxt "#31081"
 msgid "Album info"
 msgstr ""
 
-#: /1080i/Custom_1105_MusicOSDSettings.xml:46
+#: /1080i/Custom_1105_MusicOSDSettings.xml
 msgctxt "#31082"
 msgid "Lyrics add-on"
 msgstr ""
 
-#: /1080i/Custom_1105_MusicOSDSettings.xml:50
+#: /1080i/Custom_1105_MusicOSDSettings.xml
 msgctxt "#31083"
 msgid "Lyrics add-on settings"
 msgstr ""
 
-#: /1080i/Custom_1105_MusicOSDSettings.xml:37
+#: /1080i/Custom_1105_MusicOSDSettings.xml
 msgctxt "#31084"
 msgid "Visualisation settings"
 msgstr ""
 
-#: /1080i/DialogFullScreenInfo.xml:271
+#: /1080i/DialogFullScreenInfo.xml
 msgctxt "#31085"
 msgid "Channel Group"
 msgstr ""
 
-#: /1080i/DialogFullScreenInfo.xml:107
+#: /1080i/DialogFullScreenInfo.xml
 msgctxt "#31086"
 msgid "Metadata"
 msgstr ""
 
-#: /1080i/DialogContentSettings.xml:52
+#: /1080i/DialogContentSettings.xml
 msgctxt "#31087"
 msgid "Provider settings"
 msgstr ""
 
-#: /1080i/DialogContentSettings.xml:61
+#: /1080i/DialogContentSettings.xml
 msgctxt "#31088"
 msgid "Content scanning options"
 msgstr ""
 
-#: /1080i/DialogPVRGroupManager.xml:67
+#: /1080i/DialogPVRGroupManager.xml
 msgctxt "#31089"
 msgid "Available groups"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:248
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31090"
 msgid "Search trailer"
 msgstr ""
 
-#: /1080i/VideoOSD.xml:160
+#: /1080i/VideoOSD.xml
 msgctxt "#31091"
 msgid "Download subtitles"
 msgstr ""
 
-#: /1080i/VideoOSD.xml:169 /1080i/Variables.xml:163
+#: /1080i/VideoOSD.xml /1080i/Variables.xml
 msgctxt "#31092"
 msgid "Video menu"
 msgstr ""
 
-#: /1080i/SkinSettings.xml:95
+#: /1080i/SkinSettings.xml
 msgctxt "#31093"
 msgid "Show weather info in top bar"
 msgstr ""
 
-#: /1080i/SkinSettings.xml:102
+#: /1080i/SkinSettings.xml
 msgctxt "#31094"
 msgid "Show media flags for movies / episodes / music videos"
 msgstr ""
 
-#: /1080i/SkinSettings.xml:81
+#: /1080i/SkinSettings.xml
 msgctxt "#31095"
 msgid "Use slide animations"
 msgstr ""
 
-#: /1080i/DialogSubtitles.xml:58
+#: /1080i/DialogSubtitles.xml
 msgctxt "#31096"
 msgid "Local subtitle available"
 msgstr ""
 
-#: /1080i/DialogPVRChannelManager.xml:145
+#: /1080i/DialogPVRChannelManager.xml
 msgctxt "#31097"
 msgid "Channel options"
 msgstr ""
 
-#: /1080i/LoginScreen.xml:26
+#: /1080i/LoginScreen.xml
 msgctxt "#31098"
 msgid "Select your Kodi user profile[CR]to login and continue"
 msgstr ""
 
-#: /1080i/View_52_IconWall.xml:21
+#: /1080i/View_52_IconWall.xml
 msgctxt "#31099"
 msgid "Icon Wall"
 msgstr ""
 
-#: /1080i/View_53_Shift.xml:80
+#: /1080i/View_53_Shift.xml
 msgctxt "#31100"
 msgid "Shift"
 msgstr ""
 
-#: /1080i/View_54_InfoWall.xml:334
+#: /1080i/View_54_InfoWall.xml
 msgctxt "#31101"
 msgid "InfoWall"
 msgstr ""
 
-#: /1080i/View_500_SmallThumb.xml:414
+#: /1080i/View_500_SmallThumb.xml
 msgctxt "#31102"
 msgid "Wall"
 msgstr ""
 
-#: /1080i/SmartPlaylistRule.xml:48
+#: /1080i/SmartPlaylistRule.xml
 msgctxt "#31103"
 msgid "Enter text here..."
 msgstr ""
 
-#: /1080i/Home.xml:134 /1080i/Home.xml:228
+#: /1080i/Home.xml
 msgctxt "#31104"
 msgid "Your library is currently empty. In order to populate it with your personal media, enter \"Files\" section, add a media source and configure it. After the source has been added and indexed you will be able to browse your library."
 msgstr ""
 
-#: /1080i/Home.xml:468
+#: /1080i/Home.xml
 msgctxt "#31105"
 msgid "Add video sources and set the appropriate content type in order to populate your video libraries."
 msgstr ""
 
-#: /1080i/Variables.xml:164
+#: /1080i/Variables.xml
 msgctxt "#31106"
 msgid "Teletext"
 msgstr ""
 
-#: /1080i/View_55_WideList.xml:33
+#: /1080i/View_55_WideList.xml
 msgctxt "#31107"
 msgid "WideList"
 msgstr ""
 
-#: /1080i/SkinSettings.xml:109
+#: /1080i/SkinSettings.xml
 msgctxt "#31108"
 msgid "Use custom global background"
 msgstr ""
 
-#: /1080i/SkinSettings.xml:116
+#: /1080i/SkinSettings.xml
 msgctxt "#31109"
 msgid "Choose image path"
 msgstr ""
 
-#: /1080i/Home.xml:138
+#: /1080i/Home.xml
 msgctxt "#31110"
 msgid "Enter files section"
 msgstr ""
 
-#: /1080i/Home.xml:775
+#: /1080i/Home.xml
 msgctxt "#31111"
 msgid "View your personal pictures or download one of the many image add-ons from the official repository."
 msgstr ""
 
-#: /1080i/VideoOSD.xml:322
+#: /1080i/VideoOSD.xml
 msgctxt "#31112"
 msgid "Toggle audio stream"
 msgstr ""
 
-#: /1080i/Custom_1107_SearchDialog.xml:32
+#: /1080i/Custom_1107_SearchDialog.xml
 msgctxt "#31113"
 msgid "Search local library"
 msgstr ""
 
-#: /1080i/Custom_1107_SearchDialog.xml:38 /1080i/DialogMusicInfo.xml:202
+#: /1080i/Custom_1107_SearchDialog.xml /1080i/DialogMusicInfo.xml
 msgctxt "#31114"
 msgid "Search YouTube"
 msgstr ""
 
-#: /1080i/Custom_1107_SearchDialog.xml:44
+#: /1080i/Custom_1107_SearchDialog.xml
 msgctxt "#31115"
 msgid "Search TheMovieDB"
 msgstr ""
 
-#: /1080i/Includes_Home.xml:414
+#: /1080i/Includes_Home.xml
 msgctxt "#31116"
 msgid "Remove this main menu item"
 msgstr ""
 
-#: /1080i/MyVideoNav.xml:271
+#: /1080i/MyVideoNav.xml
 msgctxt "#31117"
 msgid "Edit nodes"
 msgstr ""
 
-#: /1080i/Home.xml:416
+#: /1080i/Home.xml
 msgctxt "#31118"
 msgid "Enter add-on browser"
 msgstr ""
 
-#: /1080i/Home.xml:415
+#: /1080i/Home.xml
 msgctxt "#31119"
 msgid "You do not have any add-ons installed yet. Visit our add-on browser to browse through our collection and improve your Kodi experience."
 msgstr ""
 
-#: /1080i/Home.xml:769
+#: /1080i/Home.xml
 msgctxt "#31120"
 msgid "You did not set up a weather provider yet. In order to view weather information, choose a weather provider and set up your location."
 msgstr ""
 
-#: /1080i/Home.xml:770
+#: /1080i/Home.xml
 msgctxt "#31121"
 msgid "Set weather provider"
 msgstr ""
 
-#: /1080i/Home.xml:216
+#: /1080i/Home.xml
 msgctxt "#31122"
 msgid "Unwatched TV Shows"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:456
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31123"
 msgid "Same director"
 msgstr ""
 
-#: /1080i/MyPics.xml:229
+#: /1080i/MyPics.xml
 msgctxt "#31124"
 msgid "Show images on map"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:521
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31125"
 msgid "Press up for actor info"
 msgstr ""
 
-#: /1080i/DialogVideoInfo.xml:558
+#: /1080i/DialogVideoInfo.xml
 msgctxt "#31126"
 msgid "Press OK to read plot"
 msgstr ""
 
-#: /1080i/Includes_MediaMenu.xml:137
+#: /1080i/Includes_MediaMenu.xml
 msgctxt "#31127"
 msgid "Show icons"
 msgstr ""
 
-#: /1080i/Variables.xml:30
+#: /1080i/Variables.xml
 msgctxt "#31128"
 msgid "Contributors"
 msgstr ""
 
-#: /1080i/Variables.xml:229
+#: /1080i/Variables.xml
 msgctxt "#31129"
 msgid "General settings applying to all areas of the skin."
 msgstr ""
 
-#: /1080i/Variables.xml:230
+#: /1080i/Variables.xml
 msgctxt "#31130"
 msgid "Main menu-related settings: Configure the home screen to your likings."
 msgstr ""
 
-#: /1080i/SkinSettings.xml:117
+#: /1080i/SkinSettings.xml
 msgctxt "#31131"
-msgid "Choose home fanart pack"
+msgid "Choose skin fanart pack"
 msgstr ""
 
-#: /1080i/MyVideoNav.xml:121 /1080i/View_502_FanArt.xml:213
+#: /1080i/MyVideoNav.xml /1080i/View_502_FanArt.xml
 msgctxt "#31132"
 msgid "min"
 msgstr ""
@@ -744,3 +744,17 @@ msgctxt "#31144"
 msgid "Enter add-on browser"
 msgstr ""
 
+#: /1080i/Custom_1107_SearchDialog.xml
+msgctxt "#31145"
+msgid "Search add-ons"
+msgstr ""
+
+#: /1080i/Home.xml
+msgctxt "#31146"
+msgid "Manage add-ons"
+msgstr ""
+
+#: /1080i/Home.xml
+msgctxt "#31147"
+msgid "Download add-ons"
+msgstr ""
diff --git a/addons/skin.estuary/media/DefaultFavourites.png b/addons/skin.estuary/media/DefaultFavourites.png
new file mode 100644
index 0000000..d4d2e33
Binary files /dev/null and b/addons/skin.estuary/media/DefaultFavourites.png differ
diff --git a/addons/skin.estuary/media/flags/audiocodec/aac.png b/addons/skin.estuary/media/flags/audiocodec/aac_latm.png
similarity index 100%
copy from addons/skin.estuary/media/flags/audiocodec/aac.png
copy to addons/skin.estuary/media/flags/audiocodec/aac_latm.png
diff --git a/addons/skin.estuary/media/icons/infodialogs/timer.png b/addons/skin.estuary/media/icons/infodialogs/timer.png
new file mode 100644
index 0000000..b1d117b
Binary files /dev/null and b/addons/skin.estuary/media/icons/infodialogs/timer.png differ
diff --git a/addons/skin.estuary/media/icons/settings/eventlog.png b/addons/skin.estuary/media/icons/settings/eventlog.png
new file mode 100644
index 0000000..0376aea
Binary files /dev/null and b/addons/skin.estuary/media/icons/settings/eventlog.png differ
diff --git a/appveyor.yml b/appveyor.yml
index a448c0e..21881ac 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -13,10 +13,12 @@ environment:
     # - ADDONS: screensaver
     # - ADDONS: visualization
 
+init:
+  - ps: iex ((new-object net.webclient).DownloadString('https://raw.githubusercontent.com/appveyor/ci/master/scripts/enable-rdp.ps1'))
+
 install:
   - SET PATH=C:\Program Files (x86)\CMake\bin;C:\msys64\bin;C:\msys64\usr\bin;%PATH%
   - bash -lc "pacman --needed --noconfirm -Sy"
-  - bash -lc "pacman --needed --noconfirm -S curl"
   - mklink /j %APPVEYOR_BUILD_FOLDER%\project\BuildDependencies\msys64 C:\msys64
 
 build_script:
@@ -41,10 +43,10 @@ build_script:
         # Download precompiled mingw32 libraries
         # To run make-mingwlibs.bat on AppVeyor takes too long, 
         # we must use precompiled libs to speed up build
-        bash -c "curl http://repo.msys2.org/mingw/i686/mingw-w64-i686-ffmpeg-3.1.1-1-any.pkg.tar.xz | tar xJv"
-        bash -c "curl http://repo.msys2.org/mingw/i686/mingw-w64-i686-libdvdcss-1.4.0-1-any.pkg.tar.xz | tar xJv"
-        bash -c "curl http://repo.msys2.org/mingw/i686/mingw-w64-i686-libdvdnav-5.0.3-1-any.pkg.tar.xz | tar xJv"
-        bash -c "curl http://repo.msys2.org/mingw/i686/mingw-w64-i686-libdvdread-5.0.3-1-any.pkg.tar.xz | tar xJv"
+        bash -c "wget -O - http://repo.msys2.org/mingw/i686/mingw-w64-i686-ffmpeg-3.1.1-1-any.pkg.tar.xz | tar xJv"
+        bash -c "wget -O - http://repo.msys2.org/mingw/i686/mingw-w64-i686-libdvdcss-1.4.0-1-any.pkg.tar.xz | tar xJv"
+        bash -c "wget -O - http://repo.msys2.org/mingw/i686/mingw-w64-i686-libdvdnav-5.0.3-1-any.pkg.tar.xz | tar xJv"
+        bash -c "wget -O - http://repo.msys2.org/mingw/i686/mingw-w64-i686-libdvdread-5.0.3-1-any.pkg.tar.xz | tar xJv"
         # Rename all precompiled lib*.dll.a -> *.lib, so MSVC will find them
         Get-ChildItem mingw32\lib\lib*.dll.a | %{
           $new_name = $_.Name.SubString(3) -replace ".dll.a", ".lib"
@@ -57,8 +59,8 @@ build_script:
         # Build  
         mkdir $env:APPVEYOR_BUILD_FOLDER\kodi-build
         cd $env:APPVEYOR_BUILD_FOLDER\kodi-build
-        cmake -G "Visual Studio 14" ..\project\cmake
-        cmake --build . --target all_build --config RelWithDebInfo
+        cmd /c 'cmake -G "Visual Studio 14" ..\project\cmake 2>&1'
+        cmd /c 'cmake --build . --target all_build --config RelWithDebInfo 2>&1'
       }
   
   #
diff --git a/configure.ac b/configure.ac
index daec619..acf4ce6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2,7 +2,7 @@
 # Process this file with autoconf to produce a configure script.
 
 AC_PREREQ(2.59)
-AC_INIT([kodi], [16.9.802], [http://trac.kodi.tv])
+AC_INIT([kodi], [16.9.803], [http://trac.kodi.tv])
 AC_CONFIG_HEADERS([xbmc/config.h])
 AH_TOP([#pragma once])
 m4_include([m4/ax_prog_cc_for_build.m4])
@@ -762,6 +762,21 @@ if test "$host_vendor" = "apple" ; then
   # standard application paths
   INCLUDES="$INCLUDES -I\$(abs_top_srcdir)/xbmc/osx"
   if test "$use_arch" != "arm"; then
+    SAVE_CFLAGS="$CFLAGS"
+    CFLAGS="-msse -msse2"
+    AC_COMPILE_IFELSE(
+      [AC_LANG_SOURCE([int foo;])],
+      [ HAVE_SSE=1
+        HAVE_SSE2=1
+        AC_DEFINE([HAVE_SSE],[1],[sse enabled])
+        AC_DEFINE([HAVE_SSE2],[1],[sse2 enabled])],
+      [ HAVE_SSE=0
+        HAVE_SSE2=0
+        AC_DEFINE([HAVE_SSE],[0],[sse enabled])
+        AC_DEFINE([HAVE_SSE2],[0],[sse2 enabled])
+      ])
+    CFLAGS="$SAVE_CFLAGS"
+
     LIBS="$LIBS -framework ApplicationServices"
     LIBS="$LIBS -framework AudioUnit"
     LIBS="$LIBS -framework AudioToolbox"
diff --git a/docs/README.osx b/docs/README.osx
index a4239f0..e730cd6 100644
--- a/docs/README.osx
+++ b/docs/README.osx
@@ -32,7 +32,8 @@ codecs that support a multitude of music and video formats.
 
 On Mavericks (OSX 10.9.x) we recommend using Xcode 6.1.
 On Yosemite (OSX 10.10.x) we recommend using Xcode 6.4.
-On El Capitan (OSX 10.11.x) we recommend using Xcode 7.2.
+On El Capitan (OSX 10.11.x) we recommend using Xcode 7.x or Xcode 8.x.
+On Sierra (macOS 10.12.x) we recomment using Xcode 8.x.
 
 NOTE TO NEW OS X USERS: All lines that are prefixed with the '$' character are
 commands that need to be typed into a Terminal window. Note that the '$'
@@ -69,6 +70,8 @@ constellations of Xcode and osx versions (to be updated once we know more):
 4. XCode 6.3.0 against OSX SDK 10.10 (Y)
 5. Xcode 6.4.0 against OSX SDK 10.10 (Y)
 6. Xcode 7.x against OSX SDK 10.11 (EC)
+7. Xcode 8.0 against OSX SDK 10.12 (EC)
+8. Xcode 8.0 against OSX SDK 10.12 (S)
 
 -----------------------------------------------------------------------------
 3.2 Install Kodi build depends
diff --git a/lib/addons/library.kodi.guilib/Makefile.in b/lib/addons/library.kodi.guilib/Makefile.in
index 34f221d..350fbb2 100644
--- a/lib/addons/library.kodi.guilib/Makefile.in
+++ b/lib/addons/library.kodi.guilib/Makefile.in
@@ -14,8 +14,8 @@ LIB_SHARED=../../../addons/library.kodi.guilib/$(LIBNAME)-$(ARCH).so
 endif
 
 GENERATED_ADDON_GUILIB = ../../../addons/kodi.guilib/addon.xml
-LIB_VERSION := $(shell sed -n 's/.*KODI_GUILIB_API_VERSION\s*"\(.*\)"/\1/p' $(LIB_INTERFACE))
-LIB_VERSION_MIN := $(shell sed -n 's/.*KODI_GUILIB_MIN_API_VERSION\s*"\(.*\)"/\1/p' $(LIB_INTERFACE))
+LIB_VERSION := $(shell sed -n 's/.*KODI_GUILIB_API_VERSION[[:space:]]*"\(.*\)"/\1/p' $(LIB_INTERFACE))
+LIB_VERSION_MIN := $(shell sed -n 's/.*KODI_GUILIB_MIN_API_VERSION[[:space:]]*"\(.*\)"/\1/p' $(LIB_INTERFACE))
 
 all: $(LIB_SHARED) $(GENERATED_ADDON_GUILIB)
 
diff --git a/lib/libUPnP/CMakeLists.txt b/lib/libUPnP/CMakeLists.txt
index 73a1d74..a3aaa49 100644
--- a/lib/libUPnP/CMakeLists.txt
+++ b/lib/libUPnP/CMakeLists.txt
@@ -81,7 +81,6 @@ else()
   list(APPEND SOURCES Neptune/Source/System/Win32/NptWin32Console.cpp
                       Neptune/Source/System/Win32/NptWin32Debug.cpp
                       Neptune/Source/System/Win32/NptWin32DynamicLibraries.cpp
-                      Neptune/Source/System/Win32/NptWin32File.cpp
                       Neptune/Source/System/Win32/NptWin32MessageQueue.cpp
                       Neptune/Source/System/Win32/NptWin32Network.cpp
                       Neptune/Source/System/Win32/NptWin32Queue.cpp
diff --git a/project/cmake/CMakeLists.txt b/project/cmake/CMakeLists.txt
index ab7a2f5..76870a4 100644
--- a/project/cmake/CMakeLists.txt
+++ b/project/cmake/CMakeLists.txt
@@ -178,6 +178,11 @@ if(ENABLE_OPTICAL)
   core_require_dep(Cdio)
 endif()
 
+if(ENABLE_LIRC)
+  set(LIRC_DEVICE /dev/lircd CACHE STRING "LIRC device to use")
+  list(APPEND DEP_DEFINES -DLIRC_DEVICE="${LIRC_DEVICE}" -DHAVE_LIRC=1)
+endif()
+
 if(ENABLE_AIRTUNES)
   find_package(Shairplay)
   if(SHAIRPLAY_FOUND)
diff --git a/project/cmake/modules/FindCCache.cmake b/project/cmake/modules/FindCCache.cmake
index 3ac4a6d..a7fd29f 100644
--- a/project/cmake/modules/FindCCache.cmake
+++ b/project/cmake/modules/FindCCache.cmake
@@ -7,7 +7,11 @@
 # See: https://crascit.com/2016/04/09/using-ccache-with-cmake/
 
 find_program(CCACHE_PROGRAM ccache)
-if(CCACHE_PROGRAM)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(CCACHE REQUIRED_VARS CCACHE_PROGRAM)
+
+if(CCACHE_FOUND)
   # Supports Unix Makefiles and Ninja
   set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
   set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK "${CCACHE_PROGRAM}")
diff --git a/project/cmake/modules/FindLibDvd.cmake b/project/cmake/modules/FindLibDvd.cmake
index 285c6cb..9a1f596 100644
--- a/project/cmake/modules/FindLibDvd.cmake
+++ b/project/cmake/modules/FindLibDvd.cmake
@@ -1,157 +1,204 @@
-set(dvdlibs libdvdread libdvdnav)
-if(ENABLE_DVDCSS)
-  list(APPEND dvdlibs libdvdcss)
-endif()
-
 if(NOT WIN32)
-  foreach(dvdlib ${dvdlibs})
-    file(GLOB VERSION_FILE ${CORE_SOURCE_DIR}/tools/depends/target/${dvdlib}/DVD*-VERSION)
-    file(STRINGS ${VERSION_FILE} VER)
-    string(REGEX MATCH "VERSION=[^ ]*$.*" ${dvdlib}_VER "${VER}")
-    list(GET ${dvdlib}_VER 0 ${dvdlib}_VER)
-    string(SUBSTRING "${${dvdlib}_VER}" 8 -1 ${dvdlib}_VER)
-    string(REGEX MATCH "BASE_URL=([^ ]*)" ${dvdlib}_BASE_URL "${VER}")
-    list(GET ${dvdlib}_BASE_URL 0 ${dvdlib}_BASE_URL)
-    string(SUBSTRING "${${dvdlib}_BASE_URL}" 9 -1 ${dvdlib}_BASE_URL)
-    string(TOUPPER ${dvdlib} DVDLIB)
-
-    # allow user to override the download URL with a local tarball
-    # needed for offline build envs
-    # allow upper and lowercase var name
-    if(${dvdlib}_URL)
-      set(${DVDLIB}_URL ${${dvdlib}_URL})
+  if(CMAKE_CROSSCOMPILING)
+    set(_dvdlibs dvdread dvdnav)
+    set(_handlevars LIBDVD_INCLUDE_DIRS DVDREAD_LIBRARY DVDNAV_LIBRARY)
+    if(ENABLE_DVDCSS)
+      list(APPEND _dvdlibs libdvdcss)
+      list(APPEND _handlevars DVDCSS_LIBRARY)
     endif()
-    if(${DVDLIB}_URL)
-      get_filename_component(${DVDLIB}_URL "${${DVDLIB}_URL}" ABSOLUTE)
-    else()
-      set(${DVDLIB}_URL ${${dvdlib}_BASE_URL}/archive/${${dvdlib}_VER}.tar.gz)
+
+    if(PKG_CONFIG_FOUND)
+      pkg_check_modules(PC_DVD ${_dvdlibs} QUIET)
     endif()
-    if(VERBOSE)
-      message(STATUS "${DVDLIB}_URL: ${${DVDLIB}_URL}")
+ 
+    find_path(LIBDVD_INCLUDE_DIRS dvdnav/dvdnav.h PATHS ${PC_DVD_INCLUDE_DIRS})
+    find_library(DVDREAD_LIBRARY NAMES dvdread libdvdread PATHS ${PC_DVD_dvdread_LIBDIR})
+    find_library(DVDNAV_LIBRARY NAMES dvdnav libdvdnav PATHS ${PC_DVD_dvdnav_LIBDIR})
+    if(ENABLE_DVDCSS)
+      find_library(DVDCSS_LIBRARY NAMES dvdcss libdvdcss PATHS ${PC_DVD_libdvdcss_LIBDIR})
     endif()
-  endforeach()
 
-  set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include")
-  if(CMAKE_CROSSCOMPILING)
-    set(EXTRA_FLAGS "CC=${CMAKE_C_COMPILER}")
-  endif()
+    include(FindPackageHandleStandardArgs)
+    find_package_handle_standard_args(LIBDVD REQUIRED_VARS ${_handlevars})
+    if(LIBDVD_FOUND)
+      add_library(dvdnav UNKNOWN IMPORTED)
+      set_target_properties(dvdnav PROPERTIES
+                                   FOLDER "External Projects"
+                                   IMPORTED_LOCATION "${DVDNAV_LIBRARY}")
+
+      add_library(dvdread UNKNOWN IMPORTED)
+      set_target_properties(dvdread PROPERTIES
+                                    FOLDER "External Projects"
+                                    IMPORTED_LOCATION "${DVDREAD_LIBRARY}")
+      add_library(dvdcss UNKNOWN IMPORTED)
+      set_target_properties(dvdcss PROPERTIES
+                                   FOLDER "External Projects"
+                                   IMPORTED_LOCATION "${DVDCSS_LIBRARY}")
+
+      set(_linklibs ${DVDREAD_LIBRARY})
+      if(ENABLE_DVDCSS)
+        list(APPEND _linklibs ${DVDCSS_LIBARY})
+      endif()
+      core_link_library(${DVDNAV_LIBRARY} system/players/VideoPlayer/libdvdnav dvdnav archives "${_linklibs}")
+      set(LIBDVD_LIBRARIES ${DVDNAV_LIBRARY})
+      mark_as_advanced(LIBDVD_INCLUDE_DIRS LIBDVD_LIBRARIES)
+    endif()
+  else()
+    set(dvdlibs libdvdread libdvdnav)
+    if(ENABLE_DVDCSS)
+      list(APPEND dvdlibs libdvdcss)
+    endif()
+    foreach(dvdlib ${dvdlibs})
+      file(GLOB VERSION_FILE ${CORE_SOURCE_DIR}/tools/depends/target/${dvdlib}/DVD*-VERSION)
+      file(STRINGS ${VERSION_FILE} VER)
+      string(REGEX MATCH "VERSION=[^ ]*$.*" ${dvdlib}_VER "${VER}")
+      list(GET ${dvdlib}_VER 0 ${dvdlib}_VER)
+      string(SUBSTRING "${${dvdlib}_VER}" 8 -1 ${dvdlib}_VER)
+      string(REGEX MATCH "BASE_URL=([^ ]*)" ${dvdlib}_BASE_URL "${VER}")
+      list(GET ${dvdlib}_BASE_URL 0 ${dvdlib}_BASE_URL)
+      string(SUBSTRING "${${dvdlib}_BASE_URL}" 9 -1 ${dvdlib}_BASE_URL)
+      string(TOUPPER ${dvdlib} DVDLIB)
+
+      # allow user to override the download URL with a local tarball
+      # needed for offline build envs
+      # allow upper and lowercase var name
+      if(${dvdlib}_URL)
+        set(${DVDLIB}_URL ${${dvdlib}_URL})
+      endif()
+      if(${DVDLIB}_URL)
+        get_filename_component(${DVDLIB}_URL "${${DVDLIB}_URL}" ABSOLUTE)
+      else()
+        set(${DVDLIB}_URL ${${dvdlib}_BASE_URL}/archive/${${dvdlib}_VER}.tar.gz)
+      endif()
+      if(VERBOSE)
+        message(STATUS "${DVDLIB}_URL: ${${DVDLIB}_URL}")
+      endif()
+    endforeach()
+
+    set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include")
+    if(CMAKE_CROSSCOMPILING)
+      set(EXTRA_FLAGS "CC=${CMAKE_C_COMPILER}")
+    endif()
 
-  if(APPLE)
-    set(CMAKE_LD_FLAGS "-framework IOKit -framework CoreFoundation")
-  endif()
+    if(APPLE)
+      set(CMAKE_LD_FLAGS "-framework IOKit -framework CoreFoundation")
+    endif()
 
-  set(HOST_ARCH ${ARCH})
-  if(CORE_SYSTEM_NAME STREQUAL android)
-    if(ARCH STREQUAL arm)
-      set(HOST_ARCH arm-linux-androideabi)
-    elseif(ARCH STREQUAL i486-linux)
-      set(HOST_ARCH i686-linux-android)
+    set(HOST_ARCH ${ARCH})
+    if(CORE_SYSTEM_NAME STREQUAL android)
+      if(ARCH STREQUAL arm)
+        set(HOST_ARCH arm-linux-androideabi)
+      elseif(ARCH STREQUAL i486-linux)
+        set(HOST_ARCH i686-linux-android)
+      endif()
+    endif()
+
+    if(ENABLE_DVDCSS)
+      set(DVDCSS_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdcss.a)
+      ExternalProject_Add(dvdcss URL ${LIBDVDCSS_URL}
+                                 DOWNLOAD_NAME libdvdcss-${libdvdcss_VER}.tar.gz
+                                 DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/download
+                                 PREFIX ${CORE_BUILD_DIR}/libdvd
+                                 CONFIGURE_COMMAND ac_cv_path_GIT= <SOURCE_DIR>/configure
+                                                   --target=${HOST_ARCH}
+                                                   --host=${HOST_ARCH}
+                                                   --disable-doc
+                                                   --enable-static
+                                                   --disable-shared
+                                                   --with-pic
+                                                   --prefix=<INSTALL_DIR>
+                                                   --libdir=<INSTALL_DIR>/lib
+                                                   "${EXTRA_FLAGS}"
+                                                   "CFLAGS=${CMAKE_C_FLAGS} ${DVDREAD_CFLAGS}"
+                                                   "LDFLAGS=${CMAKE_LD_FLAGS}"
+                                 BUILD_BYPRODUCTS ${DVDCSS_LIBRARY})
+      ExternalProject_Add_Step(dvdcss autoreconf
+                                      DEPENDEES download update patch
+                                      DEPENDERS configure
+                                      COMMAND PATH=${NATIVEPREFIX}/bin:$ENV{PATH} autoreconf -vif
+                                      WORKING_DIRECTORY <SOURCE_DIR>)
+
+      set_target_properties(dvdcss PROPERTIES FOLDER "External Projects")
     endif()
-  endif()
 
-  if(ENABLE_DVDCSS)
-    set(DVDCSS_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdcss.a)
-    ExternalProject_Add(dvdcss URL ${LIBDVDCSS_URL}
-                               DOWNLOAD_NAME libdvdcss-${libdvdcss_VER}.tar.gz
+    set(DVDREAD_CFLAGS "-D_XBMC")
+    if(ENABLE_DVDCSS)
+      set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -DHAVE_DVDCSS_DVDCSS_H -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include")
+    endif()
+
+    set(DVDREAD_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdread.a)
+    ExternalProject_Add(dvdread URL ${LIBDVDREAD_URL}
+                                DOWNLOAD_NAME libdvdread-${libdvdread_VER}.tar.gz
+                                DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/download
+                                PREFIX ${CORE_BUILD_DIR}/libdvd
+                                CONFIGURE_COMMAND ac_cv_path_GIT= <SOURCE_DIR>/configure
+                                                  --target=${HOST_ARCH}
+                                                  --host=${HOST_ARCH}
+                                                  --enable-static
+                                                  --disable-shared
+                                                  --with-pic
+                                                  --prefix=<INSTALL_DIR>
+                                                  --libdir=<INSTALL_DIR>/lib
+                                                  "${EXTRA_FLAGS}"
+                                                  "CFLAGS=${CMAKE_C_FLAGS} ${DVDREAD_CFLAGS}"
+                                                  "LDFLAGS=${CMAKE_LD_FLAGS}"
+                              BUILD_BYPRODUCTS ${DVDREAD_LIBRARY})
+    ExternalProject_Add_Step(dvdread autoreconf
+                                     DEPENDEES download update patch
+                                     DEPENDERS configure
+                                     COMMAND PATH=${NATIVEPREFIX}/bin:$ENV{PATH} autoreconf -vif
+                                     WORKING_DIRECTORY <SOURCE_DIR>)
+    if(ENABLE_DVDCSS)
+      add_dependencies(dvdread dvdcss)
+    endif()
+
+    set_target_properties(dvdread PROPERTIES FOLDER "External Projects")
+
+    if(ENABLE_DVDCSS)
+      set(DVDNAV_LIBS -ldvdcss)
+    endif()
+
+    set(DVDNAV_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdnav.a)
+    ExternalProject_Add(dvdnav URL ${LIBDVDNAV_URL}
+                               DOWNLOAD_NAME libdvdnav-${libdvdnav_VER}.tar.gz
                                DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/download
                                PREFIX ${CORE_BUILD_DIR}/libdvd
                                CONFIGURE_COMMAND ac_cv_path_GIT= <SOURCE_DIR>/configure
                                                  --target=${HOST_ARCH}
                                                  --host=${HOST_ARCH}
-                                                 --disable-doc
                                                  --enable-static
                                                  --disable-shared
                                                  --with-pic
-                                                 --prefix=<INSTALL_DIR>
-                                                 --libdir=<INSTALL_DIR>/lib
+                                                 --prefix=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd
+                                                 --libdir=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib
                                                  "${EXTRA_FLAGS}"
+                                                 "LDFLAGS=${CMAKE_LD_FLAGS} -L${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib"
                                                  "CFLAGS=${CMAKE_C_FLAGS} ${DVDREAD_CFLAGS}"
-                                                 "LDFLAGS=${CMAKE_LD_FLAGS}"
-                               BUILD_BYPRODUCTS ${DVDCSS_LIBRARY})
-    ExternalProject_Add_Step(dvdcss autoreconf
+                                                 "DVDREAD_CFLAGS=${DVDREAD_CFLAGS}"
+                                                 "DVDREAD_LIBS=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdread.la"
+                                                 "LIBS=${DVDNAV_LIBS}"
+                               BUILD_BYPRODUCTS ${DVDNAV_LIBRARY})
+    ExternalProject_Add_Step(dvdnav autoreconf
                                     DEPENDEES download update patch
                                     DEPENDERS configure
                                     COMMAND PATH=${NATIVEPREFIX}/bin:$ENV{PATH} autoreconf -vif
                                     WORKING_DIRECTORY <SOURCE_DIR>)
+    add_dependencies(dvdnav dvdread)
+    set_target_properties(dvdnav PROPERTIES FOLDER "External Projects")
 
-    set_target_properties(dvdcss PROPERTIES FOLDER "External Projects")
-    core_link_library(${DVDCSS_LIBRARY} system/players/VideoPlayer/libdvdcss dvdcss)
-  endif()
-
-  set(DVDREAD_CFLAGS "-D_XBMC")
-  if(ENABLE_DVDCSS)
-    set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -DHAVE_DVDCSS_DVDCSS_H -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include")
-  endif()
-
-  set(DVDREAD_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdread.a)
-  ExternalProject_Add(dvdread URL ${LIBDVDREAD_URL}
-                              DOWNLOAD_NAME libdvdread-${libdvdread_VER}.tar.gz
-                              DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/download
-                              PREFIX ${CORE_BUILD_DIR}/libdvd
-                              CONFIGURE_COMMAND ac_cv_path_GIT= <SOURCE_DIR>/configure
-                                                --target=${HOST_ARCH}
-                                                --host=${HOST_ARCH}
-                                                --enable-static
-                                                --disable-shared
-                                                --with-pic
-                                                --prefix=<INSTALL_DIR>
-                                                --libdir=<INSTALL_DIR>/lib
-                                                "${EXTRA_FLAGS}"
-                                                "CFLAGS=${CMAKE_C_FLAGS} ${DVDREAD_CFLAGS}"
-                                                "LDFLAGS=${CMAKE_LD_FLAGS}"
-                              BUILD_BYPRODUCTS ${DVDREAD_LIBRARY})
-  ExternalProject_Add_Step(dvdread autoreconf
-                                   DEPENDEES download update patch
-                                   DEPENDERS configure
-                                   COMMAND PATH=${NATIVEPREFIX}/bin:$ENV{PATH} autoreconf -vif
-                                   WORKING_DIRECTORY <SOURCE_DIR>)
-  if(ENABLE_DVDCSS)
-    add_dependencies(dvdread dvdcss)
-  endif()
-
-  set_target_properties(dvdread PROPERTIES FOLDER "External Projects")
-  core_link_library(${DVDREAD_LIBRARY} system/players/VideoPlayer/libdvdread dvdread)
-
-  if(ENABLE_DVDCSS)
-    set(DVDNAV_LIBS -ldvdcss)
-  endif()
+    set(_dvdlibs ${DVDREAD_LIBRARY} ${DVDCSS_LIBRARY})
+    # link a shared dvdnav library that includes the whole archives of dvdread and dvdcss as well
+    # the quotes around _dvdlibs are on purpose, since we want to pass a list to the function that will be unpacked automatically
+    core_link_library(${DVDNAV_LIBRARY} system/players/VideoPlayer/libdvdnav dvdnav archives "${_dvdlibs}")
 
-  set(DVDNAV_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdnav.a)
-  ExternalProject_Add(dvdnav URL ${LIBDVDNAV_URL}
-                             DOWNLOAD_NAME libdvdnav-${libdvdnav_VER}.tar.gz
-                             DOWNLOAD_DIR ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/download
-                             PREFIX ${CORE_BUILD_DIR}/libdvd
-                             CONFIGURE_COMMAND ac_cv_path_GIT= <SOURCE_DIR>/configure
-                                               --target=${HOST_ARCH}
-                                               --host=${HOST_ARCH}
-                                               --enable-static
-                                               --disable-shared
-                                               --with-pic
-                                               --prefix=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd
-                                               --libdir=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib
-                                               "${EXTRA_FLAGS}"
-                                               "LDFLAGS=${CMAKE_LD_FLAGS} -L${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib"
-                                               "CFLAGS=${CMAKE_C_FLAGS} ${DVDREAD_CFLAGS}"
-                                               "DVDREAD_CFLAGS=${DVDREAD_CFLAGS}"
-                                               "DVDREAD_LIBS=${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdread.la"
-                                               "LIBS=${DVDNAV_LIBS}"
-                             BUILD_BYPRODUCTS ${DVDNAV_LIBRARY})
-  ExternalProject_Add_Step(dvdnav autoreconf
-                                  DEPENDEES download update patch
-                                  DEPENDERS configure
-                                  COMMAND PATH=${NATIVEPREFIX}/bin:$ENV{PATH} autoreconf -vif
-                                  WORKING_DIRECTORY <SOURCE_DIR>)
-  add_dependencies(dvdnav dvdread)
-  set_target_properties(dvdnav PROPERTIES FOLDER "External Projects")
-  core_link_library(${DVDNAV_LIBRARY} system/players/VideoPlayer/libdvdnav dvdnav)
-
-  set(LIBDVD_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include)
-  set(LIBDVD_LIBRARIES ${DVDNAV_LIBRARY} ${DVDREAD_LIBRARY})
-  if(ENABLE_DVDCSS)
-    list(APPEND LIBDVD_LIBRARIES ${DVDCSS_LIBRARY})
-  endif()
-  set(LIBDVD_LIBRARIES ${LIBDVD_LIBRARIES} CACHE STRING "libdvd libraries" FORCE)
-  set(LIBDVD_FOUND 1 CACHE BOOL "libdvd found" FORCE)
+    set(LIBDVD_INCLUDE_DIRS ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include)
+    set(LIBDVD_LIBRARIES ${DVDNAV_LIBRARY} ${DVDREAD_LIBRARY})
+    if(ENABLE_DVDCSS)
+      list(APPEND LIBDVD_LIBRARIES ${DVDCSS_LIBRARY})
+    endif()
+    set(LIBDVD_LIBRARIES ${LIBDVD_LIBRARIES} CACHE STRING "libdvd libraries" FORCE)
+    set(LIBDVD_FOUND 1 CACHE BOOL "libdvd found" FORCE)
+    endif()
 else()
   # Dynamically loaded on Windows
   find_path(LIBDVD_INCLUDE_DIR dvdcss/dvdcss.h PATHS ${CORE_SOURCE_DIR}/lib/libdvd/include)
diff --git a/project/cmake/scripts/common/AddonHelpers.cmake b/project/cmake/scripts/common/AddonHelpers.cmake
index 9f7a033..bf40799 100644
--- a/project/cmake/scripts/common/AddonHelpers.cmake
+++ b/project/cmake/scripts/common/AddonHelpers.cmake
@@ -158,7 +158,7 @@ macro (build_addon target prefix libs)
     endif()
     add_cpack_workaround(${target} ${${prefix}_VERSION} ${ext})
   else()
-    if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+    if(CORE_SYSTEM_NAME STREQUAL linux OR CORE_SYSTEM_NAME STREQUAL rbpi OR CORE_SYSTEM_NAME STREQUAL freebsd)
       if(NOT OVERRIDE_PATHS)
         if(CMAKE_INSTALL_PREFIX AND NOT CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT AND NOT CMAKE_INSTALL_PREFIX STREQUAL "${${APP_NAME_UC}_PREFIX}")
           message(WARNING "CMAKE_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX} differs from ${APP_NAME} prefix, changing to ${${APP_NAME_UC}_PREFIX}. Please pass -DOVERRIDE_PATHS=1 to skip this check")
diff --git a/project/cmake/scripts/common/GeneratorSetup.cmake b/project/cmake/scripts/common/GeneratorSetup.cmake
index 47b43de..304b504 100644
--- a/project/cmake/scripts/common/GeneratorSetup.cmake
+++ b/project/cmake/scripts/common/GeneratorSetup.cmake
@@ -38,6 +38,11 @@ if(APPLE AND CMAKE_VERSION VERSION_LESS 3.4)
                   "or the usage of the patched version in depends.")
 endif()
 
+# Windows needs CMake 3.6 (VS_STARTUP_PROJECT)
+if(WIN32 AND CMAKE_VERSION VERSION_LESS 3.6)
+  message(FATAL_ERROR "Build on Windows needs CMake 3.6 or later")
+endif()
+
 # Ninja needs CMake 3.2 due to ExternalProject BUILD_BYPRODUCTS usage
 if(CMAKE_GENERATOR STREQUAL Ninja AND CMAKE_VERSION VERSION_LESS 3.2)
   message(FATAL_ERROR "Generator: Ninja requires CMake 3.2 or later")
diff --git a/project/cmake/scripts/common/Macros.cmake b/project/cmake/scripts/common/Macros.cmake
index 4f0ae67..b30dfab 100644
--- a/project/cmake/scripts/common/Macros.cmake
+++ b/project/cmake/scripts/common/Macros.cmake
@@ -211,6 +211,14 @@ function(copy_file_to_buildtree file)
     file(APPEND ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/ExportFiles.cmake "# Export files to build tree\n")
   endif()
 
+  # Exclude autotools build artefacts and other blacklisted files in source tree.
+  if(file MATCHES "(Makefile|\.in|\.xbt|\.so|\.dylib|\.gitignore)$")
+    if(VERBOSE)
+      message(STATUS "copy_file_to_buildtree - ignoring file: ${file}")
+    endif()
+    return()
+  endif()
+
   if(NOT file STREQUAL ${CMAKE_BINARY_DIR}/${outfile})
     if(VERBOSE)
       message(STATUS "copy_file_to_buildtree - copying file: ${file} -> ${CMAKE_BINARY_DIR}/${outfile}")
diff --git a/project/cmake/scripts/freebsd/ArchSetup.cmake b/project/cmake/scripts/freebsd/ArchSetup.cmake
index b85121f..013205c 100644
--- a/project/cmake/scripts/freebsd/ArchSetup.cmake
+++ b/project/cmake/scripts/freebsd/ArchSetup.cmake
@@ -14,6 +14,3 @@ else()
     message(WARNING "unknown CPU: ${CPU}")
   endif()
 endif()
-
-set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use")
-set(DEP_DEFINES -DLIRC_DEVICE=${LIRC_DEVICE})
diff --git a/project/cmake/scripts/linux/ArchSetup.cmake b/project/cmake/scripts/linux/ArchSetup.cmake
index 3cf5562..cae0bb8 100644
--- a/project/cmake/scripts/linux/ArchSetup.cmake
+++ b/project/cmake/scripts/linux/ArchSetup.cmake
@@ -24,14 +24,14 @@ else()
   endif()
 endif()
 
+# Make sure we strip binaries in Release build
+if(CMAKE_BUILD_TYPE STREQUAL Release AND CMAKE_COMPILER_IS_GNUCXX)
+  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -s")
+endif()
+
 find_package(CXX11 REQUIRED)
 include(LDGOLD)
 
-if(ENABLE_LIRC)
-  set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use")
-  set(DEP_DEFINES -DLIRC_DEVICE=${LIRC_DEVICE} -DHAVE_LIRC=1)
-endif()
-
 # Code Coverage
 if(CMAKE_BUILD_TYPE STREQUAL Coverage)
   set(COVERAGE_TEST_BINARY ${APP_NAME_LC}-test)
diff --git a/project/cmake/scripts/linux/Macros.cmake b/project/cmake/scripts/linux/Macros.cmake
index 3ddf282..2c89eab 100644
--- a/project/cmake/scripts/linux/Macros.cmake
+++ b/project/cmake/scripts/linux/Macros.cmake
@@ -27,20 +27,23 @@ function(core_link_library lib wraplib)
     foreach(arg ${data_arg})
       list(APPEND export ${arg})
     endforeach()
+  elseif(check_arg STREQUAL archives)
+    set(extra_libs ${data_arg})
   endif()
+
   get_filename_component(dir ${wraplib} PATH)
-  add_custom_command(OUTPUT ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
+  add_custom_command(OUTPUT ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
                      COMMAND cmake -E make_directory ${dir}
                      COMMAND ${CMAKE_C_COMPILER}
                      ARGS    -Wl,--whole-archive
-                             "${link_lib}"
+                             "${link_lib}" ${extra_libs}
                              -Wl,--no-whole-archive -lm
                              -shared -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX}
                              ${export}
                      DEPENDS ${target} wrapper.def wrapper)
 
   get_filename_component(libname ${wraplib} NAME_WE)
-  add_custom_target(wrap_${libname} ALL DEPENDS ${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX})
+  add_custom_target(wrap_${libname} ALL DEPENDS ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${CMAKE_SHARED_MODULE_SUFFIX})
   set_target_properties(wrap_${libname} PROPERTIES FOLDER lib/wrapped)
   add_dependencies(${APP_NAME_LC}-libraries wrap_${libname})
 
diff --git a/project/cmake/scripts/osx/Macros.cmake b/project/cmake/scripts/osx/Macros.cmake
index 3bfc679..7aed2ac 100644
--- a/project/cmake/scripts/osx/Macros.cmake
+++ b/project/cmake/scripts/osx/Macros.cmake
@@ -30,6 +30,8 @@ function(core_link_library lib wraplib)
     foreach(arg ${data_arg})
       list(APPEND export ${arg})
     endforeach()
+  elseif(check_arg STREQUAL archives)
+    set(extra_libs ${data_arg})
   endif()
   get_filename_component(dir ${wraplib} PATH)
 
@@ -41,7 +43,7 @@ function(core_link_library lib wraplib)
   add_custom_command(OUTPUT ${wraplib}-${ARCH}${extension}
                      COMMAND ${CMAKE_COMMAND} -E make_directory ${dir}
                      COMMAND ${CMAKE_C_COMPILER}
-                     ARGS    ${CUSTOM_COMMAND_ARGS_LDFLAGS} ${export} -Wl,-force_load ${link_lib}
+                     ARGS    ${CUSTOM_COMMAND_ARGS_LDFLAGS} ${export} -Wl,-force_load ${link_lib} ${extra_libs}
                              -o ${CMAKE_BINARY_DIR}/${wraplib}-${ARCH}${extension}
                      DEPENDS ${target} wrapper.def wrapper
                      VERBATIM)
diff --git a/project/cmake/scripts/rbpi/ArchSetup.cmake b/project/cmake/scripts/rbpi/ArchSetup.cmake
index 93ac01d..fa1f9f4 100644
--- a/project/cmake/scripts/rbpi/ArchSetup.cmake
+++ b/project/cmake/scripts/rbpi/ArchSetup.cmake
@@ -23,8 +23,6 @@ endif()
 
 find_package(CXX11 REQUIRED)
 
-set(LIRC_DEVICE "\"/dev/lircd\"" CACHE STRING "LIRC device to use")
-set(DEP_DEFINES -DLIRC_DEVICE=${LIRC_DEVICE})
 set(MMAL_FOUND 1 CACHE INTERNAL "MMAL")
 set(OMX_FOUND 1 CACHE INTERNAL "OMX")
 set(OMXLIB_FOUND 1 CACHE INTERNAL "OMX")
diff --git a/project/cmake/scripts/windows/ArchSetup.cmake b/project/cmake/scripts/windows/ArchSetup.cmake
index b912dcb..431b641 100644
--- a/project/cmake/scripts/windows/ArchSetup.cmake
+++ b/project/cmake/scripts/windows/ArchSetup.cmake
@@ -27,7 +27,6 @@ set(SYSTEM_DEFINES -DNOMINMAX -D_USE_32BIT_TIME_T -DHAS_DX -D__STDC_CONSTANT_MAC
                    -DTAGLIB_STATIC -DNPT_CONFIG_ENABLE_LOGGING
                    -DPLT_HTTP_DEFAULT_USER_AGENT="UPnP/1.0 DLNADOC/1.50 Kodi"
                    -DPLT_HTTP_DEFAULT_SERVER="UPnP/1.0 DLNADOC/1.50 Kodi"
-                   -DBUILDING_WITH_CMAKE
                    $<$<CONFIG:Debug>:-DD3D_DEBUG_INFO -D_ITERATOR_DEBUG_LEVEL=0>)
 
 # Make sure /FS is set for Visual Studio in order to prevent simultanious access to pdb files.
diff --git a/system/keyboardlayouts/italian.xml b/system/keyboardlayouts/italian.xml
new file mode 100644
index 0000000..9545f87
--- /dev/null
+++ b/system/keyboardlayouts/italian.xml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<!--
+Please use English language names instead.
+Default font lacks support for all characters
+-->
+<keyboardlayouts>
+  <layout language="Italian" layout="QWERTY">
+    <keyboard>
+      <row>1234567890'ì</row>
+      <row>qwertyuiopè+</row>
+      <row>asdfghjklòàù</row>
+      <row>zxcvbnm,.-</row>
+    </keyboard>
+    <keyboard modifiers="shift">
+      <row>1234567890?^</row>
+      <row>QWERTYUIOPé*</row>
+      <row>ASDFGHJKLç°§</row>
+      <row>ZXCVBNM;:_</row>
+    </keyboard>
+    <keyboard modifiers="symbol,shift+symbol">
+      <row>/\|@€#[]<>`~</row>
+      <row>!"£$%&()='?</row>
+      <row><>,.-+*_^§ç</row>
+    </keyboard>
+  </layout>
+</keyboardlayouts>
diff --git a/system/keymaps/customcontroller.AppleRemote.xml b/system/keymaps/customcontroller.AppleRemote.xml
index 4a47364..46d7d3e 100644
--- a/system/keymaps/customcontroller.AppleRemote.xml
+++ b/system/keymaps/customcontroller.AppleRemote.xml
@@ -1,33 +1,40 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- This file contains the mapping of keys (gamepad,remote and keyboard) to actions within XBMC -->
-<!-- The <global> section is a fall through - they will only be used if the button is not        -->
-<!-- used in the current window's section.  Note that there is only handling                     -->
-<!-- for a single action per button at this stage.                                               -->
-<!-- For joystick/gamepad configuration under linux/win32, see below as it differs from xbox     -->
-<!-- gamepads.                                                                                   -->
-
-<!-- The format is:                                                                              -->
-<!--    <device>                                                                                 -->
-<!--      <button id=""#>xbmc action</button>                                                    -->
-<!--    </device>                                                                                -->
-
-<!-- To map keys from other remotes using the RCA protocol, you may add <customcontroller name="AppleRemote"> blocks -->
-<!-- In this case, the tags used are <button id=""#> where # is the original button code (OBC) of the key -->
-<!-- You set it up by adding a <customcontroller name="AppleRemote"> block to the window or <global> section:        -->
-<!--    <customcontroller name="AppleRemote">                                                                        -->
-<!--       <button id="45">Stop</button>                                                          -->
-<!--    </customcontroller>                                                                       -->
-
-<!-- Note that the action can be a built-in function.                                            -->
-<!--            eg <button id="6">ActivateWindow(Favourites)</button>                            -->
-<!-- would bring up Favourites when the button with the id of 6 is press. In this case, "Menu"   -->
-
-<!--                                                                                             -->
-<!--  Button Ids:                                                                                -->
-<!--  'id' is the button ID used by SDL. The key ids recognized from your remote appears      -->
-<!--  in /var/log/syslog on the ATV2 for each button pressed and when debug mode is enabled      -->
-<!--  Use your log to discover and map custom buttons to actions.                                -->
-
+<!-- This file contains the mapping of keys to actions within Kodi.                       -->
+<!--                                                                                      -->
+<!-- The format is:                                                                       -->
+<!--  <window>                                                                            -->
+<!--    <device>                                                                          -->
+<!--      <button>action</button>                                                         -->
+<!--    </device>                                                                         -->
+<!--  </window>                                                                           -->
+<!--                                                                                      -->
+<!-- The <global> section is a fall through - they will only be used if the button is     -->
+<!-- not used in the current window's section.                                            -->
+<!--                                                                                      -->
+<!-- Actions can be built-in functions.                                                   -->
+<!--  eg <button id="6">ActivateWindow(Music)</button>                                    -->
+<!-- would automatically go to Music on the press of the "Menu" button.                   -->
+<!--                                                                                      -->
+<!--                                                                                      -->
+<!-- An empty action removes the corresponding mapping from default and parent keymaps.   -->
+<!-- This is different from a "noop" action, which disables a button.                     -->
+<!--                                                                                      -->
+<!-- More documentation on keymaps can be found on http://kodi.wiki/view/keymaps          -->
+<!--                                                                                      -->
+<!-- To map keys from other remotes using the RCA protocol, you may add                   -->
+<!--   <customcontroller name="AppleRemote"> blocks.                                      -->
+<!-- In this case, the tags used are <button id=""#> where # is the original button code  -->
+<!-- (OBC) of the key.                                                                    -->
+<!-- You set it up by adding a <customcontroller name="AppleRemote"> block to the window  -->
+<!-- or <global> section:                                                                 -->
+<!--    <customcontroller name="AppleRemote">                                             -->
+<!--       <button id="45">Stop</button>                                                  -->
+<!--    </customcontroller>                                                               -->
+<!--                                                                                      -->
+<!--  Button Ids:                                                                         -->
+<!--  'id' is the button ID used by SDL. The key ids recognized from your remote appears  -->
+<!--  in the log file for each button pressed and when debug mode is enabled.             -->
+<!--  Use your log to discover and map custom buttons to actions.                         -->
 <keymap>
   <global>
     <customcontroller name="AppleRemote">
diff --git a/system/keymaps/customcontroller.Harmony.xml b/system/keymaps/customcontroller.Harmony.xml
index 50d82d9..7a7949c 100644
--- a/system/keymaps/customcontroller.Harmony.xml
+++ b/system/keymaps/customcontroller.Harmony.xml
@@ -1,40 +1,40 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- This file contains the mapping of keys (gamepad, remote, and keyboard) to actions within XBMC -->
-<!-- The <global> section is a fall through - they will only be used if the button is not          -->
-<!-- used in the current window's section.  Note that there is only handling                       -->
-<!-- for a single action per button at this stage.                                                 -->
-<!-- For joystick/gamepad configuration under linux/win32, see below as it differs from xbox       -->
-<!-- gamepads.                                                                                     -->
-
-<!-- The format is:                      -->
-<!--    <device>                         -->
-<!--      <button>action</key>        -->
-<!--    </device>                        -->
-
-<!-- To map keys from other remotes using the RCA protocol, you may add <customcontroller name="Harmony"> blocks -->
-<!-- In this case, the tags used are <button id=""#> where # is the original button code (OBC) of the key -->
-<!-- You set it up by adding a <customcontroller name="Harmony"> block to the window or <global> section:       -->
-<!--    <customcontroller name="Harmony">             -->
-<!--       <button id="45">Stop</button>            -->
-<!--    </customcontroller>            -->
-
-<!-- Note that the action can be a built-in function.                 -->
-<!--  eg <B>ActivateWindow(Music)</B>                         -->
-<!-- would automatically go to My Music on the press of the B button. -->
-
-<!-- Joysticks / Gamepads:                                                                    -->
-<!--   See the sample PS3 controller configuration below for the format.                      -->
-<!--                                                                                          -->
-<!--  Joystick Name:                                                                          -->
-<!--   Do 'cat /proc/bus/input/devices' or see your xbmc log file  to find the names of       -->
-<!--   detected joysticks. The name used in the configuration should match the detected name. -->
-<!--                                                                                          -->
-<!--  Button Ids:                                                                             -->
-<!--   'id' is the button ID used by SDL. Joystick key ids of connected joysticks appear   -->
-<!--   in xbmc.log when they are pressed. Use your log to map custom buttons to actions.      -->
-<!--                                                                                          -->
-<!--  Axis Ids / Analog Controls                                                              -->
-<!--   Coming soon.                                                                           -->
+<!-- This file contains the mapping of keys to actions within Kodi.                       -->
+<!--                                                                                      -->
+<!-- The format is:                                                                       -->
+<!--  <window>                                                                            -->
+<!--    <device>                                                                          -->
+<!--      <button>action</button>                                                         -->
+<!--    </device>                                                                         -->
+<!--  </window>                                                                           -->
+<!--                                                                                      -->
+<!-- The <global> section is a fall through - they will only be used if the button is     -->
+<!-- not used in the current window's section.                                            -->
+<!--                                                                                      -->
+<!-- Actions can be built-in functions.                                                   -->
+<!--  eg <button id="6">ActivateWindow(Music)</button>                                    -->
+<!-- would automatically go to Music on the press of the "Menu" button.                   -->
+<!--                                                                                      -->
+<!--                                                                                      -->
+<!-- An empty action removes the corresponding mapping from default and parent keymaps.   -->
+<!-- This is different from a "noop" action, which disables a button.                     -->
+<!--                                                                                      -->
+<!-- More documentation on keymaps can be found on http://kodi.wiki/view/keymaps          -->
+<!--                                                                                      -->
+<!-- To map keys from other remotes using the RCA protocol, you may add                   -->
+<!--   <customcontroller name="Harmony"> blocks.                                          -->
+<!-- In this case, the tags used are <button id=""#> where # is the original button code  -->
+<!-- (OBC) of the key.                                                                    -->
+<!-- You set it up by adding a <customcontroller name="Harmony"> block to the window      -->
+<!-- or <global> section:                                                                 -->
+<!--    <customcontroller name="Harmony">                                                 -->
+<!--       <button id="45">Stop</button>                                                  -->
+<!--    </customcontroller>                                                               -->
+<!--                                                                                      -->
+<!--  Button Ids:                                                                         -->
+<!--  'id' is the button ID used by SDL. The key ids recognized from your remote appears  -->
+<!--  in the log file for each button pressed and when debug mode is enabled.             -->
+<!--  Use your log to discover and map custom buttons to actions.                         -->
 <keymap>
   <global>
     <customcontroller name="Harmony">
@@ -126,13 +126,13 @@
       <!-- * clear 	-->      <button id="145">Delete</button>
     </customcontroller>
   </FileManager>
-  <MyMusicPlaylist>
+  <MusicPlaylist>
     <customcontroller name="Harmony">
       <!-- * clear 	-->      <button id="145">Delete</button>
       <!-- Channel Up  	-->      <button id="171">MoveItemUp</button>
       <!-- Channel Down -->      <button id="172">MoveItemDown</button>
     </customcontroller>
-  </MyMusicPlaylist>
+  </MusicPlaylist>
   <Music>
     <customcontroller name="Harmony">
       <!-- 1 		-->      <button id="111">number1</button>
@@ -289,13 +289,13 @@
       <!-- 9 		-->      <button id="143">JumpSMS9</button>
     </customcontroller>
   </Videos>
-  <MyVideoPlaylist>
+  <VideoPlaylist>
     <customcontroller name="Harmony">
       <!-- * clear 	-->      <button id="145">Delete</button>
       <!-- Channel Up  	-->      <button id="171">MoveItemUp</button>
       <!-- Channel Down -->      <button id="172">MoveItemDown</button>
     </customcontroller>
-  </MyVideoPlaylist>
+  </VideoPlaylist>
   <VirtualKeyboard>
     <customcontroller name="Harmony">
       <!-- Prev		-->      <button id="132">BackSpace</button>
diff --git a/system/keymaps/gamepad.xml b/system/keymaps/gamepad.xml
index a9d1c65..e176751 100644
--- a/system/keymaps/gamepad.xml
+++ b/system/keymaps/gamepad.xml
@@ -1,41 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- This file contains the mapping of keys (gamepad, remote, and keyboard) to actions within XBMC -->
-<!-- The <global> section is a fall through - they will only be used if the button is not          -->
-<!-- used in the current window's section.  Note that there is only handling                       -->
-<!-- for a single action per button at this stage.                                                 -->
-<!-- For joystick/gamepad configuration under linux/win32, see below as it differs from xbox       -->
-<!-- gamepads.                                                                                     -->
-
-<!-- The format is:                      -->
-<!--    <device>                         -->
-<!--      <button>action</button>        -->
-<!--    </device>                        -->
-
-<!-- To map keys from other remotes using the RCA protocol, you may add <universalremote> blocks -->
-<!-- In this case, the tags used are <obc#> where # is the original button code (OBC) of the key -->
-<!-- You set it up by adding a <universalremote> block to the window or <global> section:       -->
-<!--    <universalremote>             -->
-<!--       <obc45>Stop</obc45>         -->
-<!--    </universalremote>            -->
-
-<!-- Note that the action can be a built-in function.                                         -->
-<!--  eg <B>ActivateWindow(Music)</B>                                                       -->
-<!-- would automatically go to My Music on the press of the B button.                         -->
-<!-- An empty action removes the corresponding mapping from the default keymap                -->
-
-<!-- Joysticks / Gamepads:                                                                    -->
-<!--   See the sample PS3 controller configuration below for the format.                      -->
-<!--                                                                                          -->
-<!--  Joystick Name:                                                                          -->
-<!--   Do 'cat /proc/bus/input/devices' or see your xbmc log file  to find the names of       -->
-<!--   detected joysticks. The name used in the configuration should match the detected name. -->
-<!--                                                                                          -->
-<!--  Button Ids:                                                                             -->
-<!--   'id' is the button ID used by SDL. Joystick button ids of connected joysticks appear   -->
-<!--   in xbmc.log when they are pressed. Use your log to map custom buttons to actions.      -->
-<!--                                                                                          -->
-<!--  Axis Ids / Analog Controls                                                              -->
-<!--   Coming soon.                                                                           -->
+<!-- This file contains the mapping of keys to actions within Kodi.                       -->
+<!--                                                                                      -->
+<!-- The format is:                                                                       -->
+<!--  <window>                                                                            -->
+<!--    <device>                                                                          -->
+<!--      <button>action</button>                                                         -->
+<!--    </device>                                                                         -->
+<!--  </window>                                                                           -->
+<!--                                                                                      -->
+<!-- The <global> section is a fall through - they will only be used if the button is     -->
+<!-- not used in the current window's section.                                            -->
+<!--                                                                                      -->
+<!-- Actions can be built-in functions.                                                   -->
+<!--  eg <B>ActivateWindow(Music)</B>                                                     -->
+<!-- would automatically go to Music on the press of the B button.                        -->
+<!--                                                                                      -->
+<!--                                                                                      -->
+<!-- An empty action removes the corresponding mapping from default and parent keymaps.   -->
+<!-- This is different from a "noop" action, which disables a button.                     -->
+<!--                                                                                      -->
+<!-- More documentation on keymaps can be found on http://kodi.wiki/view/keymaps          -->
 <keymap>
   <global>
     <gamepad>
@@ -66,17 +50,17 @@
       <Y>Highlight</Y>
     </gamepad>
   </FileManager>
-  <MyMusicPlaylist>
+  <MusicPlaylist>
     <gamepad>
       <Y>Delete</Y>
       <black>Back</black>
     </gamepad>
-  </MyMusicPlaylist>
-  <MyMusicPlaylistEditor>
+  </MusicPlaylist>
+  <MusicPlaylistEditor>
     <gamepad>
       <Y>Queue</Y>
     </gamepad>
-  </MyMusicPlaylistEditor>
+  </MusicPlaylistEditor>
   <Music>
     <gamepad>
       <Y>Queue</Y>
@@ -260,12 +244,12 @@
       <black>Delete</black>
     </gamepad>
   </Videos>
-  <MyVideoPlaylist>
+  <VideoPlaylist>
     <gamepad>
       <Y>Delete</Y>
       <black>Back</black>
     </gamepad>
-  </MyVideoPlaylist>
+  </VideoPlaylist>
   <VirtualKeyboard>
     <gamepad>
       <start>Enter</start>
diff --git a/system/keymaps/joystick.xml b/system/keymaps/joystick.xml
index 6b7aa92..937baf2 100644
--- a/system/keymaps/joystick.xml
+++ b/system/keymaps/joystick.xml
@@ -1,4 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!-- This file contains the mapping of keys to actions within Kodi.                       -->
+<!--                                                                                      -->
+<!-- The format is:                                                                       -->
+<!--  <window>                                                                            -->
+<!--    <device>                                                                          -->
+<!--      <button>action</button>                                                         -->
+<!--    </device>                                                                         -->
+<!--  </window>                                                                           -->
+<!--                                                                                      -->
+<!-- The <global> section is a fall through - they will only be used if the button is     -->
+<!-- not used in the current window's section.                                            -->
+<!--                                                                                      -->
+<!-- Actions can be built-in functions.                                                   -->
+<!--  eg <B>ActivateWindow(Music)</B>                                                     -->
+<!-- would automatically go to Music on the press of the B button.                        -->
+<!--                                                                                      -->
+<!--                                                                                      -->
+<!-- An empty action removes the corresponding mapping from default and parent keymaps.   -->
+<!-- This is different from a "noop" action, which disables a button.                     -->
+<!--                                                                                      -->
+<!-- More documentation on keymaps can be found on http://kodi.wiki/view/keymaps          -->
 <keymap>
   <global>
     <joystick>
@@ -7,7 +28,7 @@
       <x>ContextMenu</x>
       <y>FullScreen</y>
       <start>ActivateWindow(PlayerControls)</start>
-      <back>Back</back>
+      <back>PreviousMenu</back>
       <guide>ActivateWindow(Home)</guide>
       <up>Up</up>
       <down>Down</down>
@@ -34,11 +55,11 @@
       <rightbumper>Highlight</rightbumper>
     </joystick>
   </FileManager>
-  <MyMusicPlaylist>
+  <MusicPlaylist>
     <joystick>
       <leftbumper>Delete</leftbumper>
     </joystick>
-  </MyMusicPlaylist>
+  </MusicPlaylist>
   <Music>
   </Music>
   <FullscreenVideo>
@@ -200,11 +221,11 @@
   </VideoBookmarks>
   <Videos>
   </Videos>
-  <MyVideoPlaylist>
+  <VideoPlaylist>
     <joystick>
       <leftbumper>Delete</leftbumper>
     </joystick>
-  </MyVideoPlaylist>
+  </VideoPlaylist>
   <VirtualKeyboard>
     <joystick>
       <b>BackSpace</b>
@@ -220,11 +241,6 @@
       <b>Close</b>
     </joystick>
   </ContextMenu>
-  <Programs>
-    <joystick>
-      <x>ContextMenu</x>
-    </joystick>
-  </Programs>
   <Settings>
     <joystick>
       <b>PreviousMenu</b>
diff --git a/system/keymaps/keyboard.xml b/system/keymaps/keyboard.xml
index 496817a..d4dffed 100644
--- a/system/keymaps/keyboard.xml
+++ b/system/keymaps/keyboard.xml
@@ -41,16 +41,19 @@
       <pagedown>PageDown</pagedown>
       <return>Select</return>
       <return mod="longpress">ContextMenu</return>
+      <return mod="ctrl">Enter</return>
       <enter>Select</enter>
       <enter mod="longpress">ContextMenu</enter>
+      <enter mod="ctrl">Enter</enter>
       <backspace>Back</backspace>
       <browser_back>Back</browser_back>
       <browser_back mod="longpress">ActivateWindow(Home)</browser_back>
       <key id='65446'>Back</key>
       <m>Menu</m>
       <n mod="ctrl">ActivateWindow(PlayerControls)</n>
-      <s>ActivateWindow(shutdownmenu)</s>
+      <s>ActivateWindow(ShutdownMenu)</s>
       <escape>PreviousMenu</escape>
+      <escape mod="longpress">Back</escape>
       <i>Info</i>
       <menu>ContextMenu</menu>
       <menu mod="longpress">Menu</menu>
@@ -91,8 +94,8 @@
       <backslash>ToggleFullScreen</backslash>
       <home>FirstPage</home>
       <end>LastPage</end>
-      <power>ActivateWindow(shutdownmenu)</power>
-      <sleep>ActivateWindow(shutdownmenu)</sleep>
+      <power>ActivateWindow(ShutdownMenu)</power>
+      <sleep>ActivateWindow(ShutdownMenu)</sleep>
       <!-- PVR windows -->
       <e>ActivateWindow(TVGuide)</e>
       <epg>ActivateWindow(TVGuide)</epg>
@@ -156,8 +159,8 @@
       <m mod="ctrl,shift">PlayerControl(ShowVideoMenu)</m>         <!-- MCE DVD menu -->
       <o mod="ctrl">ActivateWindow(TVRecordings)</o>  <!-- MCE Recorded TV -->
       <t mod="ctrl">ActivateWindow(TVChannels)</t>  <!-- MCE Live TV  -->
-      <t mod="ctrl,shift">ActivateWindow(TVChannels)</t>  <!-- MCE My TV -->
-      <a mod="ctrl">ActivateWindow(RadioChannels)</a>  <!-- MCE My Radio -->
+      <t mod="ctrl,shift">ActivateWindow(TVChannels)</t>  <!-- MCE TV -->
+      <a mod="ctrl">ActivateWindow(RadioChannels)</a>  <!-- MCE Radio -->
       <!-- MCE keypresses without an obvious use in Kodi -->
       <u mod="ctrl">Notification(MCEKeypress, DVD subtitle, 3)</u>
       <a mod="ctrl,shift">Notification(MCEKeypress, DVD audio, 3)</a>
@@ -192,13 +195,13 @@
       <play_pause mod="longpress">Enter</play_pause>
     </keyboard>
   </VirtualKeyboard>
-  <MyTVChannels>
+  <TVChannels>
     <keyboard>
       <m mod="ctrl">Move</m>
       <h>PreviousMenu</h>
     </keyboard>
-  </MyTVChannels>
-  <MyTVRecordings>
+  </TVChannels>
+  <TVRecordings>
     <keyboard>
       <delete>Delete</delete>
       <r>Rename</r>
@@ -208,8 +211,8 @@
       <yellow>Yellow</yellow>
       <blue>Blue</blue>
     </keyboard>
-  </MyTVRecordings>
-  <MyTVTimers>
+  </TVRecordings>
+  <TVTimers>
     <keyboard>
       <delete>Delete</delete>
       <r>Rename</r>
@@ -219,21 +222,44 @@
       <yellow>Yellow</yellow>
       <blue>Blue</blue>
     </keyboard>
-  </MyTVTimers>
+  </TVTimers>
+  <TVTimerRules>
+    <keyboard>
+      <delete>Delete</delete>
+      <r>Rename</r>
+      <b>PreviousMenu</b>
+      <red>Red</red>
+      <green>Green</green>
+      <yellow>Yellow</yellow>
+      <blue>Blue</blue>
+    </keyboard>
+  </TVTimerRules>
   <TVGuide>
     <keyboard>
       <e>PreviousMenu</e>
       <t>ShowTimerRule</t>
       <epg>PreviousMenu</epg>
+      <backspace mod="longpress">Number0</backspace> <!-- 0 key goes to "now" on EPG timeline -->
+      <browser_back mod="longpress">Number0</browser_back> <!-- 0 key goes to "now" on EPG timeline -->
     </keyboard>
   </TVGuide>
-  <MyRadioChannels>
+  <RadioChannels>
     <keyboard>
       <m mod="ctrl">Move</m>
       <j>PreviousMenu</j>
     </keyboard>
-  </MyRadioChannels>
-  <MyRadioRecordings>
+  </RadioChannels>
+  <RadioRecordings>
+    <keyboard>
+      <delete>Delete</delete>
+      <r>Rename</r>
+      <red>Red</red>
+      <green>Green</green>
+      <yellow>Yellow</yellow>
+      <blue>Blue</blue>
+    </keyboard>
+  </RadioRecordings>
+  <RadioTimers>
     <keyboard>
       <delete>Delete</delete>
       <r>Rename</r>
@@ -242,8 +268,8 @@
       <yellow>Yellow</yellow>
       <blue>Blue</blue>
     </keyboard>
-  </MyRadioRecordings>
-  <MyRadioTimers>
+  </RadioTimers>
+  <RadioTimerRules>
     <keyboard>
       <delete>Delete</delete>
       <r>Rename</r>
@@ -252,11 +278,13 @@
       <yellow>Yellow</yellow>
       <blue>Blue</blue>
     </keyboard>
-  </MyRadioTimers>
+  </RadioTimerRules>
   <RadioGuide>
     <keyboard>
       <e>PreviousMenu</e>
       <t>ShowTimerRule</t>
+      <backspace mod="longpress">Number0</backspace> <!-- 0 key goes to "now" on EPG timeline -->
+      <browser_back mod="longpress">Number0</browser_back> <!-- 0 key goes to "now" on EPG timeline -->
     </keyboard>
   </RadioGuide>
   <FileManager>
@@ -269,7 +297,7 @@
       <backspace mod="longpress">ActivateWindow(Home)</backspace>
     </keyboard>
   </FileManager>
-  <MyMusicPlaylist>
+  <MusicPlaylist>
     <keyboard>
       <n>Back</n>
       <delete>Delete</delete>
@@ -277,15 +305,15 @@
       <d>MoveItemDown</d>
       <backspace mod="longpress">ActivateWindow(Home)</backspace>
     </keyboard>
-  </MyMusicPlaylist>
-  <MyMusicPlaylistEditor>
+  </MusicPlaylist>
+  <MusicPlaylistEditor>
     <keyboard>
       <u>MoveItemUp</u>
       <d>MoveItemDown</d>
       <delete>Delete</delete>
       <backspace mod="longpress">ActivateWindow(Home)</backspace>
     </keyboard>
-  </MyMusicPlaylistEditor>
+  </MusicPlaylistEditor>
   <Music>
     <keyboard>
       <n>Playlist</n>
@@ -314,6 +342,7 @@
       <menu>OSD</menu>
       <i>Info</i>
       <o>PlayerProcessInfo</o>
+      <o mod="ctrl,shift">PlayerDebug</o>
       <z>AspectRatio</z>
       <zoom>AspectRatio</zoom>
       <t>ShowSubtitles</t>
@@ -325,7 +354,10 @@
       <down>ChapterOrBigStepBack</down>
       <up mod="longpress">AudioNextLanguage</up>
       <down mod="longpress">NextSubtitle</down>
+      <left mod="alt">PlayerControl(tempodown)</left>
+      <right mod="alt">PlayerControl(tempoup)</right>
       <a>AudioDelay</a>
+      <a mod="ctrl">AudioNextLanguage</a>
       <escape>Fullscreen</escape>
       <c>Playlist</c>
       <v>ActivateWindow(Teletext)</v>
@@ -334,6 +366,11 @@
       <down mod="ctrl">SubtitleShiftDown</down>
       <pageup>SkipNext</pageup>
       <pagedown>SkipPrevious</pagedown>
+      <plus mod="ctrl">VolAmpUp</plus>
+      <equals mod="ctrl">VolAmpUp</equals>
+      <minus mod="ctrl">VolAmpDown</minus>
+      <b mod="ctrl">CreateBookmark</b>
+      <b mod="alt">CreateEpisodeBookmark</b>
     </keyboard>
   </FullscreenVideo>
   <VideoTimeSeek>
@@ -519,7 +556,7 @@
       <backspace mod="longpress">ActivateWindow(Home)</backspace>
     </keyboard>
   </Videos>
-  <MyVideoPlaylist>
+  <VideoPlaylist>
     <keyboard>
       <n>Back</n>
       <delete>Delete</delete>
@@ -527,13 +564,13 @@
       <d>MoveItemDown</d>
       <backspace mod="longpress">ActivateWindow(Home)</backspace>
     </keyboard>
-  </MyVideoPlaylist>
-  <MyPictures>
+  </VideoPlaylist>
+  <Pictures>
     <keyboard>
       <delete>Delete</delete>
       <backspace mod="longpress">ActivateWindow(Home)</backspace>
     </keyboard>
-  </MyPictures>
+  </Pictures>
   <ContextMenu>
     <keyboard>
       <c>Back</c>
@@ -699,4 +736,4 @@
       <o>PlayerProcessInfo</o>
     </keyboard>
   </PlayerProcessInfo>
-</keymap>
+</keymap>
\ No newline at end of file
diff --git a/system/keymaps/mouse.xml b/system/keymaps/mouse.xml
index c2b39f8..9df7a97 100644
--- a/system/keymaps/mouse.xml
+++ b/system/keymaps/mouse.xml
@@ -1,11 +1,31 @@
 <?xml version="1.0" encoding="UTF-8"?>
-
-<!--  Button Ids:                                                                             -->
-<!--    0: left                                                                               -->
-<!--    1: right                                                                              -->
-<!--    2: middle                                                                             -->
-<!--    3/4/5/6: extra                                                                        -->
-
+<!-- This file contains the mapping of mouse keys to actions within Kodi.                 -->
+<!--                                                                                      -->
+<!-- The format is:                                                                       -->
+<!--  <window>                                                                            -->
+<!--    <device>                                                                          -->
+<!--      <button>action</button>                                                         -->
+<!--    </device>                                                                         -->
+<!--  </window>                                                                           -->
+<!--                                                                                      -->
+<!-- The <global> section is a fall through - they will only be used if the button is     -->
+<!-- not used in the current window's section.                                            -->
+<!--                                                                                      -->
+<!-- Actions can be built-in functions.                                                   -->
+<!--  eg <middleclick>ActivateWindow(Music)</middleclick>                                 -->
+<!-- would automatically go to Music on the press of the middle mouse button.             -->
+<!--                                                                                      -->
+<!--                                                                                      -->
+<!-- An empty action removes the corresponding mapping from default and parent keymaps.   -->
+<!-- This is different from a "noop" action, which disables a button.                     -->
+<!--                                                                                      -->
+<!--  Button Ids:                                                                         -->
+<!--    0: left                                                                           -->
+<!--    1: right                                                                          -->
+<!--    2: middle                                                                         -->
+<!--    3/4/5/6: extra                                                                    -->
+<!--                                                                                      -->
+<!-- More documentation on keymaps can be found on http://kodi.wiki/view/keymaps          -->
 <keymap>
   <global>
     <mouse>
@@ -14,7 +34,6 @@
       <middleclick>middleclick</middleclick>
       <doubleclick id="0">doubleclick</doubleclick>
       <longclick id="0">contextmenu</longclick>
-
       <wheeldown>wheeldown</wheeldown>
       <wheelup>wheelup</wheelup>
       <mousedrag>mousedrag</mousedrag>
@@ -34,6 +53,4 @@
       <rightclick>Info</rightclick>
     </mouse>
   </FullscreenVideo>
-
-
 </keymap>
diff --git a/system/keymaps/remote.xml b/system/keymaps/remote.xml
index 3c791d1..54193b6 100644
--- a/system/keymaps/remote.xml
+++ b/system/keymaps/remote.xml
@@ -15,10 +15,6 @@
 <!--  eg <B>ActivateWindow(Music)</B>                                                     -->
 <!-- would automatically go to Music on the press of the B button.                        -->
 <!--                                                                                      -->
-<!--  Long presses                                                                        -->
-<!--   A limitation is that if a single press is mapped in a section, a global "longpress"-->
-<!--   will be ignored. The workaround is to duplicate the long mapping in the section.   -->
-<!--                                                                                      -->
 <!-- An empty action removes the corresponding mapping from default and parent keymaps.   -->
 <!-- This is different from a "noop" action, which disables a button.                     -->
 <!--                                                                                      -->
@@ -83,12 +79,29 @@
   </global>
   <Home>
     <remote>
-      <info>ActivateWindow(SystemInfo)</info>
       <clear>ActivateWindow(Weather)</clear>
       <hash>ActivateWindow(Settings)</hash>
     </remote>
   </Home>
-  <MyTVRecordings>
+  <TVRecordings>
+    <remote>
+      <clear>Delete</clear>
+      <red>Red</red>
+      <green>Green</green>
+      <yellow>Yellow</yellow>
+      <blue>Blue</blue>
+    </remote>
+  </TVRecordings>
+  <TVTimers>
+    <remote>
+      <clear>Delete</clear>
+      <red>Red</red>
+      <green>Green</green>
+      <yellow>Yellow</yellow>
+      <blue>Blue</blue>
+    </remote>
+  </TVTimers>
+  <TVTimerRules>
     <remote>
       <clear>Delete</clear>
       <red>Red</red>
@@ -96,8 +109,8 @@
       <yellow>Yellow</yellow>
       <blue>Blue</blue>
     </remote>
-  </MyTVRecordings>
-  <MyTVTimers>
+  </TVTimerRules>
+  <RadioRecordings>
     <remote>
       <clear>Delete</clear>
       <red>Red</red>
@@ -105,8 +118,8 @@
       <yellow>Yellow</yellow>
       <blue>Blue</blue>
     </remote>
-  </MyTVTimers>
-  <MyRadioRecordings>
+  </RadioRecordings>
+  <RadioTimers>
     <remote>
       <clear>Delete</clear>
       <red>Red</red>
@@ -114,8 +127,8 @@
       <yellow>Yellow</yellow>
       <blue>Blue</blue>
     </remote>
-  </MyRadioRecordings>
-  <MyRadioTimers>
+  </RadioTimers>
+  <RadioTimerRules>
     <remote>
       <clear>Delete</clear>
       <red>Red</red>
@@ -123,7 +136,7 @@
       <yellow>Yellow</yellow>
       <blue>Blue</blue>
     </remote>
-  </MyRadioTimers>
+  </RadioTimerRules>
   <FileManager>
     <remote>
       <clear>Delete</clear>
@@ -132,28 +145,28 @@
       <hash>Rename</hash>
     </remote>
   </FileManager>
-  <MyMusicPlaylist>
+  <MusicPlaylist>
     <remote>
       <clear>Delete</clear>
       <zero>Delete</zero>
     </remote>
-  </MyMusicPlaylist>
-  <MyMusicPlaylistEditor>
+  </MusicPlaylist>
+  <MusicPlaylistEditor>
     <remote>
       <zero>Queue</zero>
     </remote>
-  </MyMusicPlaylistEditor>
+  </MusicPlaylistEditor>
   <Music>
     <remote>
       <zero>Queue</zero>
       <star>Queue</star>
     </remote>
   </Music>
-  <MyPictures>
+  <Pictures>
     <remote>
       <clear>Delete</clear>
     </remote>
-  </MyPictures>
+  </Pictures>
   <FullscreenVideo>
     <remote>
       <zero>Number0</zero>
@@ -341,12 +354,12 @@
       <clear>Delete</clear>
     </remote>
   </Videos>
-  <MyVideoPlaylist>
+  <VideoPlaylist>
     <remote>
       <clear>Delete</clear>
       <zero>Delete</zero>
     </remote>
-  </MyVideoPlaylist>
+  </VideoPlaylist>
   <VirtualKeyboard>
     <remote>
       <back>Back</back>
diff --git a/system/keymaps/touchscreen.xml b/system/keymaps/touchscreen.xml
index 5124cdf..c3135ae 100644
--- a/system/keymaps/touchscreen.xml
+++ b/system/keymaps/touchscreen.xml
@@ -1,4 +1,25 @@
 <?xml version="1.0" encoding="UTF-8"?>
+<!-- This file contains the mapping of touch gestures to actions within Kodi.             -->
+<!--                                                                                      -->
+<!-- The format is:                                                                       -->
+<!--  <window>                                                                            -->
+<!--    <device>                                                                          -->
+<!--      <gesture>action</gesture>                                                       -->
+<!--    </device>                                                                         -->
+<!--  </window>                                                                           -->
+<!--                                                                                      -->
+<!-- The <global> section is a fall through - they will only be used if the button is     -->
+<!-- not used in the current window's section.                                            -->
+<!--                                                                                      -->
+<!-- Actions can be built-in functions.                                                   -->
+<!--  eg <tap pointers="2">ActivateWindow(Music)</tap>                                    -->
+<!-- would automatically go to Music when two fingers tap the screen at once.             -->
+<!--                                                                                      -->
+<!--                                                                                      -->
+<!-- An empty action removes the corresponding mapping from default and parent keymaps.   -->
+<!-- This is different from a "noop" action, which disables a button.                     -->
+<!--                                                                                      -->
+<!-- More documentation on keymaps can be found on http://kodi.wiki/view/keymaps          -->
 <keymap>
   <global>
     <touch>
@@ -28,7 +49,6 @@
       <swipe direction="right">StepForward</swipe>
       <swipe direction="up">ChapterOrBigStepForward</swipe>
       <swipe direction="down">ChapterOrBigStepBack</swipe>
-      <swipe direction="left" pointers="2">Seek(-7)</swipe>
       <swipe direction="up" pointers="2">SkipNext</swipe>
       <swipe direction="down" pointers="2">SkipPrevious</swipe>
       <tap pointers="2">Playlist</tap>
diff --git a/system/library/music/musicroles/albumartists.xml b/system/library/music/musicroles/albumartists.xml
new file mode 100644
index 0000000..626f224
--- /dev/null
+++ b/system/library/music/musicroles/albumartists.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<node order="10" type="folder">
+	<label>38043</label>
+	<icon>DefaultMusicArtists.png</icon>
+	<path>musicdb://artists/?albumartistsonly=true</path>
+</node>
diff --git a/system/library/music/musicroles/allartists.xml b/system/library/music/musicroles/allartists.xml
new file mode 100644
index 0000000..dfaf695
--- /dev/null
+++ b/system/library/music/musicroles/allartists.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<node order="11" type="folder">
+	<label>38044</label>
+	<icon>DefaultMusicArtists.png</icon>
+	<path>musicdb://artists/?albumartistsonly=false</path>
+</node>
diff --git a/system/library/music/musicroles/allcontributors.xml b/system/library/music/musicroles/allcontributors.xml
new file mode 100644
index 0000000..01a92fb
--- /dev/null
+++ b/system/library/music/musicroles/allcontributors.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<node order="12" type="folder">
+	<label>38045</label>
+	<icon>DefaultMusicArtists.png</icon>
+	<path>musicdb://artists/?roleid=-1000</path>
+</node>
diff --git a/system/library/music/musicroles/allroles.xml b/system/library/music/musicroles/allroles.xml
new file mode 100644
index 0000000..d6b16e4
--- /dev/null
+++ b/system/library/music/musicroles/allroles.xml
@@ -0,0 +1,6 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<node order="15" type="folder">
+	<label>38046</label>
+	<icon>DefaultMusicRoles.png</icon>
+	<path>musicdb://roles/</path>
+</node>
diff --git a/system/settings/settings.xml b/system/settings/settings.xml
index 8d20a7a..1ec0aa4 100644
--- a/system/settings/settings.xml
+++ b/system/settings/settings.xml
@@ -3016,7 +3016,7 @@
   </section>
   <section id="interface" label="14206" help="38102">
     <category id="skin" label="166" help="36102">
-      <group id="1" label="16000">
+      <group id="1" label="24997">
         <setting id="lookandfeel.skin" type="addon" label="166" help="36103">
           <level>0</level>
           <default>skin.estuary</default>
@@ -3027,7 +3027,7 @@
             <show more="true" details="true">installed</show>
           </control>
         </setting>
-        <setting id="lookandfeel.skinsettings" type="action" parent="lookandfeel.skin" label="21417" help="36104">
+        <setting id="lookandfeel.skinsettings" type="action" parent="lookandfeel.skin" label="14261" help="36104">
           <level>0</level>
           <dependencies>
             <dependency type="enable" on="property" name="AddonHasSettings" setting="lookandfeel.skin" />
@@ -3046,7 +3046,7 @@
           <control type="list" format="string" />
         </setting>
         <setting id="lookandfeel.skincolors" type="string" parent="lookandfeel.skin" label="14078" help="36106">
-          <level>2</level>
+          <level>1</level>
           <default>SKINDEFAULT</default>
           <constraints>
             <options>skincolors</options>
@@ -3057,7 +3057,7 @@
           <control type="list" format="string" />
         </setting>
         <setting id="lookandfeel.font" type="string" parent="lookandfeel.skin" label="13303" help="36107">
-          <level>2</level>
+          <level>1</level>
           <default>Default</default>
           <constraints>
             <options>skinfonts</options>
@@ -3068,12 +3068,12 @@
           <control type="list" format="string" />
         </setting>
         <setting id="lookandfeel.skinzoom" type="integer" parent="lookandfeel.skin" label="20109" help="36108">
-          <level>2</level>
+          <level>1</level>
           <default>0</default>
           <constraints>
-            <minimum>-20</minimum>
+            <minimum>-30</minimum>
             <step>2</step>
-            <maximum>20</maximum>
+            <maximum>30</maximum>
           </constraints>
           <dependencies>
             <dependency type="update" setting="lookandfeel.skin" />
diff --git a/tools/Linux/kodi.desktop b/tools/Linux/kodi.desktop
index 97526f9..aaa4142 100644
--- a/tools/Linux/kodi.desktop
+++ b/tools/Linux/kodi.desktop
@@ -1,7 +1,7 @@
 [Desktop Entry]
 Version=1.0
-Name=Kodi media center
-GenericName=Media center
+Name=Kodi
+GenericName=Media Center
 Comment=Manage and view your media
 Exec=kodi
 Icon=kodi
diff --git a/tools/Linux/kodi.sh.in b/tools/Linux/kodi.sh.in
index d0e3871..9fc75dd 100644
--- a/tools/Linux/kodi.sh.in
+++ b/tools/Linux/kodi.sh.in
@@ -119,7 +119,10 @@ print_crash_report()
     # find in userdata dir
     single_stacktrace "$HOME" 5
     # try /proc/sys/kernel/core_pattern
-    [ -d $(dirname $(cat /proc/sys/kernel/core_pattern)) ] && single_stacktrace $(dirname $(cat /proc/sys/kernel/core_pattern)) 1
+    # Check if it does not contain a pipe to a program (see man 5 core)
+    if [ "$(cat /proc/sys/kernel/core_pattern | cut -c 1)" != "|" ]; then
+      [ -d "$(dirname $(cat /proc/sys/kernel/core_pattern))" ] && single_stacktrace "$(dirname $(cat /proc/sys/kernel/core_pattern))" 1
+    fi
   else
     echo "gdb not installed, can't get stack trace." >> $FILE
   fi
diff --git a/tools/android/packaging/Makefile.in b/tools/android/packaging/Makefile.in
index 66523e4..b53ca30 100644
--- a/tools/android/packaging/Makefile.in
+++ b/tools/android/packaging/Makefile.in
@@ -104,6 +104,7 @@ res:
 	cp -fp media/drawable-mdpi/ic_launcher.png xbmc/res/drawable-mdpi/ic_launcher.png
 	cp -fp media/drawable-xhdpi/ic_launcher.png xbmc/res/drawable-xhdpi/ic_launcher.png
 	cp -fp media/drawable-xxhdpi/ic_launcher.png xbmc/res/drawable-xxhdpi/ic_launcher.png
+	cp -fp media/drawable-xxxhdpi/ic_launcher.png xbmc/res/drawable-xxxhdpi/ic_launcher.png
 	cp -fp media/drawable-xhdpi/banner.png xbmc/res/drawable-xhdpi/banner.png
 	cp xbmc/strings.xml xbmc/res/values/
 	cp xbmc/activity_main.xml xbmc/res/layout/
diff --git a/tools/android/packaging/xbmc/res/drawable-hdpi/.gitkeep b/tools/android/packaging/xbmc/res/drawable-xxxhdpi/.gitkeep
similarity index 100%
copy from tools/android/packaging/xbmc/res/drawable-hdpi/.gitkeep
copy to tools/android/packaging/xbmc/res/drawable-xxxhdpi/.gitkeep
diff --git a/tools/buildsteps/win32/buildffmpeg.sh b/tools/buildsteps/win32/buildffmpeg.sh
index 99515fd..3eb683e 100644
--- a/tools/buildsteps/win32/buildffmpeg.sh
+++ b/tools/buildsteps/win32/buildffmpeg.sh
@@ -7,6 +7,7 @@ FFMPEG_CONFIG_FILE=/xbmc/tools/buildsteps/win32/fmpeg_options.txt
 FFMPEG_VERSION_FILE=/xbmc/tools/depends/target/ffmpeg/FFMPEG-VERSION
 FFMPEG_BASE_OPTS="--disable-debug --disable-doc --enable-gpl --enable-gnutls --enable-w32threads"
 FFMPEG_DEFAULT_OPTS=""
+FFMPEG_TARGET_OS=mingw32
 
 do_loaddeps $FFMPEG_VERSION_FILE
 FFMPEGDESTDIR=/xbmc/lib/win32/$LIBNAME
@@ -20,10 +21,12 @@ do_getFFmpegConfig() {
 
   if [[ $BITS = "64bit" ]]; then
     arch=x86_64
+    FFMPEG_TARGET_OS=mingw64
     # perhaps it's not optimal
     do_addOption "--cpu=core2"
   else
     arch=x86
+    FFMPEG_TARGET_OS=mingw32
     do_addOption "--cpu=i686"
   fi
   export arch
@@ -85,15 +88,22 @@ if [[ "$tools" = "msvc" ]]; then
   do_addOption "--enable-debug"
   do_addOption "--toolchain=msvc"
 
-  PATH="/c/Program Files (x86)/Microsoft Visual Studio 12.0/VC/BIN/":$PATH
-  CFLAGS=""
-  CXXFLAGS="" 
-  LDFLAGS=""
-  export PATH CFLAGS CXXFLAGS LDFLAGS
+  # set path to MS cl.exe and link.exe first
+  if [[ $BITS = "64bit" ]]; then
+    FFMPEG_TARGET_OS=win64
+    VCTOOLSPATH="$VS140COMNTOOLS../../VC/BIN/amd64"
+  else
+    FFMPEG_TARGET_OS=win32
+    VCTOOLSPATH="$VS140COMNTOOLS../../VC/BIN/"
+  fi
+
+  export PATH="$VCTOOLSPATH":$PATH
+  export CFLAGS=""
+  export CXXFLAGS="" 
+  export LDFLAGS=""
 
   extra_cflags="-MDd -I$LOCALDESTDIR/include"
-  extra_ldflags="-LIBPATH:\"$LOCALDESTDIR/lib\" -LIBPATH:\"/mingw32/lib\" /NODEFAULTLIB:libcmt"
-  TARGET_OS=win32
+  extra_ldflags="-LIBPATH:\"$LOCALDESTDIR/lib\" -LIBPATH:\"$MINGW_PREFIX/lib\" /NODEFAULTLIB:libcmt"
 fi
 
 cd $LOCALBUILDDIR
@@ -133,12 +143,12 @@ do_print_status "$LIBNAME-$VERSION (${BITS})" "$blue_color" "Configuring"
 [[ -z "$extra_cflags" ]] && extra_cflags=-DPTW32_STATIC_LIB
 [[ -z "$extra_ldflags" ]] && extra_ldflags=-static-libgcc
 
-./configure --target-os=mingw32 --prefix=$FFMPEGDESTDIR --arch=$arch \
+./configure --target-os=$FFMPEG_TARGET_OS --prefix=$FFMPEGDESTDIR --arch=$arch \
   --disable-static --enable-shared $FFMPEG_OPTS_SHARED \
   --extra-cflags="$extra_cflags" --extra-ldflags="$extra_ldflags"
 
 do_makelib &&
-cp $FFMPEGDESTDIR/bin/*.dll /xbmc/system/ &&
+cp $FFMPEGDESTDIR/bin/*.dll /xbmc/system/
 
 #remove the bgprocessfile for signaling the process end
 if [ -f $BGPROCESSFILE ]; then
diff --git a/tools/buildsteps/win32/fmpeg_options.txt b/tools/buildsteps/win32/fmpeg_options.txt
index fb9f295..891a79e 100644
--- a/tools/buildsteps/win32/fmpeg_options.txt
+++ b/tools/buildsteps/win32/fmpeg_options.txt
@@ -18,3 +18,4 @@
 --enable-encoder=mjpeg
 --enable-protocol=http
 --enable-runtime-cpudetect
+--disable-dxva2
\ No newline at end of file
diff --git a/tools/buildsteps/win32/make-mingwlibs.bat b/tools/buildsteps/win32/make-mingwlibs.bat
index d1567a0..0d94fac 100644
--- a/tools/buildsteps/win32/make-mingwlibs.bat
+++ b/tools/buildsteps/win32/make-mingwlibs.bat
@@ -3,14 +3,13 @@ SETLOCAL
 
 rem batch file to compile mingw libs via BuildSetup
 SET WORKDIR=%base_dir%
-rem set M$ env
-call "%VS140COMNTOOLS%\..\..\VC\bin\vcvars32.bat" || exit /b 1
 
 SET PROMPTLEVEL=prompt
 SET BUILDMODE=clean
 SET opt=mintty
 SET build32=yes
 SET build64=no
+SET vcarch=x86
 SET msys2=msys64
 SET tools=mingw
 FOR %%b in (%1, %2, %3) DO (
@@ -21,9 +20,12 @@ FOR %%b in (%1, %2, %3) DO (
   IF %%b==build64 ( 
     SET build64=yes 
     SET build32=no
+    SET vcarch=x64
     )
   IF %%b==msvc SET tools=msvc
 )
+rem set MSVC env
+call "%VS140COMNTOOLS%..\..\VC\vcvarsall.bat" %vcarch% || exit /b 1
 
 IF "%WORKDIR%"=="" (
   SET WORKDIR=%~dp0\..\..\..
diff --git a/tools/depends/configure.ac b/tools/depends/configure.ac
index fb0bd6d..9c8ddad 100644
--- a/tools/depends/configure.ac
+++ b/tools/depends/configure.ac
@@ -250,6 +250,7 @@ case $host in
           10.9);;
           10.10);;
           10.11);;
+          10.12);;
           *)
             AC_MSG_ERROR(error in configure of --with-sdk=$use_sdk)
         esac
diff --git a/tools/depends/native/cmake-native/Makefile b/tools/depends/native/cmake-native/Makefile
index b999193..a478831 100644
--- a/tools/depends/native/cmake-native/Makefile
+++ b/tools/depends/native/cmake-native/Makefile
@@ -3,7 +3,7 @@ PLATFORM=$(NATIVEPLATFORM)
 DEPS= ../../Makefile.include.in Makefile
 
 APPNAME=cmake
-VERSION=3.3.2
+VERSION=3.6.2
 SOURCE=$(APPNAME)-$(VERSION)
 ARCHIVE=$(SOURCE).tar.gz
 
@@ -30,7 +30,6 @@ $(TARBALLS_LOCATION)/$(ARCHIVE):
 $(PLATFORM): $(TARBALLS_LOCATION)/$(ARCHIVE) $(DEPS)
 	-rm -rf $(PLATFORM)/*; mkdir -p $(PLATFORM)
 	cd $(PLATFORM); $(ARCHIVE_TOOL) $(ARCHIVE_TOOL_FLAGS) $(TARBALLS_LOCATION)/$(ARCHIVE)
-	cd $(PLATFORM); patch -p1 < ../darwin_enable_tbd_support.patch
 	cd $(PLATFORM); $(SETENV) $(CONFIGURE)
 
 $(APP): $(PLATFORM)
diff --git a/tools/depends/native/cmake-native/darwin_enable_tbd_support.patch b/tools/depends/native/cmake-native/darwin_enable_tbd_support.patch
deleted file mode 100644
index 031b5de..0000000
--- a/tools/depends/native/cmake-native/darwin_enable_tbd_support.patch
+++ /dev/null
@@ -1,14 +0,0 @@
-diff --git a/Modules/Platform/Darwin.cmake b/Modules/Platform/Darwin.cmake
-index 4e4810a..bb085ac 100644 (file)
---- a/Modules/Platform/Darwin.cmake
-+++ b/Modules/Platform/Darwin.cmake
-@@ -53,7 +53,7 @@ set(CMAKE_SHARED_LIBRARY_CREATE_C_FLAGS "-dynamiclib -Wl,-headerpad_max_install_
- set(CMAKE_SHARED_MODULE_CREATE_C_FLAGS "-bundle -Wl,-headerpad_max_install_names")
- set(CMAKE_SHARED_MODULE_LOADER_C_FLAG "-Wl,-bundle_loader,")
- set(CMAKE_SHARED_MODULE_LOADER_CXX_FLAG "-Wl,-bundle_loader,")
--set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib" ".so" ".a")
-+set(CMAKE_FIND_LIBRARY_SUFFIXES ".tbd" ".dylib" ".so" ".a")
- 
- # hack: if a new cmake (which uses CMAKE_INSTALL_NAME_TOOL) runs on an old build tree
- # (where install_name_tool was hardcoded) and where CMAKE_INSTALL_NAME_TOOL isn't in the cache
-
diff --git a/tools/depends/native/config.site.native.in b/tools/depends/native/config.site.native.in
index edbaff7..007ee57 100644
--- a/tools/depends/native/config.site.native.in
+++ b/tools/depends/native/config.site.native.in
@@ -24,3 +24,12 @@ fi
 
 LD_LIBRARY_PATH=@prefix@/@tool_dir@/lib:$LD_LIBRARY_PATH
 NASM=@prefix@/@tool_dir@/bin/yasm
+
+if test "@platform_os@" = "osx" ; then
+  # Xcode 8 + 10.11, clock_gettime and getentropy is present
+  # in 10.12 but will get wrongly detected if building on 10.11
+  ac_cv_search_clock_gettime=no
+  ac_cv_func_clock_gettime=no
+  ac_cv_func_getentropy=no
+fi
+
diff --git a/tools/depends/xbmc-addons.include b/tools/depends/xbmc-addons.include
index 42c5831..5eb06d2 100644
--- a/tools/depends/xbmc-addons.include
+++ b/tools/depends/xbmc-addons.include
@@ -27,7 +27,7 @@ endif
 
 ifneq ($(PREFIX),)
   ifneq (darwin, $(findstring darwin, $(HOST)))
-    INSTALL_PREFIX = $(PREFIX)
+    INSTALL_PREFIX = $(PREFIX) -DOVERRIDE_PATHS=ON
   endif
 
   CMAKE_EXTRA += -DAUTOCONF_FILES="$(CONFIG_SUB) $(CONFIG_GUESS)"
@@ -67,7 +67,7 @@ endif
          done
 ifneq ($(CROSS_COMPILING),yes)
 	@[ -f $(ADDON_PROJECT_DIR)/.failure ] && echo "Following Addons failed to build:" $(shell cat $(ADDON_PROJECT_DIR)/.failure) || :
-	@[ -w $(INSTALL_PREFIX) ] || { cd $(PLATFORM); $(MAKE) need-sudo | grep -q TRUE && $(MAKE) sudo-install || $(MAKE) install ;}
+	@cd $(PLATFORM); $(MAKE) need-sudo | grep -q TRUE && $(MAKE) sudo-install || :
 endif
 	touch $@
 
diff --git a/version.txt b/version.txt
index 3482a1c..cab03c4 100644
--- a/version.txt
+++ b/version.txt
@@ -3,9 +3,9 @@ COMPANY_NAME XBMC-Foundation
 WEBSITE http://kodi.tv
 VERSION_MAJOR 17
 VERSION_MINOR 0
-VERSION_TAG BETA2
-VERSION_CODE 169802
-ADDON_API 16.9.802
+VERSION_TAG BETA3
+VERSION_CODE 169803
+ADDON_API 16.9.803
 
 # Notes:
 # Change AC_INIT in configure.ac
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
index 45cc633..c780168 100644
--- a/xbmc/Application.cpp
+++ b/xbmc/Application.cpp
@@ -247,10 +247,6 @@ using namespace XbmcThreads;
 
 using KODI::MESSAGING::HELPERS::DialogResponse;
 
-// uncomment this if you want to use release libs in the debug build.
-// Atm this saves you 7 mb of memory
-#define USE_RELEASE_LIBS
-
 #define MAX_FFWD_SPEED 5
 
 //extern IDirectSoundRenderer* m_pAudioDecoder;
@@ -266,6 +262,7 @@ CApplication::CApplication(void)
   , m_fallbackLanguageLoaded(false)
   , m_WaitingExternalCalls(0)
   , m_ProcessedExternalCalls(0)
+  , m_ignoreSkinSettingChanges(false)
 {
   m_network = NULL;
   TiXmlBase::SetCondenseWhiteSpace(false);
@@ -336,14 +333,16 @@ bool CApplication::OnEvent(XBMC_Event& newEvent)
         CApplicationMessenger::GetInstance().PostMsg(TMSG_QUIT);
       break;
     case XBMC_VIDEORESIZE:
-      if (g_windowManager.Initialized() &&
-          !g_advancedSettings.m_fullScreen)
+      if (g_windowManager.Initialized())
       {
         g_Windowing.SetWindowResolution(newEvent.resize.w, newEvent.resize.h);
-        g_graphicsContext.SetVideoResolution(RES_WINDOW, true);
-        CSettings::GetInstance().SetInt(CSettings::SETTING_WINDOW_WIDTH, newEvent.resize.w);
-        CSettings::GetInstance().SetInt(CSettings::SETTING_WINDOW_HEIGHT, newEvent.resize.h);
-        CSettings::GetInstance().Save();
+        if (!g_advancedSettings.m_fullScreen)
+        {
+          g_graphicsContext.SetVideoResolution(RES_WINDOW, true);
+          CSettings::GetInstance().SetInt(CSettings::SETTING_WINDOW_WIDTH, newEvent.resize.w);
+          CSettings::GetInstance().SetInt(CSettings::SETTING_WINDOW_HEIGHT, newEvent.resize.h);
+          CSettings::GetInstance().Save();
+        }
       }
       break;
     case XBMC_VIDEOMOVE:
@@ -352,8 +351,8 @@ bool CApplication::OnEvent(XBMC_Event& newEvent)
       {
         // when fullscreen, remain fullscreen and resize to the dimensions of the new screen
         RESOLUTION newRes = (RESOLUTION) g_Windowing.DesktopResolution(g_Windowing.GetCurrentScreen());
-        if (newRes != g_graphicsContext.GetVideoResolution())
-          CDisplaySettings::GetInstance().SetCurrentResolution(newRes, true);
+        CDisplaySettings::GetInstance().SetCurrentResolution(newRes, true);
+        g_graphicsContext.SetVideoResolution(g_graphicsContext.GetVideoResolution(), true);
       }
       else
 #endif
@@ -546,21 +545,7 @@ bool CApplication::Create()
     CLog::Log(LOGNOTICE, "Running on %s, kernel: %s %s %d-bit version %s", g_sysinfo.GetOsPrettyNameWithVersion().c_str(),
               g_sysinfo.GetKernelName().c_str(), g_sysinfo.GetKernelCpuFamily().c_str(), g_sysinfo.GetKernelBitness(), g_sysinfo.GetKernelVersionFull().c_str());
 
-  //! @todo - move to CPlatformXXX ???
-#if defined(TARGET_LINUX)
-#if USE_STATIC_FFMPEG
-  CLog::Log(LOGNOTICE, "FFmpeg statically linked, version: %s", FFMPEG_VERSION);
-#else  // !USE_STATIC_FFMPEG
-  CLog::Log(LOGNOTICE, "FFmpeg version: %s", FFMPEG_VERSION);
-#endif // !USE_STATIC_FFMPEG
-  if (!strstr(FFMPEG_VERSION, FFMPEG_VER_SHA))
-  {
-    if (strstr(FFMPEG_VERSION, "kodi"))
-      CLog::Log(LOGNOTICE, "WARNING: unknown ffmpeg-kodi version detected");
-    else
-      CLog::Log(LOGNOTICE, "WARNING: unsupported ffmpeg version detected");
-  }
-#endif
+  CLog::Log(LOGNOTICE, "FFmpeg version/source: %s", av_version_info());
 
   std::string cpuModel(g_cpuInfo.getCPUModel());
   if (!cpuModel.empty())
@@ -805,8 +790,7 @@ bool CApplication::CreateGUI()
   if (sav_res)
     CDisplaySettings::GetInstance().SetCurrentResolution(RES_DESKTOP, true);
 
-  if (g_advancedSettings.m_splashImage)
-    CSplash::GetInstance().Show();
+  CSplash::GetInstance().Show();
 
   // The key mappings may already have been loaded by a peripheral
   CLog::Log(LOGINFO, "load keymapping");
@@ -1144,7 +1128,9 @@ bool CApplication::Initialize()
   g_curlInterface.Unload();
 
   // initialize (and update as needed) our databases
+  CSplash::GetInstance().Show(g_localizeStrings.Get(24150));
   CDatabaseManager::GetInstance().Initialize();
+  CSplash::GetInstance().Show();
 
   StartServices();
 
@@ -1156,17 +1142,13 @@ bool CApplication::Initialize()
     CSettings::GetInstance().GetSetting(CSettings::SETTING_POWERMANAGEMENT_DISPLAYSOFF)->SetRequirementsMet(m_dpms->IsSupported());
 
     g_windowManager.CreateWindows();
-    /* window id's 3000 - 3100 are reserved for python */
-
-    // initialize splash window after splash screen disappears
-    // because we need a real window in the background which gets
-    // rendered while we load the main window or enter the master lock key
-    if (g_advancedSettings.m_splashImage)
-      g_windowManager.ActivateWindow(WINDOW_SPLASH);
 
     m_confirmSkinChange = false;
-    m_incompatibleAddons = CAddonSystemSettings::GetInstance().MigrateAddons();
+    m_incompatibleAddons = CAddonSystemSettings::GetInstance().MigrateAddons([](){
+      CSplash::GetInstance().Show(g_localizeStrings.Get(24151));
+    });
     m_confirmSkinChange = true;
+    CSplash::GetInstance().Show();
 
     std::string defaultSkin = ((const CSettingString*)CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKIN))->GetDefault();
     if (!LoadSkin(CSettings::GetInstance().GetString(CSettings::SETTING_LOOKANDFEEL_SKIN)))
@@ -1179,6 +1161,12 @@ bool CApplication::Initialize()
       }
     }
 
+    // initialize splash window after splash screen disappears
+    // because we need a real window in the background which gets
+    // rendered while we load the main window or enter the master lock key
+    if (g_advancedSettings.m_splashImage)
+      g_windowManager.ActivateWindow(WINDOW_SPLASH);
+
     if (CSettings::GetInstance().GetBool(CSettings::SETTING_MASTERLOCK_STARTUPLOCK) &&
         CProfilesManager::GetInstance().GetMasterProfile().getLockMode() != LOCK_MODE_EVERYONE &&
        !CProfilesManager::GetInstance().GetMasterProfile().getLockCode().empty())
@@ -1323,8 +1311,17 @@ void CApplication::StopPVRManager()
   CLog::Log(LOGINFO, "stopping PVRManager");
   if (g_PVRManager.IsPlaying())
     StopPlaying();
+  // stop pvr manager thread and clear all pvr data
   g_PVRManager.Stop();
+  // stop epg container thread and clear all epg data
   g_EpgContainer.Stop();
+  g_EpgContainer.Clear();
+}
+
+void CApplication::ReinitPVRManager()
+{
+  CLog::Log(LOGINFO, "restarting PVRManager");
+  g_PVRManager.Reinit();
 }
 
 void CApplication::StartServices()
@@ -1354,21 +1351,19 @@ void CApplication::OnSettingChanged(const CSetting *setting)
     return;
 
   const std::string &settingId = setting->GetId();
-  // check if we should ignore this change event due to changing skins in which case we have to
-  // change several settings and each one of them could lead to a complete skin reload which would
-  // result in multiple skin reloads. Therefore we manually specify to ignore specific settings
-  // which are going to be changed.
-  if (settingId == m_skinReloadSettingIgnore)
-  {
-    m_skinReloadSettingIgnore.clear();
-    return;
-  }
 
   if (settingId == CSettings::SETTING_LOOKANDFEEL_SKIN ||
       settingId == CSettings::SETTING_LOOKANDFEEL_FONT ||
       settingId == CSettings::SETTING_LOOKANDFEEL_SKINTHEME ||
       settingId == CSettings::SETTING_LOOKANDFEEL_SKINCOLORS)
   {
+    // check if we should ignore this change event due to changing skins in which case we have to
+    // change several settings and each one of them could lead to a complete skin reload which would
+    // result in multiple skin reloads. Therefore we manually specify to ignore specific settings
+    // which are going to be changed.
+    if (m_ignoreSkinSettingChanges)
+      return;
+
     // if the skin changes and the current color/theme/font is not the default one, reset
     // the it to the default value
     if (settingId == CSettings::SETTING_LOOKANDFEEL_SKIN)
@@ -1376,28 +1371,28 @@ void CApplication::OnSettingChanged(const CSetting *setting)
       CSetting* skinRelatedSetting = CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS);
       if (!skinRelatedSetting->IsDefault())
       {
-        m_skinReloadSettingIgnore = skinRelatedSetting->GetId();
+        m_ignoreSkinSettingChanges = true;
         skinRelatedSetting->Reset();
       }
 
       skinRelatedSetting = CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKINTHEME);
       if (!skinRelatedSetting->IsDefault())
       {
-        m_skinReloadSettingIgnore = skinRelatedSetting->GetId();
+        m_ignoreSkinSettingChanges = true;
         skinRelatedSetting->Reset();
       }
 
-      setting = CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_FONT);
-      if (!setting->IsDefault())
+      skinRelatedSetting = CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_FONT);
+      if (!skinRelatedSetting->IsDefault())
       {
-        m_skinReloadSettingIgnore = skinRelatedSetting->GetId();
+        m_ignoreSkinSettingChanges = true;
         skinRelatedSetting->Reset();
       }
     }
     else if (settingId == CSettings::SETTING_LOOKANDFEEL_SKINTHEME)
     {
       CSettingString* skinColorsSetting = static_cast<CSettingString*>(CSettings::GetInstance().GetSetting(CSettings::SETTING_LOOKANDFEEL_SKINCOLORS));
-      m_skinReloadSettingIgnore = skinColorsSetting->GetId();
+      m_ignoreSkinSettingChanges = true;
 
       // we also need to adjust the skin color setting
       std::string colorTheme = ((CSettingString*)setting)->GetValue();
@@ -1408,8 +1403,7 @@ void CApplication::OnSettingChanged(const CSetting *setting)
         skinColorsSetting->SetValue(colorTheme);
     }
 
-    // reset the settings to ignore during changing skins
-    m_skinReloadSettingIgnore.clear();
+    m_ignoreSkinSettingChanges = false;
 
     if (g_SkinInfo)
     {
diff --git a/xbmc/Application.h b/xbmc/Application.h
index d20b772..22aca81 100644
--- a/xbmc/Application.h
+++ b/xbmc/Application.h
@@ -158,6 +158,7 @@ public:
   bool StartServer(enum ESERVERS eServer, bool bStart, bool bWait = false);
 
   void StopPVRManager();
+  void ReinitPVRManager();
   bool IsCurrentThread() const;
   void Stop(int exitCode);
   void RestartApp();
@@ -426,7 +427,7 @@ protected:
   bool NotifyActionListeners(const CAction &action) const;
 
   bool m_confirmSkinChange;
-  std::string m_skinReloadSettingIgnore;
+  bool m_ignoreSkinSettingChanges;
 
   bool m_saveSkinOnUnloading;
   bool m_autoExecScriptExecuted;
diff --git a/xbmc/ApplicationPlayer.cpp b/xbmc/ApplicationPlayer.cpp
index b76134d..9163bae 100644
--- a/xbmc/ApplicationPlayer.cpp
+++ b/xbmc/ApplicationPlayer.cpp
@@ -696,27 +696,6 @@ int  CApplicationPlayer::SeekChapter(int iChapter)
     return 0;
 }
 
-void CApplicationPlayer::GetRenderFeatures(std::vector<int> &renderFeatures)
-{
-  std::shared_ptr<IPlayer> player = GetInternal();
-  if (player)
-    player->OMXGetRenderFeatures(renderFeatures);
-}
-
-void CApplicationPlayer::GetDeinterlaceMethods(std::vector<int> &deinterlaceMethods)
-{
-  std::shared_ptr<IPlayer> player = GetInternal();
-  if (player)
-    player->OMXGetDeinterlaceMethods(deinterlaceMethods);
-}
-
-void CApplicationPlayer::GetScalingMethods(std::vector<int> &scalingMethods)
-{
-  std::shared_ptr<IPlayer> player = GetInternal();
-  if (player)
-    player->OMXGetScalingMethods(scalingMethods);
-}
-
 void CApplicationPlayer::SetPlaySpeed(float speed)
 {
   std::shared_ptr<IPlayer> player = GetInternal();
@@ -762,15 +741,6 @@ void CApplicationPlayer::FrameMove()
     player->FrameMove();
 }
 
-bool CApplicationPlayer::HasFrame()
-{
-  std::shared_ptr<IPlayer> player = GetInternal();
-  if (player)
-    return player->HasFrame();
-  else
-    return false;
-}
-
 void CApplicationPlayer::Render(bool clear, uint32_t alpha, bool gui)
 {
   std::shared_ptr<IPlayer> player = GetInternal();
diff --git a/xbmc/ApplicationPlayer.h b/xbmc/ApplicationPlayer.h
index d27e8df..a0567a6 100644
--- a/xbmc/ApplicationPlayer.h
+++ b/xbmc/ApplicationPlayer.h
@@ -83,7 +83,6 @@ public:
   void SetPlaySpeed(float speed);
 
   void FrameMove();
-  bool HasFrame();
   void Render(bool clear, uint32_t alpha = 255, bool gui = true);
   void FlushRenderer();
   void SetRenderViewMode(int mode);
@@ -118,13 +117,10 @@ public:
   int   GetChapter();  
   void  GetChapterName(std::string& strChapterName, int chapterIdx=-1);
   int64_t GetChapterPos(int chapterIdx=-1);
-  void  GetDeinterlaceMethods(std::vector<int> &deinterlaceMethods);
   float GetPercentage() const;
   std::string GetPlayerState();
   std::string GetPlayingTitle();
   int   GetPreferredPlaylist() const;
-  void  GetRenderFeatures(std::vector<int> &renderFeatures);
-  void  GetScalingMethods(std::vector<int> &scalingMethods);
   bool  GetStreamDetails(CStreamDetails &details);
   int   GetSubtitle();
   void  GetSubtitleCapabilities(std::vector<int> &subCaps);
diff --git a/xbmc/CompileInfo.cpp.in b/xbmc/CompileInfo.cpp.in
index 436e334..40c396c 100644
--- a/xbmc/CompileInfo.cpp.in
+++ b/xbmc/CompileInfo.cpp.in
@@ -21,10 +21,6 @@
 #include "CompileInfo.h"
 #include <cstddef>
 
-#if defined(TARGET_WINDOWS) && !defined(BUILDING_WITH_CMAKE) && !defined(_DEBUG)
-#include "../git_revision.h" // generated file
-#endif
-
 
 int CCompileInfo::GetMajor()
 {
@@ -48,12 +44,5 @@ const char* CCompileInfo::GetSuffix()
 
 const char* CCompileInfo::GetSCMID()
 {
-#if defined(TARGET_WINDOWS) && !defined(BUILDING_WITH_CMAKE)
-#ifdef GIT_REV
-  return GIT_REV;
-#else
-  return "Unknown";
-#endif
-#endif
   return "@APP_SCMID@";
 }
diff --git a/xbmc/CueDocument.cpp b/xbmc/CueDocument.cpp
index bb43004..c3d00d6 100644
--- a/xbmc/CueDocument.cpp
+++ b/xbmc/CueDocument.cpp
@@ -324,7 +324,7 @@ bool CCueDocument::Parse(CueReader& reader, const std::string& strFile)
         CLog::Log(LOGERROR, "Mangled Time in INDEX 0x tag in CUE file!");
         return false;
       }
-      if (totalTracks > 0) // Set the end time of the last track
+      if (totalTracks > 0 && m_tracks[totalTracks - 1].strFile == strCurrentFile) // Set the end time of the last track
         m_tracks[totalTracks - 1].iEndTime = time;
 
       if (totalTracks >= 0) // start time of the next track
diff --git a/xbmc/GUIInfoManager.cpp b/xbmc/GUIInfoManager.cpp
index 3cbec67..ea74bf1 100644
--- a/xbmc/GUIInfoManager.cpp
+++ b/xbmc/GUIInfoManager.cpp
@@ -90,6 +90,7 @@
 #include "pvr/recordings/PVRRecording.h"
 
 #include "addons/AddonManager.h"
+#include "addons/BinaryAddonCache.h"
 #include "interfaces/info/InfoBool.h"
 #include "video/VideoThumbLoader.h"
 #include "music/MusicThumbLoader.h"
@@ -6961,7 +6962,12 @@ bool CGUIInfoManager::GetBool(int condition1, int contextWindow, const CGUIListI
   else if (condition == SYSTEM_HAS_PVR)
     bReturn = true;
   else if (condition == SYSTEM_HAS_PVR_ADDON)
-    bReturn = CAddonMgr::GetInstance().HasAddons(ADDON::ADDON_PVRDLL);
+  {
+    VECADDONS pvrAddons;
+    CBinaryAddonCache &addonCache = CServiceBroker::GetBinaryAddonCache();
+    addonCache.GetAddons(pvrAddons, ADDON::ADDON_PVRDLL);
+    bReturn = (pvrAddons.size() > 0);
+  }
   else if (condition == SYSTEM_HAS_ADSP)
     bReturn = true;
   else if (condition == SYSTEM_HAS_CMS)
diff --git a/xbmc/NfoFile.cpp b/xbmc/NfoFile.cpp
index 2f871e7..6df6681 100644
--- a/xbmc/NfoFile.cpp
+++ b/xbmc/NfoFile.cpp
@@ -31,11 +31,13 @@
 #include "music/Artist.h"
 
 #include <vector>
+#include <string>
 
 using namespace XFILE;
 using namespace ADDON;
 
-CNfoFile::NFOResult CNfoFile::Create(const std::string& strPath, const ScraperPtr& info, int episode)
+CNfoFile::NFOResult CNfoFile::Create(const std::string& strPath,
+                                     const ScraperPtr& info, int episode)
 {
   m_info = info; // assume we can use these settings
   m_type = ScraperTypeFromContent(info->Content());
@@ -60,7 +62,8 @@ CNfoFile::NFOResult CNfoFile::Create(const std::string& strPath, const ScraperPt
     CArtist artist;
     bNfo = GetDetails(artist);
   }
-  else if (m_type == ADDON_SCRAPER_TVSHOWS || m_type == ADDON_SCRAPER_MOVIES || m_type == ADDON_SCRAPER_MUSICVIDEOS)
+  else if (m_type == ADDON_SCRAPER_TVSHOWS || m_type == ADDON_SCRAPER_MOVIES
+           || m_type == ADDON_SCRAPER_MUSICVIDEOS)
   {
     // first check if it's an XML file with the info we need
     CVideoInfoTag details;
@@ -90,7 +93,7 @@ CNfoFile::NFOResult CNfoFile::Create(const std::string& strPath, const ScraperPt
 
   std::vector<ScraperPtr> vecScrapers;
 
-  // add selected scraper - first proirity
+  // add selected scraper - first priority
   if (m_info)
     vecScrapers.push_back(m_info);
 
@@ -106,7 +109,8 @@ CNfoFile::NFOResult CNfoFile::Create(const std::string& strPath, const ScraperPt
     if (scraper->RequiresSettings() && !scraper->HasUserSettings())
       continue;
 
-    if( (!m_info || m_info->ID() != scraper->ID()) && (!defaultScraper || defaultScraper->ID() != scraper->ID()) )
+    if( (!m_info || m_info->ID() != scraper->ID())
+        && (!defaultScraper || defaultScraper->ID() != scraper->ID()) )
       vecScrapers.push_back(scraper);
   }
 
@@ -117,14 +121,24 @@ CNfoFile::NFOResult CNfoFile::Create(const std::string& strPath, const ScraperPt
 
   // search ..
   int res = -1;
-  for (unsigned int i=0;i<vecScrapers.size();++i)
+  for (unsigned int i=0; i<vecScrapers.size(); ++i)
     if ((res = Scrape(vecScrapers[i])) == 0 || res == 2)
       break;
 
   if (res == 2)
     return ERROR_NFO;
   if (bNfo)
-    return m_scurl.m_url.empty() ? FULL_NFO : COMBINED_NFO;
+  {
+    if (m_scurl.m_url.empty())
+    {
+      if (m_doc.find("[scrape url]") != std::string::npos)
+        return PARTIAL_NFO;
+      else
+        return FULL_NFO;
+    }
+    else
+      return COMBINED_NFO;
+  }
   return m_scurl.m_url.empty() ? NO_NFO : URL_NFO;
 }
 
diff --git a/xbmc/NfoFile.h b/xbmc/NfoFile.h
index 0afd8ce..c985f9b 100644
--- a/xbmc/NfoFile.h
+++ b/xbmc/NfoFile.h
@@ -41,14 +41,15 @@ public:
     FULL_NFO     = 1,
     URL_NFO      = 2,
     COMBINED_NFO = 3,
-    ERROR_NFO    = 4
+    ERROR_NFO    = 4,
+    PARTIAL_NFO  = 5
   };
 
   NFOResult Create(const std::string&, const ADDON::ScraperPtr&, int episode=-1);
   template<class T>
-    bool GetDetails(T& details,const char* document=NULL, bool prioritise=false)
+    bool GetDetails(T& details, const char* document=NULL,
+                    bool prioritise=false)
   {
-
     CXBMCTinyXML doc;
     if (document)
       doc.Parse(document, TIXML_ENCODING_UNKNOWN);
diff --git a/xbmc/Util.cpp b/xbmc/Util.cpp
index 9fb2786..161304a 100644
--- a/xbmc/Util.cpp
+++ b/xbmc/Util.cpp
@@ -196,6 +196,12 @@ std::string GetHomePath(const std::string& strTarget, std::string strPath)
 }
 #endif
 #if defined(TARGET_DARWIN)
+bool IsDirectoryValidRoot(std::string path)
+{
+  path += "/system/settings/settings.xml";
+  return CFile::Exists(path);
+}
+
 std::string GetHomePath(const std::string& strTarget, std::string strPath)
 {
   if (strPath.empty())
@@ -219,6 +225,26 @@ std::string GetHomePath(const std::string& strTarget, std::string strPath)
       strcat(given_path, "../Resources/");
       strcat(given_path, CCompileInfo::GetAppName());
       strcat(given_path, "/");
+      
+      // if this path doesn't exist we
+      // might not be started from the app bundle
+      // but from the debugger/xcode. Lets
+      // see if this assumption is valid
+      if (!CDirectory::Exists(given_path))
+      {
+        std::string given_path_stdstr = CUtil::ResolveExecutablePath();
+        // try to find the correct folder by going back
+        // in the executable path until settings.xml was found
+        bool validRoot = false;
+        do
+        {
+          given_path_stdstr = URIUtils::GetParentPath(given_path_stdstr);
+          validRoot = IsDirectoryValidRoot(given_path_stdstr);
+        }
+        while(given_path_stdstr.length() > 0 && !validRoot);
+        strncpy(given_path, given_path_stdstr.c_str(), sizeof(given_path)-1);
+      }
+      
 #endif
 
       // Convert to real path.
@@ -2040,25 +2066,27 @@ void CUtil::ScanForExternalSubtitles(const std::string& strMovie, std::vector<st
   CLog::Log(LOGDEBUG, "%s: END (total time: %i ms)", __FUNCTION__, (int)(XbmcThreads::SystemClockMillis() - startTimer));
 }
 
-void CUtil::GetExternalStreamDetailsFromFilename(const std::string& strVideo, const std::string& strStream, ExternalStreamInfo& info)
+ExternalStreamInfo CUtil::GetExternalStreamDetailsFromFilename(const std::string& videoPath, const std::string& associatedFile)
 {
-  std::string videoBaseName = URIUtils::GetFileName(strVideo);
+  ExternalStreamInfo info;
+
+  std::string videoBaseName = URIUtils::GetFileName(videoPath);
   URIUtils::RemoveExtension(videoBaseName);
 
-  std::string toParse = URIUtils::GetFileName(strStream);
+  std::string toParse = URIUtils::GetFileName(associatedFile);
   URIUtils::RemoveExtension(toParse);
 
   // we check left part - if it's same as video base name - strip it
   if (StringUtils::StartsWithNoCase(toParse, videoBaseName))
     toParse = toParse.substr(videoBaseName.length());
-  else if (URIUtils::GetExtension(strStream) == ".sub" && URIUtils::IsInArchive(strStream))
+  else if (URIUtils::GetExtension(associatedFile) == ".sub" && URIUtils::IsInArchive(associatedFile))
   {
-    // exclude parsing of vobsub file names that embedded in an archive
-    CLog::Log(LOGDEBUG, "%s - skipping archived vobsub filename parsing: %s", __FUNCTION__, CURL::GetRedacted(strStream).c_str());
+    // exclude parsing of vobsub file names that are embedded in an archive
+    CLog::Log(LOGDEBUG, "%s - skipping archived vobsub filename parsing: %s", __FUNCTION__, CURL::GetRedacted(associatedFile).c_str());
     toParse.clear();
   }
 
-  // trim any non-alphanumeric char in the begining
+  // trim any non-alphanumeric char in the beginning
   std::string::iterator result = std::find_if(toParse.begin(), toParse.end(), StringUtils::isasciialphanum);
 
   std::string name;
@@ -2113,7 +2141,9 @@ void CUtil::GetExternalStreamDetailsFromFilename(const std::string& strVideo, co
     info.flag = CDemuxStream::FLAG_NONE;
 
   CLog::Log(LOGDEBUG, "%s - Language = '%s' / Name = '%s' / Flag = '%u' from %s",
-             __FUNCTION__, info.language.c_str(), info.name.c_str(), info.flag, CURL::GetRedacted(strStream).c_str());
+             __FUNCTION__, info.language.c_str(), info.name.c_str(), info.flag, CURL::GetRedacted(associatedFile).c_str());
+
+  return info;
 }
 
 /*! \brief in a vector of subtitles finds the corresponding .sub file for a given .idx file
diff --git a/xbmc/Util.h b/xbmc/Util.h
index a2e915d..16836bc 100644
--- a/xbmc/Util.h
+++ b/xbmc/Util.h
@@ -83,7 +83,13 @@ public:
 
   static void ClearSubtitles();
   static void ScanForExternalSubtitles(const std::string& strMovie, std::vector<std::string>& vecSubtitles );
-  static void GetExternalStreamDetailsFromFilename(const std::string& strMovie, const std::string& strSubtitles, ExternalStreamInfo& info); 
+
+  /** \brief Retrieves stream info of external associated files, e.g., subtitles, for a given video.
+  *   \param[in] videoPath The full path of the video file.
+  *   \param[in] associatedFile A file that provides additional streams for the given video file.
+  *   \return stream info for the given associatedFile
+  */
+  static ExternalStreamInfo GetExternalStreamDetailsFromFilename(const std::string& videoPath, const std::string& associatedFile);
   static bool FindVobSubPair( const std::vector<std::string>& vecSubtitles, const std::string& strIdxPath, std::string& strSubPath );
   static bool IsVobSub(const std::vector<std::string>& vecSubtitles, const std::string& strSubPath);
   static std::string GetVobSubSubFromIdx(const std::string& vobSubIdx);
diff --git a/xbmc/addons/AddonManager.cpp b/xbmc/addons/AddonManager.cpp
index 8dec0bb..2d6e82a 100644
--- a/xbmc/addons/AddonManager.cpp
+++ b/xbmc/addons/AddonManager.cpp
@@ -20,6 +20,7 @@
 
 #include "AddonManager.h"
 
+#include <algorithm>
 #include <iterator>
 #include <memory>
 #include <utility>
@@ -514,22 +515,25 @@ bool CAddonMgr::GetInstallableAddons(VECADDONS& addons, const TYPE &type)
   CSingleLock lock(m_critSection);
 
   // get all addons
-  VECADDONS installableAddons;
-  if (!m_database.GetRepositoryContent(installableAddons))
+  if (!m_database.GetRepositoryContent(addons))
     return false;
 
   // go through all addons and remove all that are already installed
-  for (const auto& addon : installableAddons)
-  {
-    // check if the addon matches the provided addon type
-    if (type != ADDON::ADDON_UNKNOWN && addon->Type() != type && !addon->IsType(type))
-      continue;
 
-    if (!CanAddonBeInstalled(addon))
-      continue;
+  addons.erase(std::remove_if(addons.begin(), addons.end(),
+    [this, type](const AddonPtr& addon)
+    {
+      bool bErase = false;
 
-    addons.push_back(addon);
-  }
+      // check if the addon matches the provided addon type
+      if (type != ADDON::ADDON_UNKNOWN && addon->Type() != type && !addon->IsType(type))
+        bErase = true;
+
+      if (!this->CanAddonBeInstalled(addon))
+        bErase = true;
+
+      return bErase;
+    }), addons.end());
 
   return true;
 }
diff --git a/xbmc/addons/AddonSystemSettings.cpp b/xbmc/addons/AddonSystemSettings.cpp
index 6df9d33..620fcd7 100644
--- a/xbmc/addons/AddonSystemSettings.cpp
+++ b/xbmc/addons/AddonSystemSettings.cpp
@@ -126,7 +126,7 @@ bool CAddonSystemSettings::UnsetActive(const AddonPtr& addon)
 }
 
 
-std::vector<std::string> CAddonSystemSettings::MigrateAddons()
+std::vector<std::string> CAddonSystemSettings::MigrateAddons(std::function<void(void)> onMigrate)
 {
   auto getIncompatible = [](){
     VECADDONS incompatible;
@@ -141,6 +141,8 @@ std::vector<std::string> CAddonSystemSettings::MigrateAddons()
 
   if (CSettings::GetInstance().GetInt(CSettings::SETTING_ADDONS_AUTOUPDATES) == AUTO_UPDATES_ON)
   {
+    onMigrate();
+
     if (CRepositoryUpdater::GetInstance().CheckForUpdates())
       CRepositoryUpdater::GetInstance().Await();
 
diff --git a/xbmc/addons/AddonSystemSettings.h b/xbmc/addons/AddonSystemSettings.h
index f23c9eb..3ecd0ed 100644
--- a/xbmc/addons/AddonSystemSettings.h
+++ b/xbmc/addons/AddonSystemSettings.h
@@ -21,6 +21,7 @@
 
 #include "addons/IAddon.h"
 #include "settings/lib/ISettingCallback.h"
+#include <functional>
 #include <string>
 
 namespace ADDON
@@ -48,9 +49,12 @@ public:
   bool UnsetActive(const AddonPtr& addon);
 
   /*!
-   * Attempt to migrate installed addons. Returns a list of addons that was modified.
+   * Check compatibility of installed addons and attempt to migrate.
+   *
+   * @param onMigrate Called when a long running migration task takes place.
+   * @return list of addons that was modified.
    */
-  std::vector<std::string> MigrateAddons();
+  std::vector<std::string> MigrateAddons(std::function<void(void)> onMigrate);
 
 private:
   CAddonSystemSettings();
diff --git a/xbmc/addons/AudioDecoder.cpp b/xbmc/addons/AudioDecoder.cpp
index b23b4f3..8ab0d2d 100644
--- a/xbmc/addons/AudioDecoder.cpp
+++ b/xbmc/addons/AudioDecoder.cpp
@@ -46,6 +46,11 @@ CAudioDecoder::CAudioDecoder(AddonProps props, std::string extension, std::strin
   m_strExt = std::move(strExt);
 }
 
+CAudioDecoder::~CAudioDecoder()
+{
+  DeInit();
+}
+
 bool CAudioDecoder::Init(const CFileItem& file, unsigned int filecache)
 {
   if (!Initialized())
@@ -132,11 +137,6 @@ int CAudioDecoder::GetTrackCount(const std::string& strPath)
   return result;
 }
 
-CAEChannelInfo CAudioDecoder::GetChannelInfo()
-{
-  return m_format.m_channelLayout;
-}
-
 void CAudioDecoder::Destroy()
 {
   AudioDecoderDll::Destroy();
diff --git a/xbmc/addons/AudioDecoder.h b/xbmc/addons/AudioDecoder.h
index 937ca67..e3fc976 100644
--- a/xbmc/addons/AudioDecoder.h
+++ b/xbmc/addons/AudioDecoder.h
@@ -56,7 +56,7 @@ namespace ADDON
     CAudioDecoder(AddonProps props, std::string extension, std::string mimetype, bool tags,
         bool tracks, std::string codecName, std::string strExt);
 
-    virtual ~CAudioDecoder() {}
+    virtual ~CAudioDecoder();
 
     // Things that MUST be supplied by the child classes
     bool Init(const CFileItem& file, unsigned int filecache) override;
@@ -69,7 +69,6 @@ namespace ADDON
               MUSIC_INFO::CMusicInfoTag& tag,
               MUSIC_INFO::EmbeddedArt *art = NULL);
     int GetTrackCount(const std::string& strPath);
-    virtual CAEChannelInfo GetChannelInfo();
 
     const std::string& GetExtensions() const { return m_extension; }
     const std::string& GetMimetypes() const { return m_mimetype; }
diff --git a/xbmc/addons/BinaryAddonCache.cpp b/xbmc/addons/BinaryAddonCache.cpp
index 0c3a2b7..5a4331b 100644
--- a/xbmc/addons/BinaryAddonCache.cpp
+++ b/xbmc/addons/BinaryAddonCache.cpp
@@ -32,7 +32,7 @@ CBinaryAddonCache::~CBinaryAddonCache()
 
 void CBinaryAddonCache::Init()
 {
-  m_addonsToCache = {ADDON_AUDIODECODER, ADDON_INPUTSTREAM};
+  m_addonsToCache = {ADDON_AUDIODECODER, ADDON_INPUTSTREAM, ADDON_PVRDLL};
   CAddonMgr::GetInstance().Events().Subscribe(this, &CBinaryAddonCache::OnEvent);
   Update();
 }
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_epg_types.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_epg_types.h
index 9460952..b6200bf 100644
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_epg_types.h
+++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_epg_types.h
@@ -90,7 +90,7 @@ extern "C" {
    * @brief Representation of an EPG event.
    */
   typedef struct EPG_TAG {
-    unsigned int  iUniqueBroadcastId;  /*!< @brief (required) identifier for this event. Valid uids must be greater than EPG_TAG_INVALID_UID. */
+    unsigned int  iUniqueBroadcastId;  /*!< @brief (required) identifier for this event. Event uids must be unique for a channel. Valid uids must be greater than EPG_TAG_INVALID_UID. */
     const char *  strTitle;            /*!< @brief (required) this event's title */
     unsigned int  iChannelNumber;      /*!< @brief (required) the number of the channel this event occurs on */
     time_t        startTime;           /*!< @brief (required) start time in UTC */
diff --git a/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_types.h b/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_types.h
index b50483d..08ae183 100644
--- a/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_types.h
+++ b/xbmc/addons/kodi-addon-dev-kit/include/kodi/xbmc_pvr_types.h
@@ -455,7 +455,7 @@ extern "C" {
     unsigned int    iWeekdays;                                 /*!< @brief (optional) week days, for repeating timers */
     unsigned int    iPreventDuplicateEpisodes;                 /*!< @brief (optional) 1 if backend should only record new episodes in case of a repeating epg-based timer, 0 if all episodes shall be recorded (no duplicate detection). Actual algorithm for
                                                                     duplicate detection is defined by the backend. Addons may define own values for different duplicate detection algorithms, thus this is not just a bool.*/
-    unsigned int    iEpgUid;                                   /*!< @brief (optional) EPG event id associated with this timer. Valid ids must be greater than EPG_TAG_INVALID_UID. */
+    unsigned int    iEpgUid;                                   /*!< @brief (optional) EPG event id associated with this timer. Event ids must be unique for a channel. Valid ids must be greater than EPG_TAG_INVALID_UID. */
     unsigned int    iMarginStart;                              /*!< @brief (optional) if set, the backend starts the recording iMarginStart minutes before startTime. */
     unsigned int    iMarginEnd;                                /*!< @brief (optional) if set, the backend ends the recording iMarginEnd minutes after endTime. */
     int             iGenreType;                                /*!< @brief (optional) genre type */
diff --git a/xbmc/cores/AudioEngine/CMakeLists.txt b/xbmc/cores/AudioEngine/CMakeLists.txt
index 19371d6..c1ac17a 100644
--- a/xbmc/cores/AudioEngine/CMakeLists.txt
+++ b/xbmc/cores/AudioEngine/CMakeLists.txt
@@ -135,9 +135,9 @@ core_add_library(audioengine)
 target_include_directories(${CORE_LIBRARY} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
 if(NOT CORE_SYSTEM_NAME STREQUAL windows)
   if(HAVE_SSE)
-    target_compile_options(audioengine PRIVATE -msse)
+    target_compile_options(${CORE_LIBRARY} PRIVATE -msse)
   endif()
   if(HAVE_SSE2)
-    target_compile_options(audioengine PRIVATE -msse2)
+    target_compile_options(${CORE_LIBRARY} PRIVATE -msse2)
   endif()
 endif()
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
index d0903f1..5013e2a 100644
--- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
@@ -31,9 +31,7 @@
 #include "platform/android/jni/Build.h"
 #include "utils/TimeUtils.h"
 
-#if defined(HAS_LIBAMCODEC)
 #include "utils/AMLUtils.h"
-#endif
 
 //#define DEBUG_VERBOSE 1
 
@@ -316,14 +314,12 @@ bool CAESinkAUDIOTRACK::Initialize(AEAudioFormat &format, std::string &device)
   }
 
   int atChannelMask = AEChannelMapToAUDIOTRACKChannelMask(m_format.m_channelLayout);
+  m_format.m_channelLayout  = AUDIOTRACKChannelMaskToAEChannelMap(atChannelMask);
   if (m_encoding == CJNIAudioFormat::ENCODING_IEC61937)
     atChannelMask = CJNIAudioFormat::CHANNEL_OUT_STEREO;
-  m_format.m_channelLayout  = AUDIOTRACKChannelMaskToAEChannelMap(atChannelMask);
 
-#if defined(HAS_LIBAMCODEC)
-  if (aml_present() && m_passthrough)
+  if (aml_present() && m_passthrough && m_info.m_wantsIECPassthrough)
     atChannelMask = CJNIAudioFormat::CHANNEL_OUT_STEREO;
-#endif
 
   while (!m_at_jni)
   {
@@ -539,13 +535,12 @@ void CAESinkAUDIOTRACK::GetDelay(AEDelayStatus& status)
   }
   uint64_t normHead_pos = m_headPos - m_offset;
 
-#if defined(HAS_LIBAMCODEC)
-  if (aml_present() &&
+  // this makes EAC3 working even when AML is not enabled
+  if (aml_present() && m_info.m_wantsIECPassthrough &&
       (m_encoding == CJNIAudioFormat::ENCODING_DTS_HD ||
        m_encoding == CJNIAudioFormat::ENCODING_E_AC3 ||
        m_encoding == CJNIAudioFormat::ENCODING_DOLBY_TRUEHD))
     normHead_pos /= m_sink_frameSize;  // AML wants sink in 48k but returns pos in 192k
-#endif
 
   if (m_passthrough && !m_info.m_wantsIECPassthrough)
   {
@@ -777,8 +772,7 @@ void CAESinkAUDIOTRACK::EnumerateDevicesEx(AEDeviceInfoList &list, bool force)
       m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTS_512);
     }
 
-#if defined(HAS_LIBAMCODEC)
-    if (aml_present())
+    if (aml_present() && CJNIAudioManager::GetSDKVersion() < 23)
     {
       // passthrough
       m_info.m_wantsIECPassthrough = true;
@@ -794,7 +788,6 @@ void CAESinkAUDIOTRACK::EnumerateDevicesEx(AEDeviceInfoList &list, bool force)
       }
     }
     else
-#endif
     {
       bool supports_192khz = false;
       int test_sample[] = { 32000, 44100, 48000, 96000, 192000 };
@@ -819,33 +812,29 @@ void CAESinkAUDIOTRACK::EnumerateDevicesEx(AEDeviceInfoList &list, bool force)
         if (CJNIAudioFormat::ENCODING_DOLBY_TRUEHD != -1)
           m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_TRUEHD);
       }
-      // Android v24 can do real IEC API
-      if (CJNIAudioManager::GetSDKVersion() >= 24)
+      // Android v24 and backports can do real IEC API
+      if (CJNIAudioFormat::ENCODING_IEC61937 != -1)
       {
-        if (CJNIAudioFormat::ENCODING_IEC61937 != -1)
+        m_info.m_wantsIECPassthrough = true;
+        m_info.m_streamTypes.clear();
+        m_info.m_dataFormats.push_back(AE_FMT_RAW);
+        m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_AC3);
+        m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTSHD_CORE);
+        m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTS_1024);
+        m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTS_2048);
+        m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTS_512);
+
+        if (supports_192khz)
         {
-          m_info.m_wantsIECPassthrough = true;
-          m_info.m_streamTypes.clear();
-          m_info.m_dataFormats.push_back(AE_FMT_RAW);
-          m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_AC3);
-          m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTSHD_CORE);
-          m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTS_1024);
-          m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTS_2048);
-          m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTS_512);
-
-          if (supports_192khz)
-          {
-            m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_EAC3);
-            // not working yet
-            // m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTSHD);
-            // m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_TRUEHD);
-          }
+          m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_EAC3);
+          // not working yet
+          // m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_DTSHD);
+          // m_info.m_streamTypes.push_back(CAEStreamInfo::STREAM_TYPE_TRUEHD);
         }
       }
     }
     std::copy(m_sink_sampleRates.begin(), m_sink_sampleRates.end(), std::back_inserter(m_info.m_sampleRates));
   }
-
   list.push_back(m_info);
 }
 
diff --git a/xbmc/cores/AudioEngine/Utils/AEUtil.cpp b/xbmc/cores/AudioEngine/Utils/AEUtil.cpp
index 463257a..3d8edba 100644
--- a/xbmc/cores/AudioEngine/Utils/AEUtil.cpp
+++ b/xbmc/cores/AudioEngine/Utils/AEUtil.cpp
@@ -21,6 +21,10 @@
   #define __STDC_LIMIT_MACROS
 #endif
 
+#if (defined HAVE_CONFIG_H) && (!defined TARGET_WINDOWS)
+#include "config.h"
+#endif
+
 #include "AEUtil.h"
 #include "utils/log.h"
 #include "utils/TimeUtils.h"
diff --git a/xbmc/cores/IPlayer.h b/xbmc/cores/IPlayer.h
index 7bc005b..a1ea99f 100644
--- a/xbmc/cores/IPlayer.h
+++ b/xbmc/cores/IPlayer.h
@@ -147,7 +147,6 @@ enum EINTERLACEMETHOD
   VS_INTERLACEMETHOD_DEINTERLACE=7,
 
   VS_INTERLACEMETHOD_VDPAU_BOB=8,
-  VS_INTERLACEMETHOD_INVERSE_TELECINE=9,
 
   VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE=11,
   VS_INTERLACEMETHOD_VDPAU_TEMPORAL=12,
@@ -156,8 +155,6 @@ enum EINTERLACEMETHOD
   VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF=15,
   VS_INTERLACEMETHOD_DEINTERLACE_HALF=16,
 
-  VS_INTERLACEMETHOD_AUTO_ION = 21,
-
   VS_INTERLACEMETHOD_VAAPI_BOB = 22,
   VS_INTERLACEMETHOD_VAAPI_MADI = 23,
   VS_INTERLACEMETHOD_VAAPI_MACI = 24,
@@ -171,6 +168,8 @@ enum EINTERLACEMETHOD
   VS_INTERLACEMETHOD_IMX_ADVMOTION = 30,
   VS_INTERLACEMETHOD_IMX_ADVMOTION_HALF = 31,
 
+  VS_INTERLACEMETHOD_DXVA_AUTO = 32,
+
   VS_INTERLACEMETHOD_MAX // do not use and keep as last enum value.
 };
 
@@ -356,28 +355,6 @@ public:
 
   virtual bool SwitchChannel(const PVR::CPVRChannelPtr &channel) { return false; }
 
-  // Note: the following "OMX" methods are deprecated and will be removed in the future
-  // They should be handled by the video renderer, not the player
-  /*!
-   \brief If the player uses bypass mode, define its rendering capabilities
-   */
-  virtual void OMXGetRenderFeatures(std::vector<int> &renderFeatures) {};
-  /*!
-   \brief If the player uses bypass mode, define its deinterlace algorithms
-   */
-  virtual void OMXGetDeinterlaceMethods(std::vector<int> &deinterlaceMethods) {};
-  /*!
-   \brief If the player uses bypass mode, define how deinterlace is set
-   */
-  virtual void OMXGetDeinterlaceModes(std::vector<int> &deinterlaceModes) {};
-  /*!
-   \brief If the player uses bypass mode, define its scaling capabilities
-   */
-  virtual void OMXGetScalingMethods(std::vector<int> &scalingMethods) {};
-  /*!
-   \brief define the audio capabilities of the player (default=all)
-   */
-
   virtual void GetAudioCapabilities(std::vector<int> &audioCaps) { audioCaps.assign(1,IPC_AUD_ALL); };
   /*!
    \brief define the subtitle capabilities of the player
@@ -389,8 +366,6 @@ public:
    */
   virtual void FrameMove() {};
 
-  virtual bool HasFrame() { return false; };
-
   virtual void Render(bool clear, uint32_t alpha = 255, bool gui = true) {};
 
   virtual void FlushRenderer() {};
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Audio/DVDAudioCodecPassthrough.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Audio/DVDAudioCodecPassthrough.cpp
index b2d0aca..1e42d50 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Audio/DVDAudioCodecPassthrough.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Audio/DVDAudioCodecPassthrough.cpp
@@ -127,8 +127,8 @@ int CDVDAudioCodecPassthrough::Decode(uint8_t* pData, int iSize, double dts, dou
     if (consumed != m_backlogSize)
     {
       memmove(m_backlogBuffer, m_backlogBuffer+consumed, m_backlogSize-consumed);
-      m_backlogSize -= consumed;
     }
+    m_backlogSize -= consumed;
   }
 
   // get rid of potential side data
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/DVDCodecUtils.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/DVDCodecUtils.cpp
index 83b1c56..ac4e063 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/DVDCodecUtils.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/DVDCodecUtils.cpp
@@ -429,7 +429,7 @@ ERenderFormat CDVDCodecUtils::EFormatFromPixfmt(int fmt)
   return RENDER_FMT_NONE;
 }
 
-int CDVDCodecUtils::PixfmtFromEFormat(ERenderFormat fmt)
+AVPixelFormat CDVDCodecUtils::PixfmtFromEFormat(ERenderFormat fmt)
 {
   for(const EFormatMap *p = g_format_map; p->pix_fmt != AV_PIX_FMT_NONE; ++p)
   {
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/DVDCodecUtils.h b/xbmc/cores/VideoPlayer/DVDCodecs/DVDCodecUtils.h
index eb76a6f..361c966 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/DVDCodecUtils.h
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/DVDCodecUtils.h
@@ -23,6 +23,10 @@
 #include "Video/DVDVideoCodec.h"
 #include "cores/VideoPlayer/VideoRenderers/RenderFormats.h"
 
+extern "C" {
+#include "libavutil/pixfmt.h"
+}
+
 struct YV12Image;
 
 class CDVDCodecUtils
@@ -43,6 +47,6 @@ public:
   static double NormalizeFrameduration(double frameduration, bool *match = NULL);
 
   static ERenderFormat EFormatFromPixfmt(int fmt);
-  static int           PixfmtFromEFormat(ERenderFormat format);
+  static AVPixelFormat PixfmtFromEFormat(ERenderFormat format);
 };
 
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp
index c05cae0..bd4e084 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAmlogic.cpp
@@ -104,7 +104,11 @@ bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &option
       {
         case FF_PROFILE_H264_HIGH_10:
         case FF_PROFILE_H264_HIGH_10_INTRA:
-          // Amlogic decodes Hi10P with lots of artifacts
+        case FF_PROFILE_H264_HIGH_422:
+        case FF_PROFILE_H264_HIGH_422_INTRA:
+        case FF_PROFILE_H264_HIGH_444_PREDICTIVE:
+        case FF_PROFILE_H264_HIGH_444_INTRA:
+        case FF_PROFILE_H264_CAVLC_444:
           return false;
       }
       if ((!aml_support_h264_4k2k()) && ((m_hints.width > 1920) || (m_hints.height > 1088)))
@@ -173,6 +177,10 @@ bool CDVDVideoCodecAmlogic::Open(CDVDStreamInfo &hints, CDVDCodecOptions &option
         // HEVC supported only on S805 and S812.
         return false;
       }
+      if ((hints.profile == FF_PROFILE_HEVC_MAIN_10) && !aml_support_hevc_10bit())
+      {
+        return false;
+      }
       m_pFormatName = "am-h265";
       m_bitstream = new CBitstreamConverter();
       m_bitstream->Open(m_hints.codec, (uint8_t*)m_hints.extradata, m_hints.extrasize, true);
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
index 0f37978..bd9d08f 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecFFmpeg.cpp
@@ -310,9 +310,13 @@ bool CDVDVideoCodecFFmpeg::Open(CDVDStreamInfo &hints, CDVDCodecOptions &options
 
   m_iOrientation = hints.orientation;
 
+  m_formats.clear();
   for(std::vector<ERenderFormat>::iterator it = options.m_formats.begin(); it != options.m_formats.end(); ++it)
   {
-    m_formats.push_back((AVPixelFormat)CDVDCodecUtils::PixfmtFromEFormat(*it));
+    AVPixelFormat pixFormat = CDVDCodecUtils::PixfmtFromEFormat(*it);
+    if (pixFormat != AV_PIX_FMT_NONE)
+      m_formats.push_back(pixFormat);
+
     if(*it == RENDER_FMT_YUV420P)
       m_formats.push_back(AV_PIX_FMT_YUVJ420P);
   }
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp
index 398a185..a890675 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.cpp
@@ -922,9 +922,9 @@ bool CDecoder::Open(AVCodecContext *avctx, AVCodecContext* mainctx, enum AVPixel
 
   std::list<EINTERLACEMETHOD> deintMethods;
   deintMethods.push_back(EINTERLACEMETHOD::VS_INTERLACEMETHOD_NONE);
-  deintMethods.push_back(EINTERLACEMETHOD::VS_INTERLACEMETHOD_AUTO);
+  deintMethods.push_back(EINTERLACEMETHOD::VS_INTERLACEMETHOD_DXVA_AUTO);
   m_processInfo.UpdateDeinterlacingMethods(deintMethods);
-  m_processInfo.SetDeinterlacingMethodDefault(EINTERLACEMETHOD::VS_INTERLACEMETHOD_AUTO);
+  m_processInfo.SetDeinterlacingMethodDefault(EINTERLACEMETHOD::VS_INTERLACEMETHOD_DXVA_AUTO);
 
   m_state = DXVA_OPEN;
   return true;
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp
index 8a776b1..1dc50e7 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VAAPI.cpp
@@ -659,6 +659,7 @@ long CDecoder::Release()
     if (g_advancedSettings.CanLogComponent(LOGVIDEO))
       CLog::Log(LOGDEBUG,"VAAPI::Release pre-cleanup");
 
+    CSingleLock lock1(g_graphicsContext);
     Message *reply;
     if (m_vaapiOutput.m_controlPort.SendOutMessageSync(COutputControlProtocol::PRECLEANUP,
                                                    &reply,
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VDPAU.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VDPAU.cpp
index 8ebd313..2d2b2a4 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/VDPAU.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/VDPAU.cpp
@@ -1502,7 +1502,7 @@ void CMixer::StateMachine(int signal, Protocol *port, Message *msg)
           }
           else if (!m_outputSurfaces.empty() &&
                    m_config.stats->IsDraining() &&
-                   m_mixerInput.size() == 1)
+                   m_mixerInput.size() >= 1)
           {
             CVdpauDecodedPicture pic;
             pic.DVDPic = m_mixerInput[0].DVDPic;
diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
index 8460e27..926cc74 100644
--- a/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
+++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DVDDemuxFFmpeg.cpp
@@ -299,8 +299,9 @@ bool CDVDDemuxFFmpeg::Open(CDVDInputStream* pInput, bool streaminfo, bool filein
 
         // av_probe_input_buffer might have changed the buffer_size beyond our allocated amount
         int buffer_size = std::min((int) FFMPEG_FILE_BUFFER_SIZE, m_ioContext->buffer_size);
+        buffer_size = m_ioContext->max_packet_size ? m_ioContext->max_packet_size : buffer_size;
         // read data using avformat's buffers
-        pd.buf_size = avio_read(m_ioContext, pd.buf, m_ioContext->max_packet_size ? m_ioContext->max_packet_size : buffer_size);
+        pd.buf_size = avio_read(m_ioContext, pd.buf, buffer_size);
         if (pd.buf_size <= 0)
         {
           CLog::Log(LOGERROR, "%s - error reading from input stream, %s", __FUNCTION__, CURL::GetRedacted(strFile).c_str());
@@ -1290,7 +1291,7 @@ CDemuxStream* CDVDDemuxFFmpeg::AddStream(int streamIdx)
         st->iChannelLayout = pStream->codec->channel_layout;
         if (st->iBitsPerSample == 0)
           st->iBitsPerSample = pStream->codec->bits_per_coded_sample;
-	
+  
         if(av_dict_get(pStream->metadata, "title", NULL, 0))
           st->m_description = av_dict_get(pStream->metadata, "title", NULL, 0)->value;
 
@@ -1398,10 +1399,10 @@ CDemuxStream* CDVDDemuxFFmpeg::AddStream(int streamIdx)
         {
           CDemuxStreamSubtitleFFmpeg* st = new CDemuxStreamSubtitleFFmpeg(this, pStream);
           stream = st;
-	    
+      
           if(av_dict_get(pStream->metadata, "title", NULL, 0))
             st->m_description = av_dict_get(pStream->metadata, "title", NULL, 0)->value;
-	
+  
           break;
         }
       }
@@ -1650,31 +1651,6 @@ std::string CDVDDemuxFFmpeg::GetStreamCodecName(int iStreamId)
   std::string strName;
   if (stream)
   {
-    unsigned int in = stream->codec_fourcc;
-    // FourCC codes are only valid on video streams, audio codecs in AVI/WAV
-    // are 2 bytes and audio codecs in transport streams have subtle variation
-    // e.g AC-3 instead of ac3
-    if (stream->type == STREAM_VIDEO && in != 0)
-    {
-      char fourcc[5];
-#if defined(__powerpc__)
-      fourcc[0] = in & 0xff;
-      fourcc[1] = (in >> 8) & 0xff;
-      fourcc[2] = (in >> 16) & 0xff;
-      fourcc[3] = (in >> 24) & 0xff;
-#else
-      memcpy(fourcc, &in, 4);
-#endif
-      fourcc[4] = 0;
-      // fourccs have to be 4 characters
-      if (strlen(fourcc) == 4)
-      {
-        strName = fourcc;
-        StringUtils::ToLower(strName);
-        return strName;
-      }
-    }
-
 #ifdef FF_PROFILE_DTS_HD_MA
     /* use profile to determine the DTS type */
     if (stream->codec == AV_CODEC_ID_DTS)
diff --git a/xbmc/cores/VideoPlayer/DVDDemuxers/DemuxMultiSource.cpp b/xbmc/cores/VideoPlayer/DVDDemuxers/DemuxMultiSource.cpp
index 24c9297..9cfc1a8 100644
--- a/xbmc/cores/VideoPlayer/DVDDemuxers/DemuxMultiSource.cpp
+++ b/xbmc/cores/VideoPlayer/DVDDemuxers/DemuxMultiSource.cpp
@@ -230,8 +230,7 @@ void CDemuxMultiSource::SetMissingStreamDetails(DemuxPtr demuxer)
   std::string fileName = demuxer->GetFileName();
   for (auto& stream : demuxer->GetStreams())
   {
-    ExternalStreamInfo info;
-    CUtil::GetExternalStreamDetailsFromFilename(baseFileName, fileName, info);
+    ExternalStreamInfo info = CUtil::GetExternalStreamDetailsFromFilename(baseFileName, fileName);
 
     if (stream->flags == CDemuxStream::FLAG_NONE)
     {
diff --git a/xbmc/cores/VideoPlayer/DVDFileInfo.cpp b/xbmc/cores/VideoPlayer/DVDFileInfo.cpp
index 2e47e95..8709bbf 100644
--- a/xbmc/cores/VideoPlayer/DVDFileInfo.cpp
+++ b/xbmc/cores/VideoPlayer/DVDFileInfo.cpp
@@ -484,8 +484,7 @@ bool CDVDFileInfo::AddExternalSubtitleToDetails(const std::string &path, CStream
   }
 
   CStreamDetailSubtitle *dsub = new CStreamDetailSubtitle();
-  ExternalStreamInfo info;
-  CUtil::GetExternalStreamDetailsFromFilename(path, filename, info);
+  ExternalStreamInfo info = CUtil::GetExternalStreamDetailsFromFilename(path, filename);
   dsub->m_strLanguage = g_LangCodeExpander.ConvertToISO6392T(info.language);
   details.AddStream(dsub);
 
diff --git a/xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp b/xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp
index 4e52e71..54e5fb3 100644
--- a/xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp
+++ b/xbmc/cores/VideoPlayer/Process/ProcessInfo.cpp
@@ -59,6 +59,7 @@ void CProcessInfo::ResetVideoCodecInfo()
   m_deintMethods.clear();
   m_deintMethods.push_back(EINTERLACEMETHOD::VS_INTERLACEMETHOD_NONE);
   m_deintMethodDefault = EINTERLACEMETHOD::VS_INTERLACEMETHOD_NONE;
+  m_renderInfo.Reset();
 
   CServiceBroker::GetDataCacheCore().SetVideoDecoderName(m_videoDecoderName, m_videoIsHWDecoder);
   CServiceBroker::GetDataCacheCore().SetVideoDeintMethod(m_videoDeintMethod);
@@ -195,6 +196,12 @@ void CProcessInfo::UpdateDeinterlacingMethods(std::list<EINTERLACEMETHOD> &metho
 
   m_deintMethods = methods;
 
+  for (auto &deint : m_renderInfo.m_deintMethods)
+  {
+    if (!Supports(deint))
+      m_deintMethods.push_back(deint);
+  }
+
   if (!Supports(EINTERLACEMETHOD::VS_INTERLACEMETHOD_NONE))
     m_deintMethods.push_front(EINTERLACEMETHOD::VS_INTERLACEMETHOD_NONE);
 }
@@ -324,3 +331,16 @@ bool CProcessInfo::IsRenderClockSync()
 
   return m_isClockSync;
 }
+
+void CProcessInfo::UpdateRenderInfo(CRenderInfo &info)
+{
+  CSingleLock lock(m_renderSection);
+
+  m_renderInfo = info;
+
+  for (auto &deint : m_renderInfo.m_deintMethods)
+  {
+    if (!Supports(deint))
+      m_deintMethods.push_back(deint);
+  }
+}
diff --git a/xbmc/cores/VideoPlayer/Process/ProcessInfo.h b/xbmc/cores/VideoPlayer/Process/ProcessInfo.h
index ce545d2..9474434 100644
--- a/xbmc/cores/VideoPlayer/Process/ProcessInfo.h
+++ b/xbmc/cores/VideoPlayer/Process/ProcessInfo.h
@@ -20,6 +20,7 @@
 #pragma once
 
 #include "cores/IPlayer.h"
+#include "cores/VideoPlayer/VideoRenderers/RenderFormats.h"
 #include "threads/CriticalSection.h"
 #include <list>
 #include <string>
@@ -67,6 +68,7 @@ public:
   // render info
   void SetRenderClockSync(bool enabled);
   bool IsRenderClockSync();
+  void UpdateRenderInfo(CRenderInfo &info);
 
 protected:
   CProcessInfo();
@@ -94,4 +96,5 @@ protected:
   // render info
   CCriticalSection m_renderSection;
   bool m_isClockSync;
+  CRenderInfo m_renderInfo;
 };
diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.cpp b/xbmc/cores/VideoPlayer/VideoPlayer.cpp
index b4a604c..4cb7cb6 100644
--- a/xbmc/cores/VideoPlayer/VideoPlayer.cpp
+++ b/xbmc/cores/VideoPlayer/VideoPlayer.cpp
@@ -663,7 +663,7 @@ CVideoPlayer::CVideoPlayer(IPlayerCallback& callback)
 
   m_SkipCommercials = true;
 
-  m_processInfo = CProcessInfo::CreateInstance();
+  m_processInfo.reset(CProcessInfo::CreateInstance());
   CreatePlayers();
 
   m_displayLost = false;
@@ -2060,6 +2060,18 @@ void CVideoPlayer::HandlePlaySpeed()
 
       m_syncTimer.Set(3000);
     }
+    else
+    {
+      // exceptions for which stream players won't start properly
+      // 1. videoplayer has not detected a keyframe within lenght of demux buffers
+      if (m_CurrentAudio.id >= 0 && m_CurrentVideo.id >= 0 &&
+          !m_VideoPlayerAudio->AcceptsData() &&
+          m_VideoPlayerVideo->IsStalled())
+      {
+        CLog::Log(LOGWARNING, "VideoPlayer::Sync - stream player video does not start, flushing buffers");
+        FlushBuffers(false);
+      }
+    }
   }
 
   // handle ff/rw
@@ -2710,21 +2722,26 @@ void CVideoPlayer::HandleMessages()
         int speed = static_cast<CDVDMsgInt*>(pMsg)->m_value;
 
         // correct our current clock, as it would start going wrong otherwise
-        if(m_State.timestamp > 0)
+        if (m_State.timestamp > 0)
         {
           double offset;
-          offset  = m_clock.GetAbsoluteClock() - m_State.timestamp;
+          offset = m_clock.GetAbsoluteClock() - m_State.timestamp;
           offset *= m_playSpeed / DVD_PLAYSPEED_NORMAL;
-          offset  = DVD_TIME_TO_MSEC(offset);
-          if(offset >  1000) offset =  1000;
-          if(offset < -1000) offset = -1000;
-          m_State.time     += offset;
-          m_State.timestamp =  m_clock.GetAbsoluteClock();
+          offset = DVD_TIME_TO_MSEC(offset);
+          if (offset > 1000)
+            offset = 1000;
+          if (offset < -1000)
+            offset = -1000;
+          m_State.time += offset;
+          m_State.timestamp = m_clock.GetAbsoluteClock();
         }
 
         if (speed != DVD_PLAYSPEED_PAUSE && m_playSpeed != DVD_PLAYSPEED_PAUSE && speed != m_playSpeed)
           m_callback.OnPlayBackSpeedChanged(speed / DVD_PLAYSPEED_NORMAL);
 
+        // notifiy GUI, skins may want to show the seekbar
+        g_infoManager.SetDisplayAfterSeek();
+
         if (m_pInputStream->IsStreamType(DVDSTREAM_TYPE_PVRMANAGER) && speed != m_playSpeed)
         {
           CDVDInputStreamPVRManager* pvrinputstream = static_cast<CDVDInputStreamPVRManager*>(m_pInputStream);
@@ -2732,6 +2749,19 @@ void CVideoPlayer::HandleMessages()
         }
 
         // do a seek after rewind, clock is not in sync with current pts
+        if ((speed == DVD_PLAYSPEED_NORMAL) &&
+            (m_playSpeed != DVD_PLAYSPEED_NORMAL) &&
+            (m_playSpeed != DVD_PLAYSPEED_PAUSE) &&
+            !m_omxplayer_mode)
+        {
+          int64_t iTime = (int64_t)DVD_TIME_TO_MSEC(m_clock.GetClock() + m_State.time_offset);
+          if (m_State.time != DVD_NOPTS_VALUE)
+            iTime = m_State.time;
+          m_messenger.Put(new CDVDMsgPlayerSeek(iTime, m_playSpeed < 0, true, false, false, true));
+        }
+
+        // !!! omx alterative code path !!!
+        // should be done differently
         if (m_omxplayer_mode)
         {
           // when switching from trickplay to normal, we may not have a full set of reference frames
@@ -2749,22 +2779,7 @@ void CVideoPlayer::HandleMessages()
           m_OmxPlayerState.av_clock.OMXSetSpeed(speed);
           CLog::Log(LOGDEBUG, "%s::%s CDVDMsg::PLAYER_SETSPEED speed : %d (%d)", "CVideoPlayer", __FUNCTION__, speed, static_cast<int>(m_playSpeed));
         }
-        else if ((speed == DVD_PLAYSPEED_NORMAL) &&
-                 (m_playSpeed != DVD_PLAYSPEED_NORMAL) &&
-                 (m_playSpeed != DVD_PLAYSPEED_PAUSE))
-        {
-          int64_t iTime = (int64_t)DVD_TIME_TO_MSEC(m_clock.GetClock() + m_State.time_offset);
-          if (m_State.time != DVD_NOPTS_VALUE)
-            iTime = m_State.time;
-          m_messenger.Put(new CDVDMsgPlayerSeek(iTime, m_playSpeed < 0, true, false, false, true));
-        }
 
-        // if playspeed is different then DVD_PLAYSPEED_NORMAL or DVD_PLAYSPEED_PAUSE
-        // audioplayer, stops outputing audio to audiorendere, but still tries to
-        // sleep an correct amount for each packet
-        // videoplayer just plays faster after the clock speed has been increased
-        // 1. disable audio
-        // 2. skip frames and adjust their pts or the clock
         m_playSpeed = speed;
         m_newPlaySpeed = speed;
         m_caching = CACHESTATE_DONE;
@@ -4713,8 +4728,7 @@ int CVideoPlayer::AddSubtitleFile(const std::string& filename, const std::string
       return -1;
     m_SelectionStreams.Update(NULL, &v, vobsubfile);
 
-    ExternalStreamInfo info;
-    CUtil::GetExternalStreamDetailsFromFilename(m_item.GetPath(), vobsubfile, info);
+    ExternalStreamInfo info = CUtil::GetExternalStreamDetailsFromFilename(m_item.GetPath(), vobsubfile);
 
     for (auto sub : v.GetStreams())
     {
@@ -4751,8 +4765,7 @@ int CVideoPlayer::AddSubtitleFile(const std::string& filename, const std::string
   s.type     = STREAM_SUBTITLE;
   s.id       = 0;
   s.filename = filename;
-  ExternalStreamInfo info;
-  CUtil::GetExternalStreamDetailsFromFilename(m_item.GetPath(), filename, info);
+  ExternalStreamInfo info = CUtil::GetExternalStreamDetailsFromFilename(m_item.GetPath(), filename);
   s.name = info.name;
   s.language = info.language;
   if (static_cast<CDemuxStream::EFlags>(info.flag) != CDemuxStream::FLAG_NONE)
@@ -5039,11 +5052,6 @@ void CVideoPlayer::FrameMove()
   m_renderManager.FrameMove();
 }
 
-bool CVideoPlayer::HasFrame()
-{
-  return m_renderManager.HasFrame();
-}
-
 void CVideoPlayer::Render(bool clear, uint32_t alpha, bool gui)
 {
   m_renderManager.Render(clear, 0, alpha, gui);
@@ -5145,6 +5153,11 @@ void CVideoPlayer::UpdateClockSync(bool enabled)
   m_processInfo->SetRenderClockSync(enabled);
 }
 
+void CVideoPlayer::UpdateRenderInfo(CRenderInfo &info)
+{
+  m_processInfo->UpdateRenderInfo(info);
+}
+
 // IDispResource interface
 void CVideoPlayer::OnLostDisplay()
 {
diff --git a/xbmc/cores/VideoPlayer/VideoPlayer.h b/xbmc/cores/VideoPlayer/VideoPlayer.h
index 3f39706..8545f11 100644
--- a/xbmc/cores/VideoPlayer/VideoPlayer.h
+++ b/xbmc/cores/VideoPlayer/VideoPlayer.h
@@ -21,6 +21,7 @@
  */
 
 #include <atomic>
+#include <memory>
 #include <utility>
 #include <vector>
 #include "cores/IPlayer.h"
@@ -368,7 +369,6 @@ public:
   virtual bool SwitchChannel(const PVR::CPVRChannelPtr &channel);
 
   virtual void FrameMove();
-  virtual bool HasFrame();
   virtual void Render(bool clear, uint32_t alpha = 255, bool gui = true);
   virtual void FlushRenderer();
   virtual void SetRenderViewMode(int mode);
@@ -406,6 +406,7 @@ protected:
   virtual void VideoParamsChange() override;
   virtual void GetDebugInfo(std::string &audio, std::string &video, std::string &general) override;
   virtual void UpdateClockSync(bool enabled) override;
+  virtual void UpdateRenderInfo(CRenderInfo &info) override;
 
   void CreatePlayers();
   void DestroyPlayers();
@@ -503,7 +504,7 @@ protected:
   XbmcThreads::EndTime m_cachingTimer;
   CFileItem    m_item;
   XbmcThreads::EndTime m_ChannelEntryTimeOut;
-  CProcessInfo *m_processInfo;
+  std::unique_ptr<CProcessInfo> m_processInfo;
 
   CCurrentStream m_CurrentAudio;
   CCurrentStream m_CurrentVideo;
diff --git a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp
index c6d100b..8651327 100644
--- a/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp
+++ b/xbmc/cores/VideoPlayer/VideoPlayerVideo.cpp
@@ -291,8 +291,7 @@ void CVideoPlayerVideo::Process()
       //Okey, start rendering at stream fps now instead, we are likely in a stillframe
       if (!m_stalled)
       {
-        if(m_syncState == IDVDStreamPlayer::SYNC_INSYNC)
-          CLog::Log(LOGINFO, "CVideoPlayerVideo - Stillframe detected, switching to forced %f fps", m_fFrameRate);
+        CLog::Log(LOGINFO, "CVideoPlayerVideo - Stillframe detected, switching to forced %f fps", m_fFrameRate);
         m_stalled = true;
         pts += frametime * 4;
       }
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h b/xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h
index 9514f15..c7294ce 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/BaseRenderer.h
@@ -90,7 +90,7 @@ public:
   virtual void Flush() {};
   virtual void SetBufferSize(int numBuffers) { }
   virtual void ReleaseBuffer(int idx) { }
-  virtual bool NeedBufferForRef(int idx) { return false; }
+  virtual bool NeedBuffer(int idx) { return false; }
   virtual bool IsGuiLayer() { return true; }
   // Render info, can be called before configure
   virtual CRenderInfo GetRenderInfo() { return CRenderInfo(); }
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTBGL.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTBGL.cpp
index 9d5e9dd..19a32d6 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTBGL.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTBGL.cpp
@@ -31,22 +31,43 @@
 #include <OpenGL/CGLIOSurface.h>
 #include "windowing/WindowingFactory.h"
 
-CRendererVTB::CRendererVTB()
+struct CVTBData
 {
+  struct __CVBuffer* m_vtbbuf;
+  GLuint m_fence;
+};
 
+CRendererVTB::CRendererVTB()
+{
 }
 
 CRendererVTB::~CRendererVTB()
 {
+  for (int i = 0; i < NUM_BUFFERS; ++i)
+  {
+    DeleteTexture(i);
+  }
+}
 
+CRenderInfo CRendererVTB::GetRenderInfo()
+{
+  CRenderInfo info;
+  info.formats = m_formats;
+  info.max_buffer_size = NUM_BUFFERS;
+  info.optimal_buffer_size = 5;
+  return info;
 }
 
 void CRendererVTB::AddVideoPictureHW(DVDVideoPicture &picture, int index)
 {
   YUVBUFFER &buf = m_buffers[index];
-  if (buf.hwDec)
-    CVBufferRelease((struct __CVBuffer *)buf.hwDec);
-  buf.hwDec = picture.cvBufferRef;
+  CVTBData *vtbdata = (CVTBData*)buf.hwDec;
+  if (vtbdata->m_vtbbuf)
+  {
+    CVBufferRelease(vtbdata->m_vtbbuf);
+  }
+  vtbdata->m_vtbbuf = picture.cvBufferRef;
+
   // retain another reference, this way VideoPlayer and renderer can issue releases.
   CVBufferRetain(picture.cvBufferRef);
 }
@@ -55,20 +76,25 @@ void CRendererVTB::ReleaseBuffer(int idx)
 {
   YUVBUFFER &buf = m_buffers[idx];
   if (buf.hwDec)
-    CVBufferRelease((struct __CVBuffer *)buf.hwDec);
-  buf.hwDec = NULL;
-}
-
-
-bool CRendererVTB::Supports(EINTERLACEMETHOD method)
-{
-  return false;
+  {
+    CVTBData *vtbdata = (CVTBData*)buf.hwDec;
+    if (vtbdata->m_vtbbuf)
+    {
+      CVBufferRelease(vtbdata->m_vtbbuf);
+      vtbdata->m_vtbbuf = nullptr;
+    }
+
+    if (vtbdata->m_fence && glIsFenceAPPLE(vtbdata->m_fence))
+    {
+      glDeleteFencesAPPLE(1, &vtbdata->m_fence);
+      vtbdata->m_fence = 0;
+    }
+  }
 }
 
 bool CRendererVTB::LoadShadersHook()
 {
   CLog::Log(LOGNOTICE, "GL: Using CVBREF render method");
-  m_renderMethod = RENDER_CVREF;
   m_textureTarget = GL_TEXTURE_RECTANGLE_ARB;
   return false;
 }
@@ -110,6 +136,11 @@ bool CRendererVTB::CreateTexture(int index)
   planes[2].id = planes[1].id;
   glDisable(m_textureTarget);
 
+  CVTBData *data = new CVTBData();
+  data->m_fence = 0;
+  data->m_vtbbuf = nullptr;
+  m_buffers[index].hwDec = data;
+
   return true;
 }
 
@@ -117,9 +148,9 @@ void CRendererVTB::DeleteTexture(int index)
 {
   YUVPLANES  &planes = m_buffers[index].fields[0];
 
-  if (m_buffers[index].hwDec)
-    CVBufferRelease((struct __CVBuffer *)m_buffers[index].hwDec);
-  m_buffers[index].hwDec = NULL;
+  ReleaseBuffer(index);
+  delete (CVTBData*)m_buffers[index].hwDec;
+  m_buffers[index].hwDec = nullptr;
 
   if (planes[0].id && glIsTexture(planes[0].id))
   {
@@ -139,8 +170,9 @@ bool CRendererVTB::UploadTexture(int index)
   YUVBUFFER &buf = m_buffers[index];
   YUVFIELDS &fields = buf.fields;
   YUVPLANES &planes = fields[0];
+  CVTBData *vtbdata = (CVTBData*)m_buffers[index].hwDec;
 
-  CVImageBufferRef cvBufferRef = (struct __CVBuffer *)m_buffers[index].hwDec;
+  CVImageBufferRef cvBufferRef = vtbdata->m_vtbbuf;
 
   glEnable(m_textureTarget);
 
@@ -192,8 +224,32 @@ bool CRendererVTB::UploadTexture(int index)
 
   CalculateTextureSourceRects(index, 3);
 
-
   return true;
 }
 
+void CRendererVTB::AfterRenderHook(int idx)
+{
+  CVTBData *vtbdata = (CVTBData*)m_buffers[idx].hwDec;
+  if (vtbdata->m_fence && glIsFenceAPPLE(vtbdata->m_fence))
+  {
+    glDeleteFencesAPPLE(1, &vtbdata->m_fence);
+  }
+  glGenFencesAPPLE(1, &vtbdata->m_fence);
+  glSetFenceAPPLE(vtbdata->m_fence);
+}
+
+bool CRendererVTB::NeedBuffer(int idx)
+{
+  CVTBData *vtbdata = (CVTBData*)m_buffers[idx].hwDec;
+  if (!vtbdata)
+    return false;
+
+  if (vtbdata->m_fence && glIsFenceAPPLE(vtbdata->m_fence))
+  {
+    if (glTestFenceAPPLE(vtbdata->m_fence))
+      return false;
+  }
+
+  return true;
+}
 #endif
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTBGL.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTBGL.h
index 7133898..7294780 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTBGL.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererVTBGL.h
@@ -33,19 +33,19 @@ public:
   virtual ~CRendererVTB();
 
   // Player functions
-  virtual void AddVideoPictureHW(DVDVideoPicture &picture, int index);
-  virtual void ReleaseBuffer(int idx);
-
-  // Feature support
-  virtual bool Supports(EINTERLACEMETHOD method);
+  virtual void AddVideoPictureHW(DVDVideoPicture &picture, int index) override;
+  virtual void ReleaseBuffer(int idx) override;
+  virtual bool NeedBuffer(int idx) override;
+  virtual CRenderInfo GetRenderInfo() override;
 
 protected:
-  virtual bool LoadShadersHook();
+  virtual bool LoadShadersHook() override;
+  virtual void AfterRenderHook(int idx) override;
 
   // textures
-  virtual bool UploadTexture(int index);
-  virtual void DeleteTexture(int index);
-  virtual bool CreateTexture(int index);
+  virtual bool UploadTexture(int index) override;
+  virtual void DeleteTexture(int index) override;
+  virtual bool CreateTexture(int index) override;
 };
 
 #endif
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp
index 71bb4af..4e785f7 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.cpp
@@ -1115,6 +1115,8 @@ void CLinuxRendererGL::Render(DWORD flags, int renderBuffer)
     RenderSoftware(renderBuffer, m_currentField);
     VerifyGLState();
   }
+
+  AfterRenderHook(renderBuffer);
 }
 
 void CLinuxRendererGL::RenderSinglePass(int index, int field)
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h
index 050c067..ce3afe9 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGL.h
@@ -87,7 +87,6 @@ enum RenderMethod
   RENDER_VDPAU=0x08,
   RENDER_POT=0x10,
   RENDER_VAAPI=0x20,
-  RENDER_CVREF = 0x40,
 };
 
 enum RenderQuality
@@ -181,6 +180,7 @@ protected:
   // hooks for HwDec Renderered
   virtual bool LoadShadersHook() { return false; };
   virtual bool RenderHook(int idx) { return false; };
+  virtual void AfterRenderHook(int idx) {};
 
   struct
   {
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp
index d121bb7..275e165 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.cpp
@@ -188,17 +188,6 @@ bool CLinuxRendererGLES::Configure(unsigned int width, unsigned int height, unsi
 
   m_iLastRenderBuffer = -1;
 
-  if (m_format == RENDER_FMT_BYPASS)
-  {
-    m_renderFeatures.clear();
-    m_scalingMethods.clear();
-    m_deinterlaceMethods.clear();
-
-    g_application.m_pPlayer->GetRenderFeatures(m_renderFeatures);
-    g_application.m_pPlayer->GetDeinterlaceMethods(m_deinterlaceMethods);
-    g_application.m_pPlayer->GetScalingMethods(m_scalingMethods);
-  }
-
   return true;
 }
 
@@ -1627,13 +1616,6 @@ void CLinuxRendererGLES::SetTextureFilter(GLenum method)
 
 bool CLinuxRendererGLES::Supports(ERENDERFEATURE feature)
 {
-  // Player controls render, let it dictate available render features
-  if((m_renderMethod & RENDER_BYPASS))
-  {
-    Features::iterator itr = std::find(m_renderFeatures.begin(),m_renderFeatures.end(), feature);
-    return itr != m_renderFeatures.end();
-  }
-
   if(feature == RENDERFEATURE_BRIGHTNESS)
     return true;
 
@@ -1671,13 +1653,6 @@ bool CLinuxRendererGLES::SupportsMultiPassRendering()
 
 bool CLinuxRendererGLES::Supports(ESCALINGMETHOD method)
 {
-  // Player controls render, let it dictate available scaling methods
-  if((m_renderMethod & RENDER_BYPASS))
-  {
-    Features::iterator itr = std::find(m_scalingMethods.begin(),m_scalingMethods.end(), method);
-    return itr != m_scalingMethods.end();
-  }
-
   if(method == VS_SCALINGMETHOD_NEAREST
   || method == VS_SCALINGMETHOD_LINEAR)
     return true;
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h
index 35a879d..c060b0d 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/LinuxRendererGLES.h
@@ -40,7 +40,6 @@ class CRenderCapture;
 class CBaseTexture;
 namespace Shaders { class BaseYUV2RGBShader; }
 namespace Shaders { class BaseVideoFilterShader; }
-typedef std::vector<int>     Features;
 
 
 #undef ALIGN
@@ -261,10 +260,6 @@ protected:
   ESCALINGMETHOD m_scalingMethod;
   ESCALINGMETHOD m_scalingMethodGui;
 
-  Features m_renderFeatures;
-  Features m_deinterlaceMethods;
-  Features m_scalingMethods;
-
   // clear colour for "black" bars
   float m_clearColour;
 
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp
index baad1aa..a50e9b1 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp
@@ -23,6 +23,9 @@
 #include "windowing/WindowingFactory.h"
 #include "settings/AdvancedSettings.h"
 #include "cores/IPlayer.h"
+extern "C" {
+#include "libavutil/mem.h"
+}
 
 CRenderCaptureBase::CRenderCaptureBase()
 {
@@ -325,7 +328,7 @@ CRenderCaptureDX::CRenderCaptureDX()
 CRenderCaptureDX::~CRenderCaptureDX()
 {
   CleanupDX();
-  delete[] m_pixels;
+  av_freep(&m_pixels);
 
   g_Windowing.Unregister(this);
 }
@@ -339,11 +342,11 @@ void CRenderCaptureDX::BeginRender()
 {
   ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context();
   ID3D11Device* pDevice = g_Windowing.Get3D11Device();
-  CD3D11_QUERY_DESC queryDesc(D3D11_QUERY_OCCLUSION);
+  CD3D11_QUERY_DESC queryDesc(D3D11_QUERY_EVENT);
 
   if (!m_asyncChecked)
   {
-    m_asyncSupported = S_OK == pDevice->CreateQuery(&queryDesc, nullptr);
+    m_asyncSupported = SUCCEEDED(pDevice->CreateQuery(&queryDesc, nullptr));
     if (m_flags & CAPTUREFLAG_CONTINUOUS)
     {
       if (!m_asyncSupported)
@@ -351,7 +354,6 @@ void CRenderCaptureDX::BeginRender()
       if (!UseOcclusionQuery())
         CLog::Log(LOGWARNING, "CRenderCaptureDX: D3D11_QUERY_OCCLUSION disabled, performance might suffer");
     }
-
     m_asyncChecked = true;
   }
 
@@ -359,21 +361,12 @@ void CRenderCaptureDX::BeginRender()
 
   if (m_surfaceWidth != m_width || m_surfaceHeight != m_height)
   {
-    if (m_renderSurface)
-    {
-      while(m_renderSurface->Release() > 0) {}
-      m_renderSurface = nullptr;
-    }
-
-    if (m_copySurface)
-    {
-      while (m_copySurface->Release() > 0) {}
-      m_copySurface = nullptr;
-    }
+    SAFE_RELEASE(m_renderSurface);
+    SAFE_RELEASE(m_copySurface);
 
     CD3D11_TEXTURE2D_DESC texDesc(DXGI_FORMAT_B8G8R8A8_UNORM, m_width, m_height, 1, 1, D3D11_BIND_RENDER_TARGET);
     result = pDevice->CreateTexture2D(&texDesc, nullptr, &m_renderTexture);
-    if (S_OK != result)
+    if (FAILED(result))
     {
       CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateTexture2D (RENDER_TARGET) failed %s",
                 g_Windowing.GetErrorDescription(result).c_str());
@@ -383,7 +376,7 @@ void CRenderCaptureDX::BeginRender()
 
     CD3D11_RENDER_TARGET_VIEW_DESC rtDesc(D3D11_RTV_DIMENSION_TEXTURE2D);
     result = pDevice->CreateRenderTargetView(m_renderTexture, &rtDesc, &m_renderSurface);
-    if (S_OK != result)
+    if (FAILED(result))
     {
       CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateRenderTargetView failed %s",
         g_Windowing.GetErrorDescription(result).c_str());
@@ -396,7 +389,7 @@ void CRenderCaptureDX::BeginRender()
     texDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ;
 
     result = pDevice->CreateTexture2D(&texDesc, nullptr, &m_copySurface);
-    if (S_OK != result)
+    if (FAILED(result))
     {
       CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateTexture2D (USAGE_STAGING) failed %s",
                 g_Windowing.GetErrorDescription(result).c_str());
@@ -411,8 +404,8 @@ void CRenderCaptureDX::BeginRender()
   if (m_bufferSize != m_width * m_height * 4)
   {
     m_bufferSize = m_width * m_height * 4;
-    delete[] m_pixels;
-    m_pixels = new uint8_t[m_bufferSize];
+    av_freep(&m_pixels);
+    m_pixels = (uint8_t*)av_malloc(m_bufferSize);
   }
 
   pContext->OMSetRenderTargets(1, &m_renderSurface, nullptr);
@@ -423,35 +416,25 @@ void CRenderCaptureDX::BeginRender()
     if (!m_query)
     {
       result = pDevice->CreateQuery(&queryDesc, &m_query);
-      if (S_OK != result)
+      if (FAILED(result))
       {
         CLog::Log(LOGERROR, "CRenderCaptureDX::BeginRender: CreateQuery failed %s",
                   g_Windowing.GetErrorDescription(result).c_str());
         m_asyncSupported = false;
-        if (m_query)
-        {
-          while (m_query->Release() > 0) {}
-          m_query = nullptr;
-        }
+        SAFE_RELEASE(m_query);
       }
     }
   }
   else
   {
     //don't use an occlusion query, clean up any old one
-    if (m_query)
-    {
-      while (m_query->Release() > 0) {}
-      m_query = nullptr;
-    }
+    SAFE_RELEASE(m_query);
   }
-
-  if (m_query)
-    g_Windowing.GetImmediateContext()->Begin(m_query);
 }
 
 void CRenderCaptureDX::EndRender()
 {
+  // send commands to the GPU queue
   g_Windowing.FinishCommandList();
   ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext();
 
@@ -460,7 +443,6 @@ void CRenderCaptureDX::EndRender()
   if (m_query)
   {
     pContext->End(m_query);
-    pContext->GetData(m_query, nullptr, 0, 0); //flush the query request
   }
 
   if (m_flags & CAPTUREFLAG_IMMEDIATELY)
@@ -475,11 +457,12 @@ void CRenderCaptureDX::ReadOut()
   {
     //if the result of the occlusion query is available, the data is probably also written into m_copySurface
     HRESULT result = g_Windowing.GetImmediateContext()->GetData(m_query, nullptr, 0, 0);
-    if (S_OK == result)
+    if (SUCCEEDED(result))
     {
-      SurfaceToBuffer();
+      if (S_OK == result)
+        SurfaceToBuffer();
     }
-    else if (S_FALSE != result)
+    else
     {
       CLog::Log(LOGERROR, "CRenderCaptureDX::ReadOut: GetData failed");
       SurfaceToBuffer();
@@ -532,29 +515,10 @@ void CRenderCaptureDX::OnDestroyDevice()
 
 void CRenderCaptureDX::CleanupDX()
 {
-  if (m_renderSurface)
-  {
-    while (m_renderSurface->Release() > 0) {}
-    m_renderSurface = nullptr;
-  }
-
-  if (m_renderTexture)
-  {
-    while (m_renderTexture->Release() > 0) {}
-    m_renderTexture = nullptr;
-  }
-
-  if (m_copySurface)
-  {
-    while (m_copySurface->Release() > 0) {}
-    m_copySurface = nullptr;
-  }
-
-  if (m_query)
-  {
-    while (m_query->Release() > 0) {}
-    m_query = nullptr;
-  }
+  SAFE_RELEASE(m_renderSurface);
+  SAFE_RELEASE(m_renderTexture);
+  SAFE_RELEASE(m_copySurface);
+  SAFE_RELEASE(m_query);
 
   m_surfaceWidth = 0;
   m_surfaceHeight = 0;
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderFormats.h b/xbmc/cores/VideoPlayer/VideoRenderers/RenderFormats.h
index 4c4576f..39f62fa 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderFormats.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderFormats.h
@@ -22,6 +22,7 @@
 
 #include <cstddef>
 #include <vector>
+#include "cores/IPlayer.h"
 
 enum ERenderFormat {
   RENDER_FMT_NONE = 0,
@@ -50,14 +51,21 @@ struct CRenderInfo
 {
   CRenderInfo()
   {
+    Reset();
+  }
+  void Reset()
+  {
     optimal_buffer_size = 0;
     max_buffer_size = 0;
-    opaque_pointer = NULL;
+    opaque_pointer = nullptr;
+    m_deintMethods.clear();
+    formats.clear();
   }
   unsigned int optimal_buffer_size;
   unsigned int max_buffer_size;
   // Supported pixel formats, can be called before configure
   std::vector<ERenderFormat> formats;
+  std::vector<EINTERLACEMETHOD> m_deintMethods;
   // Can be used for initialising video codec with information from renderer (e.g. a shared image pool)
   void *opaque_pointer;
 };
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
index bbdd403..b2d3a38 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
@@ -298,6 +298,8 @@ bool CRenderManager::Configure()
     m_pRenderer->SetBufferSize(m_QueueSize);
     m_pRenderer->Update();
 
+    m_playerPort->UpdateRenderInfo(info);
+
     m_queued.clear();
     m_discard.clear();
     m_free.clear();
@@ -360,6 +362,8 @@ bool CRenderManager::HasFrame()
 
 void CRenderManager::FrameMove()
 {
+  UpdateResolution();
+
   {
     CSingleLock lock(m_statelock);
 
@@ -405,7 +409,7 @@ void CRenderManager::FrameMove()
     for (std::deque<int>::iterator it = m_discard.begin(); it != m_discard.end(); )
     {
       // renderer may want to keep the frame for postprocessing
-      if (!m_pRenderer->NeedBufferForRef(*it) || !m_bRenderGUI)
+      if (!m_pRenderer->NeedBuffer(*it) || !m_bRenderGUI)
       {
         m_pRenderer->ReleaseBuffer(*it);
         m_overlays.Release(*it);
@@ -419,7 +423,6 @@ void CRenderManager::FrameMove()
     m_bRenderGUI = true;
   }
 
-  UpdateResolution();
   ManageCaptures();
 }
 
@@ -738,9 +741,8 @@ void CRenderManager::ManageCaptures()
         //if rendering this capture continuously, and readout is async, render a new capture immediately
         if (capture->IsAsync() && !(capture->GetFlags() & CAPTUREFLAG_IMMEDIATELY))
           RenderCapture(capture);
-
-        ++it;
       }
+      ++it;
     }
     else
     {
@@ -960,7 +962,8 @@ bool CRenderManager::IsGuiLayer()
     if (!m_pRenderer)
       return false;
 
-    if (m_pRenderer->IsGuiLayer() || m_renderedOverlay || m_overlays.HasOverlay(m_presentsource))
+    if ((m_pRenderer->IsGuiLayer() && HasFrame()) ||
+        m_renderedOverlay || m_overlays.HasOverlay(m_presentsource))
       return true;
 
     if (m_renderDebug && m_debugTimer.IsTimePast())
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h
index 3d9983c..eccf66c 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.h
@@ -58,6 +58,7 @@ protected:
   virtual void VideoParamsChange() = 0;
   virtual void GetDebugInfo(std::string &audio, std::string &video, std::string &general) = 0;
   virtual void UpdateClockSync(bool enabled) = 0;
+  virtual void UpdateRenderInfo(CRenderInfo &info) = 0;
 };
 
 class CRenderManager
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp
index 1290313..55b7ba2 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.cpp
@@ -1087,7 +1087,11 @@ CRenderInfo CWinRenderer::GetRenderInfo()
   info.formats = m_formats;
   info.max_buffer_size = NUM_BUFFERS;
   if (m_renderMethod == RENDER_DXVA && m_processor)
+  {
     info.optimal_buffer_size = m_processor->Size();
+    if (m_extended_format != RENDER_FMT_DXVA)
+      info.m_deintMethods.push_back(VS_INTERLACEMETHOD_DXVA_AUTO);
+  }
   else
     info.optimal_buffer_size = 4;
   return info;
@@ -1099,7 +1103,7 @@ void CWinRenderer::ReleaseBuffer(int idx)
     SAFE_RELEASE(reinterpret_cast<DXVABuffer*>(m_VideoBuffers[idx])->pic);
 }
 
-bool CWinRenderer::NeedBufferForRef(int idx)
+bool CWinRenderer::NeedBuffer(int idx)
 {
   // check if processor wants to keep past frames
   if (m_renderMethod == RENDER_DXVA && m_processor)
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h b/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h
index 5766fe6..dfd7cd8 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/WinRenderer.h
@@ -175,7 +175,7 @@ public:
   virtual void RenderUpdate(bool clear, unsigned int flags = 0, unsigned int alpha = 255);
   virtual void SetBufferSize(int numBuffers) { m_neededBuffers = numBuffers; }
   virtual void ReleaseBuffer(int idx);
-  virtual bool NeedBufferForRef(int idx);
+  virtual bool NeedBuffer(int idx);
   virtual bool HandlesRenderFormat(ERenderFormat format) override;
 
   // Feature support
@@ -240,5 +240,3 @@ protected:
 #else
 #include "LinuxRenderer.h"
 #endif
-
-
diff --git a/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp b/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp
index d8cef9c..920ac4a 100644
--- a/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp
+++ b/xbmc/cores/omxplayer/OMXAudioCodecOMX.cpp
@@ -152,6 +152,11 @@ int COMXAudioCodecOMX::Decode(BYTE* pData, int iSize, double dts, double pts)
   if (!m_pCodecContext) return -1;
 
   AVPacket avpkt;
+  if (!m_iBufferOutputUsed)
+  {
+    m_dts = dts;
+    m_pts = pts;
+  }
   if (m_bGotFrame)
     return 0;
   av_init_packet(&avpkt);
@@ -182,11 +187,6 @@ int COMXAudioCodecOMX::Decode(BYTE* pData, int iSize, double dts, double pts)
   }
 
   m_bGotFrame = true;
-  if (!m_iBufferOutputUsed)
-  {
-    m_dts = dts;
-    m_pts = pts;
-  }
   return iBytesUsed;
 }
 
diff --git a/xbmc/cores/paplayer/ICodec.h b/xbmc/cores/paplayer/ICodec.h
index baae3d0..7c7da32 100644
--- a/xbmc/cores/paplayer/ICodec.h
+++ b/xbmc/cores/paplayer/ICodec.h
@@ -56,11 +56,6 @@ public:
   // 3.  Fill in the m_TotalTime, m_SampleRate, m_BitsPerSample and m_Channels parameters.
   virtual bool Init(const CFileItem &file, unsigned int filecache)=0;
 
-  // DeInit()
-  // Should just cleanup anything as necessary.  No need to free buffers here if they
-  // are allocated and destroyed in the destructor.
-  virtual void DeInit()=0;
-
   virtual bool CanSeek() {return true;}
 
   // Seek()
diff --git a/xbmc/cores/paplayer/VideoPlayerCodec.h b/xbmc/cores/paplayer/VideoPlayerCodec.h
index 042f4f7..1b7493c 100644
--- a/xbmc/cores/paplayer/VideoPlayerCodec.h
+++ b/xbmc/cores/paplayer/VideoPlayerCodec.h
@@ -39,14 +39,13 @@ public:
   virtual ~VideoPlayerCodec();
 
   virtual bool Init(const CFileItem &file, unsigned int filecache) override;
-  virtual void DeInit();
   virtual bool Seek(int64_t iSeekTime);
   virtual int ReadPCM(BYTE *pBuffer, int size, int *actualsize);
   virtual int ReadRaw(uint8_t **pBuffer, int *bufferSize);
   virtual bool CanInit();
   virtual bool CanSeek();
-  virtual CAEChannelInfo GetChannelInfo() {return m_srcFormat.m_channelLayout;}
 
+  void DeInit();
   AEAudioFormat GetFormat();
   void SetContentType(const std::string &strContent);
 
diff --git a/xbmc/dbwrappers/Database.h b/xbmc/dbwrappers/Database.h
index 0117ecd..6370a4e 100644
--- a/xbmc/dbwrappers/Database.h
+++ b/xbmc/dbwrappers/Database.h
@@ -139,12 +139,6 @@ public:
   bool CommitMultipleExecute();
 
   /*!
-   * @brief Open a new dataset.
-   * @return True if the dataset was created successfully, false otherwise.
-   */
-  bool OpenDS();
-
-  /*!
    * @brief Put an INSERT or REPLACE query in the queue.
    * @param strQuery The query to queue.
    * @return True if the query was added successfully, false otherwise.
diff --git a/xbmc/dbwrappers/mysqldataset.cpp b/xbmc/dbwrappers/mysqldataset.cpp
index ed82f17..69dcacb 100644
--- a/xbmc/dbwrappers/mysqldataset.cpp
+++ b/xbmc/dbwrappers/mysqldataset.cpp
@@ -32,9 +32,6 @@
 #ifdef HAS_MYSQL
 #include "mysqldataset.h"
 #include "mysql/errmsg.h"
-#if defined(TARGET_WINDOWS) && !defined(BUILDING_WITH_CMAKE)
-#pragma comment(lib, "libmysql.lib")
-#endif
 
 #ifdef TARGET_POSIX
 #include "linux/ConvUtils.h"
diff --git a/xbmc/dialogs/GUIDialogSlider.cpp b/xbmc/dialogs/GUIDialogSlider.cpp
index a0301ea..961bf13 100644
--- a/xbmc/dialogs/GUIDialogSlider.cpp
+++ b/xbmc/dialogs/GUIDialogSlider.cpp
@@ -81,6 +81,8 @@ void CGUIDialogSlider::SetSlider(const std::string &label, float value, float mi
   m_callbackData = callbackData;
   if (slider)
   {
+    slider->SetActive();
+    slider->KeepActive();
     slider->SetType(SLIDER_CONTROL_TYPE_FLOAT);
     slider->SetFloatRange(min, max);
     slider->SetFloatInterval(delta);
diff --git a/xbmc/epg/GUIEPGGridContainer.cpp b/xbmc/epg/GUIEPGGridContainer.cpp
index 8cfa281..5ac7735 100644
--- a/xbmc/epg/GUIEPGGridContainer.cpp
+++ b/xbmc/epg/GUIEPGGridContainer.cpp
@@ -838,8 +838,8 @@ bool CGUIEPGGridContainer::SelectItemFromPoint(const CPoint &point, bool justGri
   if (!m_focusedProgrammeLayout || !m_programmeLayout || (justGrid && point.x < 0))
     return false;
 
-  int channel = MathUtils::round_int(point.y / m_channelHeight);
-  int block   = MathUtils::round_int(point.x / m_blockSize);
+  int channel = point.y / m_channelHeight;
+  int block   = point.x / m_blockSize;
 
   if (channel > m_channelsPerPage)
     channel = m_channelsPerPage - 1;
diff --git a/xbmc/filesystem/CurlFile.cpp b/xbmc/filesystem/CurlFile.cpp
index 7b8973d..a6d7fe0 100644
--- a/xbmc/filesystem/CurlFile.cpp
+++ b/xbmc/filesystem/CurlFile.cpp
@@ -506,13 +506,8 @@ void CCurlFile::SetCommonOptions(CReadState* state)
   g_curlInterface.easy_setopt(h, CURLOPT_FOLLOWLOCATION, TRUE);
   g_curlInterface.easy_setopt(h, CURLOPT_MAXREDIRS, 5);
 
-  // Enable cookie engine for current handle to re-use them in future requests
-  std::string strCookieFile;
-  std::string strTempPath = CSpecialProtocol::TranslatePath(g_advancedSettings.m_cachePath);
-  strCookieFile = URIUtils::AddFileToFolder(strTempPath, "cookies.dat");
-
-  g_curlInterface.easy_setopt(h, CURLOPT_COOKIEFILE, strCookieFile.c_str());
-  g_curlInterface.easy_setopt(h, CURLOPT_COOKIEJAR, strCookieFile.c_str());
+  // Enable cookie engine for current handle
+  g_curlInterface.easy_setopt(h, CURLOPT_COOKIEFILE, "");
 
   // Set custom cookie if requested
   if (!m_cookie.empty())
diff --git a/xbmc/filesystem/FTPParse.cpp b/xbmc/filesystem/FTPParse.cpp
index 415a25b..cfcc7c6 100644
--- a/xbmc/filesystem/FTPParse.cpp
+++ b/xbmc/filesystem/FTPParse.cpp
@@ -22,14 +22,6 @@
   #include "config.h"
 #endif
 
-#if defined(TARGET_WINDOWS) && !defined(BUILDING_WITH_CMAKE)
-#define PCRE_STATIC 1
-#ifdef _DEBUG
-#pragma comment(lib, "pcrecppd.lib")
-#else  // ! _DEBUG
-#pragma comment(lib, "pcrecpp.lib")
-#endif // ! _DEBUG
-#endif // defined(TARGET_WINDOWS) && !defined(BUILDING_WITH_CMAKE)
 #include <pcrecpp.h>
 #include <cmath>
 #include "FTPParse.h"
diff --git a/xbmc/filesystem/PVRDirectory.cpp b/xbmc/filesystem/PVRDirectory.cpp
index c873d5a..4fa8441 100644
--- a/xbmc/filesystem/PVRDirectory.cpp
+++ b/xbmc/filesystem/PVRDirectory.cpp
@@ -62,54 +62,56 @@ bool CPVRDirectory::GetDirectory(const CURL& url, CFileItemList &items)
 
   if (fileName == "")
   {
-    if (!g_PVRManager.IsStarted())
-      return false;
-
-    CFileItemPtr item;
-
-    item.reset(new CFileItem(base + "channels/", true));
-    item->SetLabel(g_localizeStrings.Get(19019));
-    item->SetLabelPreformated(true);
-    items.Add(item);
-
-    item.reset(new CFileItem(base + "recordings/active/", true));
-    item->SetLabel(g_localizeStrings.Get(19017)); // TV Recordings
-    item->SetLabelPreformated(true);
-    items.Add(item);
-
-    item.reset(new CFileItem(base + "recordings/deleted/", true));
-    item->SetLabel(g_localizeStrings.Get(19108)); // Deleted TV Recordings
-    item->SetLabelPreformated(true);
-    items.Add(item);
-
-    // Sort by name only. Labels are preformated.
-    items.AddSortMethod(SortByLabel, 551 /* Name */, LABEL_MASKS("%L", "", "%L", ""));
-
+    if (g_PVRManager.IsStarted())
+    {
+      CFileItemPtr item;
+
+      item.reset(new CFileItem(base + "channels/", true));
+      item->SetLabel(g_localizeStrings.Get(19019));
+      item->SetLabelPreformated(true);
+      items.Add(item);
+
+      item.reset(new CFileItem(base + "recordings/active/", true));
+      item->SetLabel(g_localizeStrings.Get(19017)); // TV Recordings
+      item->SetLabelPreformated(true);
+      items.Add(item);
+
+      item.reset(new CFileItem(base + "recordings/deleted/", true));
+      item->SetLabel(g_localizeStrings.Get(19108)); // Deleted TV Recordings
+      item->SetLabelPreformated(true);
+      items.Add(item);
+
+      // Sort by name only. Labels are preformated.
+      items.AddSortMethod(SortByLabel, 551 /* Name */, LABEL_MASKS("%L", "", "%L", ""));
+    }
     return true;
   }
   else if (StringUtils::StartsWith(fileName, "recordings"))
   {
-    if (!g_PVRManager.IsStarted())
-      return false;
-
-    const std::string pathToUrl(url.Get());
-    return g_PVRRecordings->GetDirectory(pathToUrl, items);
+    if (g_PVRManager.IsStarted())
+    {
+      const std::string pathToUrl(url.Get());
+      return g_PVRRecordings->GetDirectory(pathToUrl, items);
+    }
+    return true;
   }
   else if (StringUtils::StartsWith(fileName, "channels"))
   {
-    if (!g_PVRChannelGroups || !g_PVRChannelGroups->Loaded())
-      return false;
-
-    const std::string pathToUrl(url.Get());
-    return g_PVRChannelGroups->GetDirectory(pathToUrl, items);
+    if (g_PVRChannelGroups && g_PVRChannelGroups->Loaded())
+    {
+      const std::string pathToUrl(url.Get());
+      return g_PVRChannelGroups->GetDirectory(pathToUrl, items);
+    }
+    return true;
   }
   else if (StringUtils::StartsWith(fileName, "timers"))
   {
-    if (!g_PVRManager.IsStarted())
-      return false;
-
-    const std::string pathToUrl(url.Get());
-    return g_PVRTimers->GetDirectory(pathToUrl, items);
+    if (g_PVRManager.IsStarted())
+    {
+      const std::string pathToUrl(url.Get());
+      return g_PVRTimers->GetDirectory(pathToUrl, items);
+    }
+    return true;
   }
 
   return false;
diff --git a/xbmc/filesystem/test/TestFileFactory.cpp b/xbmc/filesystem/test/TestFileFactory.cpp
index c28fbdb..d014d90 100644
--- a/xbmc/filesystem/test/TestFileFactory.cpp
+++ b/xbmc/filesystem/test/TestFileFactory.cpp
@@ -90,7 +90,7 @@ TEST_F(TestFileFactory, Read)
     std::cout << "File contents:" << std::endl;
     while ((size = file.Read(buf, sizeof(buf))) > 0)
     {
-      str = StringUtils::Format("  %08X", count);
+      str = StringUtils::Format("  %08llX", count);
       std::cout << str << "  ";
       count += size;
       for (i = 0; i < size; i++)
@@ -152,7 +152,7 @@ TEST_F(TestFileFactory, Write)
     std::cout << "File contents:\n";
     while ((size = file.Read(buf, sizeof(buf))) > 0)
     {
-      str = StringUtils::Format("  %08X", count);
+      str = StringUtils::Format("  %08llX", count);
       std::cout << str << "  ";
       count += size;
       for (i = 0; i < size; i++)
diff --git a/xbmc/filesystem/test/TestRarFile.cpp b/xbmc/filesystem/test/TestRarFile.cpp
index 70cf7ae..0d33a25 100644
--- a/xbmc/filesystem/test/TestRarFile.cpp
+++ b/xbmc/filesystem/test/TestRarFile.cpp
@@ -179,7 +179,7 @@ TEST(TestRarFile, CorruptedFile)
   std::cout << "File contents:" << std::endl;
   while ((size = file->Read(buf, sizeof(buf))) > 0)
   {
-    str = StringUtils::Format("  %08X", count);
+    str = StringUtils::Format("  %08llX", count);
     std::cout << str << "  ";
     count += size;
     for (i = 0; i < size; i++)
diff --git a/xbmc/filesystem/test/TestZipFile.cpp b/xbmc/filesystem/test/TestZipFile.cpp
index 1497f1a..9448d94 100644
--- a/xbmc/filesystem/test/TestZipFile.cpp
+++ b/xbmc/filesystem/test/TestZipFile.cpp
@@ -194,7 +194,7 @@ TEST_F(TestZipFile, CorruptedFile)
   std::cout << "File contents:" << std::endl;
   while ((size = file->Read(buf, sizeof(buf))) > 0)
   {
-    str = StringUtils::Format("  %08X", count);
+    str = StringUtils::Format("  %08llX", count);
     std::cout << str << "  ";
     count += size;
     for (i = 0; i < size; i++)
diff --git a/xbmc/guiinfo/GUIInfoLabels.h b/xbmc/guiinfo/GUIInfoLabels.h
index bdb0a4a..ef27cad 100644
--- a/xbmc/guiinfo/GUIInfoLabels.h
+++ b/xbmc/guiinfo/GUIInfoLabels.h
@@ -804,18 +804,19 @@
 #define LISTITEM_ADDON_NEWS         (LISTITEM_START + 178)
 #define LISTITEM_ADDON_SIZE         (LISTITEM_START + 179)
 
+//! @todo There are issues with the LISTITEM_PROPERTY range, breakage occurs when more than 200 properties are used in skins.
 #define LISTITEM_PROPERTY_START     (LISTITEM_START + 200)
-#define LISTITEM_PROPERTY_END       (LISTITEM_PROPERTY_START + 1300)
+#define LISTITEM_PROPERTY_END       (LISTITEM_PROPERTY_START + 2300)
 #define LISTITEM_END                (LISTITEM_PROPERTY_END)
 
-#define MUSICPLAYER_PROPERTY_OFFSET       800  // 100 id's reserved for musicplayer props.
-#define LISTITEM_ART_OFFSET               900  // 100 id's reserved for listitem art.
-#define LISTITEM_RATING_OFFSET      1000 // 100 id's reserved for listitem ratings.
-#define LISTITEM_VOTES_OFFSET       1100 // 100 id's reserved for listitem votes.
-#define LISTITEM_RATING_AND_VOTES_OFFSET  1200 // 100 id's reserved for listitem ratingandvotes.
+#define MUSICPLAYER_PROPERTY_OFFSET       1300  // 200 id's reserved for musicplayer props.
+#define LISTITEM_ART_OFFSET               1500  // 200 id's reserved for listitem art.
+#define LISTITEM_RATING_OFFSET      1700 // 200 id's reserved for listitem ratings.
+#define LISTITEM_VOTES_OFFSET       1900 // 200 id's reserved for listitem votes.
+#define LISTITEM_RATING_AND_VOTES_OFFSET  2100 // 200 id's reserved for listitem ratingandvotes.
 
-#define CONDITIONAL_LABEL_START       LISTITEM_END + 1 // 36501
-#define CONDITIONAL_LABEL_END         37000
+#define CONDITIONAL_LABEL_START       LISTITEM_END + 1 // 37501
+#define CONDITIONAL_LABEL_END         38500
 
 // the multiple information vector
 #define MULTI_INFO_START              40000
diff --git a/xbmc/guilib/GUIFontTTF.cpp b/xbmc/guilib/GUIFontTTF.cpp
index b5a937c..9e59eb8 100644
--- a/xbmc/guilib/GUIFontTTF.cpp
+++ b/xbmc/guilib/GUIFontTTF.cpp
@@ -42,8 +42,6 @@
 #include FT_OUTLINE_H
 #include FT_STROKER_H
 
-#define USE_RELEASE_LIBS
-
 #ifdef TARGET_WINDOWS
 #ifdef NDEBUG
 #pragma comment(lib, "freetype.lib")
diff --git a/xbmc/guilib/GUISliderControl.cpp b/xbmc/guilib/GUISliderControl.cpp
index 5f175a80..38edc34 100644
--- a/xbmc/guilib/GUISliderControl.cpp
+++ b/xbmc/guilib/GUISliderControl.cpp
@@ -59,6 +59,8 @@ CGUISliderControl::CGUISliderControl(int parentID, int controlID, float posX, fl
   m_iInfoCode = 0;
   m_dragging = false;
   m_action = NULL;
+  m_active = false;
+  m_keepactive = false;
 }
 
 CGUISliderControl::~CGUISliderControl(void)
@@ -85,7 +87,7 @@ void CGUISliderControl::Process(unsigned int currentTime, CDirtyRegionList &dirt
   dirty |= m_guiBackground.SetWidth(m_width);
   dirty |= m_guiBackground.Process(currentTime);
 
-  CGUITexture &nibLower = (m_bHasFocus && !IsDisabled() && m_currentSelector == RangeSelectorLower) ? m_guiSelectorLowerFocus : m_guiSelectorLower;
+  CGUITexture &nibLower = (m_active && m_bHasFocus && !IsDisabled() && m_currentSelector == RangeSelectorLower) ? m_guiSelectorLowerFocus : m_guiSelectorLower;
   float fScale;
   if (m_orientation == HORIZONTAL)
     fScale = m_height == 0 ? 1.0f : m_height / m_guiBackground.GetTextureHeight();
@@ -95,7 +97,7 @@ void CGUISliderControl::Process(unsigned int currentTime, CDirtyRegionList &dirt
   dirty |= ProcessSelector(nibLower, currentTime, fScale, RangeSelectorLower);
   if (m_rangeSelection)
   {
-    CGUITexture &nibUpper = (m_bHasFocus && !IsDisabled() && m_currentSelector == RangeSelectorUpper) ? m_guiSelectorUpperFocus : m_guiSelectorUpper;
+    CGUITexture &nibUpper = (m_active && m_bHasFocus && !IsDisabled() && m_currentSelector == RangeSelectorUpper) ? m_guiSelectorUpperFocus : m_guiSelectorUpper;
     if (m_orientation == HORIZONTAL)
       fScale = m_height == 0 ? 1.0f : m_height / m_guiBackground.GetTextureHeight();
     else
@@ -157,11 +159,11 @@ bool CGUISliderControl::ProcessSelector(CGUITexture &nib, unsigned int currentTi
 void CGUISliderControl::Render()
 {
   m_guiBackground.Render();
-  CGUITexture &nibLower = (m_bHasFocus && !IsDisabled() && m_currentSelector == RangeSelectorLower) ? m_guiSelectorLowerFocus : m_guiSelectorLower;
+  CGUITexture &nibLower = (m_active && m_bHasFocus && !IsDisabled() && m_currentSelector == RangeSelectorLower) ? m_guiSelectorLowerFocus : m_guiSelectorLower;
   nibLower.Render();
   if (m_rangeSelection)
   {
-    CGUITexture &nibUpper = (m_bHasFocus && !IsDisabled() && m_currentSelector == RangeSelectorUpper) ? m_guiSelectorUpperFocus : m_guiSelectorUpper;
+    CGUITexture &nibUpper = (m_active && m_bHasFocus && !IsDisabled() && m_currentSelector == RangeSelectorUpper) ? m_guiSelectorUpperFocus : m_guiSelectorUpper;
     nibUpper.Render();
   }
   CGUIControl::Render();
@@ -196,7 +198,7 @@ bool CGUISliderControl::OnAction(const CAction &action)
   switch ( action.GetID() )
   {
   case ACTION_MOVE_LEFT:
-    if (m_orientation == HORIZONTAL)
+    if (m_active && m_orientation == HORIZONTAL)
     {
       Move(-1);
       return true;
@@ -204,7 +206,7 @@ bool CGUISliderControl::OnAction(const CAction &action)
     break;
 
   case ACTION_MOVE_RIGHT:
-    if (m_orientation == HORIZONTAL)
+    if (m_active && m_orientation == HORIZONTAL)
     {
       Move(1);
       return true;
@@ -212,7 +214,7 @@ bool CGUISliderControl::OnAction(const CAction &action)
     break;
 
   case ACTION_MOVE_UP:
-    if (m_orientation == VERTICAL)
+    if (m_active && m_orientation == VERTICAL)
     {
       Move(1);
       return true;
@@ -220,7 +222,7 @@ bool CGUISliderControl::OnAction(const CAction &action)
     break;
 
   case ACTION_MOVE_DOWN:
-    if (m_orientation == VERTICAL)
+    if (m_active && m_orientation == VERTICAL)
     {
       Move(-1);
       return true;
@@ -228,9 +230,17 @@ bool CGUISliderControl::OnAction(const CAction &action)
     break;
 
   case ACTION_SELECT_ITEM:
+    if (!m_active)
+      m_active = true;
     // switch between the two sliders
-    if (m_rangeSelection)
+    else if (m_rangeSelection && m_currentSelector == RangeSelectorLower)
       SwitchRangeSelector();
+    else
+    {
+      m_active = false;
+      if (m_rangeSelection)
+        SwitchRangeSelector();
+    }
     return true;
 
   default:
@@ -239,6 +249,12 @@ bool CGUISliderControl::OnAction(const CAction &action)
   return CGUIControl::OnAction(action);
 }
 
+void CGUISliderControl::OnUnFocus()
+{
+  if (!m_keepactive)
+    m_active = false;
+}
+
 void CGUISliderControl::Move(int iNumSteps)
 {
   bool rangeSwap = false;
@@ -489,6 +505,17 @@ void CGUISliderControl::SetFloatRange(float fStart, float fEnd)
   }
 }
 
+void CGUISliderControl::SetActive()
+{
+  m_active = true;
+}
+
+
+void CGUISliderControl::KeepActive()
+{
+  m_keepactive = true;
+}
+
 void CGUISliderControl::FreeResources(bool immediately)
 {
   CGUIControl::FreeResources(immediately);
@@ -586,6 +613,7 @@ void CGUISliderControl::SetFromPosition(const CPoint &point, bool guessSelector
 
 EVENT_RESULT CGUISliderControl::OnMouseEvent(const CPoint &point, const CMouseEvent &event)
 {
+  m_active = true;
   m_dragging = false;
   if (event.m_id == ACTION_MOUSE_DRAG)
   {
diff --git a/xbmc/guilib/GUISliderControl.h b/xbmc/guilib/GUISliderControl.h
index 948210c..4520fd1 100644
--- a/xbmc/guilib/GUISliderControl.h
+++ b/xbmc/guilib/GUISliderControl.h
@@ -63,12 +63,15 @@ public:
   virtual void Process(unsigned int currentTime, CDirtyRegionList &dirtyregions);
   virtual void Render();
   virtual bool OnAction(const CAction &action);
+  virtual void OnUnFocus() override;
   virtual void AllocResources();
   virtual void FreeResources(bool immediately = false);
   virtual void DynamicResourceAlloc(bool bOnOff);
   virtual void SetInvalid();
   virtual void SetRange(int iStart, int iEnd);
   virtual void SetFloatRange(float fStart, float fEnd);
+  virtual void SetActive();
+  virtual void KeepActive();
   virtual bool OnMessage(CGUIMessage& message);
   bool ProcessSelector(CGUITexture &nib, unsigned int currentTime, float fScale, RangeSelector selector);
   void SetRangeSelection(bool rangeSelection);
@@ -129,6 +132,8 @@ protected:
   std::string m_textValue; ///< Allows overriding of the text value to be displayed (parent must update when the slider updates)
   const SliderAction *m_action; ///< Allows the skin to configure the action of a click on the slider \sa SendClick
   bool m_dragging; ///< Whether we're in a (mouse/touch) drag operation or not - some actions are sent only on release.
+  bool m_active; ///< Whether the slider has been activated by a click.
+  bool m_keepactive; ///< Whether the slider should be deactivated when losing focus.
   ORIENTATION m_orientation;
 };
 #endif
diff --git a/xbmc/guilib/GUIWindowManager.cpp b/xbmc/guilib/GUIWindowManager.cpp
index 227f323..f6f6441 100644
--- a/xbmc/guilib/GUIWindowManager.cpp
+++ b/xbmc/guilib/GUIWindowManager.cpp
@@ -405,7 +405,6 @@ bool CGUIWindowManager::DestroyWindows()
     Delete(WINDOW_WEATHER);
     Delete(WINDOW_DIALOG_GAME_CONTROLLERS);
 
-    Remove(WINDOW_SETTINGS_SYSTEM);
     Remove(WINDOW_SETTINGS_SERVICE);
     Remove(WINDOW_SETTINGS_MYPVR);
     Remove(WINDOW_SETTINGS_PLAYER);
diff --git a/xbmc/guilib/Resolution.cpp b/xbmc/guilib/Resolution.cpp
index b307524..b86110c 100644
--- a/xbmc/guilib/Resolution.cpp
+++ b/xbmc/guilib/Resolution.cpp
@@ -303,8 +303,21 @@ float CResolutionUtils::RefreshWeight(float refresh, float fps)
   float div   = refresh / fps;
   int   round = MathUtils::round_int(div);
 
+  float weight = 0.0f;
+
   if (round < 1)
-    return (fps - refresh) / fps;
+    weight = (fps - refresh) / fps;
   else
-    return (float)fabs(div / round - 1.0);
+    weight = (float)fabs(div / round - 1.0);
+
+  // punish higher refreshrates and prefer better matching
+  // e.g. 30 fps content at 60 hz is better than
+  // 30 fps at 120 hz - as we sometimes don't know if
+  // the content is interlaced at the start, only
+  // punish when refreshrate > 60 hz to not have to switch
+  // twice for 30i content
+  if (refresh > 60 && round > 1)
+    weight += round / 10000.0;
+
+  return weight;
 }
diff --git a/xbmc/interfaces/json-rpc/schema/types.json b/xbmc/interfaces/json-rpc/schema/types.json
index 2d60b37..a67befa 100644
--- a/xbmc/interfaces/json-rpc/schema/types.json
+++ b/xbmc/interfaces/json-rpc/schema/types.json
@@ -1442,7 +1442,8 @@
                 "episodeguide", "uniqueid", "dateadded", "channel", "channeltype", "hidden",
                 "locked", "channelnumber", "starttime", "endtime", "specialsortseason",
                 "specialsortepisode", "compilation", "releasetype", "albumreleasetype",
-                "contributors", "displaycomposer", "displayconductor", "displayorchestra", "displaylyricist" ]
+                "contributors", "displaycomposer", "displayconductor", "displayorchestra", "displaylyricist",
+                "userrating" ]
     }
   },
   "List.Item.All": {
diff --git a/xbmc/interfaces/json-rpc/schema/version.txt b/xbmc/interfaces/json-rpc/schema/version.txt
index 3cfdb18..f247b9f 100644
--- a/xbmc/interfaces/json-rpc/schema/version.txt
+++ b/xbmc/interfaces/json-rpc/schema/version.txt
@@ -1 +1 @@
-7.21.0
\ No newline at end of file
+7.22.0
\ No newline at end of file
diff --git a/xbmc/interfaces/legacy/Dialog.h b/xbmc/interfaces/legacy/Dialog.h
index 50eb464..33c5bf7 100644
--- a/xbmc/interfaces/legacy/Dialog.h
+++ b/xbmc/interfaces/legacy/Dialog.h
@@ -265,7 +265,7 @@ namespace XBMCAddon
 #ifdef DOXYGEN_SHOULD_USE_THIS
       ///
       /// \ingroup python_Dialog
-      /// \python_func{ xbmcgui.Dialog().browse(type, heading, shares[, mask, useThumbs, treatAsFolder, sDefault, enableMultiple]) }
+      /// \python_func{ xbmcgui.Dialog().browse(type, heading, shares[, mask, useThumbs, treatAsFolder, defaultt, enableMultiple]) }
       ///------------------------------------------------------------------------
       ///
       /// **Browser dialog**
@@ -288,7 +288,7 @@ namespace XBMCAddon
       /// @param mask           [opt] string or unicode - '|' separated file mask. (i.e. '.jpg|.png')
       /// @param useThumbs      [opt] boolean - if True autoswitch to Thumb view if files exist.
       /// @param treatAsFolder  [opt] boolean - if True playlists and archives act as folders.
-      /// @param sDefault       [opt] string - default path or file.
+      /// @param defaultt       [opt] string - default path or file.
       /// @param enableMultiple [opt] boolean - if True multiple file selection is enabled.
       ///
       /// @return If enableMultiple is False (default): returns filename and/or path as a string
@@ -320,7 +320,7 @@ namespace XBMCAddon
 #ifdef DOXYGEN_SHOULD_USE_THIS
       ///
       /// \ingroup python_Dialog
-      /// \python_func{ xbmcgui.Dialog().browseSingle(type, heading, shares[, mask, useThumbs, treatAsFolder, default]) }
+      /// \python_func{ xbmcgui.Dialog().browseSingle(type, heading, shares[, mask, useThumbs, treatAsFolder, defaultt]) }
       ///------------------------------------------------------------------------
       ///
       /// **Browse single dialog**
@@ -343,7 +343,7 @@ namespace XBMCAddon
       /// @param mask           [opt] string or unicode - '|' separated file mask. (i.e. '.jpg|.png')
       /// @param useThumbs      [opt] boolean - if True autoswitch to Thumb view if files exist (default=false).
       /// @param treatAsFolder  [opt] boolean - if True playlists and archives act as folders (default=false).
-      /// @param default        [opt] string - default path or file.
+      /// @param defaultt       [opt] string - default path or file.
       ///
       /// @return Returns filename and/or path as a string to the location of the highlighted item,
       ///        if user pressed 'Ok' or a masked item was selected.
@@ -371,7 +371,7 @@ namespace XBMCAddon
 #ifdef DOXYGEN_SHOULD_USE_THIS
       ///
       /// \ingroup python_Dialog
-      /// \python_func{ xbmcgui.Dialog().browseMultiple(type, heading, shares[, mask, useThumbs, treatAsFolder, default]) }
+      /// \python_func{ xbmcgui.Dialog().browseMultiple(type, heading, shares[, mask, useThumbs, treatAsFolder, defaultt]) }
       ///------------------------------------------------------------------------
       ///
       /// **Browser dialog**
@@ -392,7 +392,7 @@ namespace XBMCAddon
       /// @param mask           [opt] string or unicode - '|' separated file mask. (i.e. '.jpg|.png')
       /// @param useThumbs      [opt] boolean - if True autoswitch to Thumb view if files exist (default=false).
       /// @param treatAsFolder  [opt] boolean - if True playlists and archives act as folders (default=false).
-      /// @param default        [opt] string - default path or file.
+      /// @param defaultt       [opt] string - default path or file.
       /// @return Returns tuple of marked filenames as a string,"
       ///       if user pressed 'Ok' or a masked item was selected. Returns empty tuple if dialog was canceled.
       ///
@@ -418,7 +418,7 @@ namespace XBMCAddon
 #ifdef DOXYGEN_SHOULD_USE_THIS
       ///
       /// \ingroup python_Dialog
-      /// \python_func{ xbmcgui.Dialog().numeric(type, heading[, default]) }
+      /// \python_func{ xbmcgui.Dialog().numeric(type, heading[, defaultt]) }
       ///------------------------------------------------------------------------
       ///
       /// **Numeric dialog**
@@ -434,7 +434,7 @@ namespace XBMCAddon
       /// |  2    | ShowAndGetTime      | (default format: HH:MM)
       /// |  3    | ShowAndGetIPAddress | (default format: #.#.#.#)
       /// @param heading        string or unicode - dialog heading.
-      /// @param default        [opt] string - default value.
+      /// @param defaultt       [opt] string - default value.
       /// @return Returns the entered data as a string.
       ///         Returns the default value if dialog was canceled.
       ///
@@ -492,13 +492,13 @@ namespace XBMCAddon
 #ifdef DOXYGEN_SHOULD_USE_THIS
       ///
       /// \ingroup python_Dialog
-      /// \python_func{ xbmcgui.Dialog().input(heading[, default, type, option, autoclose]) }
+      /// \python_func{ xbmcgui.Dialog().input(heading[, defaultt, type, option, autoclose]) }
       ///------------------------------------------------------------------------
       ///
       /// Show an Input dialog.
       ///
       /// @param heading        string - dialog heading.
-      /// @param default        [opt] string - default value. (default=empty string)
+      /// @param defaultt       [opt] string - default value. (default=empty string)
       /// @param type           [opt] integer - the type of keyboard dialog. (default=xbmcgui.INPUT_ALPHANUM)
       /// | Parameter                        | Format                          |
       /// |---------------------------------:|:--------------------------------|
diff --git a/xbmc/interfaces/legacy/ListItem.cpp b/xbmc/interfaces/legacy/ListItem.cpp
index 5db9529..2da85b6 100644
--- a/xbmc/interfaces/legacy/ListItem.cpp
+++ b/xbmc/interfaces/legacy/ListItem.cpp
@@ -157,12 +157,12 @@ namespace XBMCAddon
         vtag.SetUniqueID(it->second, it->first);
     }
 
-    void ListItem::setRating(std::string type, float rating, int votes /* = 0 */, bool def /* = false */)
+    void ListItem::setRating(std::string type, float rating, int votes /* = 0 */, bool defaultt /* = false */)
     {
       if (!item) return;
 
       LOCKGUI;
-      item->GetVideoInfoTag()->SetRating(rating, votes, type, def);
+      item->GetVideoInfoTag()->SetRating(rating, votes, type, defaultt);
     }
 
     void ListItem::select(bool selected)
diff --git a/xbmc/interfaces/legacy/ListItem.h b/xbmc/interfaces/legacy/ListItem.h
index 9437485..911a6c9 100644
--- a/xbmc/interfaces/legacy/ListItem.h
+++ b/xbmc/interfaces/legacy/ListItem.h
@@ -291,14 +291,14 @@ namespace XBMCAddon
 #ifdef DOXYGEN_SHOULD_USE_THIS
       ///
       /// \ingroup python_xbmcgui_listitem
-      /// @brief \python_func{ setRating(type, rating, votes = 0, default = True) }
+      /// @brief \python_func{ setRating(type, rating, votes = 0, defaultt = False) }
       ///-----------------------------------------------------------------------
       /// Sets a listitem's rating. It needs at least type and rating param
       ///
       /// @param type       string - the type of the rating. Any string.
       /// @param rating     float - the value of the rating.
       /// @param votes      int - the number of votes. Default 0.
-      /// @param default    bool - is the default rating?. Default False.
+      /// @param defaultt   bool - is the default rating?. Default False.
       ///  - Some example type (any string possible):
       ///  | Label         | Type                                              |
       ///  |:-------------:|:--------------------------------------------------|
@@ -314,14 +314,14 @@ namespace XBMCAddon
       /// **Example:**
       /// ~~~~~~~~~~~~~{.py}
       /// ...
-      /// # setRating(type, rating, votes, default))
+      /// # setRating(type, rating, votes, defaultt))
       /// self.list.getSelectedItem().setRating("imdb", 4.6, 8940, True)
       /// ...
       /// ~~~~~~~~~~~~~
       ///
       setRating(...);
 #else
-      void setRating(std::string type, float rating, int votes = 0, bool def = false);
+      void setRating(std::string type, float rating, int votes = 0, bool defaultt = false);
 #endif
 
 #ifdef DOXYGEN_SHOULD_USE_THIS
diff --git a/xbmc/messaging/helpers/DialogHelper.h b/xbmc/messaging/helpers/DialogHelper.h
index d297797..1fa61b7 100644
--- a/xbmc/messaging/helpers/DialogHelper.h
+++ b/xbmc/messaging/helpers/DialogHelper.h
@@ -70,7 +70,8 @@ struct DialogYesNoMessage
   \sa CGUIDialogYesNo::ShowAndGetInput
   \sa DialogYesNoMessage
 */
-DialogResponse ShowYesNoDialogText(CVariant heading, CVariant text, CVariant noLabel = "", CVariant yesLabel = "", uint32_t autoCloseTimeout = 0);
+DialogResponse ShowYesNoDialogText(CVariant heading, CVariant text, CVariant noLabel = CVariant(),
+                                   CVariant yesLabel = CVariant(), uint32_t autoCloseTimeout = 0);
 
 /*!
   \brief This is a helper method to send a threadmessage to open a Yes/No dialog box
@@ -90,8 +91,9 @@ DialogResponse ShowYesNoDialogText(CVariant heading, CVariant text, CVariant noL
   \sa CGUIDialogYesNo::ShowAndGetInput
   \sa DialogYesNoMessage
 */
-DialogResponse ShowYesNoDialogLines(CVariant heading, CVariant line0, CVariant line1 = "",
-  CVariant line2 = "", CVariant noLabel = "", CVariant yesLabel = "", uint32_t autoCloseTimeout = 0);
+DialogResponse ShowYesNoDialogLines(CVariant heading, CVariant line0, CVariant line1 = CVariant(),
+                                    CVariant line2 = CVariant(), CVariant noLabel = CVariant(),
+                                    CVariant yesLabel = CVariant(), uint32_t autoCloseTimeout = 0);
 
 }
 }
diff --git a/xbmc/music/Album.cpp b/xbmc/music/Album.cpp
index a091766..f81575b 100644
--- a/xbmc/music/Album.cpp
+++ b/xbmc/music/Album.cpp
@@ -173,6 +173,8 @@ CAlbum::CAlbum(const CFileItem& item)
   }
 
   iYear = stTime.wYear;
+  strLabel = tag.GetRecordLabel();
+  strType = tag.GetMusicBrainzReleaseType();
   bCompilation = tag.GetCompilation();
   iTimesPlayed = 0;
   dateAdded.Reset();
@@ -376,12 +378,12 @@ bool CAlbum::Load(const TiXmlElement *album, bool append, bool prioritise)
   if (rElement)
   {
     float rating = 0;
-    float max_rating = 5;
+    float max_rating = 10;
     XMLUtils::GetFloat(album, "rating", rating);
     if (rElement->QueryFloatAttribute("max", &max_rating) == TIXML_SUCCESS && max_rating>=1)
-      rating *= (5.f / max_rating); // Normalise the Rating to between 0 and 5 
-    if (rating > 5.f)
-      rating = 5.f;
+      rating *= (10.f / max_rating); // Normalise the Rating to between 0 and 10 
+    if (rating > 10.f)
+      rating = 10.f;
     fRating = rating;
   }
   const TiXmlElement* userrating = album->FirstChildElement("userrating");
diff --git a/xbmc/music/MusicDatabase.cpp b/xbmc/music/MusicDatabase.cpp
index 59216fe..ad5afcb 100644
--- a/xbmc/music/MusicDatabase.cpp
+++ b/xbmc/music/MusicDatabase.cpp
@@ -489,6 +489,7 @@ bool CMusicDatabase::AddAlbum(CAlbum& album)
                            album.GetAlbumArtistString(),
                            album.GetGenreString(),
                            album.iYear,
+                           album.strLabel, album.strType,
                            album.bCompilation, album.releaseType);
 
   // Add the album artists
@@ -853,6 +854,7 @@ int CMusicDatabase::UpdateSong(int idSong,
 
 int CMusicDatabase::AddAlbum(const std::string& strAlbum, const std::string& strMusicBrainzAlbumID,
                              const std::string& strArtist, const std::string& strGenre, int year,
+                             const std::string& strRecordLabel, const std::string& strType,
                              bool bCompilation, CAlbum::ReleaseType releaseType)
 {
   std::string strSQL;
@@ -875,20 +877,24 @@ int CMusicDatabase::AddAlbum(const std::string& strAlbum, const std::string& str
       m_pDS->close();
       // doesnt exists, add it
       if (strMusicBrainzAlbumID.empty())
-        strSQL=PrepareSQL("insert into album (idAlbum, strAlbum, strMusicBrainzAlbumID, strArtists, strGenres, iYear, bCompilation, strReleaseType) values( NULL, '%s', NULL, '%s', '%s', %i, %i, '%s')",
+        strSQL=PrepareSQL("insert into album (idAlbum, strAlbum, strMusicBrainzAlbumID, strArtists, strGenres, iYear, strLabel, strType, bCompilation, strReleaseType) values( NULL, '%s', NULL, '%s', '%s', %i, '%s', '%s', %i, '%s')",
                           strAlbum.c_str(),
                           strArtist.c_str(),
                           strGenre.c_str(),
                           year,
+                          strRecordLabel.c_str(),
+                          strType.c_str(),
                           bCompilation,
                           CAlbum::ReleaseTypeToString(releaseType).c_str());
       else
-        strSQL=PrepareSQL("insert into album (idAlbum, strAlbum, strMusicBrainzAlbumID, strArtists, strGenres, iYear, bCompilation, strReleaseType) values( NULL, '%s', '%s', '%s', '%s', %i, %i, '%s')",
+        strSQL=PrepareSQL("insert into album (idAlbum, strAlbum, strMusicBrainzAlbumID, strArtists, strGenres, iYear, strLabel, strType, bCompilation, strReleaseType) values( NULL, '%s', '%s', '%s', '%s', %i, '%s', '%s', %i, '%s')",
                           strAlbum.c_str(),
                           strMusicBrainzAlbumID.c_str(),
                           strArtist.c_str(),
                           strGenre.c_str(),
                           year,
+                          strRecordLabel.c_str(),
+                          strType.c_str(),
                           bCompilation,
                           CAlbum::ReleaseTypeToString(releaseType).c_str());
       m_pDS->exec(strSQL);
@@ -909,18 +915,22 @@ int CMusicDatabase::AddAlbum(const std::string& strAlbum, const std::string& str
       int idAlbum = m_pDS->fv("idAlbum").get_asInt();
       m_pDS->close();
       if (strMusicBrainzAlbumID.empty())
-        strSQL=PrepareSQL("UPDATE album SET strGenres = '%s', iYear=%i, bCompilation=%i, strReleaseType = '%s', lastScraped = NULL WHERE idAlbum=%i",
+        strSQL=PrepareSQL("UPDATE album SET strGenres = '%s', iYear=%i, strLabel = '%s', strType = '%s', bCompilation=%i, strReleaseType = '%s', lastScraped = NULL WHERE idAlbum=%i",
                           strGenre.c_str(),
                           year,
+                          strRecordLabel.c_str(),
+                          strType.c_str(),
                           bCompilation,
                           CAlbum::ReleaseTypeToString(releaseType).c_str(),
                           idAlbum);
       else
-        strSQL=PrepareSQL("UPDATE album SET strAlbum = '%s', strArtists = '%s', strGenres = '%s', iYear=%i, bCompilation=%i, strReleaseType = '%s', lastScraped = NULL WHERE idAlbum=%i",
+        strSQL=PrepareSQL("UPDATE album SET strAlbum = '%s', strArtists = '%s', strGenres = '%s', iYear=%i, strLabel = '%s', strType = '%s', bCompilation=%i, strReleaseType = '%s', lastScraped = NULL WHERE idAlbum=%i",
                           strAlbum.c_str(),
                           strArtist.c_str(),
                           strGenre.c_str(),
                           year,
+                          strRecordLabel.c_str(),
+                          strType.c_str(),
                           bCompilation,
                           CAlbum::ReleaseTypeToString(releaseType).c_str(),
                           idAlbum);
@@ -2167,12 +2177,18 @@ int CMusicDatabase::GetAlbumIdByPath(const std::string& strPath)
 {
   try
   {
-    std::string strSQL=PrepareSQL("select distinct idAlbum from song join path on song.idPath = path.idPath where path.strPath='%s'", strPath.c_str());
-    m_pDS->query(strSQL);
-    if (m_pDS->eof())
-      return -1;
+    if (NULL == m_pDB.get()) return false;
+    if (NULL == m_pDS.get()) return false;
+
+    std::string strSQL = PrepareSQL("SELECT DISTINCT idAlbum FROM song JOIN path ON song.idPath = path.idPath WHERE path.strPath='%s'", strPath.c_str());
+    // run query
+    if (!m_pDS->query(strSQL)) return false;
+    int iRowsFound = m_pDS->num_rows();
 
-    int idAlbum = m_pDS->fv(0).get_asInt();
+    int idAlbum = -1; // If no album is found, or more than one album is found then -1 is returned
+    if (iRowsFound == 1)
+      idAlbum = m_pDS->fv(0).get_asInt();
+    
     m_pDS->close();
 
     return idAlbum;
@@ -2182,7 +2198,7 @@ int CMusicDatabase::GetAlbumIdByPath(const std::string& strPath)
     CLog::Log(LOGERROR, "%s(%s) failed", __FUNCTION__, strPath.c_str());
   }
 
-  return false;
+  return -1;
 }
 
 int CMusicDatabase::GetSongByArtistAndAlbumAndTitle(const std::string& strArtist, const std::string& strAlbum, const std::string& strTitle)
@@ -2414,10 +2430,12 @@ bool CMusicDatabase::GetRecentlyPlayedAlbums(VECALBUMS& albums)
     // Get data from album and album_artist tables to fully populate albums
     std::string strSQL = PrepareSQL("SELECT albumview.*, albumartistview.* FROM "
       "(SELECT idAlbum FROM albumview WHERE albumview.lastplayed IS NOT NULL "
+      "AND albumview.strReleaseType = '%s' "
       "ORDER BY albumview.lastplayed DESC LIMIT %u) as playedalbums "
       "JOIN albumview ON albumview.idAlbum = playedalbums.idAlbum "
       "JOIN albumartistview ON albumview.idAlbum = albumartistview.idAlbum "
-      "ORDER BY albumview.lastplayed DESC, albumartistview.iorder ", RECENTLY_PLAYED_LIMIT);
+      "ORDER BY albumview.lastplayed DESC, albumartistview.iorder ", 
+      CAlbum::ReleaseTypeToString(CAlbum::Album).c_str(), RECENTLY_PLAYED_LIMIT);
 
     CLog::Log(LOGDEBUG, "%s query: %s", __FUNCTION__, strSQL.c_str());
     if (!m_pDS->query(strSQL)) return false;
@@ -3615,9 +3633,11 @@ bool CMusicDatabase::GetRolesNav(const std::string& strBaseDir, CFileItemList& i
       CFileItemPtr pItem(new CFileItem(labelValue));
       pItem->GetMusicInfoTag()->SetTitle(labelValue);
       pItem->GetMusicInfoTag()->SetDatabaseId(m_pDS->fv("role.idRole").get_asInt(), "role");
-
-      std::string artistrolepath = StringUtils::Format("musicdb://artists/?roleid=%i", m_pDS->fv("role.idRole").get_asInt());
-      pItem->SetPath(artistrolepath);
+      CMusicDbUrl itemUrl = musicUrl;
+      std::string strDir = StringUtils::Format("%i/", m_pDS->fv("role.idRole").get_asInt());
+      itemUrl.AppendPath(strDir);
+      itemUrl.AddOption("roleid", m_pDS->fv("role.idRole").get_asInt());
+      pItem->SetPath(itemUrl.ToString());
 
       pItem->m_bIsFolder = true;
       items.Add(pItem);
@@ -5187,6 +5207,11 @@ std::string CMusicDatabase::GetArtistById(int id)
   return GetSingleValue("artist", "strArtist", PrepareSQL("idArtist=%i", id));
 }
 
+std::string CMusicDatabase::GetRoleById(int id)
+{
+  return GetSingleValue("role", "strRole", PrepareSQL("idRole=%i", id));
+}
+
 std::string CMusicDatabase::GetAlbumById(int id)
 {
   return GetSingleValue("album", "strAlbum", PrepareSQL("idAlbum=%i", id));
@@ -5488,24 +5513,22 @@ bool CMusicDatabase::SetSongUserrating(const std::string &filePath, int userrati
   return false;
 }
 
-bool CMusicDatabase::SetAlbumUserrating(const std::string &filePath, int userrating)
+bool CMusicDatabase::SetAlbumUserrating(const int idAlbum, int userrating)
 {
   try
   {
-    if (filePath.empty()) return false;
     if (NULL == m_pDB.get()) return false;
     if (NULL == m_pDS.get()) return false;
 
-    int albumID = GetAlbumIdByPath(filePath);
-    if (-1 == albumID) return false;
+    if (-1 == idAlbum) return false;
 
-    std::string sql = PrepareSQL("UPDATE album SET iUserrating='%i' WHERE idAlbum = %i", userrating, albumID);
+    std::string sql = PrepareSQL("UPDATE album SET iUserrating='%i' WHERE idAlbum = %i", userrating, idAlbum);
     m_pDS->exec(sql);
     return true;
   }
   catch (...)
   {
-    CLog::Log(LOGERROR, "%s (%s,%i) failed", __FUNCTION__, filePath.c_str(), userrating);
+    CLog::Log(LOGERROR, "%s (%i,%i) failed", __FUNCTION__, idAlbum, userrating);
   }
   return false;
 }
@@ -5532,28 +5555,6 @@ bool CMusicDatabase::SetSongVotes(const std::string &filePath, int votes)
   return false;
 }
 
-bool CMusicDatabase::SetAlbumVotes(const std::string &filePath, int votes)
-{
-  try
-  {
-    if (filePath.empty()) return false;
-    if (NULL == m_pDB.get()) return false;
-    if (NULL == m_pDS.get()) return false;
-
-    int albumID = GetAlbumIdByPath(filePath);
-    if (-1 == albumID) return false;
-
-    std::string sql = PrepareSQL("UPDATE album SET iVotes='%i' WHERE idAlbum = %i", votes, albumID);
-    m_pDS->exec(sql);
-    return true;
-  }
-  catch (...)
-  {
-    CLog::Log(LOGERROR, "%s (%s,%i) failed", __FUNCTION__, filePath.c_str(), votes);
-  }
-  return false;
-}
-
 int CMusicDatabase::GetSongIDFromPath(const std::string &filePath)
 {
   // grab the where string to identify the song id
@@ -5777,6 +5778,8 @@ std::string CMusicDatabase::GetItemById(const std::string &itemType, int id)
     return GetArtistById(id);
   else if (StringUtils::EqualsNoCase(itemType, "albums"))
     return GetAlbumById(id);
+  else if (StringUtils::EqualsNoCase(itemType, "roles"))
+    return GetRoleById(id);
 
   return "";
 }
diff --git a/xbmc/music/MusicDatabase.h b/xbmc/music/MusicDatabase.h
index 0a23add..71b03a2 100644
--- a/xbmc/music/MusicDatabase.h
+++ b/xbmc/music/MusicDatabase.h
@@ -194,15 +194,18 @@ public:
   bool Search(const std::string& search, CFileItemList &items);
   bool RemoveSongsFromPath(const std::string &path, MAPSONGS& songs, bool exact=true);
   bool SetSongUserrating(const std::string &filePath, int userrating);
-  bool SetAlbumUserrating(const std::string &filePath, int userrating);
   bool SetSongVotes(const std::string &filePath, int votes);
-  bool SetAlbumVotes(const std::string &filePath, int votes);
   int  GetSongByArtistAndAlbumAndTitle(const std::string& strArtist, const std::string& strAlbum, const std::string& strTitle);
 
   /////////////////////////////////////////////////
   // Album
   /////////////////////////////////////////////////
+  /*! \brief Add an album and all its songs to the database
+  \param album the album to add
+  \return the id of the album
+  */
   bool AddAlbum(CAlbum& album);
+
   /*! \brief Update an album and all its nested entities (artists, songs, infoSongs, etc)
    \param album the album to update
    \param OverrideTagData whether or not to replace the artist and song data, defaults to true.
@@ -210,14 +213,22 @@ public:
    */
   bool UpdateAlbum(CAlbum& album, bool OverrideTagData = true);
 
-  /*! \brief Add an album and all its songs to the database
-   \param album the album to add
-   \param songIDs [out] the ids of the added songs
+  /*! \brief Add an album to the database
+   \param strAlbum the album title
+   \param strMusicBrainzAlbumID the Musicbrainz Id
+   \param strArtist the album artist name(s)
+   \param strGenre the album genre(s)
+   \param year the year
+   \param strRecordLabel the recording lable
+   \param strType album type (Musicbrainz release type e.g. "Broadcast, Soundtrack, live"), 
+   \param bCompilation if the album is a compilation
+   \param releaseType "album" or "single"
    \return the id of the album
    */
   int  AddAlbum(const std::string& strAlbum, const std::string& strMusicBrainzAlbumID,
-                const std::string& strArtist, const std::string& strGenre,
-                int year, bool bCompilation, CAlbum::ReleaseType releaseType);
+                const std::string& strArtist, const std::string& strGenre, int year, 
+                const std::string& strRecordLabel, const std::string& strType,
+                bool bCompilation, CAlbum::ReleaseType releaseType);
   /*! \brief retrieve an album, optionally with all songs.
    \param idAlbum the database id of the album.
    \param album [out] the album to fill.
@@ -250,6 +261,7 @@ public:
   int  GetAlbumByName(const std::string& strAlbum, const std::string& strArtist="");
   int  GetAlbumByName(const std::string& strAlbum, const std::vector<std::string>& artist);
   std::string GetAlbumById(int id);
+  bool SetAlbumUserrating(const int idAlbum, int userrating);
 
   /////////////////////////////////////////////////
   // Artist CRUD
@@ -276,6 +288,7 @@ public:
 
   std::string GetArtistById(int id);
   int GetArtistByName(const std::string& strArtist);
+  std::string GetRoleById(int id);
 
   /////////////////////////////////////////////////
   // Cuesheets
diff --git a/xbmc/music/Song.cpp b/xbmc/music/Song.cpp
index 0c206dd..b5b3995 100644
--- a/xbmc/music/Song.cpp
+++ b/xbmc/music/Song.cpp
@@ -148,6 +148,8 @@ CSong::CSong(CFileItem& item)
   iYear = stTime.wYear;
   iTrack = tag.GetTrackAndDiscNumber();
   iDuration = tag.GetDuration();
+  strRecordLabel = tag.GetRecordLabel();
+  strAlbumType = tag.GetMusicBrainzReleaseType();
   bCompilation = tag.GetCompilation();
   embeddedArt = tag.GetCoverArtInfo();
   strFileName = tag.GetURL().empty() ? item.GetPath() : tag.GetURL();
diff --git a/xbmc/music/Song.h b/xbmc/music/Song.h
index aeb6844..93d4eb6 100644
--- a/xbmc/music/Song.h
+++ b/xbmc/music/Song.h
@@ -163,6 +163,8 @@ public:
   int iStartOffset;
   int iEndOffset;
   bool bCompilation;
+  std::string strRecordLabel; // Record label from tag for album processing by CMusicInfoScanner::FileItemsToAlbums
+  std::string strAlbumType; // (Musicbrainz) album release type from tag for album processing by CMusicInfoScanner::FileItemsToAlbums
 
   ReplayGain replayGain;
 private:
diff --git a/xbmc/music/dialogs/GUIDialogMusicInfo.cpp b/xbmc/music/dialogs/GUIDialogMusicInfo.cpp
index 25026b0..ed82871 100644
--- a/xbmc/music/dialogs/GUIDialogMusicInfo.cpp
+++ b/xbmc/music/dialogs/GUIDialogMusicInfo.cpp
@@ -80,7 +80,7 @@ bool CGUIDialogMusicInfo::OnMessage(CGUIMessage& message)
         if (db.Open())
         {
           m_needsUpdate = true;
-          db.SetAlbumUserrating(m_albumItem->GetPath(), m_albumItem->GetMusicInfoTag()->GetUserrating());
+          db.SetAlbumUserrating(m_albumItem->GetMusicInfoTag()->GetAlbumId(), m_albumItem->GetMusicInfoTag()->GetUserrating());
           db.Close();
         }
       }
diff --git a/xbmc/music/infoscanner/MusicInfoScanner.cpp b/xbmc/music/infoscanner/MusicInfoScanner.cpp
index e31e12d..311cdc6 100644
--- a/xbmc/music/infoscanner/MusicInfoScanner.cpp
+++ b/xbmc/music/infoscanner/MusicInfoScanner.cpp
@@ -674,29 +674,32 @@ void CMusicInfoScanner::FileItemsToAlbums(CFileItemList& items, VECALBUMS& album
     }
 
     /*
-     We have a compilation if
-     1. album name is non-empty AND
-     2a. no tracks overlap OR
-     2b. all tracks are marked as part of compilation AND
-     3a. a unique primary artist is specified as "various" or "various artists" OR
-     3b. we have at least two primary artists and no album artist specified.
-     */
+    We have a Various Artists compilation if
+    1. album name is non-empty AND
+    2a. no tracks overlap OR
+    2b. all tracks are marked as part of compilation AND
+    3a. a unique primary artist is specified as "various", "various artists" or the localized value
+    OR
+    3b. we have at least two primary artists and no album artist specified.
+    */
+    std::string various = g_localizeStrings.Get(340); // Various Artists
     bool compilation = !songsByAlbumName->first.empty() && (isCompilation || !tracksOverlap); // 1+2b+2a
     if (artists.size() == 1)
     {
       std::string artist = artists.begin()->first; StringUtils::ToLower(artist);
       if (!StringUtils::EqualsNoCase(artist, "various") &&
-          !StringUtils::EqualsNoCase(artist, "various artists")) // 3a
+        !StringUtils::EqualsNoCase(artist, "various artists") &&
+        !StringUtils::EqualsNoCase(artist, various)) // 3a
         compilation = false;
     }
     else if (hasAlbumArtist) // 3b
       compilation = false;
 
+    //Such a compilation album is stored with the localized value for "various artists" as the album artist
     if (compilation)
     {
       CLog::Log(LOGDEBUG, "Album '%s' is a compilation as there's no overlapping tracks and %s", songsByAlbumName->first.c_str(), hasAlbumArtist ? "the album artist is 'Various'" : "there is more than one unique artist");
       artists.clear();
-      std::string various = g_localizeStrings.Get(340); // Various Artists
       std::vector<std::string> va; va.push_back(various);
       for (VECSONGS::iterator song = songs.begin(); song != songs.end(); ++song)
       {
@@ -706,6 +709,21 @@ void CMusicInfoScanner::FileItemsToAlbums(CFileItemList& items, VECALBUMS& album
     }
 
     /*
+    We also have a compilation album when album name is non-empty and ALL tracks are marked as part of
+    a compilation even if an album artist is given, or all songs have the same primary artist. For
+    example an anthology - a collection of recordings from various old sources
+    combined together such as a "best of", retrospective or rarities type release.
+
+    Such an anthology compilation will not have been caught by the previous tests as it fails 3a and 3b.
+    The album artist can be determined just like any normal album.
+    */
+    if (!compilation && !songsByAlbumName->first.empty() && isCompilation)
+    {
+      compilation = true;
+      CLog::Log(LOGDEBUG, "Album '%s' is a compilation as all songs are marked aspart of a compilation", songsByAlbumName->first.c_str());
+    }
+
+    /*
      Step 3: Find the common albumartist for each song and assign
      albumartist to those tracks that don't have it set.
      */
@@ -745,6 +763,8 @@ void CMusicInfoScanner::FileItemsToAlbums(CFileItemList& items, VECALBUMS& album
         album.genre = (*k)->genre;
         //       in addition, we may want to use year as discriminating for albums
         album.iYear = (*k)->iYear;
+        album.strLabel = (*k)->strRecordLabel;
+        album.strType = (*k)->strAlbumType;
         album.songs.push_back(**k);
       }
       albums.push_back(album);
@@ -1114,7 +1134,7 @@ INFO_RET CMusicInfoScanner::DownloadAlbumInfo(const CAlbum& album, const ADDON::
       scraper.GetAlbums().clear();
       scraper.GetAlbums().push_back(albumNfo);
     }
-    else
+    else if (result != CNfoFile::PARTIAL_NFO)
       CLog::Log(LOGERROR,"Unable to find an url in nfo file: %s", strNfo.c_str());
   }
 
@@ -1141,7 +1161,8 @@ INFO_RET CMusicInfoScanner::DownloadAlbumInfo(const CAlbum& album, const ADDON::
 
   CGUIDialogSelect *pDlg = NULL;
   int iSelectedAlbum=0;
-  if (result == CNfoFile::NO_NFO && !bMusicBrainz)
+  if ((result == CNfoFile::NO_NFO || result == CNfoFile::PARTIAL_NFO)
+      && !bMusicBrainz)
   {
     iSelectedAlbum = -1; // set negative so that we can detect a failure
     if (scraper.Succeeded() && scraper.GetAlbumCount() >= 1)
@@ -1259,7 +1280,7 @@ INFO_RET CMusicInfoScanner::DownloadAlbumInfo(const CAlbum& album, const ADDON::
 
   albumInfo = scraper.GetAlbum(iSelectedAlbum);
   
-  if (result == CNfoFile::COMBINED_NFO)
+  if (result == CNfoFile::COMBINED_NFO || result == CNfoFile::PARTIAL_NFO)
     nfoReader.GetDetails(albumInfo.GetAlbum(), NULL, true);
   
   return INFO_ADDED;
diff --git a/xbmc/music/tags/MusicInfoTag.cpp b/xbmc/music/tags/MusicInfoTag.cpp
index 00648aa..0796771 100644
--- a/xbmc/music/tags/MusicInfoTag.cpp
+++ b/xbmc/music/tags/MusicInfoTag.cpp
@@ -119,6 +119,7 @@ const CMusicInfoTag& CMusicInfoTag::operator =(const CMusicInfoTag& tag)
   m_musicRoles = tag.m_musicRoles;
   m_strComment = tag.m_strComment;
   m_strMood = tag.m_strMood;
+  m_strMood = tag.m_strMood;
   m_strLyrics = tag.m_strLyrics;
   m_cuesheet = tag.m_cuesheet;
   m_lastPlayed = tag.m_lastPlayed;
@@ -269,6 +270,11 @@ const std::string &CMusicInfoTag::GetMood() const
   return m_strMood;
 }
 
+const std::string &CMusicInfoTag::GetRecordLabel() const
+{
+  return m_strRecordLabel;
+}
+
 const std::string &CMusicInfoTag::GetLyrics() const
 {
   return m_strLyrics;
@@ -468,6 +474,11 @@ void CMusicInfoTag::SetMood(const std::string& mood)
   m_strMood = mood;
 }
 
+void CMusicInfoTag::SetRecordLabel(const std::string& publisher)
+{
+  m_strRecordLabel = publisher;
+}
+
 void CMusicInfoTag::SetCueSheet(const std::string& cueSheet)
 {
   m_cuesheet = cueSheet;
@@ -576,6 +587,11 @@ const std::vector<std::string>& CMusicInfoTag::GetMusicBrainzAlbumArtistHints()
     return m_musicBrainzAlbumArtistHints;
 }
 
+const std::string &CMusicInfoTag::GetMusicBrainzReleaseType() const
+{
+  return m_strMusicBrainzReleaseType;
+}
+
 void CMusicInfoTag::SetMusicBrainzTrackID(const std::string& strTrackID)
 {
   m_strMusicBrainzTrackID = strTrackID;
@@ -606,6 +622,11 @@ void CMusicInfoTag::SetMusicBrainzAlbumArtistHints(const std::vector<std::string
     m_musicBrainzAlbumArtistHints = musicBrainzAlbumArtistHints;
 }
 
+void CMusicInfoTag::SetMusicBrainzReleaseType(const std::string& ReleaseType)
+{
+  m_strMusicBrainzReleaseType = ReleaseType;
+}
+
 void CMusicInfoTag::SetCoverArtInfo(size_t size, const std::string &mimeType)
 {
   m_coverArt.set(size, mimeType);
@@ -654,8 +675,10 @@ void CMusicInfoTag::SetAlbum(const CAlbum& album)
   SetAlbum(album.strAlbum);
   SetTitle(album.strAlbum);
   SetMusicBrainzAlbumID(album.strMusicBrainzAlbumID);
+  SetMusicBrainzReleaseType(album.strType);
   SetGenre(album.genre);
   SetMood(StringUtils::Join(album.moods, g_advancedSettings.m_musicItemSeparator));
+  SetRecordLabel(album.strLabel);
   SetRating(album.fRating);
   SetUserrating(album.iUserrating);
   SetVotes(album.iVotes);
@@ -769,6 +792,7 @@ void CMusicInfoTag::Serialize(CVariant& value) const
   value["displayorchestra"] = GetArtistStringForRole("orchestra");
   value["displaylyricist"] = GetArtistStringForRole("lyricist");   //TEXT
   value["mood"] = StringUtils::Split(m_strMood, g_advancedSettings.m_musicItemSeparator);
+  value["recordlabel"] = m_strRecordLabel;
   value["rating"] = m_Rating;
   value["userrating"] = m_Userrating;
   value["votes"] = m_Votes;
@@ -838,6 +862,7 @@ void CMusicInfoTag::Archive(CArchive& ar)
     ar << m_musicBrainzArtistID;
     ar << m_strMusicBrainzAlbumID;
     ar << m_musicBrainzAlbumArtistID;
+    ar << m_strMusicBrainzReleaseType;
     ar << m_lastPlayed;
     ar << m_dateAdded;
     ar << m_strComment;
@@ -850,6 +875,7 @@ void CMusicInfoTag::Archive(CArchive& ar)
       ar << credit->GetArtistId();
     }
     ar << m_strMood;
+    ar << m_strRecordLabel;
     ar << m_Rating;
     ar << m_Userrating;
     ar << m_Votes;
@@ -882,6 +908,7 @@ void CMusicInfoTag::Archive(CArchive& ar)
     ar >> m_musicBrainzArtistID;
     ar >> m_strMusicBrainzAlbumID;
     ar >> m_musicBrainzAlbumArtistID;
+    ar >> m_strMusicBrainzReleaseType;
     ar >> m_lastPlayed;
     ar >> m_dateAdded;
     ar >> m_strComment;
@@ -901,6 +928,7 @@ void CMusicInfoTag::Archive(CArchive& ar)
       m_musicRoles.emplace_back(idRole, strRole, strArtist, idArtist);
     }
     ar >> m_strMood;
+    ar >> m_strRecordLabel;
     ar >> m_Rating;
     ar >> m_Userrating;
     ar >> m_Votes;
@@ -932,6 +960,7 @@ void CMusicInfoTag::Clear()
   m_musicBrainzArtistID.clear();
   m_strMusicBrainzAlbumID.clear();
   m_musicBrainzAlbumArtistID.clear();
+  m_strMusicBrainzReleaseType.clear();
   m_musicRoles.clear();
   m_iDuration = 0;
   m_iTrack = 0;
@@ -941,6 +970,7 @@ void CMusicInfoTag::Clear()
   m_bCompilation = false;
   m_strComment.clear();
   m_strMood.clear();
+  m_strRecordLabel.clear();
   m_cuesheet.clear();
   m_iDbId = -1;
   m_type.clear();
diff --git a/xbmc/music/tags/MusicInfoTag.h b/xbmc/music/tags/MusicInfoTag.h
index 5c46a56..68cbc5c 100644
--- a/xbmc/music/tags/MusicInfoTag.h
+++ b/xbmc/music/tags/MusicInfoTag.h
@@ -73,8 +73,10 @@ public:
   const std::string& GetMusicBrainzAlbumID() const;
   const std::vector<std::string>& GetMusicBrainzAlbumArtistID() const;
   const std::vector<std::string>& GetMusicBrainzAlbumArtistHints() const;
+  const std::string& GetMusicBrainzReleaseType() const;
   const std::string& GetComment() const;
   const std::string& GetMood() const;
+  const std::string& GetRecordLabel() const;
   const std::string& GetLyrics() const;
   const std::string& GetCueSheet() const;
   const CDateTime& GetLastPlayed() const;
@@ -118,8 +120,10 @@ public:
   void SetMusicBrainzAlbumID(const std::string& strAlbumID);
   void SetMusicBrainzAlbumArtistID(const std::vector<std::string>& musicBrainzAlbumArtistId);
   void SetMusicBrainzAlbumArtistHints(const std::vector<std::string>& musicBrainzAlbumArtistHints);
+  void SetMusicBrainzReleaseType(const std::string& ReleaseType);
   void SetComment(const std::string& comment);
   void SetMood(const std::string& mood);
+  void SetRecordLabel(const std::string& publisher);
   void SetLyrics(const std::string& lyrics);
   void SetCueSheet(const std::string& cueSheet);
   void SetRating(float rating);
@@ -192,9 +196,11 @@ protected:
   std::string m_strMusicBrainzAlbumID;
   std::vector<std::string> m_musicBrainzAlbumArtistID;
   std::vector<std::string> m_musicBrainzAlbumArtistHints;
+  std::string m_strMusicBrainzReleaseType;
   VECMUSICROLES m_musicRoles; //Artists contributing to the recording and role (from tags other than ARTIST or ALBUMARTIST)
   std::string m_strComment;
   std::string m_strMood;
+  std::string m_strRecordLabel;
   std::string m_strLyrics;
   std::string m_cuesheet;
   CDateTime m_lastPlayed;
diff --git a/xbmc/music/tags/TagLoaderTagLib.cpp b/xbmc/music/tags/TagLoaderTagLib.cpp
index 45d6408..8723ba4 100644
--- a/xbmc/music/tags/TagLoaderTagLib.cpp
+++ b/xbmc/music/tags/TagLoaderTagLib.cpp
@@ -181,7 +181,7 @@ bool CTagLoaderTagLib::ParseTag(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag&
     else if (it->first == "WM/Mixer")
       AddArtistRole(tag, "mixer", GetASFStringList(it->second));
     else if (it->first == "WM/Publisher")
-    {} // Known unsupported, supress warnings
+      tag.SetRecordLabel(it->second.front().toString().to8Bit(true));
     else if (it->first == "WM/AlbumArtistSortOrder")
     {} // Known unsupported, supress warnings
     else if (it->first == "WM/ArtistSortOrder")
@@ -203,7 +203,7 @@ bool CTagLoaderTagLib::ParseTag(ASF::Tag *asf, EmbeddedArt *art, CMusicInfoTag&
     else if (it->first == "MusicBrainz/Album Status")
     {}
     else if (it->first == "MusicBrainz/Album Type")
-    {}
+      SetReleaseType(tag, GetASFStringList(it->second));
     else if (it->first == "MusicIP/PUID")
     {}
     else if (it->first == "replaygain_track_gain")
@@ -303,7 +303,7 @@ bool CTagLoaderTagLib::ParseTag(ID3v2::Tag *id3v2, MUSIC_INFO::EmbeddedArt *art,
     else if (it->first == "TPE3")   AddArtistRole(tag, "Conductor", GetID3v2StringList(it->second));
     else if (it->first == "TEXT")   AddArtistRole(tag, "Lyricist", GetID3v2StringList(it->second));
     else if (it->first == "TPE4")   AddArtistRole(tag, "Remixer", GetID3v2StringList(it->second));
-    else if (it->first == "TPUB")   {} // Publisher. Known unsupported, supress warnings
+    else if (it->first == "TPUB")   tag.SetRecordLabel(it->second.front()->toString().to8Bit(true));
     else if (it->first == "TCOP")   {} // Copyright message
     else if (it->first == "TDRC")   tag.SetYear(strtol(it->second.front()->toString().toCString(true), nullptr, 10));
     else if (it->first == "TDRL")   tag.SetYear(strtol(it->second.front()->toString().toCString(true), nullptr, 10));
@@ -346,6 +346,8 @@ bool CTagLoaderTagLib::ParseTag(ID3v2::Tag *id3v2, MUSIC_INFO::EmbeddedArt *art,
           tag.SetMusicBrainzAlbumArtistID(SplitMBID(StringListToVectorString(stringList)));
         else if (desc == "MUSICBRAINZ ALBUM ARTIST")
           SetAlbumArtist(tag, StringListToVectorString(stringList));
+        else if (desc == "MUSICBRAINZ ALBUM TYPE")
+          SetReleaseType(tag, StringListToVectorString(stringList));
         else if (desc == "REPLAYGAIN_TRACK_GAIN")
           replayGainInfo.ParseGain(ReplayGain::TRACK, stringList.front().toCString(true));
         else if (desc == "REPLAYGAIN_ALBUM_GAIN")
@@ -520,7 +522,7 @@ bool CTagLoaderTagLib::ParseTag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTag&
       // Picard uses PERFORMER tag as musician credits list formatted "name (instrument)"
       AddArtistInstrument(tag, StringListToVectorString(it->second.toStringList()));
     else if (it->first == "LABEL")   
-    {} // Publisher. Known unsupported, supress warnings
+      tag.SetRecordLabel(it->second.toString().to8Bit(true));
     else if (it->first == "COMPILATION")
       tag.SetCompilation(it->second.toString().toInt() == 1);
     else if (it->first == "LYRICS")
@@ -543,6 +545,8 @@ bool CTagLoaderTagLib::ParseTag(APE::Tag *ape, EmbeddedArt *art, CMusicInfoTag&
       tag.SetMusicBrainzAlbumID(it->second.toString().to8Bit(true));
     else if (it->first == "MUSICBRAINZ_TRACKID")
       tag.SetMusicBrainzTrackID(it->second.toString().to8Bit(true));
+    else if (it->first == "MUSICBRAINZ_ALBUMTYPE")
+      SetReleaseType(tag, StringListToVectorString(it->second.toStringList()));
     else if (g_advancedSettings.m_logLevel == LOG_LEVEL_MAX)
       CLog::Log(LOGDEBUG, "unrecognized APE tag: %s", it->first.toCString(true));
   }
@@ -617,7 +621,7 @@ bool CTagLoaderTagLib::ParseTag(Ogg::XiphComment *xiph, EmbeddedArt *art, CMusic
       // Picard uses PERFORMER tag as musician credits list formatted "name (instrument)"
       AddArtistInstrument(tag, StringListToVectorString(it->second));
     else if (it->first == "LABEL")
-    {} // Publisher. Known unsupported, supress warnings
+      tag.SetRecordLabel(it->second.front().to8Bit(true));
     else if (it->first == "COMPILATION")
       tag.SetCompilation(it->second.front().toInt() == 1);
     else if (it->first == "LYRICS")
@@ -640,6 +644,8 @@ bool CTagLoaderTagLib::ParseTag(Ogg::XiphComment *xiph, EmbeddedArt *art, CMusic
       tag.SetMusicBrainzAlbumID(it->second.front().to8Bit(true));
     else if (it->first == "MUSICBRAINZ_TRACKID")
       tag.SetMusicBrainzTrackID(it->second.front().to8Bit(true));
+    else if (it->first == "RELEASETYPE")
+      SetReleaseType(tag, StringListToVectorString(it->second));
     else if (it->first == "RATING")
     {
       // Vorbis ratings are a mess because the standard forgot to mention anything about them.
@@ -776,7 +782,7 @@ bool CTagLoaderTagLib::ParseTag(MP4::Tag *mp4, EmbeddedArt *art, CMusicInfoTag&
       AddArtistRole(tag, "Mixer", StringListToVectorString(it->second.toStringList()));
     //No MP4 standard tag for musician credits
     else if (it->first == "----:com.apple.iTunes:LABEL")
-    {} // Publisher. Known unsupported, supress warnings
+      tag.SetRecordLabel(it->second.toStringList().front().to8Bit(true));
     else if (it->first == "cpil")
       tag.SetCompilation(it->second.toBool());
     else if (it->first == "trkn")
@@ -803,6 +809,8 @@ bool CTagLoaderTagLib::ParseTag(MP4::Tag *mp4, EmbeddedArt *art, CMusicInfoTag&
       tag.SetMusicBrainzAlbumID(it->second.toStringList().front().to8Bit(true));
     else if (it->first == "----:com.apple.iTunes:MusicBrainz Track Id")
       tag.SetMusicBrainzTrackID(it->second.toStringList().front().to8Bit(true));
+    else if (it->first == "----:com.apple.iTunes:MusicBrainz Album Type")
+      SetReleaseType(tag, StringListToVectorString(it->second.toStringList()));
     else if (it->first == "covr")
     {
       MP4::CoverArtList coverArtList = it->second.toCoverArtList();
@@ -948,6 +956,14 @@ void CTagLoaderTagLib::SetGenre(CMusicInfoTag &tag, const std::vector<std::strin
     tag.SetGenre(genres);
 }
 
+void CTagLoaderTagLib::SetReleaseType(CMusicInfoTag &tag, const std::vector<std::string> &values)
+{
+  if (values.size() == 1)
+    tag.SetMusicBrainzReleaseType(values[0]);
+  else
+    tag.SetMusicBrainzReleaseType(StringUtils::Join(values, g_advancedSettings.m_musicItemSeparator));
+}
+
 void CTagLoaderTagLib::AddArtistRole(CMusicInfoTag &tag, const std::string& strRole, const std::vector<std::string> &values)
 {
   if (values.size() == 1)
diff --git a/xbmc/music/tags/TagLoaderTagLib.h b/xbmc/music/tags/TagLoaderTagLib.h
index c0b8267..b741131 100644
--- a/xbmc/music/tags/TagLoaderTagLib.h
+++ b/xbmc/music/tags/TagLoaderTagLib.h
@@ -45,6 +45,7 @@ protected:
   static void SetAlbumArtist(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
   static void SetAlbumArtistHints(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
   static void SetGenre(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
+  static void SetReleaseType(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
   static void AddArtistRole(MUSIC_INFO::CMusicInfoTag &tag, const std::string& strRole, const std::vector<std::string> &values);
   static void AddArtistRole(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
   static void AddArtistInstrument(MUSIC_INFO::CMusicInfoTag &tag, const std::vector<std::string> &values);
diff --git a/xbmc/music/windows/GUIWindowMusicBase.cpp b/xbmc/music/windows/GUIWindowMusicBase.cpp
index 2e0c897..2b9035d 100644
--- a/xbmc/music/windows/GUIWindowMusicBase.cpp
+++ b/xbmc/music/windows/GUIWindowMusicBase.cpp
@@ -1258,6 +1258,7 @@ bool CGUIWindowMusicBase::GetDirectory(const std::string &strDirectory, CFileIte
 
       newPlaylist.reset(new CFileItem("newplaylist://", false));
       newPlaylist->SetLabel(g_localizeStrings.Get(525));
+      newPlaylist->SetIconImage("DefaultPlaylist.png");
       newPlaylist->SetLabelPreformated(true);
       newPlaylist->SetSpecialSort(SortSpecialOnBottom);
       newPlaylist->SetCanQueue(false);
@@ -1265,6 +1266,7 @@ bool CGUIWindowMusicBase::GetDirectory(const std::string &strDirectory, CFileIte
 
       newPlaylist.reset(new CFileItem("newsmartplaylist://music", false));
       newPlaylist->SetLabel(g_localizeStrings.Get(21437));
+      newPlaylist->SetIconImage("DefaultPlaylist.png");
       newPlaylist->SetLabelPreformated(true);
       newPlaylist->SetSpecialSort(SortSpecialOnBottom);
       newPlaylist->SetCanQueue(false);
diff --git a/xbmc/network/upnp/UPnPInternal.cpp b/xbmc/network/upnp/UPnPInternal.cpp
index 75ef283..26d1eb1 100644
--- a/xbmc/network/upnp/UPnPInternal.cpp
+++ b/xbmc/network/upnp/UPnPInternal.cpp
@@ -655,8 +655,7 @@ BuildObject(CFileItem&                    item,
 
             for (unsigned int i = 0; i < subtitles.size(); i++)
             {
-                ExternalStreamInfo info;
-                CUtil::GetExternalStreamDetailsFromFilename(file_path.GetChars(), subtitles[i], info);
+                ExternalStreamInfo info = CUtil::GetExternalStreamDetailsFromFilename(file_path.GetChars(), subtitles[i]);
 
                 if (preferredLanguageCode == info.language)
                 {
diff --git a/xbmc/peripherals/bus/PeripheralBusUSB.h b/xbmc/peripherals/bus/PeripheralBusUSB.h
index a39f879..55d4f22 100644
--- a/xbmc/peripherals/bus/PeripheralBusUSB.h
+++ b/xbmc/peripherals/bus/PeripheralBusUSB.h
@@ -34,7 +34,4 @@
 #elif defined(TARGET_DARWIN)
 #define HAVE_PERIPHERAL_BUS_USB 1
 #include "osx/PeripheralBusUSB.h"
-#elif defined(TARGET_ANDROID)
-#define HAVE_PERIPHERAL_BUS_USB 1
-#include "linux/PeripheralBusUSBLibUSB.h"
 #endif
diff --git a/xbmc/pictures/GUIViewStatePictures.cpp b/xbmc/pictures/GUIViewStatePictures.cpp
index a04f5a7..0cfe803 100644
--- a/xbmc/pictures/GUIViewStatePictures.cpp
+++ b/xbmc/pictures/GUIViewStatePictures.cpp
@@ -82,8 +82,20 @@ std::string CGUIViewStateWindowPictures::GetExtensions()
 VECSOURCES& CGUIViewStateWindowPictures::GetSources()
 {
   VECSOURCES *pictureSources = CMediaSourceSettings::GetInstance().GetSources("pictures");
+
+  // Guard against source type not existing
+  if (pictureSources == nullptr)
+  {
+    static VECSOURCES empty;
+    return empty;
+  }
+
+  // Picture add-ons
   AddAddonsSource("image", g_localizeStrings.Get(1039), "DefaultAddonPicture.png");
+
+  // Global sources
   AddOrReplace(*pictureSources, CGUIViewState::GetSources());
+
   return *pictureSources;
 }
 
diff --git a/xbmc/pictures/GUIWindowPictures.cpp b/xbmc/pictures/GUIWindowPictures.cpp
index 2197079..c683719 100644
--- a/xbmc/pictures/GUIWindowPictures.cpp
+++ b/xbmc/pictures/GUIWindowPictures.cpp
@@ -114,11 +114,6 @@ bool CGUIWindowPictures::OnMessage(CGUIMessage& message)
         message.SetStringParam(CMediaSourceSettings::GetInstance().GetDefaultSource("pictures"));
 
       m_dlgProgress = (CGUIDialogProgress*)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
-
-      if (!CGUIMediaWindow::OnMessage(message))
-        return false;
-
-      return true;
     }
     break;
 
@@ -587,7 +582,7 @@ void CGUIWindowPictures::LoadPlayList(const std::string& strPlayList)
 
 void CGUIWindowPictures::OnItemInfo(int itemNumber)
 {
-  CFileItemPtr item = (itemNumber >= 0 && itemNumber < m_vecItems->Size()) ? m_vecItems->Get(itemNumber) : CFileItemPtr();
+  CFileItemPtr item = m_vecItems->Get(itemNumber);
   if (!item)
     return;
   if (!m_vecItems->IsPlugin() && (item->IsPlugin() || item->IsScript()))
@@ -607,8 +602,8 @@ void CGUIWindowPictures::OnItemInfo(int itemNumber)
 
 std::string CGUIWindowPictures::GetStartFolder(const std::string &dir)
 {
-  std::string lower(dir); StringUtils::ToLower(lower);
-  if (lower == "plugins" || lower == "addons")
+  if (StringUtils::EqualsNoCase(dir, "plugins") ||
+      StringUtils::EqualsNoCase(dir, "addons"))
     return "addons://sources/image/";
 
   SetupShares();
diff --git a/xbmc/pictures/Picture.cpp b/xbmc/pictures/Picture.cpp
index 64a45c3..271f882 100644
--- a/xbmc/pictures/Picture.cpp
+++ b/xbmc/pictures/Picture.cpp
@@ -26,6 +26,7 @@
 #include <algorithm>
 
 #include "Picture.h"
+#include "URL.h"
 #include "settings/AdvancedSettings.h"
 #include "settings/Settings.h"
 #include "FileItem.h"
@@ -72,7 +73,7 @@ bool CPicture::GetThumbnailFromSurface(const unsigned char* buffer, int width, i
 
 bool CPicture::CreateThumbnailFromSurface(const unsigned char *buffer, int width, int height, int stride, const std::string &thumbFile)
 {
-  CLog::Log(LOGDEBUG, "cached image '%s' size %dx%d", thumbFile.c_str(), width, height);
+  CLog::Log(LOGDEBUG, "cached image '%s' size %dx%d", CURL::GetRedacted(thumbFile).c_str(), width, height);
   if (URIUtils::HasExtension(thumbFile, ".jpg"))
   {
 #if defined(HAS_OMXPLAYER)
@@ -86,7 +87,7 @@ bool CPicture::CreateThumbnailFromSurface(const unsigned char *buffer, int width
   IImage* pImage = ImageFactory::CreateLoader(thumbFile);
   if(pImage == NULL || !pImage->CreateThumbnailFromSurface((BYTE *)buffer, width, height, XB_FMT_A8R8G8B8, stride, thumbFile.c_str(), thumb, thumbsize))
   {
-    CLog::Log(LOGERROR, "Failed to CreateThumbnailFromSurface for %s", thumbFile.c_str());
+    CLog::Log(LOGERROR, "Failed to CreateThumbnailFromSurface for %s", CURL::GetRedacted(thumbFile).c_str());
     delete pImage;
     return false;
   }
@@ -119,7 +120,7 @@ bool CThumbnailWriter::DoWork()
 
   if (!CPicture::CreateThumbnailFromSurface(m_buffer, m_width, m_height, m_stride, m_thumbFile))
   {
-    CLog::Log(LOGERROR, "CThumbnailWriter::DoWork unable to write %s", m_thumbFile.c_str());
+    CLog::Log(LOGERROR, "CThumbnailWriter::DoWork unable to write %s", CURL::GetRedacted(m_thumbFile).c_str());
     success = false;
   }
 
diff --git a/xbmc/platform/android/jni/AudioTrack.cpp b/xbmc/platform/android/jni/AudioTrack.cpp
index 176fca9..619dfc5 100644
--- a/xbmc/platform/android/jni/AudioTrack.cpp
+++ b/xbmc/platform/android/jni/AudioTrack.cpp
@@ -143,7 +143,10 @@ int CJNIAudioTrack::write(char* audioData, int offsetInBytes, int sizeInBytes)
     }
     else if (m_audioFormat == CJNIAudioFormat::ENCODING_IEC61937)
     {
-      written = call_method<int>(m_object, "write", "([SIII)I", m_buffer, (int)(offsetInBytes / sizeof(short)), (int)(sizeInBytes / sizeof(short)), CJNIAudioTrack::WRITE_BLOCKING);
+      if (CJNIBase::GetSDKVersion() >= 23)
+        written = call_method<int>(m_object, "write", "([SIII)I", m_buffer, (int)(offsetInBytes / sizeof(short)), (int)(sizeInBytes / sizeof(short)), CJNIAudioTrack::WRITE_BLOCKING);
+      else
+       written = call_method<int>(m_object, "write", "([SII)I", m_buffer, (int)(offsetInBytes / sizeof(short)), (int)(sizeInBytes / sizeof(short)));
       written *= sizeof(short);
     }
     else
diff --git a/xbmc/platform/darwin/DarwinUtils.mm b/xbmc/platform/darwin/DarwinUtils.mm
index 509cce5..c6355c3 100644
--- a/xbmc/platform/darwin/DarwinUtils.mm
+++ b/xbmc/platform/darwin/DarwinUtils.mm
@@ -87,7 +87,8 @@ enum iosPlatform
   iPhone5SGSM,
   iPhone5SGlobal,
   iPodTouch4G,
-  iPodTouch5G,  
+  iPodTouch5G,
+  iPodTouch6G,
   iPad3WIFI,
   iPad3GSMCDMA,
   iPad3,
@@ -96,14 +97,26 @@ enum iosPlatform
   iPad4GSMCDMA,
   iPadAirWifi,
   iPadAirCellular,
+  iPadAirTDLTE,
   iPadMini2Wifi,
   iPadMini2Cellular,
   iPhone6,
+  iPhone6s,
+  iPhoneSE,
+  iPhone7,
   iPadAir2Wifi,
   iPadAir2Cellular,
+  iPadPro9_7InchWifi,
+  iPadPro9_7InchCellular,
+  iPadPro12_9InchWifi,
+  iPadPro12_9InchCellular,
   iPadMini3Wifi,
   iPadMini3Cellular,
+  iPadMini4Wifi,
+  iPadMini4Cellular,
   iPhone6Plus,        //from here on list devices with retina support which have scale == 3.0
+  iPhone6sPlus,
+  iPhone7Plus,
 };
 
 // platform strings are based on http://theiphonewiki.com/wiki/Models
@@ -154,11 +167,19 @@ enum iosPlatform getIosPlatform()
     else if (devStr == "iPhone6,2") eDev = iPhone5SGlobal;
     else if (devStr == "iPhone7,1") eDev = iPhone6Plus;
     else if (devStr == "iPhone7,2") eDev = iPhone6;
+    else if (devStr == "iPhone8,1") eDev = iPhone6s;
+    else if (devStr == "iPhone8,2") eDev = iPhone6sPlus;
+    else if (devStr == "iPhone8,4") eDev = iPhoneSE;
+    else if (devStr == "iPhone9,1") eDev = iPhone7;
+    else if (devStr == "iPhone9,2") eDev = iPhone7Plus;
+    else if (devStr == "iPhone9,3") eDev = iPhone7;
+    else if (devStr == "iPhone9,4") eDev = iPhone7Plus;
     else if (devStr == "iPod1,1") eDev = iPodTouch1G;
     else if (devStr == "iPod2,1") eDev = iPodTouch2G;
     else if (devStr == "iPod3,1") eDev = iPodTouch3G;
     else if (devStr == "iPod4,1") eDev = iPodTouch4G;
     else if (devStr == "iPod5,1") eDev = iPodTouch5G;
+    else if (devStr == "iPod7,1") eDev = iPodTouch6G;
     else if (devStr == "iPad1,1") eDev = iPad;
     else if (devStr == "iPad1,2") eDev = iPad;
     else if (devStr == "iPad2,1") eDev = iPad2WIFI;
@@ -176,13 +197,21 @@ enum iosPlatform getIosPlatform()
     else if (devStr == "iPad3,6") eDev = iPad4GSMCDMA;
     else if (devStr == "iPad4,1") eDev = iPadAirWifi;
     else if (devStr == "iPad4,2") eDev = iPadAirCellular;
+    else if (devStr == "iPad4,3") eDev = iPadAirTDLTE;
     else if (devStr == "iPad4,4") eDev = iPadMini2Wifi;
     else if (devStr == "iPad4,5") eDev = iPadMini2Cellular;
+    else if (devStr == "iPad4,6") eDev = iPadMini2Cellular;
     else if (devStr == "iPad4,7") eDev = iPadMini3Wifi;
     else if (devStr == "iPad4,8") eDev = iPadMini3Cellular;
     else if (devStr == "iPad4,9") eDev = iPadMini3Cellular;
+    else if (devStr == "iPad5,1") eDev = iPadMini4Wifi;
+    else if (devStr == "iPad5,2") eDev = iPadMini4Cellular;
     else if (devStr == "iPad5,3") eDev = iPadAir2Wifi;
     else if (devStr == "iPad5,4") eDev = iPadAir2Cellular;
+    else if (devStr == "iPad6,3") eDev = iPadPro9_7InchWifi;
+    else if (devStr == "iPad6,4") eDev = iPadPro9_7InchCellular;
+    else if (devStr == "iPad6,7") eDev = iPadPro12_9InchWifi;
+    else if (devStr == "iPad6,8") eDev = iPadPro12_9InchCellular;
     else if (devStr == "AppleTV2,1") eDev = AppleTV2;
   }
 #endif
diff --git a/xbmc/platform/darwin/osx/XBMCHelper.cpp b/xbmc/platform/darwin/osx/XBMCHelper.cpp
index bb97c1b..0bd04fe 100644
--- a/xbmc/platform/darwin/osx/XBMCHelper.cpp
+++ b/xbmc/platform/darwin/osx/XBMCHelper.cpp
@@ -39,7 +39,7 @@
 #include "utils/TimeUtils.h"
 #include "filesystem/Directory.h"
 #include "filesystem/File.h"
-#include "url.h"
+#include "URL.h"
 
 #include "threads/Atomics.h"
 
diff --git a/xbmc/pvr/PVRDatabase.cpp b/xbmc/pvr/PVRDatabase.cpp
index 9d350cd..43bd474 100644
--- a/xbmc/pvr/PVRDatabase.cpp
+++ b/xbmc/pvr/PVRDatabase.cpp
@@ -26,7 +26,6 @@
 #include "addons/PVRClient.h"
 #include "pvr/channels/PVRChannelGroupInternal.h"
 #include "pvr/channels/PVRChannelGroupsContainer.h"
-#include "pvr/PVRManager.h"
 #include "settings/AdvancedSettings.h"
 #include "settings/Settings.h"
 #include "utils/log.h"
diff --git a/xbmc/pvr/PVRDatabase.h b/xbmc/pvr/PVRDatabase.h
index e64d82b..3f820ce 100644
--- a/xbmc/pvr/PVRDatabase.h
+++ b/xbmc/pvr/PVRDatabase.h
@@ -26,8 +26,6 @@
 
 #include "pvr/PVRManager.h"
 
-class CVideoSettings;
-
 namespace PVR
 {
   class CPVRChannelGroup;
diff --git a/xbmc/pvr/PVRManager.cpp b/xbmc/pvr/PVRManager.cpp
index 25afcd4..ac36d7e 100644
--- a/xbmc/pvr/PVRManager.cpp
+++ b/xbmc/pvr/PVRManager.cpp
@@ -75,21 +75,6 @@ using namespace KODI::MESSAGING;
 
 using KODI::MESSAGING::HELPERS::DialogResponse;
 
-const int CPVRManager::m_pvrWindowIds[12] = {
-    WINDOW_TV_CHANNELS,
-    WINDOW_TV_GUIDE,
-    WINDOW_TV_RECORDINGS,
-    WINDOW_TV_SEARCH,
-    WINDOW_TV_TIMERS,
-    WINDOW_TV_TIMER_RULES,
-    WINDOW_RADIO_CHANNELS,
-    WINDOW_RADIO_GUIDE,
-    WINDOW_RADIO_RECORDINGS,
-    WINDOW_RADIO_SEARCH,
-    WINDOW_RADIO_TIMERS,
-    WINDOW_RADIO_TIMER_RULES
-};
-
 CPVRManager::CPVRManager(void) :
     CThread("PVRManager"),
     m_triggerEvent(true),
@@ -298,6 +283,13 @@ void CPVRManager::Init()
   CJobManager::GetInstance().AddJob(new CPVRStartupJob(), nullptr);
 }
 
+void CPVRManager::Reinit()
+{
+  // initial check for enabled addons
+  // if at least one pvr addon is enabled, PVRManager start up
+  CJobManager::GetInstance().AddJob(new CPVRStartupJob(), nullptr);
+}
+
 void CPVRManager::Start()
 {
   Stop();
@@ -361,37 +353,48 @@ CPVRManager::ManagerState CPVRManager::GetState(void) const
 
 void CPVRManager::SetState(CPVRManager::ManagerState state)
 {
-  CSingleLock lock(m_managerStateMutex);
-  if (m_managerState == state)
-    return;
+  ObservableMessage observableMsg(ObservableMessageNone);
 
-  m_managerState = state;
-
-  PVREvent event;
-  switch (state)
   {
-    case ManagerStateError:
-      event = ManagerError;
-      break;
-    case ManagerStateStopped:
-      event = ManagerStopped;
-      break;
-    case ManagerStateStarting:
-      event = ManagerStarting;
-      break;
-    case ManagerStateStopping:
-      event = ManagerStopped;
-      break;
-    case ManagerStateInterrupted:
-      event = ManagerInterrupted;
-      break;
-    case ManagerStateStarted:
-      event = ManagerStarted;
-      break;
-    default:
+    CSingleLock lock(m_managerStateMutex);
+    if (m_managerState == state)
       return;
+
+    m_managerState = state;
+
+    PVREvent event;
+    switch (state)
+    {
+      case ManagerStateError:
+        event = ManagerError;
+        break;
+      case ManagerStateStopped:
+        event = ManagerStopped;
+        observableMsg = ObservableMessageManagerStopped;
+        break;
+      case ManagerStateStarting:
+        event = ManagerStarting;
+        break;
+      case ManagerStateStopping:
+        event = ManagerStopped;
+        break;
+      case ManagerStateInterrupted:
+        event = ManagerInterrupted;
+        break;
+      case ManagerStateStarted:
+        event = ManagerStarted;
+        break;
+      default:
+        return;
+    }
+    m_events.Publish(event);
+  }
+
+  if (observableMsg != ObservableMessageNone)
+  {
+    SetChanged();
+    NotifyObservers(observableMsg);
   }
-  m_events.Publish(event);
 }
 
 void CPVRManager::PublishEvent(PVREvent event)
@@ -524,15 +527,6 @@ bool CPVRManager::Load(bool bShowProgress)
 
   CLog::Log(LOGDEBUG, "PVRManager - %s - active clients found. continue to start", __FUNCTION__);
 
-  /* reset observer for pvr windows */
-  for (std::size_t i = 0; i != ARRAY_SIZE(m_pvrWindowIds); i++)
-  {
-    CSingleExit exit(m_critSection);
-    CGUIWindowPVRBase *pWindow = (CGUIWindowPVRBase *) g_windowManager.GetWindow(m_pvrWindowIds[i]);
-    if (pWindow)
-      pWindow->ResetObservers();
-  }
-
   /* load all channels and groups */
   if (bShowProgress)
     ShowProgressDialog(g_localizeStrings.Get(19236), 0); // Loading channels from clients
diff --git a/xbmc/pvr/PVRManager.h b/xbmc/pvr/PVRManager.h
index 8389382..0c55e4f 100644
--- a/xbmc/pvr/PVRManager.h
+++ b/xbmc/pvr/PVRManager.h
@@ -155,6 +155,11 @@ private:
     void Init(void);
 
     /*!
+     * @brief Reinit PVRManager.
+     */
+    void Reinit(void);
+
+    /*!
      * @brief Stop the PVRManager and destroy all objects it created.
      */
     void Stop(void);
@@ -572,18 +577,6 @@ private:
      */
     void PublishEvent(PVREvent state);
 
-    /*!
-     * @brief Show or update the progress dialog.
-     * @param strText The current status.
-     * @param iProgress The current progress in %.
-     */
-    void ShowProgressDialog(const std::string &strText, int iProgress);
-
-    /*!
-     * @brief Hide the progress dialog if it's visible.
-     */
-    void HideProgressDialog(void);
-
   protected:
     /*!
      * @brief Start the PVRManager, which loads all PVR data and starts some threads to update the PVR data.
@@ -597,6 +590,18 @@ private:
 
   private:
     /*!
+     * @brief Show or update the progress dialog.
+     * @param strText The current status.
+     * @param iProgress The current progress in %.
+     */
+    void ShowProgressDialog(const std::string &strText, int iProgress);
+
+    /*!
+     * @brief Hide the progress dialog if it's visible.
+     */
+    void HideProgressDialog(void);
+
+    /*!
      * @brief Load at least one client and load all other PVR data after loading the client.
      * If some clients failed to load here, the pvrmanager will retry to load them every second.
      * @param bShowProgress True, to show a progress dialog for the different load stages.
@@ -677,7 +682,6 @@ private:
     CCriticalSection                m_managerStateMutex;
     ManagerState                    m_managerState;
     std::unique_ptr<CStopWatch>     m_parentalTimer;
-    static const int                m_pvrWindowIds[12];
 
     std::atomic_bool m_isChannelPreview;
     CEventSource<PVREvent> m_events;
diff --git a/xbmc/pvr/addons/PVRClients.cpp b/xbmc/pvr/addons/PVRClients.cpp
index 63aa3a2..b44b6c6 100644
--- a/xbmc/pvr/addons/PVRClients.cpp
+++ b/xbmc/pvr/addons/PVRClients.cpp
@@ -1112,8 +1112,6 @@ bool CPVRClients::IsKnownClient(const AddonPtr client) const
 void CPVRClients::UpdateAddons(void)
 {
   VECADDONS addons;
-  PVR_CLIENT addon;
-
   CAddonMgr::GetInstance().GetInstalledAddons(addons, ADDON_PVRDLL);
 
   if (addons.empty())
@@ -1142,7 +1140,7 @@ void CPVRClients::UpdateAddons(void)
         PVR_CLIENT pvrclient = std::dynamic_pointer_cast<CPVRClient>(addon);
         if (!pvrclient)
         {
-          CLog::Log(LOGERROR, "CPVRClients::UpdateAndInitialiseClients - severe error, incorrect add type");
+          CLog::Log(LOGERROR, "CPVRClients - %s - severe error, incorrect add-on type", __FUNCTION__);
           continue;
         }
         status = pvrclient.get()->Create(iClientId);
@@ -1164,9 +1162,10 @@ void CPVRClients::UpdateAddons(void)
         }
       }
     }
-    else if (!bEnabled && IsCreatedClient(addon))
+    else if (IsCreatedClient(addon))
     {
-      StopClient(addon, false);
+      // stop add-on if it's no longer enabled, restart add-on if it's still enabled
+      StopClient(addon, bEnabled);
     }
   }
 
diff --git a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp
index 2a65b06..bf99578 100644
--- a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp
+++ b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.cpp
@@ -46,6 +46,7 @@ using namespace KODI::MESSAGING;
 #define CONTROL_BTN_RECORD              6
 #define CONTROL_BTN_OK                  7
 #define CONTROL_BTN_PLAY_RECORDING      8
+#define CONTROL_BTN_ADD_TIMER           9
 
 CGUIDialogPVRGuideInfo::CGUIDialogPVRGuideInfo(void)
     : CGUIDialog(WINDOW_DIALOG_PVR_GUIDE_INFO, "DialogPVRInfo.xml")
@@ -84,6 +85,19 @@ bool CGUIDialogPVRGuideInfo::ActionCancelTimer(const CFileItemPtr &timer)
   return bReturn;
 }
 
+bool CGUIDialogPVRGuideInfo::ActionAddTimerRule(const CEpgInfoTagPtr &tag)
+{
+  bool bReturn = false;
+
+  const CFileItemPtr item(new CFileItem(tag));
+  bReturn = CGUIWindowPVRBase::AddTimerRule(item.get(), true);
+
+  if (bReturn)
+    Close();
+
+  return bReturn;
+}
+
 bool CGUIDialogPVRGuideInfo::OnClickButtonOK(CGUIMessage &message)
 {
   bool bReturn = false;
@@ -123,6 +137,21 @@ bool CGUIDialogPVRGuideInfo::OnClickButtonRecord(CGUIMessage &message)
   return bReturn;
 }
 
+bool CGUIDialogPVRGuideInfo::OnClickButtonAddTimer(CGUIMessage &message)
+{
+  bool bReturn = false;
+
+  if (message.GetSenderId() == CONTROL_BTN_ADD_TIMER)
+  {
+    if (m_progItem && !m_progItem->Timer())
+      ActionAddTimerRule(m_progItem);
+
+    bReturn = true;
+  }
+
+  return bReturn;
+}
+
 bool CGUIDialogPVRGuideInfo::OnClickButtonPlay(CGUIMessage &message)
 {
   bool bReturn = false;
@@ -189,7 +218,8 @@ bool CGUIDialogPVRGuideInfo::OnMessage(CGUIMessage& message)
     return OnClickButtonOK(message) ||
            OnClickButtonRecord(message) ||
            OnClickButtonPlay(message) ||
-           OnClickButtonFind(message);
+           OnClickButtonFind(message) ||
+           OnClickButtonAddTimer(message);
   }
 
   return CGUIDialog::OnMessage(message);
@@ -240,6 +270,9 @@ void CGUIDialogPVRGuideInfo::OnInitWindow()
       SET_CONTROL_LABEL(CONTROL_BTN_RECORD, 19060); /* Delete timer */
       bHideRecord = false;
     }
+
+    /* already has a timer. hide the add timer button */
+    SET_CONTROL_HIDDEN(CONTROL_BTN_ADD_TIMER);
   }
   else if (m_progItem->EndAsLocalTime() > CDateTime::GetCurrentDateTime())
   {
diff --git a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h
index 2cfbfe4..f595b2b 100644
--- a/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h
+++ b/xbmc/pvr/dialogs/GUIDialogPVRGuideInfo.h
@@ -49,11 +49,13 @@ namespace PVR
 
     bool ActionStartTimer(const EPG::CEpgInfoTagPtr &tag);
     bool ActionCancelTimer(const CFileItemPtr &timer);
+    bool ActionAddTimerRule(const EPG::CEpgInfoTagPtr &tag);
 
     bool OnClickButtonOK(CGUIMessage &message);
     bool OnClickButtonRecord(CGUIMessage &message);
     bool OnClickButtonPlay(CGUIMessage &message);
     bool OnClickButtonFind(CGUIMessage &message);
+    bool OnClickButtonAddTimer(CGUIMessage &message);
 
     EPG::CEpgInfoTagPtr m_progItem;
   };
diff --git a/xbmc/pvr/timers/PVRTimers.cpp b/xbmc/pvr/timers/PVRTimers.cpp
index 9faea8a..eb515d4 100644
--- a/xbmc/pvr/timers/PVRTimers.cpp
+++ b/xbmc/pvr/timers/PVRTimers.cpp
@@ -790,31 +790,37 @@ CPVRTimerInfoTagPtr CPVRTimers::GetTimerForEpgTag(const CEpgInfoTagPtr &epgTag)
   if (epgTag)
   {
     // already a timer assigned to tag?
-    CPVRTimerInfoTagPtr timer(epgTag->Timer());
+    const CPVRTimerInfoTagPtr timer(epgTag->Timer());
     if (timer)
       return timer;
 
     // try to find a matching timer for the tag.
-    if (epgTag->ChannelTag())
+    const CPVRChannelPtr channel(epgTag->ChannelTag());
+    if (channel)
     {
-      const CPVRChannelPtr channel(epgTag->ChannelTag());
       CSingleLock lock(m_critSection);
 
-      for (MapTags::const_iterator it = m_tags.begin(); it != m_tags.end(); ++it)
+      for (const auto &tagsEntry : m_tags)
       {
-        for (VecTimerInfoTag::const_iterator timerIt = it->second->begin(); timerIt != it->second->end(); ++timerIt)
+        for (const auto &timersEntry : *tagsEntry.second)
         {
-          timer = *timerIt;
-
-          if (!timer->IsTimerRule() &&
-              (timer->GetEpgInfoTag(false) == epgTag ||
-               (timer->m_iEpgUid != EPG_TAG_INVALID_UID && timer->m_iEpgUid == epgTag->UniqueBroadcastID()) ||
-               (timer->m_iClientChannelUid == channel->UniqueID() &&
-                timer->m_bIsRadio == channel->IsRadio() &&
-                timer->StartAsUTC() <= epgTag->StartAsUTC() &&
-                timer->EndAsUTC() >= epgTag->EndAsUTC())))
+          if (timersEntry->IsTimerRule())
+            continue;
+
+          if (timersEntry->GetEpgInfoTag(false) == epgTag)
+            return timersEntry;
+
+          if (timersEntry->m_iClientChannelUid != PVR_CHANNEL_INVALID_UID &&
+              timersEntry->m_iClientChannelUid == channel->UniqueID())
           {
-            return timer;
+            if (timersEntry->m_iEpgUid != EPG_TAG_INVALID_UID &&
+                timersEntry->m_iEpgUid == epgTag->UniqueBroadcastID())
+              return timersEntry;
+
+            if (timersEntry->m_bIsRadio == channel->IsRadio() &&
+                timersEntry->StartAsUTC() <= epgTag->StartAsUTC() &&
+                timersEntry->EndAsUTC() >= epgTag->EndAsUTC())
+              return timersEntry;
           }
         }
       }
diff --git a/xbmc/pvr/windows/GUIWindowPVRBase.cpp b/xbmc/pvr/windows/GUIWindowPVRBase.cpp
index 04eb81f..34fe5b2 100644
--- a/xbmc/pvr/windows/GUIWindowPVRBase.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRBase.cpp
@@ -27,7 +27,7 @@
 #include "dialogs/GUIDialogKaiToast.h"
 #include "dialogs/GUIDialogNumeric.h"
 #include "dialogs/GUIDialogOK.h"
-#include "dialogs/GUIDialogProgress.h"
+#include "dialogs/GUIDialogExtendedProgressBar.h"
 #include "dialogs/GUIDialogSelect.h"
 #include "dialogs/GUIDialogYesNo.h"
 #include "epg/Epg.h"
@@ -66,14 +66,18 @@ std::string CGUIWindowPVRBase::m_selectedItemPaths[2];
 
 CGUIWindowPVRBase::CGUIWindowPVRBase(bool bRadio, int id, const std::string &xmlFile) :
   CGUIMediaWindow(id, xmlFile.c_str()),
-  m_bRadio(bRadio)
+  m_bRadio(bRadio),
+  m_progressHandle(nullptr)
 {
   m_selectedItemPaths[false] = "";
   m_selectedItemPaths[true] = "";
+
+  RegisterObservers();
 }
 
 CGUIWindowPVRBase::~CGUIWindowPVRBase(void)
 {
+  UnregisterObservers();
 }
 
 void CGUIWindowPVRBase::SetSelectedItemPath(bool bRadio, const std::string &path)
@@ -94,16 +98,10 @@ void CGUIWindowPVRBase::UpdateSelectedItemPath()
   m_selectedItemPaths[m_bRadio] = m_viewControl.GetSelectedItemPath();
 }
 
-void CGUIWindowPVRBase::ResetObservers(void)
-{
-  UnregisterObservers();
-  if (IsActive())
-    RegisterObservers();
-}
-
 void CGUIWindowPVRBase::RegisterObservers(void)
 {
   CSingleLock lock(m_critSection);
+  g_PVRManager.RegisterObserver(this);
   if (m_channelGroup)
     m_channelGroup->RegisterObserver(this);
 };
@@ -113,12 +111,19 @@ void CGUIWindowPVRBase::UnregisterObservers(void)
   CSingleLock lock(m_critSection);
   if (m_channelGroup)
     m_channelGroup->UnregisterObserver(this);
+  g_PVRManager.UnregisterObserver(this);
 };
 
 void CGUIWindowPVRBase::Notify(const Observable &obs, const ObservableMessage msg)
 {
-  CGUIMessage m(GUI_MSG_REFRESH_LIST, GetID(), 0, msg);
-  CApplicationMessenger::GetInstance().SendGUIMessage(m);
+  if (msg == ObservableMessageManagerStopped)
+    ClearData();
+
+  if (IsActive())
+  {
+    CGUIMessage m(GUI_MSG_REFRESH_LIST, GetID(), 0, msg);
+    CApplicationMessenger::GetInstance().SendGUIMessage(m);
+  }
 }
 
 bool CGUIWindowPVRBase::OnAction(const CAction &action)
@@ -151,33 +156,33 @@ bool CGUIWindowPVRBase::OnBack(int actionID)
   return CGUIMediaWindow::OnBack(actionID);
 }
 
+void CGUIWindowPVRBase::ClearData()
+{
+  CSingleLock lock(m_critSection);
+  m_channelGroup.reset();
+}
+
 void CGUIWindowPVRBase::OnInitWindow(void)
 {
   SetProperty("IsRadio", m_bRadio ? "true" : "");
 
-  g_PVRManager.RegisterObserver(this);
-
   if (InitChannelGroup())
   {
     CGUIMediaWindow::OnInitWindow();
 
     // mark item as selected by channel path
     m_viewControl.SetSelectedItem(GetSelectedItemPath(m_bRadio));
-
-    RegisterObservers();
   }
   else
   {
     CGUIWindow::OnInitWindow(); // do not call CGUIMediaWindow as it will do a Refresh which in no case works in this state (no cahnnelgroup!)
-    g_PVRManager.ShowProgressDialog(g_localizeStrings.Get(19235), 0); // PVR manager is starting up
+    ShowProgressDialog(g_localizeStrings.Get(19235), 0); // PVR manager is starting up
   }
 }
 
 void CGUIWindowPVRBase::OnDeinitWindow(int nextWindowID)
 {
-  g_PVRManager.HideProgressDialog();
-  g_PVRManager.UnregisterObserver(this);
-  UnregisterObservers();
+  HideProgressDialog();
   UpdateSelectedItemPath();
   CGUIMediaWindow::OnDeinitWindow(nextWindowID);
 }
@@ -206,6 +211,7 @@ bool CGUIWindowPVRBase::OnMessage(CGUIMessage& message)
           // late init
           InitChannelGroup();
           RegisterObservers();
+          HideProgressDialog();
           Refresh(true);
           m_viewControl.SetFocused();
           break;
@@ -1047,3 +1053,29 @@ bool CGUIWindowPVRBase::ConfirmStopRecording(const CPVRTimerInfoTagPtr &timer)
                          CVariant{""},
                          CVariant{timer->Title()});
 }
+
+void CGUIWindowPVRBase::ShowProgressDialog(const std::string &strText, int iProgress)
+{
+  if (!m_progressHandle)
+  {
+    CGUIDialogExtendedProgressBar *loadingProgressDialog = dynamic_cast<CGUIDialogExtendedProgressBar *>(g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS));
+    if (!loadingProgressDialog)
+    {
+      CLog::Log(LOGERROR, "CGUIWindowPVRBase - %s - unable to get WINDOW_DIALOG_EXT_PROGRESS!", __FUNCTION__);
+      return;
+    }
+    m_progressHandle = loadingProgressDialog->GetHandle(g_localizeStrings.Get(19235)); // PVR manager is starting up
+  }
+
+  m_progressHandle->SetPercentage(static_cast<float>(iProgress));
+  m_progressHandle->SetText(strText);
+}
+
+void CGUIWindowPVRBase::HideProgressDialog(void)
+{
+  if (m_progressHandle)
+  {
+    m_progressHandle->MarkFinished();
+    m_progressHandle = nullptr;
+  }
+}
diff --git a/xbmc/pvr/windows/GUIWindowPVRBase.h b/xbmc/pvr/windows/GUIWindowPVRBase.h
index a4c5a76..1ee4988 100644
--- a/xbmc/pvr/windows/GUIWindowPVRBase.h
+++ b/xbmc/pvr/windows/GUIWindowPVRBase.h
@@ -35,6 +35,8 @@
 #define CONTROL_LABEL_HEADER1             29
 #define CONTROL_LABEL_HEADER2             30
 
+class CGUIDialogProgressBarHandle;
+
 namespace PVR
 {
   enum EpgGuideView
@@ -79,8 +81,6 @@ namespace PVR
     virtual void SetInvalid() override;
     virtual bool CanBeActivated() const override;
 
-    void ResetObservers(void);
-
     static std::string GetSelectedItemPath(bool bRadio);
     static void SetSelectedItemPath(bool bRadio, const std::string &path);
 
@@ -100,6 +100,8 @@ namespace PVR
 
     virtual std::string GetDirectoryPath(void) = 0;
 
+    virtual void ClearData();
+
     bool InitChannelGroup(void);
     virtual CPVRChannelGroupPtr GetChannelGroup(void);
     virtual void SetChannelGroup(const CPVRChannelGroupPtr &group);
@@ -122,8 +124,8 @@ namespace PVR
     bool OnContextButtonEditTimerRule(CFileItem *item, CONTEXT_BUTTON button);
     bool OnContextButtonDeleteTimerRule(CFileItem *item, CONTEXT_BUTTON button);
 
-    virtual void RegisterObservers(void);
-    virtual void UnregisterObservers(void);
+    void RegisterObservers(void);
+    void UnregisterObservers(void);
 
     static CCriticalSection m_selectedItemPathsLock;
     static std::string m_selectedItemPaths[2];
@@ -150,10 +152,23 @@ namespace PVR
      */
     static bool ConfirmStopRecording(const CPVRTimerInfoTagPtr &timer);
 
+    /*!
+     * @brief Show or update the progress dialog.
+     * @param strText The current status.
+     * @param iProgress The current progress in %.
+     */
+    void ShowProgressDialog(const std::string &strText, int iProgress);
+
+    /*!
+     * @brief Hide the progress dialog if it's visible.
+     */
+    void HideProgressDialog(void);
+
     static bool DeleteTimer(CFileItem *item, bool bIsRecording, bool bDeleteRule);
     static bool AddTimer(CFileItem *item, bool bCreateRule, bool bShowTimerSettings);
 
     CPVRChannelGroupPtr m_channelGroup;
     XbmcThreads::EndTime m_refreshTimeout;
+    CGUIDialogProgressBarHandle *m_progressHandle; /*!< progress dialog that is displayed while the pvr manager is loading */
   };
 }
diff --git a/xbmc/pvr/windows/GUIWindowPVRChannels.cpp b/xbmc/pvr/windows/GUIWindowPVRChannels.cpp
index 610a8d1..67067fc 100644
--- a/xbmc/pvr/windows/GUIWindowPVRChannels.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRChannels.cpp
@@ -50,23 +50,13 @@ CGUIWindowPVRChannels::CGUIWindowPVRChannels(bool bRadio) :
   CGUIWindowPVRBase(bRadio, bRadio ? WINDOW_RADIO_CHANNELS : WINDOW_TV_CHANNELS, "MyPVRChannels.xml"),
   m_bShowHiddenChannels(false)
 {
-}
-
-void CGUIWindowPVRChannels::RegisterObservers(void)
-{
-  CSingleLock lock(m_critSection);
   g_EpgContainer.RegisterObserver(this);
-  g_PVRManager.RegisterObserver(this);
   g_infoManager.RegisterObserver(this);
-  CGUIWindowPVRBase::RegisterObservers();
 }
 
-void CGUIWindowPVRChannels::UnregisterObservers(void)
+CGUIWindowPVRChannels::~CGUIWindowPVRChannels()
 {
-  CSingleLock lock(m_critSection);
-  CGUIWindowPVRBase::UnregisterObservers();
   g_infoManager.UnregisterObserver(this);
-  g_PVRManager.UnregisterObserver(this);
   g_EpgContainer.UnregisterObserver(this);
 }
 
diff --git a/xbmc/pvr/windows/GUIWindowPVRChannels.h b/xbmc/pvr/windows/GUIWindowPVRChannels.h
index 88878ce..94e0119 100644
--- a/xbmc/pvr/windows/GUIWindowPVRChannels.h
+++ b/xbmc/pvr/windows/GUIWindowPVRChannels.h
@@ -27,7 +27,7 @@ namespace PVR
   {
   public:
     CGUIWindowPVRChannels(bool bRadio);
-    virtual ~CGUIWindowPVRChannels(void) {};
+    virtual ~CGUIWindowPVRChannels(void);
 
     virtual bool OnMessage(CGUIMessage& message) override;
     virtual void GetContextButtons(int itemNumber, CContextButtons &buttons) override;
@@ -38,8 +38,6 @@ namespace PVR
 
   protected:
     virtual std::string GetDirectoryPath(void) override;
-    virtual void RegisterObservers(void) override;
-    virtual void UnregisterObservers(void) override;
 
   private:
     bool OnContextButtonAdd(CFileItem *item, CONTEXT_BUTTON button);
diff --git a/xbmc/pvr/windows/GUIWindowPVRGuide.cpp b/xbmc/pvr/windows/GUIWindowPVRGuide.cpp
index bc3b0a2..d3c69b2 100644
--- a/xbmc/pvr/windows/GUIWindowPVRGuide.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRGuide.cpp
@@ -46,10 +46,12 @@ CGUIWindowPVRGuide::CGUIWindowPVRGuide(bool bRadio) :
   m_cachedChannelGroup(new CPVRChannelGroup)
 {
   m_bRefreshTimelineItems = false;
+  g_EpgContainer.RegisterObserver(this);
 }
 
 CGUIWindowPVRGuide::~CGUIWindowPVRGuide(void)
 {
+  g_EpgContainer.UnregisterObserver(this);
   StopRefreshTimelineItemsThread();
 }
 
@@ -71,6 +73,17 @@ void CGUIWindowPVRGuide::Init()
   StartRefreshTimelineItemsThread();
 }
 
+void CGUIWindowPVRGuide::ClearData()
+{
+  {
+    CSingleLock lock(m_critSection);
+    m_cachedChannelGroup.reset(new CPVRChannelGroup);
+    m_newTimeline.reset();
+  }
+
+  CGUIWindowPVRBase::ClearData();
+}
+
 void CGUIWindowPVRGuide::OnInitWindow()
 {
   if (m_guiState.get())
@@ -101,25 +114,10 @@ void CGUIWindowPVRGuide::StopRefreshTimelineItemsThread()
   m_refreshTimelineItemsThread->StopThread(false);
 }
 
-void CGUIWindowPVRGuide::RegisterObservers(void)
-{
-  CSingleLock lock(m_critSection);
-  g_EpgContainer.RegisterObserver(this);
-  g_PVRManager.RegisterObserver(this);
-  CGUIWindowPVRBase::RegisterObservers();
-}
-
-void CGUIWindowPVRGuide::UnregisterObservers(void)
-{
-  CSingleLock lock(m_critSection);
-  CGUIWindowPVRBase::UnregisterObservers();
-  g_PVRManager.UnregisterObserver(this);
-  g_EpgContainer.UnregisterObserver(this);
-}
-
 void CGUIWindowPVRGuide::Notify(const Observable &obs, const ObservableMessage msg)
 {
-  if (m_viewControl.GetCurrentControl() == GUIDE_VIEW_TIMELINE &&
+  if (IsActive() &&
+      m_viewControl.GetCurrentControl() == GUIDE_VIEW_TIMELINE &&
       (msg == ObservableMessageEpg ||
        msg == ObservableMessageEpgContainer ||
        msg == ObservableMessageChannelGroupReset ||
diff --git a/xbmc/pvr/windows/GUIWindowPVRGuide.h b/xbmc/pvr/windows/GUIWindowPVRGuide.h
index 5cf3c53..d5a41fc 100644
--- a/xbmc/pvr/windows/GUIWindowPVRGuide.h
+++ b/xbmc/pvr/windows/GUIWindowPVRGuide.h
@@ -57,8 +57,8 @@ namespace PVR
     virtual void UpdateSelectedItemPath() override;
     virtual std::string GetDirectoryPath(void) override { return ""; }
     virtual bool GetDirectory(const std::string &strDirectory, CFileItemList &items) override;
-    virtual void RegisterObservers(void) override;
-    virtual void UnregisterObservers(void) override;
+
+    void ClearData() override;
 
   private:
     void Init();
diff --git a/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp b/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp
index a35d594..b3055f5 100644
--- a/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRRecordings.cpp
@@ -48,22 +48,12 @@ CGUIWindowPVRRecordings::CGUIWindowPVRRecordings(bool bRadio) :
   CGUIWindowPVRBase(bRadio, bRadio ? WINDOW_RADIO_RECORDINGS : WINDOW_TV_RECORDINGS, "MyPVRRecordings.xml") ,
   m_bShowDeletedRecordings(false)
 {
-}
-
-void CGUIWindowPVRRecordings::RegisterObservers(void)
-{
-  CSingleLock lock(m_critSection);
-  g_PVRManager.RegisterObserver(this);
   g_infoManager.RegisterObserver(this);
-  CGUIWindowPVRBase::RegisterObservers();
 }
 
-void CGUIWindowPVRRecordings::UnregisterObservers(void)
+CGUIWindowPVRRecordings::~CGUIWindowPVRRecordings()
 {
-  CSingleLock lock(m_critSection);
-  CGUIWindowPVRBase::UnregisterObservers();
   g_infoManager.UnregisterObserver(this);
-  g_PVRManager.UnregisterObserver(this);
 }
 
 void CGUIWindowPVRRecordings::OnWindowLoaded()
diff --git a/xbmc/pvr/windows/GUIWindowPVRRecordings.h b/xbmc/pvr/windows/GUIWindowPVRRecordings.h
index 7347246..1dfdcf6 100644
--- a/xbmc/pvr/windows/GUIWindowPVRRecordings.h
+++ b/xbmc/pvr/windows/GUIWindowPVRRecordings.h
@@ -30,7 +30,7 @@ namespace PVR
   {
   public:
     CGUIWindowPVRRecordings(bool bRadio);
-    virtual ~CGUIWindowPVRRecordings(void) {};
+    virtual ~CGUIWindowPVRRecordings(void);
 
     static std::string GetResumeString(const CFileItem& item);
 
@@ -45,8 +45,6 @@ namespace PVR
   protected:
     virtual std::string GetDirectoryPath(void) override;
     virtual void OnPrepareFileItems(CFileItemList &items) override;
-    virtual void RegisterObservers(void) override;
-    virtual void UnregisterObservers(void) override;
 
   private:
     bool ActionDeleteRecording(CFileItem *item);
diff --git a/xbmc/pvr/windows/GUIWindowPVRTimersBase.cpp b/xbmc/pvr/windows/GUIWindowPVRTimersBase.cpp
index 0589591..3c55214 100644
--- a/xbmc/pvr/windows/GUIWindowPVRTimersBase.cpp
+++ b/xbmc/pvr/windows/GUIWindowPVRTimersBase.cpp
@@ -43,22 +43,12 @@ using namespace PVR;
 CGUIWindowPVRTimersBase::CGUIWindowPVRTimersBase(bool bRadio, int id, const std::string &xmlFile) :
   CGUIWindowPVRBase(bRadio, id, xmlFile)
 {
-}
-
-void CGUIWindowPVRTimersBase::RegisterObservers(void)
-{
-  CSingleLock lock(m_critSection);
-  g_PVRManager.RegisterObserver(this);
   g_infoManager.RegisterObserver(this);
-  CGUIWindowPVRBase::RegisterObservers();
 }
 
-void CGUIWindowPVRTimersBase::UnregisterObservers(void)
+CGUIWindowPVRTimersBase::~CGUIWindowPVRTimersBase()
 {
-  CSingleLock lock(m_critSection);
-  CGUIWindowPVRBase::UnregisterObservers();
   g_infoManager.UnregisterObserver(this);
-  g_PVRManager.UnregisterObserver(this);
 }
 
 void CGUIWindowPVRTimersBase::GetContextButtons(int itemNumber, CContextButtons &buttons)
diff --git a/xbmc/pvr/windows/GUIWindowPVRTimersBase.h b/xbmc/pvr/windows/GUIWindowPVRTimersBase.h
index a541147..b53fcf2 100644
--- a/xbmc/pvr/windows/GUIWindowPVRTimersBase.h
+++ b/xbmc/pvr/windows/GUIWindowPVRTimersBase.h
@@ -32,7 +32,7 @@ namespace PVR
   {
   public:
     CGUIWindowPVRTimersBase(bool bRadio, int id, const std::string &xmlFile);
-    virtual ~CGUIWindowPVRTimersBase(void) {};
+    virtual ~CGUIWindowPVRTimersBase(void);
 
     bool OnMessage(CGUIMessage& message);
     bool OnAction(const CAction &action);
@@ -40,10 +40,6 @@ namespace PVR
     bool OnContextButton(int itemNumber, CONTEXT_BUTTON button);
     void UpdateButtons(void);
 
-  protected:
-    virtual void RegisterObservers(void);
-    virtual void UnregisterObservers(void);
-
   private:
     bool ActionDeleteTimer(CFileItem *item);
     bool ActionShowTimer(CFileItem *item);
diff --git a/xbmc/rendering/CMakeLists.txt b/xbmc/rendering/CMakeLists.txt
index e72d68c..ff8c6d0 100644
--- a/xbmc/rendering/CMakeLists.txt
+++ b/xbmc/rendering/CMakeLists.txt
@@ -5,10 +5,10 @@ set(HEADERS RenderSystem.h)
 core_add_library(rendering)
 if(NOT CORE_SYSTEM_NAME STREQUAL windows)
   if(HAVE_SSE)
-    target_compile_options(rendering PRIVATE -msse)
+    target_compile_options(${CORE_LIBRARY} PRIVATE -msse)
   endif()
   if(HAVE_SSE2)
-    target_compile_options(rendering PRIVATE -msse2)
+    target_compile_options(${CORE_LIBRARY} PRIVATE -msse2)
   endif()
 endif()
 
diff --git a/xbmc/settings/AdvancedSettings.h b/xbmc/settings/AdvancedSettings.h
index 1727580..fc526d1 100644
--- a/xbmc/settings/AdvancedSettings.h
+++ b/xbmc/settings/AdvancedSettings.h
@@ -46,6 +46,7 @@ namespace ADDON
 class DatabaseSettings
 {
 public:
+  DatabaseSettings() { Reset(); }
   void Reset()
   {
     type.clear();
diff --git a/xbmc/utils/AMLUtils.cpp b/xbmc/utils/AMLUtils.cpp
index 80fb453..5a1074e 100644
--- a/xbmc/utils/AMLUtils.cpp
+++ b/xbmc/utils/AMLUtils.cpp
@@ -191,6 +191,23 @@ bool aml_support_hevc_4k2k()
   return (has_hevc_4k2k == 1);
 }
 
+bool aml_support_hevc_10bit()
+{
+  static int has_hevc_10bit = -1;
+
+  if (has_hevc_10bit == -1)
+  {
+    CRegExp regexp;
+    regexp.RegComp("hevc:.*10bit");
+    std::string valstr;
+    if (SysfsUtils::GetString("/sys/class/amstream/vcodec_profile", valstr) != 0)
+      has_hevc_10bit = 0;
+    else
+      has_hevc_10bit = (regexp.RegFind(valstr) >= 0) ? 1 : 0;
+  }
+  return (has_hevc_10bit == 1);
+}
+
 bool aml_support_h264_4k2k()
 {
   static int has_h264_4k2k = -1;
diff --git a/xbmc/utils/AMLUtils.h b/xbmc/utils/AMLUtils.h
index 6ba1ff7..57b9dce 100644
--- a/xbmc/utils/AMLUtils.h
+++ b/xbmc/utils/AMLUtils.h
@@ -47,6 +47,7 @@ bool aml_hw3d_present();
 bool aml_wired_present();
 bool aml_support_hevc();
 bool aml_support_hevc_4k2k();
+bool aml_support_hevc_10bit();
 bool aml_support_h264_4k2k();
 void aml_set_audio_passthrough(bool passthrough);
 bool aml_IsHdmiConnected();
diff --git a/xbmc/utils/AsyncFileCopy.cpp b/xbmc/utils/AsyncFileCopy.cpp
deleted file mode 100644
index b030516..0000000
--- a/xbmc/utils/AsyncFileCopy.cpp
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- *      Copyright (C) 2005-2013 Team XBMC
- *      http://xbmc.org
- *
- *  This Program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2, or (at your option)
- *  any later version.
- *
- *  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 XBMC; see the file COPYING.  If not, see
- *  <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "threads/SystemClock.h"
-#include "AsyncFileCopy.h"
-#include "dialogs/GUIDialogProgress.h"
-#include "guilib/GUIWindowManager.h"
-#include "log.h"
-#include "utils/StringUtils.h"
-#include "URL.h"
-#include "utils/Variant.h"
-
-CAsyncFileCopy::CAsyncFileCopy() : CThread("AsyncFileCopy")
-{
-  m_cancelled = false;
-  m_succeeded = false;
-  m_running = false;
-  m_percent = 0;
-  m_speed = 0;
-}
-
-CAsyncFileCopy::~CAsyncFileCopy()
-{
-  StopThread();
-}
-
-bool CAsyncFileCopy::Copy(const std::string &from, const std::string &to, const std::string &heading)
-{
-  // reset the variables to their appropriate states
-  m_from = from;
-  m_to = to;
-  m_cancelled = false;
-  m_succeeded = false;
-  m_percent = 0;
-  m_speed = 0;
-  m_running = true;
-  CURL url1(from);
-  CURL url2(to);
-
-  // create our thread, which starts the file copy operation
-  Create();
-  CGUIDialogProgress *dlg = (CGUIDialogProgress *)g_windowManager.GetWindow(WINDOW_DIALOG_PROGRESS);
-  unsigned int time = XbmcThreads::SystemClockMillis();
-  while (m_running)
-  {
-    m_event.WaitMSec(1000 / 30);
-    if (!m_running)
-      break;
-    // start the dialog up as needed
-    if (dlg && !dlg->IsDialogRunning() && (XbmcThreads::SystemClockMillis() - time) > 500) // wait 0.5 seconds before starting dialog
-    {
-      dlg->SetHeading(CVariant{heading});
-      dlg->SetLine(0, CVariant{url1.GetWithoutUserDetails()});
-      dlg->SetLine(1, CVariant{url2.GetWithoutUserDetails()});
-      dlg->SetPercentage(0);
-      dlg->Open();
-    }
-    // and update the dialog as we go
-    if (dlg && dlg->IsDialogRunning())
-    {
-      dlg->SetHeading(CVariant{heading});
-      dlg->SetLine(0, CVariant{url1.Get()});
-      dlg->SetLine(1, CVariant{url2.Get()});
-      dlg->SetLine(2, CVariant{ StringUtils::Format("%2.2f KB/s", m_speed / 1024) });
-      dlg->SetPercentage(m_percent);
-      dlg->Progress();
-      m_cancelled = dlg->IsCanceled();
-    }
-  }
-  if (dlg)
-    dlg->Close();
-  return !m_cancelled && m_succeeded;
-}
-
-bool CAsyncFileCopy::OnFileCallback(void *pContext, int ipercent, float avgSpeed)
-{
-  m_percent = ipercent;
-  m_speed = avgSpeed;
-  m_event.Set();
-  return !m_cancelled;
-}
-
-void CAsyncFileCopy::Process()
-{
-  try
-  {
-    m_succeeded = XFILE::CFile::Copy(m_from, m_to, this);
-  }
-  catch (...)
-  {
-    m_succeeded = false;
-    CLog::Log(LOGERROR, "%s: unhandled exception copying file", __FUNCTION__);
-  }
-  m_running = false;
-}
diff --git a/xbmc/utils/AsyncFileCopy.h b/xbmc/utils/AsyncFileCopy.h
deleted file mode 100644
index 00b36f7..0000000
--- a/xbmc/utils/AsyncFileCopy.h
+++ /dev/null
@@ -1,54 +0,0 @@
-#pragma once
-
-/*
- *      Copyright (C) 2005-2013 Team XBMC
- *      http://xbmc.org
- *
- *  This Program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2, or (at your option)
- *  any later version.
- *
- *  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 XBMC; see the file COPYING.  If not, see
- *  <http://www.gnu.org/licenses/>.
- *
- */
-
-#include <string>
-#include "threads/Thread.h"
-#include "filesystem/File.h"
-
-class CAsyncFileCopy : public CThread, public XFILE::IFileCallback
-{
-public:
-  CAsyncFileCopy();
-  virtual ~CAsyncFileCopy();
-
-  /// \brief  Main routine to copy files from one source to another.
-  /// \return true if successful, and false if it failed or was cancelled.
-  bool Copy(const std::string &from, const std::string &to, const std::string &heading);
-
-  /// \brief callback from CFile::Copy()
-  virtual bool OnFileCallback(void *pContext, int ipercent, float avgSpeed);
-
-protected:
-  virtual void Process();
-
-private:
-  /// volatile variables as we access these from both threads
-  volatile int m_percent;      ///< current percentage (0..100)
-  volatile float m_speed;      ///< current speed (in bytes per second)
-  volatile bool m_cancelled;   ///< whether or not we cancelled the operation
-  volatile bool m_running;     ///< whether or not the copy operation is still in progress
-  
-  bool m_succeeded;  ///< whether or not the copy operation was successful
-  std::string m_from; ///< source URL to copy from
-  std::string m_to;   ///< destination URL to copy to
-  CEvent m_event;    ///< event to set to force an update
-};
diff --git a/xbmc/utils/CMakeLists.txt b/xbmc/utils/CMakeLists.txt
index fa5db07..2c1d409 100644
--- a/xbmc/utils/CMakeLists.txt
+++ b/xbmc/utils/CMakeLists.txt
@@ -2,7 +2,6 @@ set(SOURCES ActorProtocol.cpp
             AlarmClock.cpp
             AliasShortcutUtils.cpp
             Archive.cpp
-            AsyncFileCopy.cpp
             auto_buffer.cpp
             Base64.cpp
             BitstreamConverter.cpp
@@ -78,7 +77,6 @@ set(HEADERS ActorProtocol.h
             AlarmClock.h
             AliasShortcutUtils.h
             Archive.h
-            AsyncFileCopy.h
             auto_buffer.h
             Base64.h
             BitstreamConverter.h
@@ -180,7 +178,7 @@ if(NOT CORE_SYSTEM_NAME STREQUAL windows)
                       GLUtils.h)
 endif()
 
-if(AML_FOUND)
+if(CORE_SYSTEM_NAME STREQUAL android OR AML_FOUND)
   list(APPEND SOURCES AMLUtils.cpp
                       ScreenshotAML.cpp)
   list(APPEND HEADERS AMLUtils.h
@@ -191,6 +189,6 @@ core_add_library(utils)
 
 if(NOT CORE_SYSTEM_NAME STREQUAL windows)
   if(HAVE_SSE2)
-    target_compile_options(utils PRIVATE -msse2)
+    target_compile_options(${CORE_LIBRARY} PRIVATE -msse2)
   endif()
 endif()
diff --git a/xbmc/utils/Makefile.in b/xbmc/utils/Makefile.in
index 47ad392..7ec1b21 100644
--- a/xbmc/utils/Makefile.in
+++ b/xbmc/utils/Makefile.in
@@ -1,7 +1,6 @@
 SRCS += AlarmClock.cpp
 SRCS += AliasShortcutUtils.cpp
 SRCS += Archive.cpp
-SRCS += AsyncFileCopy.cpp
 SRCS += auto_buffer.cpp
 SRCS += Base64.cpp
 SRCS += BitstreamConverter.cpp
diff --git a/xbmc/utils/Observer.h b/xbmc/utils/Observer.h
index 542cee2..3b59755 100644
--- a/xbmc/utils/Observer.h
+++ b/xbmc/utils/Observer.h
@@ -42,7 +42,8 @@ typedef enum
   ObservableMessageTimersReset,
   ObservableMessageRecordings,
   ObservableMessagePeripheralsChanged,
-  ObservableMessageChannelGroupsLoaded
+  ObservableMessageChannelGroupsLoaded,
+  ObservableMessageManagerStopped
 } ObservableMessage;
 
 class Observer
diff --git a/xbmc/utils/RegExp.h b/xbmc/utils/RegExp.h
index e4071e4..1a393fa 100644
--- a/xbmc/utils/RegExp.h
+++ b/xbmc/utils/RegExp.h
@@ -33,14 +33,6 @@
 namespace PCRE {
 struct real_pcre_jit_stack; // forward declaration for PCRE without JIT
 typedef struct real_pcre_jit_stack pcre_jit_stack;
-#if defined(TARGET_WINDOWS) && !defined(BUILDING_WITH_CMAKE)
-#define PCRE_STATIC 1
-#ifdef _DEBUG
-#pragma comment(lib, "pcred.lib")
-#else  // ! _DEBUG
-#pragma comment(lib, "pcre.lib")
-#endif // ! _DEBUG
-#endif // defined(TARGET_WINDOWS) && !defined(BUILDING_WITH_CMAKE)
 #include <pcre.h>
 }
 
diff --git a/xbmc/utils/SaveFileStateJob.cpp b/xbmc/utils/SaveFileStateJob.cpp
index 89ad9c8..e943c4a 100644
--- a/xbmc/utils/SaveFileStateJob.cpp
+++ b/xbmc/utils/SaveFileStateJob.cpp
@@ -51,7 +51,7 @@ bool CSaveFileStateJob::DoWork()
       progressTrackingFile = original;
   }
 
-  if (progressTrackingFile != "")
+  if (!progressTrackingFile.empty())
   {
 #ifdef HAS_UPNP
     // checks if UPnP server of this file is available and supports updating
diff --git a/xbmc/utils/Screenshot.cpp b/xbmc/utils/Screenshot.cpp
index 1e5f387..cf690cd 100644
--- a/xbmc/utils/Screenshot.cpp
+++ b/xbmc/utils/Screenshot.cpp
@@ -24,6 +24,7 @@
 #include <vector>
 
 #include "Util.h"
+#include "URL.h"
 
 #include "Application.h"
 #include "windowing/WindowingFactory.h"
@@ -195,11 +196,11 @@ void CScreenShot::TakeScreenshot(const std::string &filename, bool sync)
   CScreenshotSurface surface;
   if (!surface.capture())
   {
-    CLog::Log(LOGERROR, "Screenshot %s failed", filename.c_str());
+    CLog::Log(LOGERROR, "Screenshot %s failed", CURL::GetRedacted(filename).c_str());
     return;
   }
 
-  CLog::Log(LOGDEBUG, "Saving screenshot %s", filename.c_str());
+  CLog::Log(LOGDEBUG, "Saving screenshot %s", CURL::GetRedacted(filename).c_str());
 
   //set alpha byte to 0xFF
   for (int y = 0; y < surface.m_height; y++)
@@ -213,7 +214,7 @@ void CScreenShot::TakeScreenshot(const std::string &filename, bool sync)
   if (sync)
   {
     if (!CPicture::CreateThumbnailFromSurface(surface.m_buffer, surface.m_width, surface.m_height, surface.m_stride, filename))
-      CLog::Log(LOGERROR, "Unable to write screenshot %s", filename.c_str());
+      CLog::Log(LOGERROR, "Unable to write screenshot %s", CURL::GetRedacted(filename).c_str());
 
     delete [] surface.m_buffer;
     surface.m_buffer = NULL;
@@ -225,7 +226,7 @@ void CScreenShot::TakeScreenshot(const std::string &filename, bool sync)
     if (fp)
       fclose(fp);
     else
-      CLog::Log(LOGERROR, "Unable to create file %s", filename.c_str());
+      CLog::Log(LOGERROR, "Unable to create file %s", CURL::GetRedacted(filename).c_str());
 
     //write .png file asynchronous with CThumbnailWriter, prevents stalling of the render thread
     //buffer is deleted from CThumbnailWriter
diff --git a/xbmc/utils/Splash.cpp b/xbmc/utils/Splash.cpp
index 7e1d885..d7d4812 100644
--- a/xbmc/utils/Splash.cpp
+++ b/xbmc/utils/Splash.cpp
@@ -24,21 +24,15 @@
 #include "guilib/GUILabelControl.h"
 #include "guilib/GUIFontManager.h"
 #include "filesystem/File.h"
+#include "settings/AdvancedSettings.h"
 #include "windowing/WindowingFactory.h"
-#include "log.h"
 
 using namespace XFILE;
 
 CSplash::CSplash()
-  : m_image(nullptr)
 {
 }
 
-CSplash::~CSplash()
-{
-  delete m_image;
-}
-
 CSplash& CSplash::GetInstance()
 {
   static CSplash instance;
@@ -47,13 +41,22 @@ CSplash& CSplash::GetInstance()
 
 void CSplash::Show()
 {
+  Show("");
+}
+
+void CSplash::Show(const std::string& message)
+{
+  if (!g_advancedSettings.m_splashImage)
+    return;
+
   if (!m_image)
   {
     std::string splashImage = "special://home/media/Splash.png";
     if (!XFILE::CFile::Exists(splashImage))
       splashImage = "special://xbmc/media/Splash.png";
 
-    m_image = new CGUIImage(0, 0, 0, 0, g_graphicsContext.GetWidth(), g_graphicsContext.GetHeight(), CTextureInfo(splashImage));
+    m_image = std::unique_ptr<CGUIImage>(new CGUIImage(0, 0, 0, 0, g_graphicsContext.GetWidth(),
+        g_graphicsContext.GetHeight(), CTextureInfo(splashImage)));
     m_image->SetAspectRatio(CAspectRatio::AR_SCALE);
   }
 
@@ -70,6 +73,28 @@ void CSplash::Show()
   m_image->Render();
   m_image->FreeResources();
 
+  if (!message.empty())
+  {
+    if (!m_messageLayout)
+    {
+      auto messageFont = g_fontManager.LoadTTF("__splash__", "arial.ttf", 0xFFFFFFFF, 0, 20, FONT_STYLE_NORMAL, false, 1.0f, 1.0f, &res);
+      if (messageFont)
+        m_messageLayout = std::unique_ptr<CGUITextLayout>(new CGUITextLayout(messageFont, true, 0));
+    }
+
+    if (m_messageLayout)
+    {
+      m_messageLayout->Update(message, 1150, false, true);
+      float textWidth, textHeight;
+      m_messageLayout->GetTextExtent(textWidth, textHeight);
+
+      int width = g_graphicsContext.GetWidth();
+      int height = g_graphicsContext.GetHeight();
+      float y = height - textHeight - 30; // -30 for safe viewing area
+      m_messageLayout->RenderOutline(width/2, y, 0, 0xFF000000, XBFONT_CENTER_X, width);
+    }
+  }
+
   //show it on screen
   g_Windowing.EndRender();
   g_graphicsContext.Flip(true, false);
diff --git a/xbmc/utils/Splash.h b/xbmc/utils/Splash.h
index d8c81c2..03ade13 100644
--- a/xbmc/utils/Splash.h
+++ b/xbmc/utils/Splash.h
@@ -20,9 +20,11 @@
  *
  */
 
+#include <memory>
 #include <string>
 
 class CGUIImage;
+class CGUITextLayout;
 
 class CSplash
 {
@@ -30,13 +32,15 @@ public:
   static CSplash& GetInstance();
 
   void Show();
+  void Show(const std::string& message);
 
 protected:
   CSplash();
   CSplash(const CSplash&);
   CSplash& operator=(CSplash const&);
-  virtual ~CSplash();
+  virtual ~CSplash() = default;
 
 private:
-  CGUIImage* m_image;
+  std::unique_ptr<CGUIImage> m_image;
+  std::unique_ptr<CGUITextLayout> m_messageLayout;
 };
diff --git a/xbmc/utils/Variant.cpp b/xbmc/utils/Variant.cpp
index 270d99e..a884130 100644
--- a/xbmc/utils/Variant.cpp
+++ b/xbmc/utils/Variant.cpp
@@ -129,6 +129,11 @@ double str2double(const std::wstring &str, double fallback /* = 0.0 */)
   return fallback;
 }
 
+CVariant::CVariant()
+  : m_type{VariantTypeNull}
+{
+}
+
 CVariant CVariant::ConstNullVariant = CVariant::VariantTypeConstNull;
 
 CVariant::CVariant(VariantType type)
diff --git a/xbmc/utils/Variant.h b/xbmc/utils/Variant.h
index b902751..6760a6a 100644
--- a/xbmc/utils/Variant.h
+++ b/xbmc/utils/Variant.h
@@ -48,7 +48,8 @@ public:
     VariantTypeConstNull
   };
 
-  CVariant(VariantType type = VariantTypeNull);
+  CVariant();
+  CVariant(VariantType type);
   CVariant(int integer);
   CVariant(int64_t integer);
   CVariant(unsigned int unsignedinteger);
diff --git a/xbmc/utils/XBMCTinyXML.h b/xbmc/utils/XBMCTinyXML.h
index 4a62652..f2b528f 100644
--- a/xbmc/utils/XBMCTinyXML.h
+++ b/xbmc/utils/XBMCTinyXML.h
@@ -23,16 +23,7 @@
 #if (defined HAVE_CONFIG_H) && (!defined TARGET_WINDOWS)
   #include "config.h"
 #endif
-#ifdef TARGET_WINDOWS
-#ifndef BUILDING_WITH_CMAKE
-#define TIXML_USE_STL
-#ifdef _DEBUG
-#pragma comment(lib, "tinyxmlSTLd.lib")
-#else
-#pragma comment(lib, "tinyxmlSTL.lib")
-#endif
-#endif
-#else
+#ifndef TARGET_WINDOWS
 //compile fix for TinyXml < 2.6.0
 #define DOCUMENT    TINYXML_DOCUMENT
 #define ELEMENT     TINYXML_ELEMENT
diff --git a/xbmc/utils/test/CMakeLists.txt b/xbmc/utils/test/CMakeLists.txt
index c298ba8..515907d 100644
--- a/xbmc/utils/test/CMakeLists.txt
+++ b/xbmc/utils/test/CMakeLists.txt
@@ -1,7 +1,6 @@
 set(SOURCES TestAlarmClock.cpp
             TestAliasShortcutUtils.cpp
             TestArchive.cpp
-            TestAsyncFileCopy.cpp
             TestBase64.cpp
             TestBitstreamStats.cpp
             TestCharsetConverter.cpp
diff --git a/xbmc/utils/test/TestAsyncFileCopy.cpp b/xbmc/utils/test/TestAsyncFileCopy.cpp
deleted file mode 100644
index 186c2dc..0000000
--- a/xbmc/utils/test/TestAsyncFileCopy.cpp
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- *      Copyright (C) 2005-2013 Team XBMC
- *      http://xbmc.org
- *
- *  This Program is free software; you can redistribute it and/or modify
- *  it under the terms of the GNU General Public License as published by
- *  the Free Software Foundation; either version 2, or (at your option)
- *  any later version.
- *
- *  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 XBMC; see the file COPYING.  If not, see
- *  <http://www.gnu.org/licenses/>.
- *
- */
-
-#include "utils/AsyncFileCopy.h"
-#include "filesystem/File.h"
-
-#include "test/TestUtils.h"
-
-#include "gtest/gtest.h"
-
-static const char refdata[] = "\x01\x02\x03\x04\x05\x06\x07\x08"
-                              "\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
-                              "\x11\x12\x13\x14\x15\x16\x17\x18"
-                              "\x19\x1a\x1b\x1c\x1d\x1e\x1f\x20"
-                              "\x21\x22\x23\x24\x25\x26\x27\x28"
-                              "\x29\x2a\x2b\x2c\x2d\x2e\x2f\x30";
-
-TEST(TestAsyncFileCopy, General)
-{
-  CAsyncFileCopy c;
-  XFILE::CFile *f1, *f2;
-  char vardata[sizeof(refdata)];
-
-  ASSERT_NE(nullptr, (f1 = XBMC_CREATETEMPFILE("")));
-  ASSERT_NE(nullptr, (f2 = XBMC_CREATETEMPFILE(".copy")));
-
-  EXPECT_EQ((int)sizeof(refdata), f1->Write(refdata, sizeof(refdata)));
-  f1->Close();
-  f2->Close();
-  EXPECT_TRUE(c.Copy(XBMC_TEMPFILEPATH(f1), XBMC_TEMPFILEPATH(f2), ""));
-  EXPECT_TRUE(f2->Open(XBMC_TEMPFILEPATH(f2)));
-  EXPECT_EQ(sizeof(refdata), f2->Read(vardata, sizeof(refdata)));
-  f2->Close();
-  EXPECT_TRUE(!memcmp(vardata, refdata, sizeof(refdata)));
-
-  EXPECT_TRUE(XBMC_DELETETEMPFILE(f1));
-  EXPECT_TRUE(XBMC_DELETETEMPFILE(f2));
-}
diff --git a/xbmc/utils/test/TestStopwatch.cpp b/xbmc/utils/test/TestStopwatch.cpp
index f9204fb..a4a5277 100644
--- a/xbmc/utils/test/TestStopwatch.cpp
+++ b/xbmc/utils/test/TestStopwatch.cpp
@@ -70,6 +70,7 @@ TEST(TestStopWatch, Reset)
   a.StartZero();
   thread.Sleep(2);
   EXPECT_GT(a.GetElapsedMilliseconds(), 1);
+  thread.Sleep(3);
   a.Reset();
-  EXPECT_LT(a.GetElapsedMilliseconds(), 1);
+  EXPECT_LT(a.GetElapsedMilliseconds(), 5);
 }
diff --git a/xbmc/video/VideoInfoScanner.cpp b/xbmc/video/VideoInfoScanner.cpp
index 797013a..974b0f7 100644
--- a/xbmc/video/VideoInfoScanner.cpp
+++ b/xbmc/video/VideoInfoScanner.cpp
@@ -457,6 +457,10 @@ namespace VIDEO
       }
       if (ret == INFO_CANCELLED || ret == INFO_ERROR)
       {
+        CLog::Log(LOGWARNING,
+                  "VideoInfoScanner: Error %s occurred while retrieving"
+                  "information for %s.", ret,
+                  CURL::GetRedacted(pItem->GetPath()).c_str());
         FoundSomeInfo = false;
         break;
       }
@@ -552,13 +556,21 @@ namespace VIDEO
 
     CScraperUrl url;
     int retVal = 0;
-    if (pURL)
+    if (pURL && !pURL->m_url.empty())
       url = *pURL;
     else if ((retVal = FindVideo(pItem->GetMovieName(bDirNames), info2, url, pDlgProgress)) <= 0)
       return retVal < 0 ? INFO_CANCELLED : INFO_NOT_FOUND;
 
-    long lResult=-1;
-    if (GetDetails(pItem, url, info2, result == CNfoFile::COMBINED_NFO ? &m_nfoReader : NULL, pDlgProgress))
+    CLog::Log(LOGDEBUG,
+              "VideoInfoScanner: Fetching url '%s' using %s scraper (content: '%s')",
+              url.m_url[0].m_url.c_str(), info2->Name().c_str(),
+              TranslateContent(info2->Content()).c_str());
+
+    long lResult = -1;
+    if (GetDetails(pItem, url, info2,
+                   (result == CNfoFile::COMBINED_NFO
+                    || result == CNfoFile::PARTIAL_NFO) ? &m_nfoReader : NULL,
+                   pDlgProgress))
     {
       if ((lResult = AddVideo(pItem, info2->Content(), false, useLocal)) < 0)
         return INFO_ERROR;
@@ -606,12 +618,20 @@ namespace VIDEO
 
     CScraperUrl url;
     int retVal = 0;
-    if (pURL)
+    if (pURL && !pURL->m_url.empty())
       url = *pURL;
     else if ((retVal = FindVideo(pItem->GetMovieName(bDirNames), info2, url, pDlgProgress)) <= 0)
       return retVal < 0 ? INFO_CANCELLED : INFO_NOT_FOUND;
 
-    if (GetDetails(pItem, url, info2, result == CNfoFile::COMBINED_NFO ? &m_nfoReader : NULL, pDlgProgress))
+    CLog::Log(LOGDEBUG,
+              "VideoInfoScanner: Fetching url '%s' using %s scraper (content: '%s')",
+              url.m_url[0].m_url.c_str(), info2->Name().c_str(),
+              TranslateContent(info2->Content()).c_str());
+
+    if (GetDetails(pItem, url, info2,
+                   (result == CNfoFile::COMBINED_NFO
+                    || result == CNfoFile::PARTIAL_NFO) ? &m_nfoReader : NULL,
+                   pDlgProgress))
     {
       if (AddVideo(pItem, info2->Content(), bDirNames, useLocal) < 0)
         return INFO_ERROR;
@@ -655,12 +675,20 @@ namespace VIDEO
 
     CScraperUrl url;
     int retVal = 0;
-    if (pURL)
+    if (pURL && !pURL->m_url.empty())
       url = *pURL;
     else if ((retVal = FindVideo(pItem->GetMovieName(bDirNames), info2, url, pDlgProgress)) <= 0)
       return retVal < 0 ? INFO_CANCELLED : INFO_NOT_FOUND;
 
-    if (GetDetails(pItem, url, info2, result == CNfoFile::COMBINED_NFO ? &m_nfoReader : NULL, pDlgProgress))
+    CLog::Log(LOGDEBUG,
+              "VideoInfoScanner: Fetching url '%s' using %s scraper (content: '%s')",
+              url.m_url[0].m_url.c_str(), info2->Name().c_str(),
+              TranslateContent(info2->Content()).c_str());
+
+    if (GetDetails(pItem, url, info2,
+                   (result == CNfoFile::COMBINED_NFO
+                    || result == CNfoFile::PARTIAL_NFO) ? &m_nfoReader : NULL,
+                   pDlgProgress))
     {
       if (AddVideo(pItem, info2->Content(), bDirNames, useLocal) < 0)
         return INFO_ERROR;
@@ -1999,10 +2027,10 @@ namespace VIDEO
       switch(result)
       {
         case CNfoFile::COMBINED_NFO:
-          type = "Mixed";
+          type = "mixed";
           break;
         case CNfoFile::FULL_NFO:
-          type = "Full";
+          type = "full";
           break;
         case CNfoFile::URL_NFO:
           type = "URL";
@@ -2010,6 +2038,9 @@ namespace VIDEO
         case CNfoFile::NO_NFO:
           type = "";
           break;
+        case CNfoFile::PARTIAL_NFO:
+          type = "partial";
+          break;
         default:
           type = "malformed";
       }
@@ -2022,14 +2053,14 @@ namespace VIDEO
       }
       else if (result != CNfoFile::NO_NFO && result != CNfoFile::ERROR_NFO)
       {
-        scrUrl = m_nfoReader.ScraperUrl();
-        info = m_nfoReader.GetScraperInfo();
-
-        StringUtils::RemoveCRLF(scrUrl.m_url[0].m_url);
-        CLog::Log(LOGDEBUG, "VideoInfoScanner: Fetching url '%s' using %s scraper (content: '%s')",
-          scrUrl.m_url[0].m_url.c_str(), info->Name().c_str(), TranslateContent(info->Content()).c_str());
+        if (result != CNfoFile::PARTIAL_NFO)
+        {
+          scrUrl = m_nfoReader.ScraperUrl();
+          StringUtils::RemoveCRLF(scrUrl.m_url[0].m_url);
+          info = m_nfoReader.GetScraperInfo();
+        }
 
-        if (result == CNfoFile::COMBINED_NFO)
+        if (result != CNfoFile::URL_NFO)
           m_nfoReader.GetDetails(*pItem->GetVideoInfoTag());
       }
     }
diff --git a/xbmc/video/ViewModeSettings.cpp b/xbmc/video/ViewModeSettings.cpp
index bb885df..5e1414c 100644
--- a/xbmc/video/ViewModeSettings.cpp
+++ b/xbmc/video/ViewModeSettings.cpp
@@ -47,7 +47,7 @@ static const ViewModeProperties viewModes[] =
   { 634,   ViewModeStretch16x9 },
   { 644,   ViewModeStretch16x9Nonlin, HIDE_ITEM, HIDE_ITEM },
   { 635,   ViewModeOriginal },
-  { 636,   ViewModeCustom, HIDE_ITEM, HIDE_ITEM }
+  { 636,   ViewModeCustom, HIDE_ITEM }
 };
 
 #define NUMBER_OF_VIEW_MODES (sizeof(viewModes) / sizeof(viewModes[0]))
diff --git a/xbmc/video/dialogs/GUIDialogVideoInfo.cpp b/xbmc/video/dialogs/GUIDialogVideoInfo.cpp
index 061242a..2031f3d 100644
--- a/xbmc/video/dialogs/GUIDialogVideoInfo.cpp
+++ b/xbmc/video/dialogs/GUIDialogVideoInfo.cpp
@@ -688,6 +688,7 @@ void CGUIDialogVideoInfo::OnGetArt()
     {
       CFileItemPtr item(new CFileItem("thumb://Current", false));
       item->SetArt("thumb", m_movieItem->GetArt(type));
+      item->SetIconImage("DefaultPicture.png");
       item->SetLabel(g_localizeStrings.Get(13512));
       items.Add(item);
     }
@@ -695,6 +696,7 @@ void CGUIDialogVideoInfo::OnGetArt()
     { // add the 'thumb' type in
       CFileItemPtr item(new CFileItem("thumb://Thumb", false));
       item->SetArt("thumb", currentArt["thumb"]);
+      item->SetIconImage("DefaultPicture.png");
       item->SetLabel(g_localizeStrings.Get(13512));
       items.Add(item);
     }
@@ -722,6 +724,7 @@ void CGUIDialogVideoInfo::OnGetArt()
     {
       CFileItemPtr item(new CFileItem("thumb://Local", false));
       item->SetArt("thumb", localThumb);
+      item->SetIconImage("DefaultPicture.png");
       item->SetLabel(g_localizeStrings.Get(13514));
       items.Add(item);
     }
@@ -730,7 +733,7 @@ void CGUIDialogVideoInfo::OnGetArt()
       // which is probably the IMDb thumb.  These could be wrong, so allow the user
       // to delete the incorrect thumb
       CFileItemPtr item(new CFileItem("thumb://None", false));
-      item->SetIconImage("DefaultVideo.png");
+      item->SetIconImage("DefaultPicture.png");
       item->SetLabel(g_localizeStrings.Get(13515));
       items.Add(item);
     }
@@ -794,6 +797,7 @@ void CGUIDialogVideoInfo::OnGetFanart()
   {
     CFileItemPtr itemCurrent(new CFileItem("fanart://Current",false));
     itemCurrent->SetArt("thumb", m_movieItem->GetArt("fanart"));
+    itemCurrent->SetIconImage("DefaultPicture.png");
     itemCurrent->SetLabel(g_localizeStrings.Get(20440));
     items.Add(itemCurrent);
   }
@@ -819,6 +823,7 @@ void CGUIDialogVideoInfo::OnGetFanart()
   {
     CFileItemPtr itemLocal(new CFileItem("fanart://Local",false));
     itemLocal->SetArt("thumb", strLocal);
+    itemLocal->SetIconImage("DefaultPicture.png");
     itemLocal->SetLabel(g_localizeStrings.Get(20438));
 
     //! @todo Do we need to clear the cached image?
@@ -828,7 +833,7 @@ void CGUIDialogVideoInfo::OnGetFanart()
   else
   {
     CFileItemPtr itemNone(new CFileItem("fanart://None", false));
-    itemNone->SetIconImage("DefaultVideo.png");
+    itemNone->SetIconImage("DefaultPicture.png");
     itemNone->SetLabel(g_localizeStrings.Get(20439));
     items.Add(itemNone);
   }
@@ -2041,4 +2046,4 @@ void CGUIDialogVideoInfo::ShowFor(const CFileItem& item)
     ADDON::ScraperPtr info;
     window->OnItemInfo(item, info);
   }
-}
\ No newline at end of file
+}
diff --git a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp
index c9ffc14..0534828 100644
--- a/xbmc/video/dialogs/GUIDialogVideoSettings.cpp
+++ b/xbmc/video/dialogs/GUIDialogVideoSettings.cpp
@@ -262,14 +262,11 @@ void CGUIDialogVideoSettings::InitializeSettings()
   entries.push_back(std::make_pair(16021, VS_INTERLACEMETHOD_RENDER_BOB));
   entries.push_back(std::make_pair(16020, VS_INTERLACEMETHOD_DEINTERLACE));
   entries.push_back(std::make_pair(16036, VS_INTERLACEMETHOD_DEINTERLACE_HALF));
-  entries.push_back(std::make_pair(16314, VS_INTERLACEMETHOD_INVERSE_TELECINE));
   entries.push_back(std::make_pair(16311, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL));
   entries.push_back(std::make_pair(16310, VS_INTERLACEMETHOD_VDPAU_TEMPORAL));
   entries.push_back(std::make_pair(16325, VS_INTERLACEMETHOD_VDPAU_BOB));
   entries.push_back(std::make_pair(16318, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_SPATIAL_HALF));
   entries.push_back(std::make_pair(16317, VS_INTERLACEMETHOD_VDPAU_TEMPORAL_HALF));
-  entries.push_back(std::make_pair(16314, VS_INTERLACEMETHOD_VDPAU_INVERSE_TELECINE));
-  entries.push_back(std::make_pair(16325, VS_INTERLACEMETHOD_AUTO_ION));
   entries.push_back(std::make_pair(16327, VS_INTERLACEMETHOD_VAAPI_BOB));
   entries.push_back(std::make_pair(16328, VS_INTERLACEMETHOD_VAAPI_MADI));
   entries.push_back(std::make_pair(16329, VS_INTERLACEMETHOD_VAAPI_MACI));
@@ -280,6 +277,7 @@ void CGUIDialogVideoSettings::InitializeSettings()
   entries.push_back(std::make_pair(16334, VS_INTERLACEMETHOD_IMX_FASTMOTION));
   entries.push_back(std::make_pair(16335, VS_INTERLACEMETHOD_IMX_ADVMOTION_HALF));
   entries.push_back(std::make_pair(16336, VS_INTERLACEMETHOD_IMX_ADVMOTION));
+  entries.push_back(std::make_pair(16320, VS_INTERLACEMETHOD_DXVA_AUTO));
 
   /* remove unsupported methods */
   for (StaticIntegerSettingOptions::iterator it = entries.begin(); it != entries.end(); )
diff --git a/xbmc/video/jobs/VideoLibraryRefreshingJob.cpp b/xbmc/video/jobs/VideoLibraryRefreshingJob.cpp
index 4948065..e9449c9 100644
--- a/xbmc/video/jobs/VideoLibraryRefreshingJob.cpp
+++ b/xbmc/video/jobs/VideoLibraryRefreshingJob.cpp
@@ -102,8 +102,8 @@ bool CVideoLibraryRefreshingJob::Work(CVideoDatabase &db)
 
 
       // if we are performing a forced refresh ask the user to choose between using a valid NFO and a valid scraper
-      if (needsRefresh && IsModal() && !scraper->IsNoop() &&
-         (nfoResult == CNfoFile::URL_NFO || nfoResult == CNfoFile::COMBINED_NFO || nfoResult == CNfoFile::FULL_NFO))
+      if (needsRefresh && IsModal() && !scraper->IsNoop()
+          && nfoResult != CNfoFile::ERROR_NFO)
       {
         int heading = 20159;
         if (scraper->Content() == CONTENT_MOVIES)
@@ -292,7 +292,10 @@ bool CVideoLibraryRefreshingJob::Work(CVideoDatabase &db)
     }
 
     // finally download the information for the item
-    if (!scanner.RetrieveVideoInfo(items, scanSettings.parent_name, scraper->Content(), !ignoreNfo, &scraperUrl, m_refreshAll, GetProgressDialog()))
+    if (!scanner.RetrieveVideoInfo(items, scanSettings.parent_name,
+                                   scraper->Content(), !ignoreNfo,
+                                   scraperUrl.m_url.empty() ? NULL : &scraperUrl,
+                                   m_refreshAll, GetProgressDialog()))
     {
       // something went wrong
       MarkFinished();
diff --git a/xbmc/video/windows/GUIWindowFullScreen.cpp b/xbmc/video/windows/GUIWindowFullScreen.cpp
index 7263752..72da165 100644
--- a/xbmc/video/windows/GUIWindowFullScreen.cpp
+++ b/xbmc/video/windows/GUIWindowFullScreen.cpp
@@ -485,7 +485,7 @@ void CGUIWindowFullScreen::FrameMove()
 
 void CGUIWindowFullScreen::Process(unsigned int currentTime, CDirtyRegionList &dirtyregion)
 {
-  if (g_application.m_pPlayer->IsRenderingGuiLayer() && g_application.m_pPlayer->HasFrame())
+  if (g_application.m_pPlayer->IsRenderingGuiLayer())
     MarkDirtyRegion();
 
   CGUIWindow::Process(currentTime, dirtyregion);
diff --git a/xbmc/view/GUIViewState.cpp b/xbmc/view/GUIViewState.cpp
index ceb7881..08e3135 100644
--- a/xbmc/view/GUIViewState.cpp
+++ b/xbmc/view/GUIViewState.cpp
@@ -346,7 +346,7 @@ bool CGUIViewState::ChooseSortMethod()
   if (!dialog)
     return false;
   dialog->Reset();
-  dialog->SetHeading(CVariant{ 32104 }); // Label "Sort by"
+  dialog->SetHeading(CVariant{ 39010 }); // Label "Sort by"
   for (auto &sortMethod : m_sortMethods)
     dialog->Add(g_localizeStrings.Get(sortMethod.m_buttonLabel));
   dialog->SetSelected(m_currentSortMethod);
diff --git a/xbmc/windowing/windows/WinEventsWin32.cpp b/xbmc/windowing/windows/WinEventsWin32.cpp
index b7f18e4..15f0fce 100644
--- a/xbmc/windowing/windows/WinEventsWin32.cpp
+++ b/xbmc/windowing/windows/WinEventsWin32.cpp
@@ -667,6 +667,26 @@ LRESULT CALLBACK CWinEventsWin32::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, L
         m_pEventFunc(newEvent);
       }
       return(0);
+    case WM_DISPLAYCHANGE:
+      CLog::Log(LOGDEBUG, __FUNCTION__": display change event");  
+      if (g_application.GetRenderGUI() && !g_Windowing.IsAlteringWindow() && GET_X_LPARAM(lParam) > 0 && GET_Y_LPARAM(lParam) > 0)  
+      {
+        g_Windowing.UpdateResolutions();
+        if (g_advancedSettings.m_fullScreen)  
+        {  
+          newEvent.type = XBMC_VIDEOMOVE;  
+          newEvent.move.x = 0;  
+          newEvent.move.y = 0;  
+        }  
+        else  
+        {  
+          newEvent.type = XBMC_VIDEORESIZE;  
+          newEvent.resize.w = GET_X_LPARAM(lParam);  
+          newEvent.resize.h = GET_Y_LPARAM(lParam);  
+        }  
+        m_pEventFunc(newEvent);  
+      }  
+      return(0);  
     case WM_SIZE:
       newEvent.type = XBMC_VIDEORESIZE;
       newEvent.resize.w = GET_X_LPARAM(lParam);
diff --git a/xbmc/windowing/windows/WinSystemWin32.cpp b/xbmc/windowing/windows/WinSystemWin32.cpp
index d62abf1..9d21a05 100644
--- a/xbmc/windowing/windows/WinSystemWin32.cpp
+++ b/xbmc/windowing/windows/WinSystemWin32.cpp
@@ -558,7 +558,7 @@ bool CWinSystemWin32::ChangeResolution(const RESOLUTION_INFO& res, bool forceCha
 
 void CWinSystemWin32::UpdateResolutions()
 {
-
+  m_MonitorsInfo.clear();
   CWinSystemBase::UpdateResolutions();
 
   UpdateResolutionsInternal();
diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp
index 25fa402..89f1c6a 100644
--- a/xbmc/windows/GUIMediaWindow.cpp
+++ b/xbmc/windows/GUIMediaWindow.cpp
@@ -687,7 +687,14 @@ bool CGUIMediaWindow::GetDirectory(const std::string &strDirectory, CFileItemLis
   // update the view state's reference to the current items
   m_guiState.reset(CGUIViewState::GetViewState(GetID(), items));
 
-  if (m_guiState.get() && !m_guiState->HideParentDirItems() && items.GetPath() != GetRootPath())
+  bool bHideParent = false;
+
+  if (m_guiState && m_guiState->HideParentDirItems())
+    bHideParent = true;
+  if (items.GetPath() == GetRootPath())
+    bHideParent = true;
+
+  if (!bHideParent)
   {
     CFileItemPtr pItem(new CFileItem(".."));
     pItem->SetPath(strParentPath);
@@ -1990,9 +1997,10 @@ bool CGUIMediaWindow::Filter(bool advanced /* = true */)
 
 std::string CGUIMediaWindow::GetStartFolder(const std::string &dir)
 {
-  std::string lower(dir); StringUtils::ToLower(lower);
-  if (lower == "$root" || lower == "root")
+  if (StringUtils::EqualsNoCase(dir, "$root") ||
+      StringUtils::EqualsNoCase(dir, "root"))
     return "";
+
   return dir;
 }
 
diff --git a/xbmc/windows/GUIWindowLoginScreen.cpp b/xbmc/windows/GUIWindowLoginScreen.cpp
index d6d14ff..697ff4b 100644
--- a/xbmc/windows/GUIWindowLoginScreen.cpp
+++ b/xbmc/windows/GUIWindowLoginScreen.cpp
@@ -322,6 +322,9 @@ void CGUIWindowLoginScreen::LoadProfile(unsigned int profile)
   JSONRPC::CJSONRPC::Initialize();
 #endif
 
+  // restart PVR services
+  g_application.ReinitPVRManager();
+
   // start services which should run on login
   ADDON::CAddonMgr::GetInstance().StartServices(false);
 
diff --git a/xbmc/windows/GUIWindowSystemInfo.cpp b/xbmc/windows/GUIWindowSystemInfo.cpp
index 4184db0..30f49de 100644
--- a/xbmc/windows/GUIWindowSystemInfo.cpp
+++ b/xbmc/windows/GUIWindowSystemInfo.cpp
@@ -187,7 +187,7 @@ void CGUIWindowSystemInfo::FrameMove()
 
 void CGUIWindowSystemInfo::ResetLabels()
 {
-  for (int i = 2; i < 12; i++)
+  for (int i = 2; i < 13; i++)
   {
     SET_CONTROL_LABEL(i, "");
   }

-- 
kodi packaging



More information about the pkg-multimedia-commits mailing list