[SCM] kodi/master: Imported Upstream version 17.0~rc4+dfsg1

rbalint at users.alioth.debian.org rbalint at users.alioth.debian.org
Sun Feb 5 01:00:27 UTC 2017


The following commit has been merged in the master branch:
commit 2c2ad897bda3d8d86168074a0cec66612653c847
Author: Balint Reczey <balint at balintreczey.hu>
Date:   Sat Feb 4 08:51:49 2017 +0100

    Imported Upstream version 17.0~rc4+dfsg1

diff --git a/.gitignore b/.gitignore
index 9c8dc28..c0631de 100644
--- a/.gitignore
+++ b/.gitignore
@@ -564,3 +564,6 @@ exclude_dll.txt
 
 #certificates
 /system/certs/
+
+#Workaround for autotools right before final Krypton
+xbmc/cores/AudioEngine/AEDefines_override.h
diff --git a/addons/repository.xbmc.org/addon.xml b/addons/repository.xbmc.org/addon.xml
index cc98ca3..54e1a20 100644
--- a/addons/repository.xbmc.org/addon.xml
+++ b/addons/repository.xbmc.org/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="repository.xbmc.org"
 		name="Kodi Add-on repository"
-		version="2.5.7"
+		version="2.5.8"
 		provider-name="Team Kodi">
   <requires>
     <import addon="xbmc.addon" version="12.0.0"/>
@@ -97,7 +97,7 @@
 		<description lang="fr_FR">Télécharger et installer des extensions à partir du dépôt officiel Kodi.tv.[CR]En utilisant le dépôt officiel, vous bénéficierez de notre service de serveurs miroirs permettant de télécharger rapidement depuis une région proche de chez vous.[CR]Toutes les extensions de ce dépôt ont été testées sommairement, si vous trouvez une extension corrompue ou inutilisable, veuillez en informer l'Équipe Kodi afin que nous puissions prendre les mesures nécessaires.</description>
 		<description lang="gl_ES">Descargar e instalar Engadidos dende o repositorio oficial de Kodi.tv.[CR] Empregando o repositorio oficial, vostede poderá gozar das vantaxes do seu extenso servizo de replicación de ficheiros que lle permite unhas descargas máis rápidas dende unha rexión preto a vostede.[CR] Tódolos Engadidos deste repositorio pasaron por comprobacións básicas. Se atopa algún Engadido roto ou non funcional, por favor reporteo ó equipo de Kodi para que poidan actuar en consecuencia.</description>
 		<description lang="he_IL">הורדה והתקנת הרחבות ממאגר הרחבות Kodi.tv הרשמי.[CR] שימוש במאגר הרשמי מאפשר לנצל את שירות שיקוף הקבצים של Kodi.tv העוזר להוריד מהר יותר מהשרת הקרוב ביותר.[CR] כל ההרחבות במאגר זה עברו בדיקה בסיסית. יש לדווח לצוות הפיתוח של Kodi על כל הרחבה שנמצאה כלא תקינה או שלא עובדת ע"מ שתתבצע הפעולה המתאימה.</description>
-		<description lang="hr_HR">Preuzmite i instalirajte dodatke sa službenog Kodi.tv repozitorija dodataka.[CR] Korištenjem službenog repozitorija bit ćete u mogućnosti iskoristiti prednosti usluge našeg brzog zrcalnog poslužitelja datoteka, da bi mogli brže preuzimati iz regije koje je bliže vašoj lokaciji.[CR] Svi dodaci na ovom repozitoriju prošli su osnovno testiranje, u slučaju da primijetite neispravan dodatak, molimo vas da to prijavite Kodi timu koji će zatim poduzeti potrebne korake.</description>
+		<description lang="hr_HR">Preuzmite i instalirajte dodatke sa službenog Kodi.tv repozitorija dodataka.[CR] Korištenjem službenog repozitorija bit ćete u mogućnosti iskoristiti prednosti usluge našeg brzog zrcalnog poslužitelja datoteka, kako bi mogli brže preuzimati iz regije koje je bliže vašoj lokaciji.[CR] Svi dodaci na ovom repozitoriju prošli su osnovno testiranje, u slučaju da primijetite neispravan dodatak, molimo vas da to prijavite Kodi timu koji će zatim poduzeti potrebne korake.</description>
 		<description lang="hu_HU">Kiegészítők letöltése és telepítése a hivatalos Kodi.tv tárolóhelyről.[CR] A hivatalos tárolóhely használatával kihasználhatod szerteágazó tükör-kiszolgáló hálózatunkat, ami segít a gyorsabb letöltésben egy hozzád közelebb eső körzet használatával.[CR]  Minden kiegészítő ezen a tárolóhelyen átment egy alaptesztelésen. Ha mégis hibás vagy nem működő kiegészítőt találsz, kérünk jelezd az Kodi csapatnak, hogy megtegyük a szükséges lépéseket.</description>
 		<description lang="id_ID">Unduh dan pasang pengaya dari repositori pengaya resmi Kodi.tv. [CR] Dengan menggunakan repositori resmi anda akan mendapat keuntungan dari miror berkas kami yang luas dimana dapat membantu anda untuk lebih cepat mengunduh dari daerah yang dekat dengan anda. [CR] Semua pengaya pada repository telah melalui uji coba standar, jika anda menemukan pengaya yang rusak atau tidak bekerja tolong laporkan kepada tim Kodi agar kami bisa menindak lanjutinya.</description>
 		<description lang="is_IS">Sækja og setja inn viðbætur frá hinu viðurkennda Kodi.tv viðbóta safni.[CR] Með því að nota þetta safn getur þú nýtt þér möguleikann á fullkmonni speglunar þjónustu sem hjálpar við að sækja viðbætur hraðar frá landsvæði nálægt þér.[CR] Allar viðbætur í þessu safni hafa gengið undir grunn prófanir, ef þú finnur viðbætur sem eru bilaðar eða virka ekki vinsamlegast látið Kodi teymið vita svo við getum gert eitthvað í málinu.</description>
@@ -120,7 +120,7 @@
 		<description lang="sl_SI">Prenos in namestitev dodatkov iz uradnega skladišča Kodi.tv.[CR] Z uporabo uradnega skladišča, boste lahko izkoristili hitrejšo povezavo, ki bo izbrana glede na vašo lokacijo.[CR] Vsi dodatki tega skladišča so bili osnovno stestirani, če pa boste našli pokvarjen ali nedelujoč dodatek, to sporočite ekipi Kodi, da bomo lahko odpravili napake.</description>
 		<description lang="sr_RS">Преузмите и инсталирајте додатке из Званичног Kodi.tv спремишта додатака.[CR] Коришћењем званичног Спремишта моћићете да искористите предности нашег сервиса копија фајлова који ће вам помоћи приликом бржег преузимања из региона ближег вашој локацији.[CR] Сви додаци у овом спремишту прошли су основно тестирање, у случају да пронађете неисправан додатак молимо вас да то пријавите Kodi тиму који ће затим предузети неопходне мере.</description>
 		<description lang="sr_RS at latin">Preuzmi i instaliraj dodatne programe iz Zvaničnog Kodi.tv spremišta za dodatne programe.[CR] Korišćenjem zvaničnog Spremišta moći ćete da iskoristite prednosti našeg servisa kopija fajlova koji će vam pomoći prilikom bržeg preuzimanja iz regiona bližeg vašoj lokaciji.[CR] Svi dodatni programi u ovom spremištu prošli su osnovno testiranje, u slučaju da pronađete neispravan dodatni program molimo vas da to prijavite Kodi timu koji će zatim preduzeti neophodne mere.</description>
-		<description lang="sv_SE">Ladda ner och installera tillägg från det officiella Kodi.tv tilläggsförrådet.[CR]Genom att använda det officiella förrådet kommer du att få fördelen att kunna använda vår omfattande spegeltjänst som kommer att hjälpa dig till snabbare nedladdningar från en plats nära dig.[CR]Alla tillägg i detta förråd har genomgått grundläggande tester. Hittar du ett trasigt eller icke fungerande tillägg, vänligen meddela detta till Team Kodi så att vi kan vidta nödvändiga åtgärder.</description>
+		<description lang="sv_SE">Ladda ner och installera tillägg från det officiella Kodi.tv tilläggsförrådet.[CR] Genom att använda det officiella förrådet kommer du att få fördelen att kunna använda vår omfattande spegeltjänst som kommer att hjälpa dig till snabbare nedladdningar från en plats nära dig.[CR] Alla tillägg i detta förråd har genomgått grundläggande tester. Hittar du ett trasigt eller icke fungerande tillägg, vänligen meddela detta till Team Kodi så att vi kan vidta nödvändiga åtgärder.</description>
 		<description lang="szl">Sebiyrej i insztaluj przidŏwki z ôficjalnygo repozytoriōm Kodi.tv.[CR] Przi Używaniu ôficjalnygo repozytoriōm używŏsz serwerōw zdrzadłowych, rozsianych po calistym świecie. Ôbiyrany je tyn, kery je nŏjbliżyj ciebie, co istuje srogõ wartkość skuplowaniŏ.[CR]Wszyjske przidŏwki w tym repozytoriōm sōm testowane, ale mogōm pokŏzać sie popszniōne. Zgłoś wtynczŏs feler, coby ekipa Kodi mogła go sprŏwić.</description>
 		<description lang="tg_TJ">Барномаҳои иловагиро аз анбори нармафзори Kodi.tv боргирӣ кунед ва насб намоед.[CR]  Аз истифодаи анбори нармафзори расмии мо ба шумо имконият пайдо мешавад, ки тавонед шароити мусофидро аз хидмати оинаи файлии васеъ ба даст оред ва нармафзори лозимиро аз сервери минтакаи ба шумо наздиктар бо суръати баланд боргирӣ кунед.[CR]  Ҳамаи барномаҳо аз анбори нармафзори мо дар ҳолати санҷишӣ мебошанд, бинобар ин агар ягон барномаи иловагии нуқсондор ё вайроншударо ёбед, лутфан дар бораи он барнома ва нуқсон пайдошуда ба гурӯҳи кории Kodi гузориш диҳед, то ин ки мо тавонем ҳамаи камбудиҳои барномаҳои моро ҳал кунем.</description>
 		<description lang="th_TH">ดาวน์โหลดและติดตั้งส่วนเสริม จากแหล่งข้อมูลโปรแกรมของ Kodi.tv อย่างเป็นทางการ.[CR]  โดยการใช้งานแหล่งข้อมูลโปรแกรมอย่างเป็นทางการ คุณสามารถใช้ประโยชน์จากบริการแฟ้มมิเรอร์ที่กว้างขวางของเรา ที่จะช่วยให้การดาวน์โหลดของคุณเร็วขึ้นจากภูมิภาคที่ใกล้ที่สุด.[CR]  ส่วนเสริม ทั้งหมดในแหล่งเก็บข้อมูลนี้ อยู่ภายใต้การทดสอบขั้นพื้นฐานแล้ว ถ้าคุณพบส่วนเสริมที่เสียหายหรือไม่ทำงาน กรุณาแจ้งทีมงาน Kodi เพื่อให้เราสามารถดำเนินการใด ๆ ที่จำเป็น.</description>
diff --git a/addons/resource.language.en_gb/resources/strings.po b/addons/resource.language.en_gb/resources/strings.po
index abfc92b..da55803 100644
--- a/addons/resource.language.en_gb/resources/strings.po
+++ b/addons/resource.language.en_gb/resources/strings.po
@@ -16646,7 +16646,7 @@ msgstr ""
 #. Description of setting with label #14091 "Character set"
 #: system/settings/settings.xml
 msgctxt "#36116"
-msgid "Choose which character set is used for displaying text in the user interface."
+msgid "Choose which character set is used for displaying text in the user interface. This doesn't change the character set used for subtitles, for that go to Player > Language."
 msgstr ""
 
 #. Description of setting with label #14079 "Timezone country"
@@ -19654,7 +19654,21 @@ msgctxt "#38111"
 msgid "This category contains other settings for the GUI interface"
 msgstr ""
 
-#empty strings from id 38112 to 38999
+#empty strings from id 38112 to 38206
+
+#. Description of setting "Pictures -> Show EXIF picture information" with label #38207
+#: system/settings/settings.xml
+msgctxt "#38207"
+msgid "Show EXIF picture information"
+msgstr ""
+
+#. Help text of setting "Pictures -> Show EXIF picture information" with label #38208
+#: system/settings/settings.xml
+msgctxt "#38208"
+msgid "If EXIF information exists (date, time, camera used, etc.), it will be displayed."
+msgstr ""
+
+#empty strings from id 38209 to 38999
 
 #: system/settings/settings.xml
 msgctxt "#39000"
diff --git a/addons/screensaver.xbmc.builtin.dim/addon.xml b/addons/screensaver.xbmc.builtin.dim/addon.xml
index 3640853..8e56e14 100644
--- a/addons/screensaver.xbmc.builtin.dim/addon.xml
+++ b/addons/screensaver.xbmc.builtin.dim/addon.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
 <addon id="screensaver.xbmc.builtin.dim"
        name="Dim"
-       version="1.0.35"
+       version="1.0.36"
        provider-name="Team Kodi">
   <extension point="xbmc.ui.screensaver" library=""/>
   <extension point="xbmc.addon.metadata">
diff --git a/addons/skin.estouchy/addon.xml b/addons/skin.estouchy/addon.xml
index d15c7e7..c5048c6 100644
--- a/addons/skin.estouchy/addon.xml
+++ b/addons/skin.estouchy/addon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<addon id="skin.estouchy" version="1.1.5" name="Estouchy" provider-name="Team Kodi">
+<addon id="skin.estouchy" version="1.1.7" name="Estouchy" provider-name="Team Kodi">
 	<requires>
 		<import addon="xbmc.gui" version="5.12.0"/>
 	</requires>
@@ -12,7 +12,7 @@
 		<summary lang="am_ET">ለ ተችስክሪን አካሎች ቆዳ</summary>
 		<summary lang="bg_BG">Облик за устройства с екран чувствителен на допир</summary>
 		<summary lang="ca_ES">Aparença per als dispositius amb pantalla tàctil</summary>
-		<summary lang="cs_CZ">Skin pro dotyková zařízení</summary>
+		<summary lang="cs_CZ">Vzhled pro zařízení s dotykovou obrazovkou</summary>
 		<summary lang="de_DE">Skin für Touchscreen-Geräte</summary>
 		<summary lang="el_GR">Κέλυφος για συσκευές με οθόνη αφής</summary>
 		<summary lang="en_GB">Skin for touchscreen devices</summary>
@@ -25,6 +25,7 @@
 		<summary lang="fr_FR">Habillage pour les appareils à écran tactile</summary>
 		<summary lang="gl_ES">Pel para dispositivos táctiles</summary>
 		<summary lang="he_IL">מעטפת עבור התקני מסך מגע</summary>
+		<summary lang="hr_HR">Presvlaka za uređaje s dodirom na zaslon</summary>
 		<summary lang="hu_HU">Felület érintőképernyős eszközöknek</summary>
 		<summary lang="it_IT">Skin per dispositivi touchscreen</summary>
 		<summary lang="ko_KR">터치 스크린 기기를 위한 스킨</summary>
@@ -49,7 +50,7 @@
 		<description lang="af_ZA">Oortreksel ontwerp om op raakskerm toestelle soos tablette en slimfone te gebruik</description>
 		<description lang="bg_BG">Обликът е разработен за ползване на устройства, с екран чувствителен на допир като таблет или телефон.</description>
 		<description lang="ca_ES">Aparença dissenyada perquè s'utilitzi en dispositius amb pantalla tàctil com taules i telèfons intel·ligents</description>
-		<description lang="cs_CZ">Skin navržený pro zařízení s dotykovou obrazovkou, jako jsou tablety a smartphony.</description>
+		<description lang="cs_CZ">Vzhled navržený pro použití na zařízeních s dotykovou obrazovkou, jako jsou tablety a chytré telefony</description>
 		<description lang="de_DE">Dieses Skin wurde für die Benutzung mit Touchscreen-Geräten wie Tablets und Handys entworfen</description>
 		<description lang="el_GR">Κέλυφος σχεδιασμένο για να χρησιμοποιηθεί σε συσκευές με οθόνη αφής όπως ταμπλέτες και έξυπνα κινητά.</description>
 		<description lang="en_GB">Skin designed to be used on touchscreen devices like tablets and smartphones</description>
@@ -62,6 +63,7 @@
 		<description lang="fr_FR">Habillage conçu pour les appareils à écran tactile comme les tablettes et les téléphones</description>
 		<description lang="gl_ES">Pel deseñada para se empregar en dispositivos táctiles como tabletas e móbiles</description>
 		<description lang="he_IL">מעטפת מיועדת לשימוש בהתקני מסך מגע כגון טאבלט וסמארטפון</description>
+		<description lang="hr_HR">Presvlaka dizajnirana za korištenje na uređajima s dodirom na zaslon poput tableta i pametnih telefona</description>
 		<description lang="hu_HU">Egy érintőképernyős eszközökre, például táblagépekre és okostelefonokra tervezett felület</description>
 		<description lang="it_IT">Skin progettata per essere usata su dispositivi touchscreen come tablet e smartphone</description>
 		<description lang="ko_KR">태블릿이나 스마트폰과 같은 터치 스크린 기기에서 사용할 수 있게 디자인한 스킨</description>
diff --git a/addons/skin.estouchy/changelog.txt b/addons/skin.estouchy/changelog.txt
index 336b273..aea6d75 100644
--- a/addons/skin.estouchy/changelog.txt
+++ b/addons/skin.estouchy/changelog.txt
@@ -1,3 +1,25 @@
+V1.1.7
+- Add scrollbar to guide view
+- Align shutdown button
+
+V1.1.6
+- Updated language files from Transifex
+
+V1.1.5
+- Updated language files from Transifex
+
+V1.1.4
+- Updated language files from Transifex
+
+V1.1.3
+- Updated language files from Transifex
+
+V1.1.2
+- Updated language files from Transifex
+
+V1.1.1
+- Updated language files from Transifex
+
 V1.1.0
 - Redesign
 
diff --git a/addons/skin.estouchy/language/resource.language.cs_cz/strings.po b/addons/skin.estouchy/language/resource.language.cs_cz/strings.po
index ae34d41..49d9e53 100644
--- a/addons/skin.estouchy/language/resource.language.cs_cz/strings.po
+++ b/addons/skin.estouchy/language/resource.language.cs_cz/strings.po
@@ -34,7 +34,7 @@ msgstr "Možnosti vizualizace"
 
 msgctxt "#31006"
 msgid "Visualization Presets"
-msgstr "Přednastavení vizualizace"
+msgstr "Předvolby vizualizace"
 
 msgctxt "#31007"
 msgid "Context Menu"
@@ -42,7 +42,7 @@ msgstr "Místní nabídka"
 
 msgctxt "#31009"
 msgid "Working..."
-msgstr "Pracuji..."
+msgstr "Zpracovávání..."
 
 msgctxt "#31011"
 msgid "Recent"
@@ -54,7 +54,7 @@ msgstr "Filmy"
 
 msgctxt "#31014"
 msgid "Episodes"
-msgstr "Epizod(y)"
+msgstr "Epizody"
 
 msgctxt "#31016"
 msgid "Albums"
@@ -94,11 +94,11 @@ msgstr "Čas ukončení"
 
 msgctxt "#31050"
 msgid "Sort: Ascending"
-msgstr "Řazení: vzestupně"
+msgstr "Řazení: Vzestupně"
 
 msgctxt "#31051"
 msgid "Sort: Descending"
-msgstr "Řazení: sestupně"
+msgstr "Řazení: Sestupně"
 
 msgctxt "#31055"
 msgid "Open playlist"
@@ -144,6 +144,10 @@ msgctxt "#31303"
 msgid "Data provider"
 msgstr "Poskytovatel dat"
 
+msgctxt "#31309"
+msgid "System Memory Used:"
+msgstr "Použitá systémová paměť:"
+
 msgctxt "#31320"
 msgid "Last Logged In"
 msgstr "Naposledy přihlášen"
@@ -154,7 +158,7 @@ msgstr "Vysíláno"
 
 msgctxt "#31355"
 msgid "Video Menu"
-msgstr "Menu videa"
+msgstr "Nabídka videa"
 
 msgctxt "#31356"
 msgid "Download Subtitles"
@@ -166,23 +170,59 @@ msgstr "Teletext"
 
 msgctxt "#31390"
 msgid "Skin default"
-msgstr "Výchozí vzhled"
+msgstr "Výchozí nastavení vzhledu"
 
 msgctxt "#31391"
 msgid "Arial based"
-msgstr "Písmo Arial"
+msgstr "Založeno na Arial"
 
 msgctxt "#31400"
 msgid "Change the skin · Set language and region · Change file listing options · Set up a screensaver"
-msgstr "Změnit vzhled · Nastavit jazyk a region · Změnit možnosti výpisu souborů · Nastavit spořič obrazovky"
+msgstr "Změňte vzhled · Nastavte jazyk a region · Změňte možnosti výpisu souborů · Nastavte spořič obrazovky"
+
+msgctxt "#31405"
+msgid "Configure & manage media sharing services · Configure & manage the weather service"
+msgstr "Konfigurujte a spravujte služby sdílení médií · Konfigurujte a spravujte služby počasí"
+
+msgctxt "#31406"
+msgid "Configure display · Configure audio · Configure internet access · Configure power saving· Configure logging"
+msgstr "Konfigurujte obrazovku · Konfigurujte zvuk · Konfigurujte přístup k internetu · Konfigurujte úsporu energie · Konfigurujte protokolování"
 
 msgctxt "#31407"
 msgid "Manage your installed add-ons · Browse for and install add-ons from kodi.tv · Modify add-on settings"
-msgstr "Spravujte nainstalované doplňky · Procházejte a instalujte doplňky z kodi.tv · Upravujte nastavení doplňků"
+msgstr "Spravujte nainstalované doplňky · Procházejte a instalujte doplňky z kodi.tv · Upravte nastavení doplňků"
+
+msgctxt "#31408"
+msgid "Configure actions that can be used during playback · Configure how media content is played"
+msgstr "Konfigurujte akce, které mohou být použity během přehrávání · Konfigurujte způsob přehrávání médií"
+
+msgctxt "#31409"
+msgid "Configure library sources · Show the media lists display content · Configure how library lists are navigated"
+msgstr "Konfigurujte zdroje knihovny · Upravte obsah zobrazení seznamu médií · Konfigurujte způsob navigace v seznamech knihovny"
+
+msgctxt "#31410"
+msgid "Configure skin · Configure region · Configure control · Configure screensaver · Configure master lock"
+msgstr "Konfigurujte vzhled · Konfigurujte region · Konfigurujte ovládání · Konfigurujte spořič obrazovky · Konfigurujte hlavní zámek"
+
+msgctxt "#31411"
+msgid "Configure your profiles · Set locking options · Enable login screen"
+msgstr "Konfigurujte své profily · Nastavte možnosti uzamknutí · Povolte přihlašovací obrazovku"
+
+msgctxt "#31412"
+msgid "Display system information · Hardware statistics · Check storage availability · View network configuration"
+msgstr "Zobrazte informace o systému · Hardwarové statistiky · Zkontrolujte dostupnost úložiště · Zobrazte konfiguraci sítě"
 
 msgctxt "#31421"
 msgid "Select your Kodi user Profile[CR]to login and continue"
-msgstr "Vyberte váš uživatelské profil Kodi[CR]pro přihlášení a pokračování"
+msgstr "Vyberte svůj uživatelský profil Kodi[CR]pro přihlášení a pokračování"
+
+msgctxt "#31548"
+msgid "Home menu"
+msgstr "Domovská nabídka"
+
+msgctxt "#31549"
+msgid "Home Add-ons"
+msgstr "Doplňky na domovské obrazovce"
 
 msgctxt "#31550"
 msgid "Backgrounds"
@@ -190,11 +230,11 @@ msgstr "Pozadí"
 
 msgctxt "#31551"
 msgid "Add-on Shortcut"
-msgstr "Zkratka rozšíření"
+msgstr "Klávesová zkratka doplňku"
 
 msgctxt "#31552"
 msgid "SYNC"
-msgstr "SYNCHRONIZUJ"
+msgstr "SYNCHRONIZOVAT"
 
 msgctxt "#31553"
 msgid "Use Custom Background"
@@ -206,11 +246,11 @@ msgstr "Pozadí:"
 
 msgctxt "#31555"
 msgid "Configure TV settings · Change full screen info · Manage EPG data settings"
-msgstr "Konfiguruj nastavení TV · Změň celoobrazovkové info · Spravuj nastaveni EPG"
+msgstr "Konfigurujte nastavení TV · Změňte informace na celé obrazovce · Spravujte data televizního programu"
 
 msgctxt "#31556"
 msgid "Live TV"
-msgstr "Televize"
+msgstr "Živé vysílání"
 
 msgctxt "#31557"
 msgid "Hide video background"
@@ -238,7 +278,7 @@ msgstr "Přejmenovat skupinu"
 
 msgctxt "#31563"
 msgid "Delete Group"
-msgstr "Smazat skupinu"
+msgstr "Odstranit skupinu"
 
 msgctxt "#31564"
 msgid "Show hidden"
@@ -246,7 +286,7 @@ msgstr "Zobrazit skryté"
 
 msgctxt "#31565"
 msgid "Show deleted"
-msgstr "Zobrazit smazané"
+msgstr "Zobrazit odstraněné"
 
 msgctxt "#31900"
 msgid "First Run"
@@ -254,16 +294,16 @@ msgstr "První spuštění"
 
 msgctxt "#31901"
 msgid "There are two things to know about navigating Estouchy"
-msgstr "Měli byste vědět dvě věci o navigování v Estouchy"
+msgstr "O navigování v Estouchy byste měli vědět dvě věci "
 
 msgctxt "#31902"
 msgid "The Kodi logo functions as a 'HOME' button. Whenever you touch it, you will be taken back to the home screen."
-msgstr "Kodi logo slouží jako tlačítko 'DOMŮ'. Kdykoliv ho stisknete, přepnete se zpět na domovskou obrazovku."
+msgstr "Logo Kodi slouží jako tlačítko 'DOMŮ'. Kdykoliv se ho dotknete, přepnete se zpět na domovskou obrazovku."
 
 msgctxt "#31903"
 msgid "When you are playing audio or video, the item title will appear at the top of the screen. Touching it will take you to the fullscreen visualization or video window."
-msgstr "Kdykoliv přehrajete hudbu nebo video, název této položky se zobrazí na horním okraji obrazovky. Pokud na něj kliknete, zobrazí se video nebo vizualizace v celoobrazovkovém režimu."
+msgstr "Když přehráváte hudbu nebo video, objeví se na horním okraji obrazovky název položky. Pokud se ho dotknete, přepnete se do okna vizualizace nebo videa na celou obrazovku."
 
 msgctxt "#31904"
 msgid "Now Playing Title..."
-msgstr "Nyní přehrávám..."
+msgstr "Nyní se přehrává..."
diff --git a/addons/skin.estouchy/language/resource.language.hr_hr/strings.po b/addons/skin.estouchy/language/resource.language.hr_hr/strings.po
index 167cb05..fd8e41d 100644
--- a/addons/skin.estouchy/language/resource.language.hr_hr/strings.po
+++ b/addons/skin.estouchy/language/resource.language.hr_hr/strings.po
@@ -38,12 +38,16 @@ msgstr "Predlošci vizualizacije"
 
 msgctxt "#31007"
 msgid "Context Menu"
-msgstr "Dodatni izbornik"
+msgstr "Izbornik sadržaja"
 
 msgctxt "#31009"
 msgid "Working..."
 msgstr "Obrađivanje..."
 
+msgctxt "#31011"
+msgid "Recent"
+msgstr "Nedavno"
+
 msgctxt "#31013"
 msgid "Movies"
 msgstr "Filmovi"
@@ -68,6 +72,10 @@ msgctxt "#31038"
 msgid "Login"
 msgstr "Prijava"
 
+msgctxt "#31039"
+msgid "Updated:"
+msgstr "Nadopunjeno:"
+
 msgctxt "#31044"
 msgid "FAST FORWARD"
 msgstr "PREMOTAVANJE UNAPRIJED"
@@ -78,7 +86,7 @@ msgstr "PREMOTAVANJE UNAZAD"
 
 msgctxt "#31046"
 msgid "Play speed"
-msgstr "Brzina izvođenja"
+msgstr "Brzina reprodukcije"
 
 msgctxt "#31049"
 msgid "End Time"
@@ -106,7 +114,7 @@ msgstr "Zatvori popis izvođenja"
 
 msgctxt "#31058"
 msgid "System music files"
-msgstr "Glazbene datoteke sustava"
+msgstr "Zvučne datoteke sustava"
 
 msgctxt "#31059"
 msgid "Current playlist"
@@ -130,12 +138,16 @@ msgstr "Trenutna temp."
 
 msgctxt "#31301"
 msgid "Last Updated"
-msgstr "Posljednje ažuriranje"
+msgstr "Posljednja nadopuna"
 
 msgctxt "#31303"
 msgid "Data provider"
 msgstr "Pružatelj podataka"
 
+msgctxt "#31309"
+msgid "System Memory Used:"
+msgstr "Korištenje memorije:"
+
 msgctxt "#31320"
 msgid "Last Logged In"
 msgstr "Posljednji put prijavljeni"
@@ -168,10 +180,50 @@ msgctxt "#31400"
 msgid "Change the skin · Set language and region · Change file listing options · Set up a screensaver"
 msgstr "Promijenite presvlaku · Postavite jezik i regiju · Izmijenite mogućnosti popisa datoteka   · Postavite čuvara zaslona"
 
+msgctxt "#31405"
+msgid "Configure & manage media sharing services · Configure & manage the weather service"
+msgstr "Prilagodite i upravljajte uslugama dijeljenja medija · Prilagodite i upravljajte uslugama vremenske prognoze"
+
+msgctxt "#31406"
+msgid "Configure display · Configure audio · Configure internet access · Configure power saving· Configure logging"
+msgstr "Prilagodite zaslon · Prilagodite zvuk · Prilagodite pristup internetu · Prilagodite štednju energije · Prilagodite zapisivanje"
+
+msgctxt "#31407"
+msgid "Manage your installed add-ons · Browse for and install add-ons from kodi.tv · Modify add-on settings"
+msgstr "Prilagodite vaše instalirane dodatke · Pregledavajte i instalirajte dodatke s kodi.tv · Prilagodite postavke dodatka"
+
+msgctxt "#31408"
+msgid "Configure actions that can be used during playback · Configure how media content is played"
+msgstr "Prilagodite radnje koje se koriste tijekom reprodukcije · Prilagodite način reprodukcije medijskog sadržaja"
+
+msgctxt "#31409"
+msgid "Configure library sources · Show the media lists display content · Configure how library lists are navigated"
+msgstr "Prilagodite izvore zbirke · Prilagodite kako zbirka prikazuje medijski sadržaj · Prilagodite kako se upravlja prikazom zbirke"
+
+msgctxt "#31410"
+msgid "Configure skin · Configure region · Configure control · Configure screensaver · Configure master lock"
+msgstr "Prilagodite presvlaku · Prilagodite lokalizaciju · Prilagodite upravljanje · Prilagodite čuvar zaslona · Prilagodite glavno zaključavanje"
+
+msgctxt "#31411"
+msgid "Configure your profiles · Set locking options · Enable login screen"
+msgstr "Prilagodite svoje profile · Postavite mogućnosti zaključavanja · Omogućite zaslon prijave"
+
+msgctxt "#31412"
+msgid "Display system information · Hardware statistics · Check storage availability · View network configuration"
+msgstr "Prikaz informacija sustava · Statistika hardvera · Provjera uređaja pohrane · Prikaz postavka mreže"
+
 msgctxt "#31421"
 msgid "Select your Kodi user Profile[CR]to login and continue"
 msgstr "Odaberite svoj Kodi korisnički profil[CR]za prijavu i nastavite"
 
+msgctxt "#31548"
+msgid "Home menu"
+msgstr "Početni izbornik"
+
+msgctxt "#31549"
+msgid "Home Add-ons"
+msgstr "Početni dodaci"
+
 msgctxt "#31550"
 msgid "Backgrounds"
 msgstr "Pozadine"
@@ -180,14 +232,38 @@ msgctxt "#31551"
 msgid "Add-on Shortcut"
 msgstr "Prečac dodataka"
 
+msgctxt "#31552"
+msgid "SYNC"
+msgstr "USKLADI"
+
+msgctxt "#31553"
+msgid "Use Custom Background"
+msgstr "Koristi prilagođenu pozadinu"
+
+msgctxt "#31554"
+msgid "Background:"
+msgstr "Pozadina:"
+
+msgctxt "#31555"
+msgid "Configure TV settings · Change full screen info · Manage EPG data settings"
+msgstr "Prilagodite postavke televizije · Prilagodite cijelozaslonske informacije · Upravljajte postavkama EPG vodiča"
+
 msgctxt "#31556"
 msgid "Live TV"
-msgstr "TV uživo"
+msgstr "Televizija"
 
 msgctxt "#31557"
 msgid "Hide video background"
 msgstr "Sakrij video pozadinu"
 
+msgctxt "#31558"
+msgid "Hide visualization background"
+msgstr "Sakrij vizualizacije pozadine"
+
+msgctxt "#31559"
+msgid "Channel settings"
+msgstr "Postavke programa"
+
 msgctxt "#31560"
 msgid "Available groups"
 msgstr "Dostupne grupe"
@@ -203,3 +279,27 @@ msgstr "Preimenuj grupu"
 msgctxt "#31563"
 msgid "Delete Group"
 msgstr "Obriši grupu"
+
+msgctxt "#31564"
+msgid "Show hidden"
+msgstr "Prikaži skriveno"
+
+msgctxt "#31565"
+msgid "Show deleted"
+msgstr "Prikaži obrisano"
+
+msgctxt "#31901"
+msgid "There are two things to know about navigating Estouchy"
+msgstr "Postoje dvije stvari koje morate znati o upravljanju s Estouchyem"
+
+msgctxt "#31902"
+msgid "The Kodi logo functions as a 'HOME' button. Whenever you touch it, you will be taken back to the home screen."
+msgstr "Funkcija Kodi logotipa je poput 'HOME' tipke. Kada ju dodirnete, vratit ćete se natrag na početni zaslon."
+
+msgctxt "#31903"
+msgid "When you are playing audio or video, the item title will appear at the top of the screen. Touching it will take you to the fullscreen visualization or video window."
+msgstr "Kada reproducirate glazbu ili video snimku, naslov stavke će se pojaviti na vrhu zaslona. Dodir naslova će vas odvesti u prozor vizualizacije glazbe ili cijelozaslonski prikaz video snimke."
+
+msgctxt "#31904"
+msgid "Now Playing Title..."
+msgstr "Trenutno reproducirana stavka..."
diff --git a/addons/skin.estouchy/language/resource.language.nl_nl/strings.po b/addons/skin.estouchy/language/resource.language.nl_nl/strings.po
index 38ae1ce..677a271 100644
--- a/addons/skin.estouchy/language/resource.language.nl_nl/strings.po
+++ b/addons/skin.estouchy/language/resource.language.nl_nl/strings.po
@@ -216,6 +216,14 @@ msgctxt "#31421"
 msgid "Select your Kodi user Profile[CR]to login and continue"
 msgstr "Kies je Kodi gebruikersprofiel[CR]om in te loggen en door te gaan"
 
+msgctxt "#31548"
+msgid "Home menu"
+msgstr "Begin menu"
+
+msgctxt "#31549"
+msgid "Home Add-ons"
+msgstr "Begin Add-ons"
+
 msgctxt "#31550"
 msgid "Backgrounds"
 msgstr "Achtergronden"
diff --git a/addons/skin.estouchy/language/resource.language.pt_pt/strings.po b/addons/skin.estouchy/language/resource.language.pt_pt/strings.po
index c861bf0..d3b6541 100644
--- a/addons/skin.estouchy/language/resource.language.pt_pt/strings.po
+++ b/addons/skin.estouchy/language/resource.language.pt_pt/strings.po
@@ -144,6 +144,10 @@ msgctxt "#31303"
 msgid "Data provider"
 msgstr "Fornecedor de dados"
 
+msgctxt "#31309"
+msgid "System Memory Used:"
+msgstr "Memória do sistema utilizada:"
+
 msgctxt "#31320"
 msgid "Last Logged In"
 msgstr "Última Ligação"
@@ -212,6 +216,14 @@ msgctxt "#31421"
 msgid "Select your Kodi user Profile[CR]to login and continue"
 msgstr "Escolha o seu perfil de utilizador do Kodi[CR]para iniciar sessão e continuar"
 
+msgctxt "#31548"
+msgid "Home menu"
+msgstr "Menu de Início"
+
+msgctxt "#31549"
+msgid "Home Add-ons"
+msgstr "Add-ons de Início"
+
 msgctxt "#31550"
 msgid "Backgrounds"
 msgstr "Fundos"
diff --git a/addons/skin.estouchy/media/icon_button_shutdown.png b/addons/skin.estouchy/media/icon_button_shutdown.png
index 75c0014..0fc018c 100644
Binary files a/addons/skin.estouchy/media/icon_button_shutdown.png and b/addons/skin.estouchy/media/icon_button_shutdown.png differ
diff --git a/addons/skin.estouchy/xml/Home.xml b/addons/skin.estouchy/xml/Home.xml
index dd85973..971f04b 100644
--- a/addons/skin.estouchy/xml/Home.xml
+++ b/addons/skin.estouchy/xml/Home.xml
@@ -153,11 +153,10 @@
 				<orientation>Horizontal</orientation>
 				<itemlayout height="120" width="120">
 					<control type="image">
-						<posx>20</posx>
-						<posy>20</posy>
-						<width>80</width>
-						<height>80</height>
-						<bordersize>12</bordersize>
+						<posx>32</posx>
+						<posy>32</posy>
+						<width>56</width>
+						<height>56</height>
 						<texture>$INFO[ListItem.Icon]</texture>
 						<aspectratio>keep</aspectratio>
 					</control>
@@ -171,11 +170,10 @@
 						<texture colordiffuse="blue">roundbutton-focus.png</texture>
 					</control>
 					<control type="image">
-						<posx>20</posx>
-						<posy>20</posy>
-						<width>80</width>
-						<height>80</height>
-						<bordersize>12</bordersize>
+						<posx>32</posx>
+						<posy>32</posy>
+						<width>56</width>
+						<height>56</height>
 						<texture>$INFO[ListItem.Icon]</texture>
 						<aspectratio>keep</aspectratio>
 					</control>
diff --git a/addons/skin.estouchy/xml/Includes.xml b/addons/skin.estouchy/xml/Includes.xml
index 738b765..c16c20b 100644
--- a/addons/skin.estouchy/xml/Includes.xml
+++ b/addons/skin.estouchy/xml/Includes.xml
@@ -310,7 +310,7 @@
 			<include>Window_OpenClose_Animation</include>
 			<posx>40r</posx>
 			<posy>120</posy>
-			<visible>Control.IsVisible(60) + ![[Window.IsVisible(TVGuide) | Window.IsVisible(RadioGuide)] + Control.IsVisible(10)]</visible>
+			<visible>Control.IsVisible(60)</visible>
 			<animation effect="slide" start="40,0" end="0,0" time="400">Visible</animation>
 			<animation effect="slide" start="0,0" end="40,0" time="400">Hidden</animation>
 			<animation effect="slide" start="0,0" end="-7,0" time="0" condition="String.IsEqual(Skin.AspectRatio,4:3)">Conditional</animation>
diff --git a/addons/skin.estouchy/xml/ViewsPVR.xml b/addons/skin.estouchy/xml/ViewsPVR.xml
index 7a89c27..d3467d7 100644
--- a/addons/skin.estouchy/xml/ViewsPVR.xml
+++ b/addons/skin.estouchy/xml/ViewsPVR.xml
@@ -182,11 +182,11 @@
 			<width>$PARAM[panel-width]</width>
 			<height>550</height>
 			<onleft>2</onleft>
-			<onright>10</onright>
+			<onright>60</onright>
 			<onup>10</onup>
 			<ondown>10</ondown>
 			<viewtype label="19069">list</viewtype>
-			<pagecontrol>10</pagecontrol>
+			<pagecontrol>60</pagecontrol>
 			<scrolltime>200</scrolltime>
 			<timeblocks>40</timeblocks>
 			<rulerunit>6</rulerunit>
diff --git a/addons/skin.estuary/addon.xml b/addons/skin.estuary/addon.xml
index 2f9fe2b..656483a 100644
--- a/addons/skin.estuary/addon.xml
+++ b/addons/skin.estuary/addon.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<addon id="skin.estuary" version="1.9.9" name="Estuary" provider-name="phil65, Ichabod Fletchman">
+<addon id="skin.estuary" version="1.9.10" name="Estuary" provider-name="phil65, Ichabod Fletchman">
 	<requires>
 		<import addon="xbmc.gui" version="5.12.0"/>
 	</requires>
@@ -14,7 +14,7 @@
 		<summary lang="af_ZA">Estuary oortreksel deur phil65. (Kodi se bestek oortreksel)</summary>
 		<summary lang="bg_BG">Estuary облик от phil65 и Piers. (стандартния облик на Kodi)</summary>
 		<summary lang="ca_ES">Aparença Estuary per phil65 i Piers. (aparença predeterminada de Kodi)</summary>
-		<summary lang="cs_CZ">Vzhled Estuary od autorů phil65 a Piers. (Výchozí vzhled Kodi)</summary>
+		<summary lang="cs_CZ">Vzhled Estuary od autora phil65. (Výchozí vzhled Kodi)</summary>
 		<summary lang="da_DK">Estuary skin. Lavet af phil65. (Kodi's standard brugerflade)</summary>
 		<summary lang="de_DE">Estuary Skin von phil65 und Piers. (Kodi Standardskin)</summary>
 		<summary lang="el_GR">Το κέλυφος Estuary από τον phil65 και τον Pier. (προεπιλεγμένο κέλυφος του Kodi)</summary>
@@ -48,7 +48,7 @@
 		<summary lang="sv_SE">Estuary-skin av phil65 och Piers. (Kodi's standard-skin)</summary>
 		<summary lang="szl">Skōra Estuary ôd phil65 i Piers. (Wychodnŏ skōra Kodi)</summary>
 		<summary lang="th_TH">สกิน Estuary โดย phil65 และ Piers (หน้าตาเริ่มต้นของKodi)</summary>
-		<summary lang="tr_TR">Estuary dış görünümü. phil65 ve Piers (Kodi'nin varsayılan dış görünümü)</summary>
+		<summary lang="tr_TR">Estuary dış görünümü. phil65 (Kodi'nin varsayılan dış görünümü)</summary>
 		<summary lang="uk_UA">Обкладинка Estuary від phil65 і Piers. (стандартна обкладинка Kodi)</summary>
 		<summary lang="zh_CN">phil65 和 Piers 开发的 Estuary 皮肤(Kodi 的默认皮肤)</summary>
 		<summary lang="zh_TW">phil65與Piers 製作的Estuary佈景主題(Kodi的預設佈景主題)</summary>
diff --git a/addons/skin.estuary/language/resource.language.cs_cz/strings.po b/addons/skin.estuary/language/resource.language.cs_cz/strings.po
index 4465a2c..e66a428 100644
--- a/addons/skin.estuary/language/resource.language.cs_cz/strings.po
+++ b/addons/skin.estuary/language/resource.language.cs_cz/strings.po
@@ -110,7 +110,7 @@ msgstr "Typ zobrazení"
 
 msgctxt "#31025"
 msgid "No favourites found. You can add any item from media views to this list by using the context menu."
-msgstr "Nenalezeny žádné oblíbené. Jakoukoliv položku ze zobrazení médií můžete přidat na tento seznam pomocí místní nabídky."
+msgstr "Nenalezeny žádné oblíbené. Na tento seznam můžete přidat jakoukoliv položku ze zobrazení médií pomocí místní nabídky."
 
 msgctxt "#31028"
 msgid "Show fanart"
@@ -154,7 +154,7 @@ msgstr "Přetočit zpět"
 
 msgctxt "#31039"
 msgid "Fast forward"
-msgstr "Rychle vpřed"
+msgstr "Přetočit vpřed"
 
 msgctxt "#31041"
 msgid "Camera manufacturer"
@@ -334,7 +334,7 @@ msgstr "Sem zadejte text..."
 
 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 "Vaše knihovna je aktuálně prázdná. Abyste ji naplnili svými médii, vstupte do sekce „Soubory“, přidejte zdroj medií a nakonfigurujte ho. Poté, co bude zdroje přidán a zaindexován, budete moci procházet svou knihovnu."
+msgstr "Vaše knihovna je aktuálně prázdná. Abyste ji naplnili svými médii, vstupte do sekce „Soubory“, přidejte zdroj medií a nakonfigurujte ho. Poté, co bude zdroj přidán a zaindexován, budete moci procházet svou knihovnu."
 
 msgctxt "#31105"
 msgid "Add video sources and set the appropriate content type in order to populate your video libraries."
@@ -442,11 +442,11 @@ msgstr "min"
 
 msgctxt "#31134"
 msgid "Remaining"
-msgstr "Zbývající"
+msgstr "Zbývá"
 
 msgctxt "#31136"
 msgid "Click here to see latest changes..."
-msgstr "Klikněte zde pro zobrazení posledních změn..."
+msgstr "Klikněte sem pro zobrazení posledních změn..."
 
 msgctxt "#31137"
 msgid "PVR info"
@@ -474,7 +474,7 @@ msgstr "Rychlost přehrávání"
 
 msgctxt "#31143"
 msgid "You did not set up PVR yet. In order to use PVR, choose a PVR client addon and configure it. Please visit http://kodi.wiki/view/PVR to learn more."
-msgstr "Zatím jste nenastavili PVR. Abyste mohli používat PVR, zvolte doplněk klienta PVR nakonfigurujte jej. Pokud chcete zjistit více, navštivte http://kodi.wiki/view/PVR."
+msgstr "Zatím jste nenastavili PVR. Abyste mohli používat PVR, zvolte doplněk klienta PVR a nakonfigurujte jej. Pokud chcete zjistit více, navštivte http://kodi.wiki/view/PVR."
 
 msgctxt "#31144"
 msgid "Enter add-on browser"
diff --git a/addons/skin.estuary/language/resource.language.hr_hr/strings.po b/addons/skin.estuary/language/resource.language.hr_hr/strings.po
index f4b5743..c457b21 100644
--- a/addons/skin.estuary/language/resource.language.hr_hr/strings.po
+++ b/addons/skin.estuary/language/resource.language.hr_hr/strings.po
@@ -22,11 +22,11 @@ msgstr "Trenutno se reproducira"
 
 msgctxt "#31001"
 msgid "Search..."
-msgstr "Traži..."
+msgstr "Pretaži..."
 
 msgctxt "#31002"
 msgid "Show media fanart as background"
-msgstr "Prikaži medija fanart kao pozadinu"
+msgstr "Prikaži poster obožavatelja medija kao pozadinu"
 
 msgctxt "#31003"
 msgid "Cinema mode"
@@ -70,7 +70,7 @@ msgstr "Naizmjenični izvođači"
 
 msgctxt "#31014"
 msgid "Unplayed albums"
-msgstr "Neslušani albumi"
+msgstr "Neodslušani albumi"
 
 msgctxt "#31015"
 msgid "Recent recordings"
@@ -110,19 +110,19 @@ msgstr "Vrsta prikaza"
 
 msgctxt "#31025"
 msgid "No favourites found. You can add any item from media views to this list by using the context menu."
-msgstr "Omiljeno nije pronađeno. Možete dodati bilo koju stavku iz medija na ovaj popis pomoću kontekstnog izbornika."
+msgstr "Omiljeno nije pronađeno. Možete dodati bilo koju stavku iz medija na ovaj popis pomoću sadržajnog izbornika."
 
 msgctxt "#31028"
 msgid "Show fanart"
-msgstr "Prikaži fanart"
+msgstr "Prikaži poster obožavatelja"
 
 msgctxt "#31029"
 msgid "Last logged in"
-msgstr "Posljednji put prijavljen"
+msgstr "Posljednji prijavljen"
 
 msgctxt "#31030"
 msgid "System memory usage"
-msgstr "Korištenje memorije sustava"
+msgstr "Korištenje memorije"
 
 msgctxt "#31031"
 msgid "Version info"
@@ -130,7 +130,7 @@ msgstr "Informacija inačice"
 
 msgctxt "#31032"
 msgid "Order"
-msgstr "Redoslijed"
+msgstr "Poredaj"
 
 msgctxt "#31033"
 msgid "Your rating"
@@ -146,7 +146,7 @@ msgstr "Stranice"
 
 msgctxt "#31036"
 msgid "items"
-msgstr "stavke"
+msgstr "stavka"
 
 msgctxt "#31038"
 msgid "Rewind"
@@ -166,7 +166,7 @@ msgstr "Mogućnosti popisa izvođenja"
 
 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 "Postavite vrstu i dodajte pravila za stvaranje pametne liste izvođenja. Te liste izvođenje su dinamičke i sadrže sve medijske stavke koje odgovaraju postavljenim pravilima. "
+msgstr "Postavite vrstu i dodajte pravila za stvaranje pametnog popisa izvođenja. Ti popisi izvođenja su promjenjivi i sadrže sve medijske stavke iz vaše baze podataka koje odgovaraju odabranim pravilima. "
 
 msgctxt "#31044"
 msgid "Add group"
@@ -186,11 +186,11 @@ msgstr "Dostupno"
 
 msgctxt "#31050"
 msgid "Press [B]OK[/B] to stop"
-msgstr "Pritisni [B]OK[/B] za kraj"
+msgstr "Pritisni [B]U redu[/B] za završetak"
 
 msgctxt "#31051"
 msgid "Toggle language"
-msgstr "Prebaci jezik"
+msgstr "Odaberi podnaslov"
 
 msgctxt "#31052"
 msgid "filtered"
@@ -202,27 +202,27 @@ msgstr "Temeljen na Arialu "
 
 msgctxt "#31054"
 msgid "Press [B]Left[/B] to rewind, or [B]Right[/B] to fast-forward"
-msgstr "Pritisni [B]Lijevo[/B] za Premotavanje unazad, ili [B]Desno[/B] za Premotavanje unaprijed"
+msgstr "Pritisni [B]Lijevu strelicu[/B] za premotavanje unazad, ili [B]Desnu strelicu[/B] za premotavanje unaprijed"
 
 msgctxt "#31056"
 msgid "Go to playlist"
-msgstr "Idi na popis za reprodukciju"
+msgstr "Idi na popis izvođenja"
 
 msgctxt "#31057"
 msgid "Show login screen on startup"
-msgstr "Prikaži zaslon prijave prilikom pokretanja"
+msgstr "Prikaži zaslon prijave pri pokretanju"
 
 msgctxt "#31058"
 msgid "Automatic Login on startup"
-msgstr "Automatska prijava prilikom pokretanja"
+msgstr "Automatska prijava pri pokretanju"
 
 msgctxt "#31061"
 msgid "Main menu items"
-msgstr "Glavne stavke izbornika"
+msgstr "Glavni izbornik"
 
 msgctxt "#31062"
 msgid "Choose weather fanart pack"
-msgstr "Izaberite fanart paket za vrijeme"
+msgstr "Odaberi paket postera obožavatelja za vrijeme"
 
 msgctxt "#31063"
 msgid "Sections"
@@ -230,11 +230,11 @@ msgstr "Dio"
 
 msgctxt "#31065"
 msgid "Video playlist"
-msgstr "Video popis za reprodukciju"
+msgstr "Video popis izvođenja"
 
 msgctxt "#31066"
 msgid "Music playlist"
-msgstr "Glazbeni popis za reprodukciju"
+msgstr "Glazbeni popis izvođenja"
 
 msgctxt "#31067"
 msgid "Event log"
@@ -250,7 +250,7 @@ msgstr "Posljednja nadopuna"
 
 msgctxt "#31071"
 msgid "by"
-msgstr "po"
+msgstr "od"
 
 msgctxt "#31072"
 msgid "Power Options"
@@ -294,11 +294,11 @@ msgstr "Video izbornik"
 
 msgctxt "#31093"
 msgid "Show weather info in top bar"
-msgstr "Prikaži informacije o vremenu u gornjoj traci"
+msgstr "Prikaži informacije vremena u gornjoj traci"
 
 msgctxt "#31095"
 msgid "Use slide animations"
-msgstr "Koristi animacije"
+msgstr "Koristi klizne animacije"
 
 msgctxt "#31096"
 msgid "Local subtitle available"
@@ -314,11 +314,11 @@ msgstr "Odaberite svoj Kodi korisnički profil[CR]za prijavu i nastavak"
 
 msgctxt "#31099"
 msgid "IconWall"
-msgstr "Ikona zid"
+msgstr "Zid ikona"
 
 msgctxt "#31100"
 msgid "Shift"
-msgstr "Pomicanje"
+msgstr "Pomak"
 
 msgctxt "#31101"
 msgid "InfoWall"
@@ -330,15 +330,15 @@ msgstr "Zid"
 
 msgctxt "#31103"
 msgid "Enter text here..."
-msgstr "Unesite tekst ovdje..."
+msgstr "Upišite tekst ovdje..."
 
 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 "Vaša zbirka je trenutno prazna. Da bi ste ju popunili sa vašim osobnim medijima, uđite u \"datoteke\", dodajte izvor medija i konfigurirajte ga. Nakon što je izvor dodan i indeksiran biti ćete u mogućnosti pregledavati vašu zbirku"
+msgstr "Vaša zbirka je trenutno prazna. Kako biste ju popunili s vašim osobnim medijima, uđite u \"Datoteke\" odjeljak, dodajte izvor medija i prilagodite ga. Nakon što je izvor dodan i popisan biti ćete u mogućnosti pregledavati svoju zbirku."
 
 msgctxt "#31105"
 msgid "Add video sources and set the appropriate content type in order to populate your video libraries."
-msgstr "Dodajte video izvor i postavite odgovarajuću vrstu sadržaja kako biste popunili svoju video zbirku."
+msgstr "Dodajte video izvor i postavite odgovarajuću vrstu sadržaja kako biste popunili svoju videoteku."
 
 msgctxt "#31106"
 msgid "Teletext"
@@ -346,19 +346,19 @@ msgstr "Teletekst"
 
 msgctxt "#31107"
 msgid "WideList"
-msgstr "Široka lista"
+msgstr "Širok popis"
 
 msgctxt "#31110"
 msgid "Enter files section"
-msgstr "Uđite u datoteke"
+msgstr "Otvori odjeljak datoteka"
 
 msgctxt "#31111"
 msgid "View your personal pictures or download one of the many image add-ons from the official repository."
-msgstr "Pogledajte svoje osobne slike ili preuzmite jedan od mnogih slikovnih dodataka iz službenog repozitorija."
+msgstr "Gledajte svoje osobne slike ili preuzmite jedan od mnogih slikovnih dodataka iz službenog repozitorija."
 
 msgctxt "#31112"
 msgid "Toggle audio stream"
-msgstr "Prebaci audio stream"
+msgstr "Odaberi zvučni zapis"
 
 msgctxt "#31113"
 msgid "Search local library"
@@ -374,7 +374,7 @@ msgstr "Pretraži TheMovieDB"
 
 msgctxt "#31116"
 msgid "Remove this main menu item"
-msgstr "Ukloni ovu stavku iz glavnog izbornika"
+msgstr "Ukloni ovu stavku glavnog izbornika"
 
 msgctxt "#31117"
 msgid "Edit nodes"
@@ -382,19 +382,19 @@ msgstr "Uredi čvorišta"
 
 msgctxt "#31118"
 msgid "Enter add-on browser"
-msgstr "Pregled dodataka"
+msgstr "Otvori pregled dodataka"
 
 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 "Nemate niti jedan dodatak instaliran. Posjetite i pregledajte našu kolekciju dodataka i poboljšajte vaše kodi iskustvo."
+msgstr "Nemate niti jedan dodatak instaliran. Posjetite naš preglednik dodataka kako bi pregledali našu kolekciju i poboljšali svoje iskustvo s Kodijem."
 
 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 "Još niste postavili pružatelja usluge o vremenu. Kako biste vidjeli informacije o vremenu, odaberite pružatelja usluge i konfigurirajte ga."
+msgstr "Još niste postavili pružatelja vremenske usluge. Kako biste vidjeli informacije o vremenu, odaberite pružatelja usluge i postavite svoju lokaciju."
 
 msgctxt "#31121"
 msgid "Set weather provider"
-msgstr "Postavi pružatelja vremenskih usluga"
+msgstr "Postavi pružatelja vremenske usluge"
 
 msgctxt "#31122"
 msgid "Unwatched TV Shows"
@@ -406,15 +406,15 @@ msgstr "Isti redatelj"
 
 msgctxt "#31124"
 msgid "Show images on map"
-msgstr "Prikaži slike ne karti"
+msgstr "Prikaži slike na karti"
 
 msgctxt "#31125"
 msgid "Press up for actor info"
-msgstr "Pritisni gore za informacije o glumcu"
+msgstr "Pritisni gornju strelicu za informacije o glumcu"
 
 msgctxt "#31126"
 msgid "Press OK to read plot"
-msgstr "Pritisni OK za čitanje zapleta"
+msgstr "Pritisni 'U redu' za čitanje kratkog sadržaja"
 
 msgctxt "#31127"
 msgid "Show icons"
@@ -426,15 +426,15 @@ msgstr "Suradnici"
 
 msgctxt "#31129"
 msgid "General settings applying to all areas of the skin."
-msgstr "Opče postavke koje se primjenjuju na sva područja presvlake"
+msgstr "Opće postavke koje se primjenjuju na sva područja presvlake."
 
 msgctxt "#31130"
 msgid "Main menu-related settings: Configure the home screen to your likings."
-msgstr "Postavke vezane za Glavni izbornik: Postavite početni zaslon kako vam odgovara"
+msgstr "Postavke glavnog izbornika: Prilagodite početni zaslon svojim potrebama."
 
 msgctxt "#31131"
 msgid "Choose skin fanart pack"
-msgstr "Izaberite fanart paket za presvlaku"
+msgstr "Odaberi paket postera obožavatelja za presvlaku"
 
 msgctxt "#31132"
 msgid "min"
@@ -446,7 +446,7 @@ msgstr "Preostalo"
 
 msgctxt "#31136"
 msgid "Click here to see latest changes..."
-msgstr "Pritisnite ovdje da bi vidjeli zadnje obavijesti..."
+msgstr "Pritisnite ovdje kako bi vidjeli najnovije promjene..."
 
 msgctxt "#31137"
 msgid "PVR info"
@@ -454,11 +454,11 @@ msgstr "PVR informacije"
 
 msgctxt "#31138"
 msgid "Player process info"
-msgstr "Informacije o izvođenju"
+msgstr "Informacije reproduktora"
 
 msgctxt "#31139"
 msgid "Video decoder"
-msgstr "Video dekoder"
+msgstr "Video dekôder"
 
 msgctxt "#31140"
 msgid "Pixel format"
@@ -466,19 +466,19 @@ msgstr "Format piksela"
 
 msgctxt "#31141"
 msgid "Changes for version"
-msgstr "Promjene za verziju"
+msgstr "Promjene u inačici"
 
 msgctxt "#31142"
 msgid "Play speed"
-msgstr "Brzina izvođenja"
+msgstr "Brzina reprodukcije"
 
 msgctxt "#31143"
 msgid "You did not set up PVR yet. In order to use PVR, choose a PVR client addon and configure it. Please visit http://kodi.wiki/view/PVR to learn more."
-msgstr "Još niste postavili PVR. Da biste koristili PVR, odaberite jedan od ponuđenih iz liste dodataka te ga konfigurirajte. Posjetite http://kodi.wiki/view/PVR kako bi saznali više."
+msgstr "Još niste postavili PVR. Kako biste koristili PVR, odaberite dodatak PVR klijenta i prilagodite ga. Posjetite http://kodi.wiki/view/PVR kako bi saznali više."
 
 msgctxt "#31144"
 msgid "Enter add-on browser"
-msgstr "Pregled dodataka"
+msgstr "Otvori pregled dodataka"
 
 msgctxt "#31145"
 msgid "Search add-ons"
@@ -490,7 +490,7 @@ msgstr "Kategorije"
 
 msgctxt "#31149"
 msgid "Select genre fanart pack"
-msgstr "Odaberite fanart paket za žanrove"
+msgstr "Odaberi paket postera obožavatelja za žanrove"
 
 msgctxt "#31150"
 msgid "Repository"
@@ -502,23 +502,23 @@ msgstr "Nepogledani glazbeni spotovi"
 
 msgctxt "#31152"
 msgid "Random music videos"
-msgstr "Nasumični glazbeni spotovi"
+msgstr "Naizmjenični glazbeni spotovi"
 
 msgctxt "#31153"
 msgid "You do not have any add-ons of this type installed. Enter the add-on browser to download add-ons created by our community."
-msgstr "Nemate niti jedan dodatak ove vrste instaliran. Uđite u preglednik dodataka kako biste preuzeli dodatke stvorene od strane naše zajednice."
+msgstr "Nemate niti jedan dodatak ove vrste instaliran. Otvorite preglednik dodataka kako biste preuzeli dodatke stvorene od strane naše zajednice."
 
 msgctxt "#31154"
 msgid "Press OK to switch between locations"
-msgstr "Pritisni OK za prebacivanje između lokacija"
+msgstr "Pritisni 'U redu' za prebacivanje između lokacija"
 
 msgctxt "#31155"
 msgid "No bookmarks created yet."
-msgstr "Zabilješke još nisu stvorene"
+msgstr "Još nema stvorenih zabilješka."
 
 msgctxt "#31156"
 msgid "Choose background pattern"
-msgstr "Odaberite pozadinski uzorak"
+msgstr "Odaberi uzorak pozadine"
 
 msgctxt "#31157"
 msgid "Edit categories"
@@ -534,7 +534,7 @@ msgstr "Ilustracije"
 
 msgctxt "#31160"
 msgid "Show media flags"
-msgstr "Prikaži medijske karakteristike"
+msgstr "Prikaži medijske oznake"
 
 msgctxt "#31161"
 msgid "Numeric pad"
diff --git a/addons/skin.estuary/language/resource.language.nl_nl/strings.po b/addons/skin.estuary/language/resource.language.nl_nl/strings.po
index 07206d3..4b4fd16 100644
--- a/addons/skin.estuary/language/resource.language.nl_nl/strings.po
+++ b/addons/skin.estuary/language/resource.language.nl_nl/strings.po
@@ -120,6 +120,10 @@ msgctxt "#31029"
 msgid "Last logged in"
 msgstr "Laatst ingelogd op"
 
+msgctxt "#31030"
+msgid "System memory usage"
+msgstr "Systeem geheugen gebruik"
+
 msgctxt "#31031"
 msgid "Version info"
 msgstr "Versie info"
@@ -308,6 +312,10 @@ msgctxt "#31098"
 msgid "Select your Kodi user profile[CR]to login and continue"
 msgstr "Selecteer jouw Kodi Gebruikersprofiel[CR]om in te loggen en door te gaan"
 
+msgctxt "#31099"
+msgid "IconWall"
+msgstr "iconenmuur"
+
 msgctxt "#31100"
 msgid "Shift"
 msgstr "Scheiden"
@@ -475,3 +483,59 @@ msgstr "Ga naar add-on verkenner"
 msgctxt "#31145"
 msgid "Search add-ons"
 msgstr "Zoek add-ons"
+
+msgctxt "#31148"
+msgid "Categories"
+msgstr "categoriën"
+
+msgctxt "#31149"
+msgid "Select genre fanart pack"
+msgstr "Selecteer genre Fanart pakket"
+
+msgctxt "#31150"
+msgid "Repository"
+msgstr "depot"
+
+msgctxt "#31151"
+msgid "Unwatched music videos"
+msgstr "Niet bekeken muziek video`s"
+
+msgctxt "#31152"
+msgid "Random music videos"
+msgstr "Willekeurige muziekvideo`s"
+
+msgctxt "#31153"
+msgid "You do not have any add-ons of this type installed. Enter the add-on browser to download add-ons created by our community."
+msgstr "U heeft nog geen enkele add-on van dit type geïnstalleerd. bezoek de add-on verkenner om add-ons te downloaden gecreëerd door onze community"
+
+msgctxt "#31154"
+msgid "Press OK to switch between locations"
+msgstr "Druk OK om de schakelen tussen locatie`s"
+
+msgctxt "#31155"
+msgid "No bookmarks created yet."
+msgstr "Nog geen bladwijzer gecreëerd "
+
+msgctxt "#31156"
+msgid "Choose background pattern"
+msgstr "Kies achtergrond patroon"
+
+msgctxt "#31157"
+msgid "Edit categories"
+msgstr "Aanpassen categorien "
+
+msgctxt "#31158"
+msgid "Touch mode"
+msgstr "Aanraak modus"
+
+msgctxt "#31159"
+msgid "Artwork"
+msgstr "Artwork"
+
+msgctxt "#31160"
+msgid "Show media flags"
+msgstr "Toon media vlaggen"
+
+msgctxt "#31161"
+msgid "Numeric pad"
+msgstr "Numeriek pad"
diff --git a/addons/skin.estuary/language/resource.language.pt_pt/strings.po b/addons/skin.estuary/language/resource.language.pt_pt/strings.po
index b26bd69..3a961e5 100644
--- a/addons/skin.estuary/language/resource.language.pt_pt/strings.po
+++ b/addons/skin.estuary/language/resource.language.pt_pt/strings.po
@@ -120,6 +120,10 @@ msgctxt "#31029"
 msgid "Last logged in"
 msgstr "Última vez ligado"
 
+msgctxt "#31030"
+msgid "System memory usage"
+msgstr "Utilização da memória do sistema"
+
 msgctxt "#31031"
 msgid "Version info"
 msgstr "Info da versão"
@@ -440,6 +444,10 @@ msgctxt "#31139"
 msgid "Video decoder"
 msgstr "Descodificador de vídeo"
 
+msgctxt "#31140"
+msgid "Pixel format"
+msgstr "Formato de píxel"
+
 msgctxt "#31141"
 msgid "Changes for version"
 msgstr "Alterações da versão"
@@ -455,3 +463,35 @@ msgstr "Entrar no navegador de add-ons"
 msgctxt "#31145"
 msgid "Search add-ons"
 msgstr "Pesquisar add-ons"
+
+msgctxt "#31148"
+msgid "Categories"
+msgstr "Categorias"
+
+msgctxt "#31150"
+msgid "Repository"
+msgstr "Repositório"
+
+msgctxt "#31151"
+msgid "Unwatched music videos"
+msgstr "Vídeos de música não vistos"
+
+msgctxt "#31152"
+msgid "Random music videos"
+msgstr "Vídeos de música aleatórios"
+
+msgctxt "#31155"
+msgid "No bookmarks created yet."
+msgstr "Ainda não foram criados marcadores."
+
+msgctxt "#31156"
+msgid "Choose background pattern"
+msgstr "Escolha o modelo de fundo"
+
+msgctxt "#31157"
+msgid "Edit categories"
+msgstr "Editar categorias"
+
+msgctxt "#31158"
+msgid "Touch mode"
+msgstr "Modo de toque"
diff --git a/addons/skin.estuary/language/resource.language.sv_se/strings.po b/addons/skin.estuary/language/resource.language.sv_se/strings.po
index 3650d68..cec310f 100644
--- a/addons/skin.estuary/language/resource.language.sv_se/strings.po
+++ b/addons/skin.estuary/language/resource.language.sv_se/strings.po
@@ -42,7 +42,7 @@ msgstr "Se i 2D"
 
 msgctxt "#31006"
 msgid "Random movies"
-msgstr "Slumpmässiga filmer"
+msgstr "Slumpvis urvalda filmer"
 
 msgctxt "#31007"
 msgid "Unwatched movies"
@@ -62,11 +62,11 @@ msgstr "Mest spelade album"
 
 msgctxt "#31012"
 msgid "Random albums"
-msgstr "Slumpmässiga album"
+msgstr "Slumpvis urvalda album"
 
 msgctxt "#31013"
 msgid "Random artists"
-msgstr "Slumpmässiga artister"
+msgstr "Slumpvis urvalda artister"
 
 msgctxt "#31014"
 msgid "Unplayed albums"
@@ -222,7 +222,7 @@ msgstr "Huvudmeny objekt"
 
 msgctxt "#31062"
 msgid "Choose weather fanart pack"
-msgstr "Välj fanart för väder"
+msgstr "Välj väder-fanart paket"
 
 msgctxt "#31063"
 msgid "Sections"
@@ -238,7 +238,7 @@ msgstr "Spellista för musik"
 
 msgctxt "#31067"
 msgid "Event log"
-msgstr "Händelselogg"
+msgstr "Eventlogg"
 
 msgctxt "#31068"
 msgid "Choose presets"
@@ -258,7 +258,7 @@ msgstr "Energialternativ"
 
 msgctxt "#31075"
 msgid "Movie sets"
-msgstr "Filmsamling"
+msgstr "Filmsamlingar"
 
 msgctxt "#31079"
 msgid "Cast not available"
@@ -398,7 +398,7 @@ msgstr "Ställ in väderleksleverantör"
 
 msgctxt "#31122"
 msgid "Unwatched TV Shows"
-msgstr "O-sedda TV-program"
+msgstr "Osedda TV-program"
 
 msgctxt "#31123"
 msgid "Same director"
@@ -502,7 +502,7 @@ msgstr "Osedda musikvideor"
 
 msgctxt "#31152"
 msgid "Random music videos"
-msgstr "Slumpvis musikvideor"
+msgstr "Slumpvis urvalda musikvideor"
 
 msgctxt "#31153"
 msgid "You do not have any add-ons of this type installed. Enter the add-on browser to download add-ons created by our community."
diff --git a/addons/skin.estuary/xml/AddonBrowser.xml b/addons/skin.estuary/xml/AddonBrowser.xml
index f3ee214..dd211bc 100644
--- a/addons/skin.estuary/xml/AddonBrowser.xml
+++ b/addons/skin.estuary/xml/AddonBrowser.xml
@@ -63,7 +63,7 @@
 			<control type="group">
 				<height>78</height>
 				<bottom>0</bottom>
-				<visible>$EXP[sidebar_focused]</visible>
+				<visible>$EXP[sidebar_visible]</visible>
 				<animation effect="fade" time="300">VisibleChange</animation>
 				<include content="LeftAlignedInfo">
 					<param name="main_label" value="$INFO[Window(AddonBrowser).Property(Updated)]" />
diff --git a/addons/skin.estuary/xml/Constants_1920.xml b/addons/skin.estuary/xml/Constants_1920.xml
index d85f2d5..f9b714b 100644
--- a/addons/skin.estuary/xml/Constants_1920.xml
+++ b/addons/skin.estuary/xml/Constants_1920.xml
@@ -7,5 +7,5 @@
 	<constant name="tvrecordings_width">1060</constant>
 	<constant name="eventloglist_width">1430</constant>
 	<constant name="playlisteditorlist_width">770</constant>
-	<constant name="playlistlist_width">904</constant>
+	<constant name="playlistlist_width">896</constant>
 </includes>
diff --git a/addons/skin.estuary/xml/Constants_2560.xml b/addons/skin.estuary/xml/Constants_2560.xml
index fea8fc5..ba83217 100644
--- a/addons/skin.estuary/xml/Constants_2560.xml
+++ b/addons/skin.estuary/xml/Constants_2560.xml
@@ -7,5 +7,5 @@
 	<constant name="tvrecordings_width">1700</constant>
 	<constant name="eventloglist_width">2070</constant>
 	<constant name="playlisteditorlist_width">1410</constant>
-	<constant name="playlistlist_width">1544</constant>
+	<constant name="playlistlist_width">1536</constant>
 </includes>
diff --git a/addons/skin.estuary/xml/DialogMusicInfo.xml b/addons/skin.estuary/xml/DialogMusicInfo.xml
index 4f895ab..08940cc 100644
--- a/addons/skin.estuary/xml/DialogMusicInfo.xml
+++ b/addons/skin.estuary/xml/DialogMusicInfo.xml
@@ -31,7 +31,7 @@
 					<height>567</height>
 					<aspectratio aligny="top">scale</aspectratio>
 					<fadetime>300</fadetime>
-					<texture background="true" fallback="DefaultAudio.png">$INFO[ListItem.Art(thumb)]</texture>
+					<texture background="true">$VAR[MusicInfoThumbVar]</texture>
 				</control>
 			</control>
 			<control type="group">
diff --git a/addons/skin.estuary/xml/Home.xml b/addons/skin.estuary/xml/Home.xml
index 3159d2c..16187cc 100644
--- a/addons/skin.estuary/xml/Home.xml
+++ b/addons/skin.estuary/xml/Home.xml
@@ -541,7 +541,7 @@
 								<texture border="21">dialogs/dialog-bg.png</texture>
 							</control>
 							<control type="label">
-								<left>300</left>
+								<left>840</left>
 								<top>60</top>
 								<aligny>center</aligny>
 								<height>24</height>
@@ -551,7 +551,7 @@
 								<label>$INFO[Weather.Location]</label>
 							</control>
 							<control type="label">
-								<left>300</left>
+								<left>840</left>
 								<top>120</top>
 								<aligny>center</aligny>
 								<height>24</height>
diff --git a/addons/skin.estuary/xml/Includes.xml b/addons/skin.estuary/xml/Includes.xml
index 03935c9..9d297c8 100644
--- a/addons/skin.estuary/xml/Includes.xml
+++ b/addons/skin.estuary/xml/Includes.xml
@@ -34,7 +34,7 @@
 	<constant name="list_y_offset">0</constant>
 	<constant name="list_item_height">80</constant>
 	<expression name="infodialog_active">Window.IsActive(musicinformation) | Window.IsActive(songinformation) | Window.IsActive(movieinformation) | Window.IsActive(addoninformation) | Window.IsActive(pvrguideinfo) | Window.IsActive(pvrrecordinginfo) | Window.IsActive(pictureinfo) | Window.IsVisible(script-script.extendedinfo-DialogVideoInfo.xml) | Window.IsVisible(script-script.extendedinfo-DialogInfo.xml) | Window.IsVisible(script-script.extendedinfo-VideoList.xml)</expression>
-	<expression name="sidebar_focused">ControlGroup(9000).HasFocus | Control.HasFocus(6130)</expression>
+	<expression name="sidebar_visible">ControlGroup(9000).HasFocus | Control.HasFocus(6130) | Window.IsActive(MyPlaylist.xml)</expression>
 	<include name="CommonScrollbars">
 		<control type="group">
 			<animation effect="fade" start="100" end="0" time="150">WindowClose</animation>
@@ -320,6 +320,7 @@
 					<font>$PARAM[font]</font>
 					<aligny>center</aligny>
 					<label>$INFO[ListItem.Label]</label>
+					<scroll>true</scroll>
 				</control>
 			</focusedlayout>
 		</definition>
diff --git a/addons/skin.estuary/xml/Includes_MediaMenu.xml b/addons/skin.estuary/xml/Includes_MediaMenu.xml
index baa5f59..650121f 100644
--- a/addons/skin.estuary/xml/Includes_MediaMenu.xml
+++ b/addons/skin.estuary/xml/Includes_MediaMenu.xml
@@ -200,7 +200,7 @@
 						<onleft>14100</onleft>
 						<onup>8</onup>
 						<ondown>6056</ondown>
-						<visible>Player.HasMedia + [$EXP[sidebar_focused]]</visible>
+						<visible>Player.HasMedia + [$EXP[sidebar_visible]]</visible>
 						<visible>!System.HasModalDialog</visible>
 						<include content="BottomMainMenuToggleItem">
 							<param name="control_id" value="14101" />
@@ -243,7 +243,7 @@
 		<include>OpenClose_Left</include>
 		<depth>DepthSideBlade</depth>
 		<left>-520</left>
-		<animation type="Conditional" condition="$EXP[sidebar_focused]" reversible="true">
+		<animation type="Conditional" condition="$EXP[sidebar_visible]" reversible="true">
 			<effect type="slide" start="0" end="520" time="400" tween="cubic" easing="out" />
 		</animation>
 		<control type="image">
@@ -251,7 +251,7 @@
 			<height>100%</height>
 			<aspectratio>scale</aspectratio>
 			<texture colordiffuse="80FFFFFF">colors/black.png</texture>
-			<visible>$EXP[sidebar_focused] + !System.HasModalDialog</visible>
+			<visible>$EXP[sidebar_visible] + !System.HasModalDialog</visible>
 			<animation effect="fade" time="200">VisibleChange</animation>
 		</control>
 		<control type="image">
@@ -271,41 +271,44 @@
 		</control>
 	</include>
 	<include name="MediaMenuNowPlaying">
-		<control type="grouplist" id="14100">
-			<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="300">VisibleChange</animation>
-			<orientation>horizontal</orientation>
-			<itemgap>-17</itemgap>
-			<left>5</left>
-			<onleft>14100</onleft>
-			<width>450</width>
-			<visible>Player.HasMedia + [$EXP[sidebar_focused]]</visible>
-			<visible>!System.HasModalDialog</visible>
-			<include content="BottomMainMenuToggleItem">
-				<param name="control_id" value="14101" />
-				<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="IconButton">
-				<param name="control_id" value="14102" />
-				<param name="onclick" value="Stop" />
-				<param name="onclick_2" value="SetFocus(50)" />
-				<param name="icon" value="icons/now-playing/stop.png" />
-			</include>
-			<include content="IconButton">
-				<param name="control_id" value="14104" />
-				<param name="onclick" value="PlayerControl(Next)" />
-				<param name="icon" value="icons/now-playing/next.png" />
-			</include>
-			<include content="IconButton">
-				<param name="control_id" value="14105" />
-				<param name="onclick" value="Fullscreen" />
-				<param name="icon" value="icons/now-playing/fullscreen.png" />
-			</include>
-		</control>
+        <param name="left">5</param>
+		<definition>
+			<control type="grouplist" id="14100">
+				<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="300">VisibleChange</animation>
+				<orientation>horizontal</orientation>
+				<itemgap>-17</itemgap>
+				<left>$PARAM[left]</left>
+				<onleft>14100</onleft>
+				<width>450</width>
+				<visible>Player.HasMedia + [$EXP[sidebar_visible]]</visible>
+				<visible>!System.HasModalDialog</visible>
+				<include content="BottomMainMenuToggleItem">
+					<param name="control_id" value="14101" />
+					<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="IconButton">
+					<param name="control_id" value="14102" />
+					<param name="onclick" value="Stop" />
+					<param name="onclick_2" value="SetFocus(50)" />
+					<param name="icon" value="icons/now-playing/stop.png" />
+				</include>
+				<include content="IconButton">
+					<param name="control_id" value="14104" />
+					<param name="onclick" value="PlayerControl(Next)" />
+					<param name="icon" value="icons/now-playing/next.png" />
+				</include>
+				<include content="IconButton">
+					<param name="control_id" value="14105" />
+					<param name="onclick" value="Fullscreen" />
+					<param name="icon" value="icons/now-playing/fullscreen.png" />
+				</include>
+			</control>
+		</definition>
 	</include>
 	<include name="MediaMenuListCommon">
 		<definition>
@@ -345,7 +348,6 @@
 			</control>
 			<control type="button" id="19">
 				<visible>Container.CanFilter + !Container.CanFilterAdvanced</visible>
-				<visible>!Container.Content()</visible>
 				<include>MediaMenuItemsCommon</include>
 				<label>$LOCALIZE[137]</label>
 			</control>
diff --git a/addons/skin.estuary/xml/MusicOSD.xml b/addons/skin.estuary/xml/MusicOSD.xml
index 73dee70..bf74ff7 100644
--- a/addons/skin.estuary/xml/MusicOSD.xml
+++ b/addons/skin.estuary/xml/MusicOSD.xml
@@ -173,7 +173,8 @@
 			</control>
 		</control>
 		<control type="group">
-			<top>960</top>
+			<bottom>0</bottom>
+			<height>120</height>
 			<animation effect="fade" start="0" end="100" time="250">WindowOpen</animation>
 			<animation effect="fade" start="100" end="0" time="250">WindowClose</animation>
 			<control type="button" id="87">
diff --git a/addons/skin.estuary/xml/MyPlaylist.xml b/addons/skin.estuary/xml/MyPlaylist.xml
index 51361f0..f66dc10 100644
--- a/addons/skin.estuary/xml/MyPlaylist.xml
+++ b/addons/skin.estuary/xml/MyPlaylist.xml
@@ -10,9 +10,9 @@
 			<control type="group">
 				<include>OpenClose_Left</include>
 				<control type="fixedlist" id="50">
-					<left>402</left>
+					<left>410</left>
 					<top>list_y_offset</top>
-					<right>594</right>
+					<right>586</right>
 					<bottom>list_y_offset</bottom>
 					<scrolltime tween="cubic" easing="out">500</scrolltime>
 					<orientation>vertical</orientation>
@@ -79,7 +79,7 @@
 				<control type="group">
 					<depth>DepthContentPanel</depth>
 					<include content="ContentPanel">
-						<param name="width" value="462" />
+						<param name="width" value="470" />
 					</include>
 					<control type="grouplist" id="700">
 						<orientation>vertical</orientation>
@@ -90,9 +90,9 @@
 						<ondown>700</ondown>
 						<onleft>50</onleft>
 						<onright>50</onright>
-						<width>402</width>
+						<width>410</width>
 						<control type="radiobutton" id="20">
-							<width>402</width>
+							<width>410</width>
 							<height>110</height>
 							<align>left</align>
 							<aligny>top</aligny>
@@ -115,6 +115,9 @@
 							<param name="control_id" value="22" />
 							<param name="label" value="$LOCALIZE[192]" />
 						</include>
+						<include content="MediaMenuNowPlaying">
+							<param name="left" value="-5" />
+						</include>
 					</control>
 				</control>
 			</control>
diff --git a/addons/skin.estuary/xml/MyVideoNav.xml b/addons/skin.estuary/xml/MyVideoNav.xml
index 8b2b8f8..ea67f8e 100644
--- a/addons/skin.estuary/xml/MyVideoNav.xml
+++ b/addons/skin.estuary/xml/MyVideoNav.xml
@@ -138,7 +138,7 @@
 						<include>MediaMenuItemsCommon</include>
 						<label>$LOCALIZE[31056]</label>
 						<onclick>ActivateWindow(videoplaylist)</onclick>
-						<visible>IntegerGreaterThan(Playlist.Length(video),0)</visible>
+						<visible>Integer.IsGreater(Playlist.Length(video),0)</visible>
 					</control>
 					<control type="button" id="621">
 						<description>Get more</description>
diff --git a/addons/skin.estuary/xml/Variables.xml b/addons/skin.estuary/xml/Variables.xml
index a1f306b..f41d2bd 100644
--- a/addons/skin.estuary/xml/Variables.xml
+++ b/addons/skin.estuary/xml/Variables.xml
@@ -65,6 +65,12 @@
 		<value condition="ListItem.IsFolder + String.IsEmpty(ListItem.Thumb)">DefaultFolderSquare.png</value>
 		<value>$INFO[ListItem.Thumb]</value>
 	</variable>
+	<variable name="MusicInfoThumbVar">
+		<value condition="!String.IsEmpty(Listitem.Art(thumb))">$INFO[Listitem.Art(thumb)]</value>
+		<value condition="String.IsEqual(listitem.dbtype,artist)">DefaultArtist.png</value>
+		<value condition="String.IsEqual(listitem.dbtype,album)">DefaultAlbumCover.png</value>
+		<value>DefaultAudio.png</value>
+	</variable>
 	<variable name="InfoWallThumbVar">
 		<value condition="!String.IsEmpty(Listitem.Art(poster))">$INFO[Listitem.Art(poster)]</value>
 		<value>$INFO[ListItem.Icon]</value>
diff --git a/addons/skin.estuary/xml/View_51_Poster.xml b/addons/skin.estuary/xml/View_51_Poster.xml
index 25ffb60..3fb4209 100644
--- a/addons/skin.estuary/xml/View_51_Poster.xml
+++ b/addons/skin.estuary/xml/View_51_Poster.xml
@@ -112,6 +112,7 @@
 						<autoscroll time="3000" delay="7000" repeat="5000">!System.HasModalDialog + Skin.HasSetting(AutoScroll)</autoscroll>
 						<label>$INFO[ListItem.Plot]</label>
 						<shadowcolor>text_shadow</shadowcolor>
+						<visible>!ListItem.IsCollection</visible>
 					</control>
 				</control>
 			</control>
diff --git a/addons/skin.estuary/xml/View_55_WideList.xml b/addons/skin.estuary/xml/View_55_WideList.xml
index 7ae0346..c567df7 100644
--- a/addons/skin.estuary/xml/View_55_WideList.xml
+++ b/addons/skin.estuary/xml/View_55_WideList.xml
@@ -37,7 +37,7 @@
 						<aligny>center</aligny>
 						<label>$INFO[ListItem.Year]</label>
 						<shadowcolor>text_shadow</shadowcolor>
-						<visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies)</visible>
+						<visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies) + !Container.Content(videos)</visible>
 					</control>
 					<control type="image">
 						<left>35</left>
@@ -45,7 +45,7 @@
 						<width>32</width>
 						<height>32</height>
 						<texture>$VAR[ListWatchedIconVar]</texture>
-						<visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | String.IsEmpty(ListItem.Year)</visible>
+						<visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | Container.Content(videos) | String.IsEmpty(ListItem.Year)</visible>
 					</control>
 					<control type="label">
 						<left>105</left>
@@ -78,7 +78,7 @@
 						<label>$INFO[ListItem.Year]</label>
 						<textcolor>button_focus</textcolor>
 						<shadowcolor>text_shadow</shadowcolor>
-						<visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies)</visible>
+						<visible>!Container.Content(tvshows) + !Container.Content(seasons) + !Container.Content(episodes) + !Container.Content(movies) + !Container.Content(videos)</visible>
 					</control>
 					<control type="image">
 						<left>35</left>
@@ -86,7 +86,7 @@
 						<width>32</width>
 						<height>32</height>
 						<texture colordiffuse="grey">$VAR[ListWatchedIconVar]</texture>
-						<visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | String.IsEmpty(ListItem.Year)</visible>
+						<visible>Container.Content(tvshows) | Container.Content(seasons) | Container.Content(episodes) | Container.Content(movies) | Container.Content(videos) | String.IsEmpty(ListItem.Year)</visible>
 					</control>
 					<control type="label">
 						<left>105</left>
diff --git a/codegenerator.mk b/codegenerator.mk
index 5f8bdd9..dc93280 100644
--- a/codegenerator.mk
+++ b/codegenerator.mk
@@ -69,3 +69,4 @@ else
 #build json builder - ".." because makefile is in the parent dir of "bin"
 	$(MAKE) -C $(abspath $(@D)/..)
 endif
+$(shell touch $(TOPDIR)/xbmc/cores/AudioEngine/AEDefines_override.h)
diff --git a/configure.ac b/configure.ac
index 7a10705..b9bbe74 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.903], [http://trac.kodi.tv])
+AC_INIT([kodi], [16.9.904], [http://trac.kodi.tv])
 AC_CONFIG_HEADERS([xbmc/config.h])
 AH_TOP([#pragma once])
 m4_include([m4/ax_prog_cc_for_build.m4])
diff --git a/media/banner.png b/media/banner.png
index e67c5cc..e3a0b26 100644
Binary files a/media/banner.png and b/media/banner.png differ
diff --git a/media/icon120x120.png b/media/icon120x120.png
index 45bdb7f..ea99e64 100644
Binary files a/media/icon120x120.png and b/media/icon120x120.png differ
diff --git a/media/icon256x256.png b/media/icon256x256.png
index 87f1bf4..d958660 100644
Binary files a/media/icon256x256.png and b/media/icon256x256.png differ
diff --git a/project/cmake/CMakeLists.txt b/project/cmake/CMakeLists.txt
index aecda36..504e4c0 100644
--- a/project/cmake/CMakeLists.txt
+++ b/project/cmake/CMakeLists.txt
@@ -103,7 +103,7 @@ list(APPEND DEPLIBS ${CMAKE_THREAD_LIBS_INIT})
 
 # Required dependencies
 set(required_deps Sqlite3 FreeType PCRE Cpluff LibDvd
-                  TinyXML Python Yajl
+                  TinyXML Python Yajl Cdio
                   Lzo2 Fribidi TagLib FFMPEG CrossGUID)
 if(NOT WIN32)
   list(APPEND required_deps ZLIB)
@@ -171,7 +171,6 @@ endif()
 
 if(ENABLE_OPTICAL)
   list(APPEND DEP_DEFINES -DHAS_DVD_DRIVE)
-  core_require_dep(Cdio)
 endif()
 
 if(ENABLE_LIRC)
diff --git a/project/cmake/addons/bootstrap/CMakeLists.txt b/project/cmake/addons/bootstrap/CMakeLists.txt
index c20b97e..66b7e3d 100644
--- a/project/cmake/addons/bootstrap/CMakeLists.txt
+++ b/project/cmake/addons/bootstrap/CMakeLists.txt
@@ -50,7 +50,6 @@ function(bootstrap_repo repo_id repo_url repo_revision)
                                       -DCMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}
                                       -DPROJECT_SOURCE_DIR=<SOURCE_DIR>
                                       -DCMAKE_INSTALL_PREFIX=${CMAKE_INSTALL_PREFIX}
-                                      -DADDONS_TO_BUILD=${ADDONS_TO_BUILD}
                                       -P ${PROJECT_SOURCE_DIR}/Bootstrap.cmake
                       )
 endfunction()
diff --git a/project/cmake/installdata/common/common.txt b/project/cmake/installdata/common/common.txt
index c1e52f0..a9d1923 100644
--- a/project/cmake/installdata/common/common.txt
+++ b/project/cmake/installdata/common/common.txt
@@ -2,7 +2,6 @@ media/*
 sounds/*
 system/keymaps/*
 system/library/*
-system/players/VideoPlayer/etc/*
 system/shaders/*
 system/settings/*
 userdata/*
diff --git a/project/cmake/installdata/ios/fontconfig.txt b/project/cmake/installdata/ios/fontconfig.txt
new file mode 100644
index 0000000..1f1bd9d
--- /dev/null
+++ b/project/cmake/installdata/ios/fontconfig.txt
@@ -0,0 +1 @@
+system/players/VideoPlayer/etc/*
diff --git a/project/cmake/modules/FindLibDvd.cmake b/project/cmake/modules/FindLibDvd.cmake
index 59c6f96..a083ddc 100644
--- a/project/cmake/modules/FindLibDvd.cmake
+++ b/project/cmake/modules/FindLibDvd.cmake
@@ -123,9 +123,9 @@ if(NOT WIN32)
       set_target_properties(dvdcss PROPERTIES FOLDER "External Projects")
     endif()
 
-    set(DVDREAD_CFLAGS "-D_XBMC")
+    set(DVDREAD_CFLAGS "-D_XBMC -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include")
     if(ENABLE_DVDCSS)
-      set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -DHAVE_DVDCSS_DVDCSS_H -I${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/include")
+      set(DVDREAD_CFLAGS "${DVDREAD_CFLAGS} -DHAVE_DVDCSS_DVDCSS_H")
     endif()
 
     set(DVDREAD_LIBRARY ${CMAKE_BINARY_DIR}/${CORE_BUILD_DIR}/libdvd/lib/libdvdread.a)
diff --git a/project/cmake/scripts/common/Macros.cmake b/project/cmake/scripts/common/Macros.cmake
index 17ab1aa..d8cdce9 100644
--- a/project/cmake/scripts/common/Macros.cmake
+++ b/project/cmake/scripts/common/Macros.cmake
@@ -584,6 +584,7 @@ function(core_find_git_rev stamp)
   else()
     find_package(Git)
     if(GIT_FOUND AND EXISTS ${CORE_SOURCE_DIR}/.git)
+      execute_process(COMMAND ${GIT_EXECUTABLE} update-index --ignore-submodules --refresh -q)
       execute_process(COMMAND ${GIT_EXECUTABLE} diff-files --ignore-submodules --quiet --
                       RESULT_VARIABLE status_code
                       WORKING_DIRECTORY ${CORE_SOURCE_DIR})
@@ -653,9 +654,9 @@ macro(core_find_versions)
   set(APP_VERSION ${APP_VERSION_MAJOR}.${APP_VERSION_MINOR})
   if(APP_VERSION_TAG)
     set(APP_VERSION ${APP_VERSION}-${APP_VERSION_TAG})
+    string(TOLOWER ${APP_VERSION_TAG} APP_VERSION_TAG_LC)
   endif()
   string(REPLACE "." "," FILE_VERSION ${APP_ADDON_API}.0)
-  string(TOLOWER ${APP_VERSION_TAG} APP_VERSION_TAG_LC)
   file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version REGEX "^.*GUILIB_API_VERSION (.*)$")
   string(REGEX REPLACE ".*\"(.*)\"" "\\1" guilib_version ${guilib_version})
   file(STRINGS ${CORE_SOURCE_DIR}/xbmc/addons/kodi-addon-dev-kit/include/kodi/libKODI_guilib.h guilib_version_min REGEX "^.*GUILIB_MIN_API_VERSION (.*)$")
diff --git a/cmake/scripts/rbpi/ExtraTargets.cmake b/project/cmake/scripts/rbpi/ExtraTargets.cmake
similarity index 100%
rename from cmake/scripts/rbpi/ExtraTargets.cmake
rename to project/cmake/scripts/rbpi/ExtraTargets.cmake
diff --git a/system/settings/settings.xml b/system/settings/settings.xml
index c3804da..f28f5da 100644
--- a/system/settings/settings.xml
+++ b/system/settings/settings.xml
@@ -581,6 +581,11 @@
     </category>
     <category id="pictures" label="14217" help="38105">
       <group id="1" label="108">
+        <setting id="pictures.usetags" type="boolean" label="38207" help="38208">
+          <level>1</level>
+          <default>true</default>
+          <control type="toggle" />
+        </setting>
         <setting id="slideshow.staytime" type="integer" label="12378" help="36312">
           <level>0</level>
           <default>5</default>
@@ -665,13 +670,24 @@
           <control type="spinner" format="integer" delayed="true"/>
         </setting>
         <setting id="subtitles.font" type="string" label="14089" help="36185">
-          <level>3</level>
+          <level>1</level>
           <default>arial.ttf</default>
           <constraints>
             <options>fonts</options>
           </constraints>
           <control type="list" format="string" />
         </setting>
+        <setting id="subtitles.charset" type="string" parent="subtitles.font" label="735" help="36189">
+          <level>1</level>
+          <default>DEFAULT</default>
+          <constraints>
+            <options>charsets</options>
+          </constraints>
+          <dependencies>
+            <dependency type="enable" on="property" name="IsUsingTTFSubtitles" setting="subtitles.font" />
+          </dependencies>
+          <control type="list" format="string" />
+        </setting>
         <setting id="subtitles.height" type="integer" parent="subtitles.font" label="289" help="36186">
           <level>3</level>
           <default>28</default>
@@ -721,17 +737,6 @@
           </dependencies>
           <control type="list" format="string" />
         </setting>
-        <setting id="subtitles.charset" type="string" parent="subtitles.font" label="735" help="36189">
-          <level>3</level>
-          <default>DEFAULT</default>
-          <constraints>
-            <options>charsets</options>
-          </constraints>
-          <dependencies>
-            <dependency type="enable" on="property" name="IsUsingTTFSubtitles" setting="subtitles.font" />
-          </dependencies>
-          <control type="list" format="string" />
-        </setting>
         <setting id="subtitles.overrideassfonts" type="boolean" label="21368" help="36190">
           <level>3</level>
           <default>false</default>
diff --git a/tools/android/packaging/Makefile.in b/tools/android/packaging/Makefile.in
index b34fa6c..fb8b20b 100644
--- a/tools/android/packaging/Makefile.in
+++ b/tools/android/packaging/Makefile.in
@@ -117,6 +117,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 $(CORE_SOURCE_DIR)/media/Splash.png xbmc/res/drawable-xxxhdpi/splash.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/
diff --git a/tools/android/packaging/media/drawable-xhdpi/banner.png b/tools/android/packaging/media/drawable-xhdpi/banner.png
index e67c5cc..e3a0b26 100644
Binary files a/tools/android/packaging/media/drawable-xhdpi/banner.png and b/tools/android/packaging/media/drawable-xhdpi/banner.png differ
diff --git a/tools/darwin/packaging/media/osx/background/DiskImageBackgroundKodi.png b/tools/darwin/packaging/media/osx/background/DiskImageBackgroundKodi.png
index a41c8f2..a13c658 100644
Binary files a/tools/darwin/packaging/media/osx/background/DiskImageBackgroundKodi.png and b/tools/darwin/packaging/media/osx/background/DiskImageBackgroundKodi.png differ
diff --git a/version.txt b/version.txt
index 12205dc..2247469 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 RC3
-VERSION_CODE 169903
-ADDON_API 16.9.903
+VERSION_TAG RC4
+VERSION_CODE 169904
+ADDON_API 16.9.904
 
 # Notes:
 # Change AC_INIT in configure.ac
diff --git a/xbmc/Application.cpp b/xbmc/Application.cpp
index 620366e..c6ef0c0 100644
--- a/xbmc/Application.cpp
+++ b/xbmc/Application.cpp
@@ -960,6 +960,10 @@ bool CApplication::InitDirectoriesOSX()
   else
     userHome = "/root";
 
+  std::string binaddonAltDir;
+  if (getenv("KODI_BINADDON_PATH"))
+    binaddonAltDir = getenv("KODI_BINADDON_PATH");
+
   std::string appPath = CUtil::GetHomePath();
   setenv("KODI_HOME", appPath.c_str(), 0);
 
@@ -978,6 +982,7 @@ bool CApplication::InitDirectoriesOSX()
   {
     // map our special drives
     CSpecialProtocol::SetXBMCBinPath(appPath);
+    CSpecialProtocol::SetXBMCAltBinAddonPath(binaddonAltDir);
     CSpecialProtocol::SetXBMCPath(appPath);
     #if defined(TARGET_DARWIN_IOS)
       std::string appName = CCompileInfo::GetAppName();
@@ -1015,6 +1020,7 @@ bool CApplication::InitDirectoriesOSX()
     URIUtils::AddSlashAtEnd(appPath);
 
     CSpecialProtocol::SetXBMCBinPath(appPath);
+    CSpecialProtocol::SetXBMCAltBinAddonPath(binaddonAltDir);
     CSpecialProtocol::SetXBMCPath(appPath);
     CSpecialProtocol::SetHomePath(URIUtils::AddFileToFolder(appPath, "portable_data"));
     CSpecialProtocol::SetMasterProfilePath(URIUtils::AddFileToFolder(appPath, "portable_data/userdata"));
@@ -4649,6 +4655,11 @@ const std::string& CApplication::CurrentFile()
   return m_itemCurrentFile->GetPath();
 }
 
+std::shared_ptr<CFileItem> CApplication::CurrentFileItemPtr()
+{
+  return m_itemCurrentFile;
+}
+
 CFileItem& CApplication::CurrentFileItem()
 {
   return *m_itemCurrentFile;
diff --git a/xbmc/Application.h b/xbmc/Application.h
index 580fdce..8d5876e 100644
--- a/xbmc/Application.h
+++ b/xbmc/Application.h
@@ -164,6 +164,7 @@ public:
   void ReloadSkin(bool confirm = false);
   const std::string& CurrentFile();
   CFileItem& CurrentFileItem();
+  std::shared_ptr<CFileItem> CurrentFileItemPtr();
   void SetCurrentFileItem(const CFileItem &item);
   CFileItem& CurrentUnstackedItem();
   virtual bool OnMessage(CGUIMessage& message) override;
diff --git a/xbmc/ContextMenuManager.cpp b/xbmc/ContextMenuManager.cpp
index 4329c54..9268872 100644
--- a/xbmc/ContextMenuManager.cpp
+++ b/xbmc/ContextMenuManager.cpp
@@ -43,7 +43,13 @@ CContextMenuManager::CContextMenuManager(CAddonMgr& addonMgr)
 
 CContextMenuManager::~CContextMenuManager()
 {
+  Deinit();
+}
+
+void CContextMenuManager::Deinit()
+{
   m_addonMgr.Events().Unsubscribe(this);
+  m_items.clear();
 }
 
 CContextMenuManager& CContextMenuManager::GetInstance()
diff --git a/xbmc/ContextMenuManager.h b/xbmc/ContextMenuManager.h
index 3a96b8a..7f613b1 100644
--- a/xbmc/ContextMenuManager.h
+++ b/xbmc/ContextMenuManager.h
@@ -40,6 +40,7 @@ public:
   static CContextMenuManager& GetInstance();
 
   void Init();
+  void Deinit();
 
   ContextMenuView GetItems(const CFileItem& item, const CContextMenuItem& root = MAIN) const;
 
diff --git a/xbmc/addons/AddonDatabase.cpp b/xbmc/addons/AddonDatabase.cpp
index 4750b42..d6c4e85 100644
--- a/xbmc/addons/AddonDatabase.cpp
+++ b/xbmc/addons/AddonDatabase.cpp
@@ -133,7 +133,7 @@ int CAddonDatabase::GetMinSchemaVersion() const
 
 int CAddonDatabase::GetSchemaVersion() const
 {
-  return 26;
+  return 27;
 }
 
 void CAddonDatabase::CreateTables()
@@ -146,6 +146,7 @@ void CAddonDatabase::CreateTables()
       "version TEXT NOT NULL,"
       "name TEXT NOT NULL,"
       "summary TEXT NOT NULL,"
+      "news TEXT NOT NULL,"
       "description TEXT NOT NULL)");
 
   CLog::Log(LOGINFO, "create repo table");
@@ -301,6 +302,10 @@ void CAddonDatabase::UpdateTables(int version)
         "summary TEXT NOT NULL,"
         "description TEXT NOT NULL)");
   }
+  if (version < 27)
+  {
+    m_pDS->exec("ALTER TABLE addons ADD news TEXT NOT NULL DEFAULT ''");
+  }
 }
 
 void CAddonDatabase::SyncInstalled(const std::set<std::string>& ids,
@@ -478,7 +483,7 @@ bool CAddonDatabase::FindByAddonId(const std::string& addonId, ADDON::VECADDONS&
     if (NULL == m_pDS.get()) return false;
 
     std::string sql = PrepareSQL(
-        "SELECT addons.version, addons.name, addons.summary, addons.description, addons.metadata,"
+        "SELECT addons.version, addons.name, addons.summary, addons.description, addons.metadata, addons.news,"
         "repo.addonID AS repoID FROM addons "
         "JOIN addonlinkrepo ON addonlinkrepo.idAddon=addons.id "
         "JOIN repo ON repo.id=addonlinkrepo.idRepo "
@@ -498,7 +503,8 @@ bool CAddonDatabase::FindByAddonId(const std::string& addonId, ADDON::VECADDONS&
       builder.SetSummary(m_pDS->fv(2).get_asString());
       builder.SetDescription(m_pDS->fv(3).get_asString());
       DeserializeMetadata(m_pDS->fv(4).get_asString(), builder);
-      builder.SetOrigin(m_pDS->fv(5).get_asString());
+      builder.SetChangelog(m_pDS->fv(5).get_asString());
+      builder.SetOrigin(m_pDS->fv(6).get_asString());
 
       auto addon = builder.Build();
       if (addon)
@@ -792,14 +798,15 @@ bool CAddonDatabase::UpdateRepositoryContent(const std::string& repository, cons
     for (const auto& addon : addons)
     {
       m_pDS->exec(PrepareSQL(
-          "INSERT INTO addons (id, metadata, addonID, version, name, summary, description) "
-          "VALUES (NULL, '%s', '%s', '%s', '%s','%s', '%s')",
+          "INSERT INTO addons (id, metadata, addonID, version, name, summary, description, news) "
+          "VALUES (NULL, '%s', '%s', '%s', '%s','%s', '%s','%s')",
           SerializeMetadata(*addon).c_str(),
           addon->ID().c_str(),
           addon->Version().asString().c_str(),
           addon->Name().c_str(),
           addon->Summary().c_str(),
-          addon->Description().c_str()));
+          addon->Description().c_str(),
+          addon->ChangeLog().c_str()));
 
       auto idAddon = m_pDS->lastinsertid();
       if (idAddon <= 0)
diff --git a/xbmc/addons/FilesystemInstaller.cpp b/xbmc/addons/FilesystemInstaller.cpp
index bd4a931..81b83e4 100644
--- a/xbmc/addons/FilesystemInstaller.cpp
+++ b/xbmc/addons/FilesystemInstaller.cpp
@@ -26,8 +26,35 @@
 #include "utils/StringUtils.h"
 #include "utils/URIUtils.h"
 
+#ifdef TARGET_POSIX
+#include "XTimeUtils.h"
+#endif
+
 using namespace XFILE;
 
+namespace
+{
+
+bool renameOrRetry(const std::string & source, const std::string & dest, const char * description)
+{
+  auto count = 1;
+  auto result = false;
+  do
+  {
+    result = CFile::Rename(source, dest);
+    if (!result)
+    {
+      CLog::Log(LOGERROR, "Failed to move %s addon files from '%s' to '%s', retrying in 500ms",
+			          description, source.c_str(), dest.c_str());
+      Sleep(500);
+    }
+  } while (!result && count++ < 4);
+
+  return result;
+}
+
+} // end namespace unnamed
+
 CFilesystemInstaller::CFilesystemInstaller()
 {
   m_addonFolder = CSpecialProtocol::TranslatePath("special://home/addons/");
@@ -52,18 +79,12 @@ bool CFilesystemInstaller::InstallToFilesystem(const std::string& archive, const
   bool hasOldData = CDirectory::Exists(addonFolder);
   if (hasOldData)
   {
-    if (!CFile::Rename(addonFolder, oldAddonData))
-    {
-      CLog::Log(LOGERROR, "Failed to move old addon files from '%s' to '%s'", addonFolder.c_str(), oldAddonData.c_str());
+    if (!renameOrRetry(addonFolder, oldAddonData, "old"))
       return false;
-    }
   }
 
-  if (!CFile::Rename(newAddonData, addonFolder))
-  {
-    CLog::Log(LOGERROR, "Failed to move new addon files from '%s' to '%s'", newAddonData.c_str(), addonFolder.c_str());
+  if (!renameOrRetry(newAddonData, addonFolder, "new"))
     return false;
-  }
 
   if (hasOldData)
   {
diff --git a/xbmc/addons/PVRClient.cpp b/xbmc/addons/PVRClient.cpp
index d85a00d..1ab7381 100644
--- a/xbmc/addons/PVRClient.cpp
+++ b/xbmc/addons/PVRClient.cpp
@@ -101,6 +101,24 @@ void CPVRClient::OnEnabled()
   CPVRManager::GetInstance().Clients()->UpdateAddons();
 }
 
+void CPVRClient::StopRunningInstance()
+{
+  const ADDON::AddonPtr addon(GetRunningInstance());
+  if (addon)
+  {
+    // stop the pvr manager and stop and unload the running pvr addon
+    PVR::CPVRManager::GetInstance().Stop();
+    CPVRManager::GetInstance().Clients()->StopClient(addon, false);
+  }
+}
+
+void CPVRClient::OnPreInstall()
+{
+  // note: this method is also called on update; thus stop and unload possibly running instance
+  StopRunningInstance();
+  CAddon::OnPreInstall();
+}
+
 void CPVRClient::OnPostInstall(bool update, bool modal)
 {
   CAddon::OnPostInstall(update, modal);
@@ -109,8 +127,7 @@ void CPVRClient::OnPostInstall(bool update, bool modal)
 
 void CPVRClient::OnPreUnInstall()
 {
-  // stop the pvr manager, so running pvr add-ons are stopped and closed
-  PVR::CPVRManager::GetInstance().Stop();
+  StopRunningInstance();
   CAddon::OnPreUnInstall();
 }
 
diff --git a/xbmc/addons/PVRClient.h b/xbmc/addons/PVRClient.h
index 8262ed5..1f3a47c 100644
--- a/xbmc/addons/PVRClient.h
+++ b/xbmc/addons/PVRClient.h
@@ -72,6 +72,7 @@ namespace PVR
 
     virtual void OnDisabled() override;
     virtual void OnEnabled() override;
+    virtual void OnPreInstall() override;
     virtual void OnPostInstall(bool update, bool modal) override;
     virtual void OnPreUnInstall() override;
     virtual void OnPostUnInstall() override;
@@ -706,6 +707,11 @@ namespace PVR
      */
     bool CanPlayChannel(const CPVRChannelPtr &channel) const;
 
+    /*!
+     * @brief Stop this instance, if it is currently running.
+     */
+    void StopRunningInstance();
+
     bool LogError(const PVR_ERROR error, const char *strMethod) const;
     void LogException(const std::exception &e, const char *strFunctionName) const;
 
diff --git a/xbmc/cores/AudioEngine/Makefile.in b/xbmc/cores/AudioEngine/Makefile.in
index 9a4e998..edb6b11 100644
--- a/xbmc/cores/AudioEngine/Makefile.in
+++ b/xbmc/cores/AudioEngine/Makefile.in
@@ -83,6 +83,5 @@ SRCS += Utils/AELimiter.cpp
 SRCS += Encoders/AEEncoderFFmpeg.cpp
 
 LIB   = audioengine.a
-
 include @abs_top_srcdir@/Makefile.include
 -include $(patsubst %.cpp,%.P,$(patsubst %.c,%.P,$(SRCS)))
diff --git a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
index 7149b34..1698b2f 100644
--- a/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
+++ b/xbmc/cores/AudioEngine/Sinks/AESinkAUDIOTRACK.cpp
@@ -469,7 +469,10 @@ bool CAESinkAUDIOTRACK::Initialize(AEAudioFormat &format, std::string &device)
       Deinitialize();
       return false;
     }
-    CLog::Log(LOGDEBUG, "CAESinkAUDIOTRACK::Initialize returned: m_sampleRate %u; format:%s; min_buffer_size %u; m_frames %u; m_frameSize %u; channels: %d", m_sink_sampleRate, CAEUtil::DataFormatToStr(m_format.m_dataFormat), m_min_buffer_size, m_format.m_frames, m_format.m_frameSize, m_format.m_channelLayout.Count());
+    const char* method = m_passthrough ? (m_info.m_wantsIECPassthrough ? "IEC (PT)" : "RAW (PT)") : "PCM";
+    CLog::Log(LOGNOTICE, "CAESinkAUDIOTRACK::Initializing with: m_sampleRate: %u format: %s (AE) method: %s stream-type: %s min_buffer_size: %u m_frames: %u m_frameSize: %u channels: %d",
+                          m_sink_sampleRate, CAEUtil::DataFormatToStr(m_format.m_dataFormat), method, m_passthrough ? CAEUtil::StreamTypeToStr(m_format.m_streamInfo.m_type) : "PCM-STREAM",
+                          m_min_buffer_size, m_format.m_frames, m_format.m_frameSize, m_format.m_channelLayout.Count());
   }
   format = m_format;
 
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp
index 92bdd83..7500ead 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DVDVideoCodecAndroidMediaCodec.cpp
@@ -685,6 +685,8 @@ void CDVDVideoCodecAndroidMediaCodec::Dispose()
       xbmc_jnienv()->ExceptionClear();
   }
   ReleaseSurfaceTexture();
+  if (m_render_surface)
+    CXBMCApp::get()->clearVideoView();
 
   SAFE_DELETE(m_bitstream);
   s_instances--;
diff --git a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.h b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.h
index 2170515..da28645 100644
--- a/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.h
+++ b/xbmc/cores/VideoPlayer/DVDCodecs/Video/DXVA.h
@@ -147,7 +147,7 @@ protected:
 
   // ID3DResource overrides
   void OnCreateDevice() override  {}
-  void OnDestroyDevice() override { CSingleLock lock(m_section); m_state = DXVA_LOST;  m_event.Reset(); }
+  void OnDestroyDevice(bool fatal) override { CSingleLock lock(m_section); m_state = DXVA_LOST;  m_event.Reset(); }
   void OnLostDevice() override    { CSingleLock lock(m_section); m_state = DXVA_LOST;  m_event.Reset(); }
   void OnResetDevice() override   { CSingleLock lock(m_section); m_state = DXVA_RESET; m_event.Set();   }
 
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h
index 60be085..4a3dafd 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/DXVAHD.h
@@ -64,7 +64,7 @@ public:
 
   // ID3DResource overrides
   void OnCreateDevice() override  {}
-  void OnDestroyDevice() override { CSingleLock lock(m_section); UnInit(); }
+  void OnDestroyDevice(bool fatal) override { CSingleLock lock(m_section); UnInit(); }
   void OnLostDevice() override    { CSingleLock lock(m_section); UnInit(); }
   void OnResetDevice() override   { CSingleLock lock(m_section); Close();  }
 
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp
index a7287c6..8fefc1c 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/HwDecRender/RendererMediaCodecSurface.cpp
@@ -143,6 +143,11 @@ bool CRendererMediaCodecSurface::RenderHook(int index)
         srcRect.x2 *= 2.0;
       break;
 
+      case RENDER_STEREO_MODE_MONO:
+        dstRect.y2 = dstRect.y2 * (dstRect.y2 / m_sourceRect.y2);
+        dstRect.x2 = dstRect.x2 * (dstRect.x2 / m_sourceRect.x2);
+      break;
+
       default:
       break;
     }
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRendererDX.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRendererDX.cpp
index d5e36af..1d64eb4 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRendererDX.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRendererDX.cpp
@@ -151,12 +151,14 @@ COverlayQuadsDX::COverlayQuadsDX(ASS_Image* images, int width, int height)
     CLog::Log(LOGERROR, "%s - failed to create vertex buffer", __FUNCTION__);
     m_texture.Release();
   }
-
+  else
+    g_Windowing.Register(this);
   delete[] vt;
 }
 
 COverlayQuadsDX::~COverlayQuadsDX()
 {
+  g_Windowing.Unregister(this);
 }
 
 void COverlayQuadsDX::Render(SRenderState &state)
@@ -204,8 +206,18 @@ void COverlayQuadsDX::Render(SRenderState &state)
   pGUIShader->RestoreBuffers();
 }
 
+void COverlayQuadsDX::OnDestroyDevice(bool fatal)
+{
+  // fatal means that we have no valid buffer anymore
+  // resetting m_count will cause no rendering
+  if (fatal) 
+    m_count = 0; 
+}
+
+
 COverlayImageDX::~COverlayImageDX()
 {
+  g_Windowing.Unregister(this);
 }
 
 COverlayImageDX::COverlayImageDX(CDVDOverlayImage* o)
@@ -271,6 +283,7 @@ COverlayImageDX::COverlayImageDX(CDVDOverlayImage* o)
     m_width  = (float)o->width;
     m_height = (float)o->height;
   }
+  g_Windowing.Register(this);
 }
 
 COverlayImageDX::COverlayImageDX(CDVDOverlaySpu* o)
@@ -292,6 +305,8 @@ COverlayImageDX::COverlayImageDX(CDVDOverlaySpu* o)
   m_y      = (float)(min_y + o->y);
   m_width  = (float)(max_x - min_x);
   m_height = (float)(max_y - min_y);
+
+  g_Windowing.Register(this);
 }
 
 void COverlayImageDX::Load(uint32_t* rgba, int width, int height, int stride)
@@ -329,6 +344,9 @@ void COverlayImageDX::Load(uint32_t* rgba, int width, int height, int stride)
 
 void COverlayImageDX::Render(SRenderState &state)
 {
+  if (m_type == TYPE_NONE)
+    return;
+
   ID3D11DeviceContext* pContext = g_Windowing.Get3D11Context();
   CGUIShaderDX* pGUIShader = g_Windowing.GetGUIShader();
 
@@ -369,4 +387,12 @@ void COverlayImageDX::Render(SRenderState &state)
   pGUIShader->RestoreBuffers();
 }
 
+void OVERLAY::COverlayImageDX::OnDestroyDevice(bool fatal)
+{
+  // fatal means that we have no valid texture and buffer anymore
+  // resetting m_type will cause no rendering
+  if (fatal)
+    m_type = TYPE_NONE;
+}
+
 #endif
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRendererDX.h b/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRendererDX.h
index f5fd62b..23e4083 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRendererDX.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/OverlayRendererDX.h
@@ -35,12 +35,15 @@ namespace OVERLAY {
 
   class COverlayQuadsDX
     : public COverlay
+    , public ID3DResource
   {
   public:
     COverlayQuadsDX(ASS_Image* images, int width, int height);
     virtual ~COverlayQuadsDX();
 
     void Render(SRenderState& state);
+    void OnCreateDevice() override {}
+    void OnDestroyDevice(bool fatal) override;
 
     int                    m_count;
     DWORD                  m_fvf;
@@ -50,6 +53,7 @@ namespace OVERLAY {
 
   class COverlayImageDX
     : public COverlay
+    , public ID3DResource
   {
   public:
     COverlayImageDX(CDVDOverlayImage* o);
@@ -58,6 +62,8 @@ namespace OVERLAY {
 
     void Load(uint32_t* rgba, int width, int height, int stride);
     void Render(SRenderState& state);
+    void OnCreateDevice() override {}
+    void OnDestroyDevice(bool fatal) override;
 
     DWORD                  m_fvf;
     CD3DTexture            m_texture;
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp
index a50e9b1..9bf0310 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.cpp
@@ -507,7 +507,7 @@ void CRenderCaptureDX::OnLostDevice()
   SetState(CAPTURESTATE_FAILED);
 }
 
-void CRenderCaptureDX::OnDestroyDevice()
+void CRenderCaptureDX::OnDestroyDevice(bool fatal)
 {
   CleanupDX();
   SetState(CAPTURESTATE_FAILED);
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.h b/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.h
index 640461f..9f9565f 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.h
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderCapture.h
@@ -210,7 +210,7 @@ class CRenderCaptureDX : public CRenderCaptureBase, public ID3DResource
     void EndRender();
     void ReadOut();
     
-    virtual void OnDestroyDevice();
+    virtual void OnDestroyDevice(bool fatal);
     virtual void OnLostDevice();
     virtual void OnCreateDevice() {};
 
diff --git a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
index 17c428c..420b5b5 100644
--- a/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
+++ b/xbmc/cores/VideoPlayer/VideoRenderers/RenderManager.cpp
@@ -236,8 +236,8 @@ bool CRenderManager::Configure(DVDVideoPicture& picture, float fps, unsigned fla
     m_NumberBuffers  = buffers;
     m_renderState = STATE_CONFIGURING;
     m_stateEvent.Reset();
-
-    CheckEnableClockSync();
+    m_clockSync.Reset();
+    m_dvdClock.SetVsyncAdjust(0);
 
     CSingleLock lock2(m_presentlock);
     m_presentstep = PRESENT_READY;
@@ -318,7 +318,7 @@ bool CRenderManager::Configure()
     m_renderedOverlay = false;
     m_renderDebug = false;
     m_clockSync.Reset();
-    CheckEnableClockSync();
+    m_dvdClock.SetVsyncAdjust(0);
 
     m_renderState = STATE_CONFIGURED;
 
@@ -383,6 +383,8 @@ void CRenderManager::FrameMove()
         CApplicationMessenger::GetInstance().PostMsg(TMSG_SWITCHTOFULLSCREEN);
       }
     }
+
+    CheckEnableClockSync();
   }
   {
     CSingleLock lock2(m_presentlock);
@@ -1080,8 +1082,6 @@ void CRenderManager::UpdateResolution()
         RESOLUTION res = CResolutionUtils::ChooseBestResolution(m_fps, m_width, CONF_FLAGS_STEREO_MODE_MASK(m_flags));
         g_graphicsContext.SetVideoResolution(res);
         UpdateDisplayLatency();
-
-        CheckEnableClockSync();
       }
       m_bTriggerUpdateResolution = false;
       m_playerPort->VideoParamsChange();
diff --git a/xbmc/dialogs/GUIDialogProgress.cpp b/xbmc/dialogs/GUIDialogProgress.cpp
index 39d339c..485d6bf 100644
--- a/xbmc/dialogs/GUIDialogProgress.cpp
+++ b/xbmc/dialogs/GUIDialogProgress.cpp
@@ -160,7 +160,8 @@ void CGUIDialogProgress::SetProgressAdvance(int nSteps/*=1*/)
   if (m_iCurrent>m_iMax)
     m_iCurrent=0;
 
-  SetPercentage((m_iCurrent*100)/m_iMax);
+  if (m_iMax > 0)
+    SetPercentage((m_iCurrent*100)/m_iMax);
 }
 
 bool CGUIDialogProgress::Abort()
diff --git a/xbmc/epg/EpgContainer.cpp b/xbmc/epg/EpgContainer.cpp
index 85820b1..f597fa0 100644
--- a/xbmc/epg/EpgContainer.cpp
+++ b/xbmc/epg/EpgContainer.cpp
@@ -411,12 +411,24 @@ CEpgInfoTagPtr CEpgContainer::GetTagById(const CPVRChannelPtr &channel, unsigned
 {
   CEpgInfoTagPtr retval;
 
-  if (!channel || iBroadcastId == EPG_TAG_INVALID_UID)
+  if (iBroadcastId == EPG_TAG_INVALID_UID)
     return retval;
 
-  const CEpgPtr epg(channel->GetEPG());
-  if (epg)
-    retval = epg->GetTagByBroadcastId(iBroadcastId);
+  if (channel)
+  {
+    const CEpgPtr epg(channel->GetEPG());
+    if (epg)
+      retval = epg->GetTagByBroadcastId(iBroadcastId);
+  }
+  else
+  {
+    for (const auto &epgEntry : m_epgs)
+    {
+      retval = epgEntry.second->GetTagByBroadcastId(iBroadcastId);
+      if (retval)
+        break;
+    }
+  }
 
   return retval;
 }
diff --git a/xbmc/filesystem/FavouritesDirectory.cpp b/xbmc/filesystem/FavouritesDirectory.cpp
index fc42ed3..dd50787 100644
--- a/xbmc/filesystem/FavouritesDirectory.cpp
+++ b/xbmc/filesystem/FavouritesDirectory.cpp
@@ -197,8 +197,13 @@ std::string CFavouritesDirectory::GetExecutePath(const CFileItem &item, const st
       execute = StringUtils::Format("ActivateWindow(%s,%s,return)", contextWindow.c_str(), StringUtils::Paramify(item.GetPath()).c_str());
   }
   //! @todo STRING_CLEANUP
-  else if (item.IsScript() && item.GetPath().size() > 9) // plugin://<foo>
+  else if (item.IsScript() && item.GetPath().size() > 9) // script://<foo>
     execute = StringUtils::Format("RunScript(%s)", StringUtils::Paramify(item.GetPath().substr(9)).c_str());
+  else if (item.IsAddonsPath() && item.GetPath().size() > 9) // addons://<foo>
+  {
+    CURL url(item.GetPath());
+    execute = StringUtils::Format("RunAddon(%s)", url.GetFileName().c_str());
+  }
   else if (item.IsAndroidApp() && item.GetPath().size() > 26) // androidapp://sources/apps/<foo>
     execute = StringUtils::Format("StartAndroidActivity(%s)", StringUtils::Paramify(item.GetPath().substr(26)).c_str());
   else  // assume a media file
diff --git a/xbmc/filesystem/PluginDirectory.cpp b/xbmc/filesystem/PluginDirectory.cpp
index caff5c3..76eaf43 100644
--- a/xbmc/filesystem/PluginDirectory.cpp
+++ b/xbmc/filesystem/PluginDirectory.cpp
@@ -227,7 +227,7 @@ void CPluginDirectory::EndOfDirectory(int handle, bool success, bool replaceList
     return;
 
   // set cache to disc
-  dir->m_listItems->SetCacheToDisc(CFileItemList::CACHE_NEVER);
+  dir->m_listItems->SetCacheToDisc(cacheToDisc ? CFileItemList::CACHE_IF_SLOW : CFileItemList::CACHE_NEVER);
 
   dir->m_success = success;
   dir->m_listItems->SetReplaceListing(replaceListing);
diff --git a/xbmc/filesystem/win32/Win32File.cpp b/xbmc/filesystem/win32/Win32File.cpp
index 9389d74..60ab2da 100644
--- a/xbmc/filesystem/win32/Win32File.cpp
+++ b/xbmc/filesystem/win32/Win32File.cpp
@@ -403,6 +403,11 @@ bool CWin32File::Rename(const CURL& urlCurrentName, const CURL& urlNewName)
     return false;
 
   const bool result = (MoveFileExW(curNameW.c_str(), newNameW.c_str(), MOVEFILE_COPY_ALLOWED) != 0);
+  if (!result)
+  {
+    CLog::LogW(LOGERROR, L"Failed to rename file/directory %s to %s, Error: %s",
+      curNameW.c_str(), newNameW.c_str(), CLog::Win32ErrorToString(GetLastError()));
+  }
   if (m_smbFile)
     m_lastSMBFileErr = GetLastError(); // set real error state
 
diff --git a/xbmc/guilib/D3DResource.cpp b/xbmc/guilib/D3DResource.cpp
index a5aaab7..8a8d585 100644
--- a/xbmc/guilib/D3DResource.cpp
+++ b/xbmc/guilib/D3DResource.cpp
@@ -383,18 +383,15 @@ void CD3DTexture::SaveTexture()
   }
 }
 
-void CD3DTexture::OnDestroyDevice()
+void CD3DTexture::OnDestroyDevice(bool fatal)
 {
-  SaveTexture();
+  if (!fatal)
+    SaveTexture();
   SAFE_RELEASE(m_texture);
   SAFE_RELEASE(m_textureView);
   SAFE_RELEASE(m_renderTarget);
 }
 
-void CD3DTexture::OnLostDevice()
-{
-}
-
 void CD3DTexture::RestoreTexture()
 {
   // yay, we're back - make a new copy of the texture
@@ -416,10 +413,6 @@ void CD3DTexture::OnCreateDevice()
   RestoreTexture();
 }
 
-void CD3DTexture::OnResetDevice()
-{
-}
-
 unsigned int CD3DTexture::GetMemoryUsage(unsigned int pitch) const
 {
   switch (m_format)
@@ -533,10 +526,10 @@ bool CD3DEffect::Create(const std::string &effectString, DefinesMap* defines)
 void CD3DEffect::Release()
 {
   g_Windowing.Unregister(this);
-  OnDestroyDevice();
+  OnDestroyDevice(false);
 }
 
-void CD3DEffect::OnDestroyDevice()
+void CD3DEffect::OnDestroyDevice(bool fatal)
 {
   SAFE_RELEASE(m_effect);
   m_techniquie = nullptr;
@@ -790,8 +783,14 @@ bool CD3DBuffer::Unmap()
   return false;
 }
 
-void CD3DBuffer::OnDestroyDevice()
+void CD3DBuffer::OnDestroyDevice(bool fatal)
 {
+  if (fatal)
+  {
+    SAFE_RELEASE(m_buffer);
+    return;
+  }
+
   ID3D11Device* pDevice = g_Windowing.Get3D11Device();
   ID3D11DeviceContext* pContext = g_Windowing.GetImmediateContext();
 
@@ -1005,7 +1004,7 @@ void CD3DVertexShader::OnCreateDevice()
     m_inited = CreateInternal();
 }
 
-void CD3DVertexShader::OnDestroyDevice()
+void CD3DVertexShader::OnDestroyDevice(bool fatal)
 {
   ReleaseShader();
 }
@@ -1130,7 +1129,7 @@ void CD3DPixelShader::OnCreateDevice()
     m_inited = CreateInternal();
 }
 
-void CD3DPixelShader::OnDestroyDevice()
+void CD3DPixelShader::OnDestroyDevice(bool fatal)
 {
   ReleaseShader();
 }
diff --git a/xbmc/guilib/D3DResource.h b/xbmc/guilib/D3DResource.h
index cf0a0b9..8a51efd 100644
--- a/xbmc/guilib/D3DResource.h
+++ b/xbmc/guilib/D3DResource.h
@@ -58,10 +58,11 @@ class ID3DResource
 public:
   virtual ~ID3DResource() {};
 
-  virtual void OnDestroyDevice()=0;
+  virtual void OnDestroyDevice(bool fatal)=0;
   virtual void OnCreateDevice()=0;
   virtual void OnLostDevice() {};
   virtual void OnResetDevice() {};
+  virtual void OnDestroyDevice() { OnDestroyDevice(false); }
 };
 
 class CD3DHelper
@@ -137,10 +138,8 @@ public:
   static void DrawQuad(const CRect &coords, color_t color, unsigned numViews, ID3D11ShaderResourceView **view, const CRect *texCoords,
     SHADER_METHOD options = SHADER_METHOD_RENDER_TEXTURE_BLEND);
 
-  virtual void OnDestroyDevice();
-  virtual void OnCreateDevice();
-  virtual void OnLostDevice();
-  virtual void OnResetDevice();
+  void OnDestroyDevice(bool fatal) override;
+  void OnCreateDevice() override;
 
 private:
   unsigned int GetMemoryUsage(unsigned int pitch) const;
@@ -191,8 +190,8 @@ public:
 
   ID3DX11Effect *Get() const { return m_effect; };
 
-  virtual void OnDestroyDevice();
-  virtual void OnCreateDevice();
+  void OnDestroyDevice(bool fatal) override;
+  void OnCreateDevice() override;
 
 private:
   bool         CreateEffect();
@@ -218,8 +217,8 @@ public:
   DXGI_FORMAT GetFormat() { return m_format; }
   ID3D11Buffer* Get() const { return m_buffer; };
 
-  virtual void OnDestroyDevice();
-  virtual void OnCreateDevice();
+  void OnDestroyDevice(bool fatal) override;
+  void OnCreateDevice() override;
 private:
   bool CreateBuffer(const void *pData);
   D3D11_BIND_FLAG  m_type;
@@ -247,8 +246,8 @@ public:
   void Release();
   bool IsInited() { return m_inited; }
 
-  virtual void OnDestroyDevice();
-  virtual void OnCreateDevice();
+  void OnDestroyDevice(bool fatal) override;
+  void OnCreateDevice() override;
 
 private:
   bool CreateInternal();
@@ -275,8 +274,8 @@ public:
   void Release();
   bool IsInited() { return m_inited; }
 
-  virtual void OnDestroyDevice();
-  virtual void OnCreateDevice();
+  void OnDestroyDevice(bool fatal) override;
+  void OnCreateDevice() override;
 
 private:
   bool CreateInternal();
diff --git a/xbmc/guilib/GUIFontTTFDX.cpp b/xbmc/guilib/GUIFontTTFDX.cpp
index f87abf7..8d2b028 100644
--- a/xbmc/guilib/GUIFontTTFDX.cpp
+++ b/xbmc/guilib/GUIFontTTFDX.cpp
@@ -348,7 +348,7 @@ void CGUIFontTTFDX::CreateStaticIndexBuffer(void)
 bool CGUIFontTTFDX::m_staticIndexBufferCreated = false;
 ID3D11Buffer* CGUIFontTTFDX::m_staticIndexBuffer = nullptr;
 
-void CGUIFontTTFDX::OnDestroyDevice(void)
+void CGUIFontTTFDX::OnDestroyDevice(bool fatal)
 {
   SAFE_RELEASE(m_staticIndexBuffer);
   m_staticIndexBufferCreated = false;
diff --git a/xbmc/guilib/GUIFontTTFDX.h b/xbmc/guilib/GUIFontTTFDX.h
index c66ce34..4b906ae 100644
--- a/xbmc/guilib/GUIFontTTFDX.h
+++ b/xbmc/guilib/GUIFontTTFDX.h
@@ -44,21 +44,21 @@ public:
   CGUIFontTTFDX(const std::string& strFileName);
   virtual ~CGUIFontTTFDX(void);
 
-  virtual bool FirstBegin();
-  virtual void LastEnd();
-  virtual CVertexBuffer CreateVertexBuffer(const std::vector<SVertex> &vertices) const;
-  virtual void DestroyVertexBuffer(CVertexBuffer &bufferHandle) const;
+  bool FirstBegin() override;
+  void LastEnd() override;
+  CVertexBuffer CreateVertexBuffer(const std::vector<SVertex> &vertices) const override;
+  void DestroyVertexBuffer(CVertexBuffer &bufferHandle) const override;
 
-  virtual void OnDestroyDevice();
-  virtual void OnCreateDevice();
+  void OnDestroyDevice(bool fatal) override;
+  void OnCreateDevice() override;
 
   static void CreateStaticIndexBuffer(void);
   static void DestroyStaticIndexBuffer(void);
 
 protected:
-  virtual CBaseTexture* ReallocTexture(unsigned int& newHeight);
-  virtual bool CopyCharToTexture(FT_BitmapGlyph bitGlyph, unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2);
-  virtual void DeleteHardwareTexture();
+  CBaseTexture* ReallocTexture(unsigned int& newHeight) override;
+  bool CopyCharToTexture(FT_BitmapGlyph bitGlyph, unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2) override;
+  void DeleteHardwareTexture() override;
 
 private:
   bool UpdateDynamicVertexBuffer(const SVertex* pSysMem, unsigned int count);
diff --git a/xbmc/guilib/Resolution.cpp b/xbmc/guilib/Resolution.cpp
index b86110c..8c19be8 100644
--- a/xbmc/guilib/Resolution.cpp
+++ b/xbmc/guilib/Resolution.cpp
@@ -224,11 +224,13 @@ RESOLUTION CResolutionUtils::FindClosestResolution(float fps, int width, bool is
       // evaluate all higher modes and evalute them
       // concerning dimension and refreshrate weight
       // skip lower resolutions
+      // don't change resolutions when 3D is wanted
       if ((width < orig.iScreenWidth) || // orig res large enough
          (info.iScreenWidth < orig.iScreenWidth) || // new res is smaller
          (info.iScreenHeight < orig.iScreenHeight) || // new height would be smaller
          (info.dwFlags & D3DPRESENTFLAG_MODEMASK) != (curr.dwFlags & D3DPRESENTFLAG_MODEMASK) || // don't switch to interlaced modes
-         (info.iScreen != curr.iScreen)) // skip not current displays
+         (info.iScreen != curr.iScreen) || // skip not current displays
+         is3D) // skip res changing when doing 3D
       {
         continue;
       }
diff --git a/xbmc/interfaces/json-rpc/PVROperations.cpp b/xbmc/interfaces/json-rpc/PVROperations.cpp
index 0ebca75..6fbd6e2 100644
--- a/xbmc/interfaces/json-rpc/PVROperations.cpp
+++ b/xbmc/interfaces/json-rpc/PVROperations.cpp
@@ -337,34 +337,12 @@ JSONRPC_STATUS CPVROperations::GetTimerDetails(const std::string &method, ITrans
   return OK;
 }
 
-CFileItemPtr CPVROperations::GetBroadcastFromBroadcastid(unsigned int broadcastid)
-{
-  EpgSearchFilter filter;
-  filter.Reset();
-  filter.m_iUniqueBroadcastId = broadcastid;
-
-  CFileItemList broadcasts;
-  int resultSize = g_EpgContainer.GetEPGSearch(broadcasts, filter);
-
-  if (resultSize != 1)
-    return CFileItemPtr();
-
-  return broadcasts.Get(0);
-}
-
 JSONRPC_STATUS CPVROperations::AddTimer(const std::string &method, ITransportLayer *transport, IClient *client, const CVariant &parameterObject, CVariant &result)
 {
   if (!g_PVRManager.IsStarted())
     return FailedToExecute;
 
-  CFileItemPtr broadcast = CPVROperations::GetBroadcastFromBroadcastid(parameterObject["broadcastid"].asUnsignedInteger());
-  if (!broadcast)
-    return InvalidParams;
-
-  if (!broadcast->HasEPGInfoTag())
-    return InvalidParams;
-
-  CEpgInfoTagPtr epgTag = broadcast->GetEPGInfoTag();
+  const CEpgInfoTagPtr epgTag = g_EpgContainer.GetTagById(CPVRChannelPtr(), parameterObject["broadcastid"].asUnsignedInteger());
 
   if (!epgTag)
     return InvalidParams;
@@ -406,14 +384,7 @@ JSONRPC_STATUS CPVROperations::ToggleTimer(const std::string &method, ITransport
   if (!g_PVRManager.IsStarted())
     return FailedToExecute;
 
-  CFileItemPtr broadcast = CPVROperations::GetBroadcastFromBroadcastid(parameterObject["broadcastid"].asUnsignedInteger());
-  if (!broadcast)
-    return InvalidParams;
-
-  if (!broadcast->HasEPGInfoTag())
-    return InvalidParams;
-
-  CEpgInfoTagPtr epgTag = broadcast->GetEPGInfoTag();
+  const CEpgInfoTagPtr epgTag = g_EpgContainer.GetTagById(CPVRChannelPtr(), parameterObject["broadcastid"].asUnsignedInteger());
 
   if (!epgTag)
     return InvalidParams;
diff --git a/xbmc/interfaces/json-rpc/PVROperations.h b/xbmc/interfaces/json-rpc/PVROperations.h
index 96c262b..12ab532 100644
--- a/xbmc/interfaces/json-rpc/PVROperations.h
+++ b/xbmc/interfaces/json-rpc/PVROperations.h
@@ -51,7 +51,5 @@ namespace JSONRPC
   private:
     static JSONRPC_STATUS GetPropertyValue(const std::string &property, CVariant &result);
     static void FillChannelGroupDetails(const PVR::CPVRChannelGroupPtr &channelGroup, const CVariant &parameterObject, CVariant &result, bool append = false);
-
-    static CFileItemPtr GetBroadcastFromBroadcastid(unsigned int broadcastid);
   };
 }
diff --git a/xbmc/interfaces/legacy/ModuleXbmcplugin.h b/xbmc/interfaces/legacy/ModuleXbmcplugin.h
index 2237ccd..081e27b 100644
--- a/xbmc/interfaces/legacy/ModuleXbmcplugin.h
+++ b/xbmc/interfaces/legacy/ModuleXbmcplugin.h
@@ -131,8 +131,8 @@ namespace XBMCAddon
     /// @param updateListing        [opt] bool - True=this folder should
     ///                             update the current listing/False=Folder
     ///                             is a subfolder(Default).
-    /// @param cacheToDisc          [opt] bool - True=Allow folder to be cached
-    ///                             (default)/False=this folder
+    /// @param cacheToDisc          [opt] bool - True=Folder will cache if
+    ///                             extended time(default)/False=this folder
     ///                             will never cache to disc.
     ///
     ///
diff --git a/xbmc/music/dialogs/GUIDialogMusicOSD.cpp b/xbmc/music/dialogs/GUIDialogMusicOSD.cpp
index 865d29b..c8c2b95 100644
--- a/xbmc/music/dialogs/GUIDialogMusicOSD.cpp
+++ b/xbmc/music/dialogs/GUIDialogMusicOSD.cpp
@@ -91,7 +91,7 @@ bool CGUIDialogMusicOSD::OnAction(const CAction &action)
         for (int i = 1; i <= 10; i++)
           dialog->Add(StringUtils::Format("%s: %i", g_localizeStrings.Get(563).c_str(), i));
 
-        auto track = std::make_shared<CFileItem>(g_application.CurrentFileItem());
+        auto track = g_application.CurrentFileItemPtr();
         dialog->SetSelected(track->GetMusicInfoTag()->GetUserrating());
 
         dialog->Open();
diff --git a/xbmc/pictures/GUIWindowPictures.cpp b/xbmc/pictures/GUIWindowPictures.cpp
index 4b5ec50..5be32ff 100644
--- a/xbmc/pictures/GUIWindowPictures.cpp
+++ b/xbmc/pictures/GUIWindowPictures.cpp
@@ -203,7 +203,7 @@ void CGUIWindowPictures::OnPrepareFileItems(CFileItemList& items)
     if (StringUtils::EqualsNoCase(items[i]->GetLabel(), "folder.jpg"))
       items.Remove(i);
 
-  if (items.GetFolderCount() == items.Size())
+  if (items.GetFolderCount()==items.Size() || !CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_USETAGS))
     return;
 
   // Start the music info loader thread
diff --git a/xbmc/pictures/PictureInfoLoader.cpp b/xbmc/pictures/PictureInfoLoader.cpp
index dd33472..05304f9 100644
--- a/xbmc/pictures/PictureInfoLoader.cpp
+++ b/xbmc/pictures/PictureInfoLoader.cpp
@@ -43,6 +43,7 @@ void CPictureInfoLoader::OnLoaderStart()
   m_mapFileItems->SetFastLookup(true);
 
   m_tagReads = 0;
+  m_loadTags = CSettings::GetInstance().GetBool(CSettings::SETTING_PICTURES_USETAGS);
 
   if (m_pProgressCallback)
     m_pProgressCallback->SetProgressMax(m_pVecItems->GetFileCount());
@@ -87,8 +88,11 @@ bool CPictureInfoLoader::LoadItemLookup(CFileItem* pItem)
   if (pItem->HasPictureInfoTag())
     return false;
 
-  pItem->GetPictureInfoTag()->Load(pItem->GetPath());
-  m_tagReads++;
+  if (m_loadTags)
+  { // Nothing found, load tag from file
+    pItem->GetPictureInfoTag()->Load(pItem->GetPath());
+    m_tagReads++;
+  }
 
   return true;
 }
diff --git a/xbmc/pictures/PictureInfoLoader.h b/xbmc/pictures/PictureInfoLoader.h
index 000b54f..2a022ff 100644
--- a/xbmc/pictures/PictureInfoLoader.h
+++ b/xbmc/pictures/PictureInfoLoader.h
@@ -39,5 +39,6 @@ protected:
 
   CFileItemList* m_mapFileItems;
   unsigned int m_tagReads;
+  bool m_loadTags;
 };
 
diff --git a/xbmc/platform/android/activity/XBMCApp.cpp b/xbmc/platform/android/activity/XBMCApp.cpp
index 1912d9a..cc8b650 100644
--- a/xbmc/platform/android/activity/XBMCApp.cpp
+++ b/xbmc/platform/android/activity/XBMCApp.cpp
@@ -44,6 +44,8 @@
 #include "platform/xbmc.h"
 #include "windowing/WinEvents.h"
 #include "guilib/GUIWindowManager.h"
+#include "guilib/GraphicContext.h"
+#include "settings/DisplaySettings.h"
 #include "utils/log.h"
 #include "messaging/ApplicationMessenger.h"
 #include "utils/StringUtils.h"
@@ -548,7 +550,7 @@ CRect CXBMCApp::MapRenderToDroid(const CRect& srcRect)
   float scaleY = 1.0;
 
   CJNIRect r = m_xbmcappinstance->getVideoViewSurfaceRect();
-  RESOLUTION_INFO renderRes = g_graphicsContext.GetResInfo(g_graphicsContext.GetVideoResolution());
+  RESOLUTION_INFO renderRes = CDisplaySettings::GetInstance().GetResolutionInfo(g_graphicsContext.GetVideoResolution());
   scaleX = (double)r.width() / renderRes.iWidth;
   scaleY = (double)r.height() / renderRes.iHeight;
 
diff --git a/xbmc/pvr/PVRManager.cpp b/xbmc/pvr/PVRManager.cpp
index d885931..53f3571 100644
--- a/xbmc/pvr/PVRManager.cpp
+++ b/xbmc/pvr/PVRManager.cpp
@@ -424,6 +424,13 @@ void CPVRManager::Stop(void)
   if (IsStopped())
     return;
 
+  /* stop playback if needed */
+  if (IsPlaying())
+  {
+    CLog::Log(LOGNOTICE,"PVRManager - %s - stopping PVR playback", __FUNCTION__);
+    CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP);
+  }
+
   SetState(ManagerStateStopping);
 
   m_pendingUpdates.Stop();
@@ -433,13 +440,6 @@ void CPVRManager::Stop(void)
 
   CLog::Log(LOGNOTICE, "PVRManager - stopping");
 
-  /* stop playback if needed */
-  if (IsPlaying())
-  {
-    CLog::Log(LOGNOTICE,"PVRManager - %s - stopping PVR playback", __FUNCTION__);
-    CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP);
-  }
-
   /* stop all update threads */
   SetState(ManagerStateInterrupted);
 
diff --git a/xbmc/pvr/addons/PVRClients.cpp b/xbmc/pvr/addons/PVRClients.cpp
index a524f10..7fea6d3 100644
--- a/xbmc/pvr/addons/PVRClients.cpp
+++ b/xbmc/pvr/addons/PVRClients.cpp
@@ -179,9 +179,13 @@ int CPVRClients::GetFirstConnectedClientID(void)
 int CPVRClients::EnabledClientAmount(void) const
 {
   int iReturn(0);
-  CSingleLock lock(m_critSection);
+  PVR_CLIENTMAP clientMap;
+  {
+    CSingleLock lock(m_critSection);
+    clientMap = m_clientMap;
+  }
 
-  for (const auto &client : m_clientMap)
+  for (const auto &client : clientMap)
     if (!CAddonMgr::GetInstance().IsAddonDisabled(client.second->ID()))
       ++iReturn;
 
@@ -190,7 +194,13 @@ int CPVRClients::EnabledClientAmount(void) const
 
 bool CPVRClients::HasEnabledClients(void) const
 {
-  for (const auto &client : m_clientMap)
+  PVR_CLIENTMAP clientMap;
+  {
+    CSingleLock lock(m_critSection);
+    clientMap = m_clientMap;
+  }
+
+  for (const auto &client : clientMap)
     if (!CAddonMgr::GetInstance().IsAddonDisabled(client.second->ID()))
       return true;
   return false;
@@ -198,8 +208,9 @@ bool CPVRClients::HasEnabledClients(void) const
 
 bool CPVRClients::StopClient(AddonPtr client, bool bRestart)
 {
-  /* stop playback */
-  CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP);
+  /* stop playback if needed */
+  if (IsPlaying())
+    CApplicationMessenger::GetInstance().SendMsg(TMSG_MEDIA_STOP);
 
   CSingleLock lock(m_critSection);
   int iId = GetClientId(client);
@@ -209,8 +220,13 @@ bool CPVRClients::StopClient(AddonPtr client, bool bRestart)
     if (bRestart)
       mappedClient->ReCreate();
     else
-      mappedClient->Destroy();
+    {
+      const auto it = m_clientMap.find(iId);
+      if (it != m_clientMap.end())
+        m_clientMap.erase(it);
 
+      mappedClient->Destroy();
+    }
     return true;
   }
 
diff --git a/xbmc/pvr/channels/PVRChannelGroup.cpp b/xbmc/pvr/channels/PVRChannelGroup.cpp
index 3f2fd65..f117f54 100644
--- a/xbmc/pvr/channels/PVRChannelGroup.cpp
+++ b/xbmc/pvr/channels/PVRChannelGroup.cpp
@@ -31,6 +31,7 @@
 #include "settings/lib/Setting.h"
 #include "settings/Settings.h"
 #include "threads/SingleLock.h"
+#include "utils/JobManager.h"
 #include "utils/log.h"
 #include "utils/StringUtils.h"
 
@@ -265,26 +266,37 @@ bool CPVRChannelGroup::MoveChannel(unsigned int iOldChannelNumber, unsigned int
 
 void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
 {
+  // searching and setting channel icons may take some time, and (more important)
+  // it triggers GUI which might lead to deadlocks if directly called.
+  PVR_CHANNEL_GROUP_MEMBERS groupMembers;
+  {
+    CSingleLock lock(m_critSection);
+    groupMembers = m_members;
+  }
+
+  CJobManager::GetInstance().AddJob(new CPVRSearchAndSetChannelIcons(groupMembers, bUpdateDb), nullptr);
+}
+
+bool CPVRSearchAndSetChannelIcons::DoWork()
+{
   std::string iconPath = CSettings::GetInstance().GetString(CSettings::SETTING_PVRMENU_ICONPATH);
   if (iconPath.empty())
-    return;
+    return true;
 
   const CPVRDatabasePtr database(g_PVRManager.GetTVDatabase());
   if (!database)
-    return;
+    return false;
 
   /* fetch files in icon path for fast lookup */
   CFileItemList fileItemList;
   XFILE::CDirectory::GetDirectory(iconPath, fileItemList, ".jpg|.png|.tbn");
 
   if (fileItemList.IsEmpty())
-    return;
+    return true;
 
   CGUIDialogExtendedProgressBar* dlgProgress = (CGUIDialogExtendedProgressBar*)g_windowManager.GetWindow(WINDOW_DIALOG_EXT_PROGRESS);
   CGUIDialogProgressBarHandle* dlgProgressHandle = dlgProgress ? dlgProgress->GetHandle(g_localizeStrings.Get(19287)) : NULL;
 
-  CSingleLock lock(m_critSection);
-
   /* create a map for fast lookup of normalized file base name */
   std::map<std::string, std::string> fileItemMap;
   const VECFILEITEMS &items = fileItemList.GetList();
@@ -298,14 +310,14 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
 
   int channelIndex = 0;
   CPVRChannelPtr channel;
-  for(PVR_CHANNEL_GROUP_MEMBERS::const_iterator it = m_members.begin(); it != m_members.end(); ++it)
+  for(const auto &groupMember : m_groupMembers)
   {
-    channel = it->second.channel;
+    channel = groupMember.second.channel;
 
     /* update progress dialog */
     if (dlgProgressHandle)
     {
-      dlgProgressHandle->SetProgress(channelIndex++, m_members.size());
+      dlgProgressHandle->SetProgress(channelIndex++, m_groupMembers.size());
       dlgProgressHandle->SetText(channel->ChannelName());
     }
 
@@ -330,7 +342,7 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
       channel->SetIconPath(itItem->second, g_advancedSettings.m_bPVRAutoScanIconsUserSet);
     }
 
-    if (bUpdateDb)
+    if (m_bUpdateDb)
       channel->Persist();
 
     //! @todo start channel icon scraper here if nothing was found
@@ -338,6 +350,8 @@ void CPVRChannelGroup::SearchAndSetChannelIcons(bool bUpdateDb /* = false */)
 
   if (dlgProgressHandle)
     dlgProgressHandle->MarkFinished();
+
+  return true;
 }
 
 /********** sort methods **********/
diff --git a/xbmc/pvr/channels/PVRChannelGroup.h b/xbmc/pvr/channels/PVRChannelGroup.h
index dd2ede5..90b9ef5 100644
--- a/xbmc/pvr/channels/PVRChannelGroup.h
+++ b/xbmc/pvr/channels/PVRChannelGroup.h
@@ -546,4 +546,18 @@ namespace PVR
   private:
     CPVRChannelGroupPtr m_group;
   };
+
+  class CPVRSearchAndSetChannelIcons : public CJob
+  {
+  public:
+    CPVRSearchAndSetChannelIcons(const PVR_CHANNEL_GROUP_MEMBERS &groupMembers, bool bUpdateDb)
+    : m_groupMembers(groupMembers), m_bUpdateDb(bUpdateDb) {}
+    virtual ~CPVRSearchAndSetChannelIcons() {}
+    virtual const char *GetType() const { return "pvr-channelgroup-searchandsetchannelicons"; }
+
+    virtual bool DoWork();
+  private:
+    PVR_CHANNEL_GROUP_MEMBERS m_groupMembers;
+    const bool m_bUpdateDb;
+  };
 }
diff --git a/xbmc/rendering/dx/RenderSystemDX.cpp b/xbmc/rendering/dx/RenderSystemDX.cpp
index 21c571d..f83d212 100644
--- a/xbmc/rendering/dx/RenderSystemDX.cpp
+++ b/xbmc/rendering/dx/RenderSystemDX.cpp
@@ -29,6 +29,7 @@
 #include "guilib/GUIShaderDX.h"
 #include "guilib/GUITextureD3D.h"
 #include "guilib/GUIWindowManager.h"
+#include "messaging/ApplicationMessenger.h"
 #include "settings/AdvancedSettings.h"
 #include "threads/SingleLock.h"
 #include "utils/MathUtils.h"
@@ -418,7 +419,14 @@ void CRenderSystemDX::DeleteDevice()
 
   // tell any shared resources
   for (std::vector<ID3DResource *>::iterator i = m_resources.begin(); i != m_resources.end(); ++i)
-    (*i)->OnDestroyDevice();
+  {
+    // the most of resources like textures and buffers try to 
+    // receive and save their status from current device.
+    // m_nDeviceStatus contains the last device status and
+    // DXGI_ERROR_DEVICE_REMOVED means that we have no possibility
+    // to use the device anymore, tell all resouces about this.
+    (*i)->OnDestroyDevice(DXGI_ERROR_DEVICE_REMOVED == m_nDeviceStatus);
+  }
 
   if (m_pSwapChain)
     m_pSwapChain->SetFullscreenState(false, nullptr);
@@ -1284,6 +1292,8 @@ bool CRenderSystemDX::BeginRender()
     {
       OnDeviceLost();
       OnDeviceReset();
+      if (m_bRenderCreated)
+        KODI::MESSAGING::CApplicationMessenger::GetInstance().PostMsg(TMSG_EXECUTE_BUILT_IN, -1, -1, nullptr, "ReloadSkin");
     }
     return false;
   }
diff --git a/xbmc/settings/Settings.cpp b/xbmc/settings/Settings.cpp
index 9940b6a..6e13ba6 100644
--- a/xbmc/settings/Settings.cpp
+++ b/xbmc/settings/Settings.cpp
@@ -296,6 +296,7 @@ const std::string CSettings::SETTING_AUDIOCDS_SETTINGS = "audiocds.settings";
 const std::string CSettings::SETTING_AUDIOCDS_EJECTONRIP = "audiocds.ejectonrip";
 const std::string CSettings::SETTING_MYMUSIC_SONGTHUMBINVIS = "mymusic.songthumbinvis";
 const std::string CSettings::SETTING_MYMUSIC_DEFAULTLIBVIEW = "mymusic.defaultlibview";
+const std::string CSettings::SETTING_PICTURES_USETAGS = "pictures.usetags";
 const std::string CSettings::SETTING_PICTURES_GENERATETHUMBS = "pictures.generatethumbs";
 const std::string CSettings::SETTING_PICTURES_SHOWVIDEOS = "pictures.showvideos";
 const std::string CSettings::SETTING_PICTURES_DISPLAYRESOLUTION = "pictures.displayresolution";
diff --git a/xbmc/settings/Settings.h b/xbmc/settings/Settings.h
index 482f61d..269a3a7 100644
--- a/xbmc/settings/Settings.h
+++ b/xbmc/settings/Settings.h
@@ -253,6 +253,7 @@ public:
   static const std::string SETTING_AUDIOCDS_EJECTONRIP;
   static const std::string SETTING_MYMUSIC_SONGTHUMBINVIS;
   static const std::string SETTING_MYMUSIC_DEFAULTLIBVIEW;
+  static const std::string SETTING_PICTURES_USETAGS;
   static const std::string SETTING_PICTURES_GENERATETHUMBS;
   static const std::string SETTING_PICTURES_SHOWVIDEOS;
   static const std::string SETTING_PICTURES_DISPLAYRESOLUTION;
diff --git a/xbmc/utils/StringUtils.cpp b/xbmc/utils/StringUtils.cpp
index d30fbf2..1ba6407 100644
--- a/xbmc/utils/StringUtils.cpp
+++ b/xbmc/utils/StringUtils.cpp
@@ -944,6 +944,8 @@ long StringUtils::TimeStringToSeconds(const std::string &timeString)
 
 std::string StringUtils::SecondsToTimeString(long lSeconds, TIME_FORMAT format)
 {
+  bool isNegative = lSeconds < 0;
+  lSeconds = abs(lSeconds);
   int hh = lSeconds / 3600;
   lSeconds = lSeconds % 3600;
   int mm = lSeconds / 60;
@@ -960,6 +962,8 @@ std::string StringUtils::SecondsToTimeString(long lSeconds, TIME_FORMAT format)
     strHMS += StringUtils::Format(strHMS.empty() ? "%2.2i" : ":%2.2i", mm);
   if (format & TIME_FORMAT_SS)
     strHMS += StringUtils::Format(strHMS.empty() ? "%2.2i" : ":%2.2i", ss);
+  if (isNegative)
+    strHMS = "-" + strHMS;
   return strHMS;
 }
 
diff --git a/xbmc/utils/win32/Win32Log.cpp b/xbmc/utils/win32/Win32Log.cpp
index ef5264c..05d46bc 100644
--- a/xbmc/utils/win32/Win32Log.cpp
+++ b/xbmc/utils/win32/Win32Log.cpp
@@ -18,7 +18,11 @@
 *
 */
 
+
 #include "Win32Log.h"
+
+#include <string>
+
 #include "utils/StringUtils.h"
 #include "utils/CharsetConverter.h"
 
@@ -63,3 +67,17 @@ void CWin32Log::LogFunctionW(int loglevel, const char* functionName, const wchar
     }
   }
 }
+
+std::wstring CWin32Log::Win32ErrorToString(int errorCode)
+{
+  LPWSTR message = nullptr;
+  auto result = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
+    nullptr, errorCode, 0, message, 0, nullptr);
+  if (result == 0)
+    return std::wstring();
+
+  std::wstring formattedMessage(message, result);
+  HeapFree(GetProcessHeap(), 0, message);
+
+  return formattedMessage;
+}
diff --git a/xbmc/utils/win32/Win32Log.h b/xbmc/utils/win32/Win32Log.h
index 53ee0fe..a4719bd 100644
--- a/xbmc/utils/win32/Win32Log.h
+++ b/xbmc/utils/win32/Win32Log.h
@@ -33,6 +33,7 @@ class CWin32Log : public CLog
 public:
   static void LogW(int loglevel, PRINTF_FORMAT_STRING const wchar_t *format, ...);
   static void LogFunctionW(int loglevel, IN_OPT_STRING const char* functionName, PRINTF_FORMAT_STRING const wchar_t* format, ...);
+  static std::wstring Win32ErrorToString(int errorCode);
 #define LogFW(loglevel,format,...) LogFunctionW((loglevel),__FUNCTION__,(format),##__VA_ARGS__)
 };
 
diff --git a/xbmc/windows/GUIMediaWindow.cpp b/xbmc/windows/GUIMediaWindow.cpp
index aaa956b..896102f 100644
--- a/xbmc/windows/GUIMediaWindow.cpp
+++ b/xbmc/windows/GUIMediaWindow.cpp
@@ -511,7 +511,7 @@ bool CGUIMediaWindow::OnMessage(CGUIMessage& message)
       }
       if (message.GetParam2() == PLUGIN_REFRESH_DELAY)
       {
-        Refresh();
+        Refresh(true);
         SetInitialVisibility();
         RestoreControlStates();
         SetInitialVisibility();
diff --git a/xbmc/windows/GUIWindowLoginScreen.cpp b/xbmc/windows/GUIWindowLoginScreen.cpp
index 5efb4b2..63fb648 100644
--- a/xbmc/windows/GUIWindowLoginScreen.cpp
+++ b/xbmc/windows/GUIWindowLoginScreen.cpp
@@ -272,6 +272,8 @@ CFileItemPtr CGUIWindowLoginScreen::GetCurrentListItem(int offset)
 
 void CGUIWindowLoginScreen::LoadProfile(unsigned int profile)
 {
+  CServiceBroker::GetContextMenuManager().Deinit();
+
   // stop service addons and give it some time before we start it again
   ADDON::CAddonMgr::GetInstance().StopServices(true);
 
@@ -322,6 +324,9 @@ void CGUIWindowLoginScreen::LoadProfile(unsigned int profile)
   JSONRPC::CJSONRPC::Initialize();
 #endif
 
+  // Restart context menu manager
+  CServiceBroker::GetContextMenuManager().Init();
+
   // restart PVR services
   CServiceBroker::GetPVRManager().Reinit();
 

-- 
kodi packaging



More information about the pkg-multimedia-commits mailing list