diff -pruN 19.0.3+ds1-1/azure-pipelines.yml 20.3.1+ds1-1/azure-pipelines.yml
--- 19.0.3+ds1-1/azure-pipelines.yml	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/azure-pipelines.yml	2022-06-20 21:32:29.000000000 +0000
@@ -4,7 +4,7 @@ variables:
 trigger:
   branches:
     include:
-    - Matrix
+    - Nexus
     - releases/*
   paths:
     include:
@@ -48,7 +48,7 @@ jobs:
 
     - script: |
         cd ..
-        git clone --branch Matrix --depth=1 https://github.com/xbmc/xbmc.git kodi
+        git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git kodi
         cd $(Build.SourcesDirectory)
         mkdir build
         cd build
diff -pruN 19.0.3+ds1-1/debian/changelog 20.3.1+ds1-1/debian/changelog
--- 19.0.3+ds1-1/debian/changelog	2022-03-21 17:49:30.000000000 +0000
+++ 20.3.1+ds1-1/debian/changelog	2022-08-04 09:55:17.000000000 +0000
@@ -1,3 +1,10 @@
+kodi-pvr-vdr-vnsi (20.3.1+ds1-1) unstable; urgency=medium
+
+  * New upstream version 20.3.1+ds1
+  * Prepare for v20 in unstable
+
+ -- Vasyl Gello <vasek.gello@gmail.com>  Thu, 04 Aug 2022 09:55:17 +0000
+
 kodi-pvr-vdr-vnsi (19.0.3+ds1-1) unstable; urgency=medium
 
   * New upstream version 19.0.3+ds1
diff -pruN 19.0.3+ds1-1/debian/control 20.3.1+ds1-1/debian/control
--- 19.0.3+ds1-1/debian/control	2022-03-21 17:49:30.000000000 +0000
+++ 20.3.1+ds1-1/debian/control	2022-08-04 09:55:17.000000000 +0000
@@ -4,12 +4,12 @@ Section: video
 Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
 Uploaders: Tobias Grimm <etobi@debian.org>, Vasyl Gello <vasek.gello@gmail.com>
 Build-Depends: debhelper-compat (= 13)
-Build-Depends-Arch: dh-sequence-kodiaddon (>= 2:19~),
+Build-Depends-Arch: dh-sequence-kodiaddon (>= 2:20~),
  cmake,
  libgles2-mesa-dev [armel armhf] | libgl1-mesa-dev | libgl-dev,
  libtinyxml-dev,
  pkg-config
-Standards-Version: 4.6.0
+Standards-Version: 4.6.1
 Rules-Requires-Root: no
 Vcs-Git: https://salsa.debian.org/multimedia-team/kodi-media-center/kodi-pvr-vdr-vnsi.git
 Vcs-Browser: https://salsa.debian.org/multimedia-team/kodi-media-center/kodi-pvr-vdr-vnsi
diff -pruN 19.0.3+ds1-1/debian/copyright 20.3.1+ds1-1/debian/copyright
--- 19.0.3+ds1-1/debian/copyright	2021-09-01 14:07:21.000000000 +0000
+++ 20.3.1+ds1-1/debian/copyright	2022-08-04 09:55:17.000000000 +0000
@@ -2,11 +2,10 @@ Format: https://www.debian.org/doc/packa
 Upstream-Name: pvr.vdr.vnsi
 Source: https://github.com/kodi-pvr/pvr.vdr.vnsi
 Files-Excluded: depends
-Upstream-Contact: interest@kodi.tv
 
 Files: *
 Copyright: 2005-2013, Team XBMC
- 2013-2021, Team Kodi
+ 2013-2022, Team Kodi
 License: GPL-2+
 
 Files: lib/kissnet/*
@@ -37,7 +36,7 @@ License: GPL-2+
 Files: debian/*
 Copyright: 2013 fernetmenta <fernetmenta@kodi.tv>
            2015 Tobias Grimm <etobi@debian.org>
-           2020-2021 Vasyl Gello <vasek.gello@gmail.com>
+           2020-2022 Vasyl Gello <vasek.gello@gmail.com>
 License: GPL-2+
 
 License: GPL-2+
diff -pruN 19.0.3+ds1-1/debian/upstream/metadata 20.3.1+ds1-1/debian/upstream/metadata
--- 19.0.3+ds1-1/debian/upstream/metadata	2021-09-01 14:07:21.000000000 +0000
+++ 20.3.1+ds1-1/debian/upstream/metadata	2022-08-04 09:55:17.000000000 +0000
@@ -1,5 +1,6 @@
 Bug-Database: https://github.com/kodi-pvr/pvr.vdr.vnsi/issues
 Bug-Submit: https://github.com/kodi-pvr/pvr.vdr.vnsi/issues/new
+Contact: interest@kodi.tv
 FAQ: https://kodi.wiki/view/Main_Page
 Repository: https://github.com/kodi-pvr/pvr.vdr.vnsi.git
 Repository-Browse: https://github.com/kodi-pvr/pvr.vdr.vnsi
diff -pruN 19.0.3+ds1-1/debian/watch 20.3.1+ds1-1/debian/watch
--- 19.0.3+ds1-1/debian/watch	2021-08-26 10:39:27.000000000 +0000
+++ 20.3.1+ds1-1/debian/watch	2022-08-04 09:55:17.000000000 +0000
@@ -5,4 +5,4 @@ opts="repack, \
       repacksuffix=+ds1, \
       dversionmangle=auto" \
 https://github.com/kodi-pvr/pvr.vdr.vnsi/releases \
-/kodi-pvr/pvr.vdr.vnsi/archive/refs/tags/?(\d\S*)-Matrix\.tar\.gz
+/kodi-pvr/pvr.vdr.vnsi/archive/refs/tags/?(\d\S*)-Nexus\.tar\.gz
diff -pruN 19.0.3+ds1-1/.github/workflows/build.yml 20.3.1+ds1-1/.github/workflows/build.yml
--- 19.0.3+ds1-1/.github/workflows/build.yml	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/.github/workflows/build.yml	2022-06-20 21:32:29.000000000 +0000
@@ -27,14 +27,14 @@ jobs:
       env:
         DEBIAN_BUILD: ${{ matrix.DEBIAN_BUILD }}
       run: |
-        if [[ $DEBIAN_BUILD == true ]]; then sudo add-apt-repository -y ppa:team-xbmc/ppa; fi
+        if [[ $DEBIAN_BUILD == true ]]; then sudo add-apt-repository -y ppa:team-xbmc/xbmc-nightly; fi
         if [[ $DEBIAN_BUILD == true ]]; then sudo apt-get update; fi
         if [[ $DEBIAN_BUILD == true ]]; then sudo apt-get install fakeroot; fi
     - name: Checkout Kodi repo
       uses: actions/checkout@v2
       with:
         repository: xbmc/xbmc
-        ref: Matrix
+        ref: master
         path: xbmc
     - name: Checkout pvr.vdr.vnsi repo
       uses: actions/checkout@v2
@@ -48,7 +48,7 @@ jobs:
       run: |
         if [[ $DEBIAN_BUILD != true ]]; then cd ${app_id} && mkdir -p build && cd build; fi
         if [[ $DEBIAN_BUILD != true ]]; then cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=${{ github.workspace }} -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=${{ github.workspace }}/xbmc/addons -DPACKAGE_ZIP=1 ${{ github.workspace }}/xbmc/cmake/addons; fi
-        if [[ $DEBIAN_BUILD == true ]]; then wget https://raw.githubusercontent.com/xbmc/xbmc/Matrix/xbmc/addons/kodi-dev-kit/tools/debian-addon-package-test.sh && chmod +x ./debian-addon-package-test.sh; fi
+        if [[ $DEBIAN_BUILD == true ]]; then wget https://raw.githubusercontent.com/xbmc/xbmc/master/xbmc/addons/kodi-dev-kit/tools/debian-addon-package-test.sh && chmod +x ./debian-addon-package-test.sh; fi
         if [[ $DEBIAN_BUILD == true ]]; then sudo apt-get build-dep ${{ github.workspace }}/${app_id}; fi
     - name: Build
       env:
diff -pruN 19.0.3+ds1-1/.github/workflows/changelog-and-release.yml 20.3.1+ds1-1/.github/workflows/changelog-and-release.yml
--- 19.0.3+ds1-1/.github/workflows/changelog-and-release.yml	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/.github/workflows/changelog-and-release.yml	2022-06-20 21:32:29.000000000 +0000
@@ -133,7 +133,7 @@ jobs:
         shell: bash
 
       # Create a release at {steps.required-variables.outputs.branch}
-      # - tag and release name format: {steps.required-variables.outputs.version}-{steps.required-variables.outputs.branch} ie. 1.0.0-Matrix
+      # - tag and release name format: {steps.required-variables.outputs.version}-{steps.required-variables.outputs.branch} ie. 20.0.0-Nexus
       # - release body: {steps.required-variables.outputs.changes}
       - name: Create Release
         id: create-release
diff -pruN 19.0.3+ds1-1/.github/workflows/release.yml 20.3.1+ds1-1/.github/workflows/release.yml
--- 19.0.3+ds1-1/.github/workflows/release.yml	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/.github/workflows/release.yml	2022-06-20 21:32:29.000000000 +0000
@@ -50,7 +50,7 @@ jobs:
         working-directory: ${{ github.event.repository.name }}
 
       # Create a release at {steps.required-variables.outputs.branch}
-      # - tag and release name format: {steps.required-variables.outputs.version}-{steps.required-variables.outputs.branch} ie. 1.0.0-Matrix
+      # - tag and release name format: {steps.required-variables.outputs.version}-{steps.required-variables.outputs.branch} ie. 20.0.0-Nexus
       # - release body: {steps.required-variables.outputs.changes}
       - name: Create Release
         id: create-release
diff -pruN 19.0.3+ds1-1/Jenkinsfile 20.3.1+ds1-1/Jenkinsfile
--- 19.0.3+ds1-1/Jenkinsfile	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/Jenkinsfile	2022-06-20 21:32:29.000000000 +0000
@@ -1 +1 @@
-buildPlugin(version: "Matrix")
+buildPlugin(version: "Nexus")
diff -pruN 19.0.3+ds1-1/pvr.vdr.vnsi/addon.xml.in 20.3.1+ds1-1/pvr.vdr.vnsi/addon.xml.in
--- 19.0.3+ds1-1/pvr.vdr.vnsi/addon.xml.in	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/pvr.vdr.vnsi/addon.xml.in	2022-06-20 21:32:29.000000000 +0000
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <addon
   id="pvr.vdr.vnsi"
-  version="19.0.3"
+  version="20.3.1"
   name="VDR VNSI Client"
   provider-name="Team Kodi, FernetMenta">
   <requires>@ADDON_DEPENDS@</requires>
diff -pruN 19.0.3+ds1-1/pvr.vdr.vnsi/changelog.txt 20.3.1+ds1-1/pvr.vdr.vnsi/changelog.txt
--- 19.0.3+ds1-1/pvr.vdr.vnsi/changelog.txt	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/pvr.vdr.vnsi/changelog.txt	2022-06-20 21:32:29.000000000 +0000
@@ -1,20 +1,34 @@
-v19.0.3
+v20.3.1
+- Fix further crashes on some channels
+
+v20.3.0
+- If picon named logo doesn't exists channel name is used in logo filename
+
+v20.2.3
+- Fix Kodi crash upon reconnect
+
+v20.2.2
 - Fix connection errors on Kodi start and during backend reconnections
 
-v19.0.2
+v20.2.1
 - Fix crash on some channels
 
-v19.0.1
-- Translations updates from Weblate
-	- be_by, da_dk, es_mx, hu_hu, is_is, ko_kr, lt_lt, nb_no, zh_tw
+v20.2.0
+- Translation updates by Weblate
+- Kodi main API update to version 2.0.0
+
+v20.1.0
+- Kodi PVR API to 8.0.0
+  - Add supports recordings delete capability
+  - Enforce EDL limits
 
-v19.0.0
+v20.0.0
 - Translations updates from Weblate
   - da_dk
   - To allow also addon.xml content update by Weblate
 - Minor cleanups on addon addon.xml
-- Changed test builds to 'Kodi 19 Matrix'
-- Increased version to 19.0.0
+- Changed test builds to 'Kodi 20 Nexus'
+- Increased version to 20.0.0
   - With start of Kodi 20 Nexus, takes addon as major the same version number as Kodi.
     This done to know easier to which Kodi the addon works.
 
diff -pruN 19.0.3+ds1-1/README.md 20.3.1+ds1-1/README.md
--- 19.0.3+ds1-1/README.md	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/README.md	2022-06-20 21:32:29.000000000 +0000
@@ -1,7 +1,7 @@
 [![License: GPL-2.0-or-later](https://img.shields.io/badge/License-GPL%20v2+-blue.svg)](LICENSE.md)
-[![Build and run tests](https://github.com/kodi-pvr/pvr.vdr.vnsi/actions/workflows/build.yml/badge.svg?branch=Matrix)](https://github.com/kodi-pvr/pvr.vdr.vnsi/actions/workflows/build.yml)
-[![Build Status](https://dev.azure.com/teamkodi/kodi-pvr/_apis/build/status/kodi-pvr.pvr.vdr.vnsi?branchName=Matrix)](https://dev.azure.com/teamkodi/kodi-pvr/_build/latest?definitionId=69&branchName=Matrix)
-[![Build Status](https://jenkins.kodi.tv/view/Addons/job/kodi-pvr/job/pvr.vdr.vnsi/job/Matrix/badge/icon)](https://jenkins.kodi.tv/blue/organizations/jenkins/kodi-pvr%2Fpvr.vdr.vnsi/branches/)
+[![Build and run tests](https://github.com/kodi-pvr/pvr.vdr.vnsi/actions/workflows/build.yml/badge.svg?branch=Nexus)](https://github.com/kodi-pvr/pvr.vdr.vnsi/actions/workflows/build.yml)
+[![Build Status](https://dev.azure.com/teamkodi/kodi-pvr/_apis/build/status/kodi-pvr.pvr.vdr.vnsi?branchName=Nexus)](https://dev.azure.com/teamkodi/kodi-pvr/_build/latest?definitionId=69&branchName=Nexus)
+[![Build Status](https://jenkins.kodi.tv/view/Addons/job/kodi-pvr/job/pvr.vdr.vnsi/job/Nexus/badge/icon)](https://jenkins.kodi.tv/blue/organizations/jenkins/kodi-pvr%2Fpvr.vdr.vnsi/branches/)
 [![Coverity Scan Build Status](https://scan.coverity.com/projects/5120/badge.svg)](https://scan.coverity.com/projects/5120)
 
 # VDR VNSI PVR
@@ -11,8 +11,8 @@ VDR VNSI PVR client addon for [Kodi](htt
 
 ### Linux
 
-1. `git clone --branch Matrix https://github.com/xbmc/xbmc.git`
-2. `git clone --branch Matrix https://github.com/kodi-pvr/pvr.vdr.vnsi.git`
+1. `git clone --branch master https://github.com/xbmc/xbmc.git`
+2. `git clone https://github.com/kodi-pvr/pvr.vdr.vnsi.git`
 3. `cd pvr.vdr.vnsi && mkdir build && cd build`
 4. `cmake -DADDONS_TO_BUILD=pvr.vdr.vnsi -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons`
 5. `make`
diff -pruN 19.0.3+ds1-1/src/Addon.cpp 20.3.1+ds1-1/src/Addon.cpp
--- 19.0.3+ds1-1/src/Addon.cpp	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/Addon.cpp	2022-06-20 21:32:29.000000000 +0000
@@ -23,36 +23,33 @@ ADDON_STATUS CPVRAddon::Create()
 }
 
 ADDON_STATUS CPVRAddon::SetSetting(const std::string& settingName,
-                                   const kodi::CSettingValue& settingValue)
+                                   const kodi::addon::CSettingValue& settingValue)
 {
   return CVNSISettings::Get().SetSetting(settingName, settingValue);
 }
 
-ADDON_STATUS CPVRAddon::CreateInstance(int instanceType,
-                                       const std::string& instanceID,
-                                       KODI_HANDLE instance,
-                                       const std::string& version,
-                                       KODI_HANDLE& addonInstance)
+ADDON_STATUS CPVRAddon::CreateInstance(const kodi::addon::IInstanceInfo& instance,
+                                       KODI_ADDON_INSTANCE_HDL& hdl)
 {
   kodi::Log(ADDON_LOG_DEBUG, "%s: Creating VDR VNSI PVR-Client", __func__);
 
-  if (instanceID.empty())
+  if (instance.GetID().empty())
   {
     kodi::Log(ADDON_LOG_ERROR, "%s: Instance creation called without id", __func__);
     return ADDON_STATUS_UNKNOWN;
   }
 
-  if (instanceType == ADDON_INSTANCE_PVR)
+  if (instance.IsType(ADDON_INSTANCE_PVR))
   {
     CVNSIClientInstance* client = nullptr;
     try
     {
-      client = new CVNSIClientInstance(*this, instance, version);
+      client = new CVNSIClientInstance(*this, instance);
       if (client->Start(CVNSISettings::Get().GetHostname(), CVNSISettings::Get().GetPort(), nullptr,
                         CVNSISettings::Get().GetWolMac()))
       {
-        addonInstance = client;
-        m_usedInstances.emplace(instanceID, client);
+        hdl = client;
+        m_usedInstances.emplace(instance.GetID(), client);
         return ADDON_STATUS_OK;
       }
     }
@@ -66,13 +63,12 @@ ADDON_STATUS CPVRAddon::CreateInstance(i
   return ADDON_STATUS_UNKNOWN;
 }
 
-void CPVRAddon::DestroyInstance(int instanceType,
-                                const std::string& instanceID,
-                                KODI_HANDLE addonInstance)
+void CPVRAddon::DestroyInstance(const kodi::addon::IInstanceInfo& instance,
+                                const KODI_ADDON_INSTANCE_HDL hdl)
 {
-  if (instanceType == ADDON_INSTANCE_PVR)
+  if (instance.IsType(ADDON_INSTANCE_PVR))
   {
-    const auto& it = m_usedInstances.find(instanceID);
+    const auto& it = m_usedInstances.find(instance.GetID());
     if (it != m_usedInstances.end())
     {
       m_usedInstances.erase(it);
diff -pruN 19.0.3+ds1-1/src/Addon.h 20.3.1+ds1-1/src/Addon.h
--- 19.0.3+ds1-1/src/Addon.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/Addon.h	2022-06-20 21:32:29.000000000 +0000
@@ -13,22 +13,18 @@
 
 class CVNSIClientInstance;
 
-class ATTRIBUTE_HIDDEN CPVRAddon : public kodi::addon::CAddonBase
+class ATTR_DLL_LOCAL CPVRAddon : public kodi::addon::CAddonBase
 {
 public:
   CPVRAddon() = default;
 
   ADDON_STATUS Create() override;
   ADDON_STATUS SetSetting(const std::string& settingName,
-                          const kodi::CSettingValue& settingValue) override;
-  ADDON_STATUS CreateInstance(int instanceType,
-                              const std::string& instanceID,
-                              KODI_HANDLE instance,
-                              const std::string& version,
-                              KODI_HANDLE& addonInstance) override;
-  void DestroyInstance(int instanceType,
-                       const std::string& instanceID,
-                       KODI_HANDLE addonInstance) override;
+                          const kodi::addon::CSettingValue& settingValue) override;
+  ADDON_STATUS CreateInstance(const kodi::addon::IInstanceInfo& instance,
+                              KODI_ADDON_INSTANCE_HDL& hdl) override;
+  void DestroyInstance(const kodi::addon::IInstanceInfo& instance,
+                       const KODI_ADDON_INSTANCE_HDL hdl) override;
 
 private:
   std::unordered_map<std::string, CVNSIClientInstance*> m_usedInstances;
diff -pruN 19.0.3+ds1-1/src/Channels.h 20.3.1+ds1-1/src/Channels.h
--- 19.0.3+ds1-1/src/Channels.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/Channels.h	2022-06-20 21:32:29.000000000 +0000
@@ -14,7 +14,7 @@
 #include <string>
 #include <vector>
 
-class ATTRIBUTE_HIDDEN CProvider
+class ATTR_DLL_LOCAL CProvider
 {
 public:
   CProvider() = default;
@@ -27,7 +27,7 @@ public:
   bool m_whitelist = false;
 };
 
-class ATTRIBUTE_HIDDEN CChannel
+class ATTR_DLL_LOCAL CChannel
 {
 public:
   void SetCaids(const char* caids);
@@ -41,7 +41,7 @@ public:
   bool m_blacklist;
 };
 
-class ATTRIBUTE_HIDDEN CVNSIChannels
+class ATTR_DLL_LOCAL CVNSIChannels
 {
 public:
   CVNSIChannels() = default;
diff -pruN 19.0.3+ds1-1/src/ClientInstance.cpp 20.3.1+ds1-1/src/ClientInstance.cpp
--- 19.0.3+ds1-1/src/ClientInstance.cpp	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/ClientInstance.cpp	2022-06-20 21:32:29.000000000 +0000
@@ -20,6 +20,7 @@
 #include <algorithm>
 #include <kodi/General.h>
 #include <kodi/Network.h>
+#include <kodi/Filesystem.h>
 #include <string.h>
 #include <time.h>
 
@@ -89,9 +90,8 @@ void CVNSIClientInstance::Queue::Set(std
 }
 
 CVNSIClientInstance::CVNSIClientInstance(const CPVRAddon& base,
-                                         KODI_HANDLE instance,
-                                         const std::string& kodiVersion)
-  : kodi::addon::CInstancePVRClient(instance, kodiVersion),
+                                         const kodi::addon::IInstanceInfo& instance)
+  : kodi::addon::CInstancePVRClient(instance),
     cVNSISession(*dynamic_cast<kodi::addon::CInstancePVRClient*>(this)),
     m_base(base)
 {
@@ -110,18 +110,22 @@ CVNSIClientInstance::~CVNSIClientInstanc
 
 void CVNSIClientInstance::OnDisconnect()
 {
-  kodi::addon::CInstancePVRClient::ConnectionStateChange(
-      "vnsi connection lost", PVR_CONNECTION_STATE_DISCONNECTED, kodi::GetLocalizedString(30044));
+  kodi::addon::CInstancePVRClient::ConnectionStateChange("vnsi connection lost",
+                                                         PVR_CONNECTION_STATE_DISCONNECTED,
+                                                         kodi::addon::GetLocalizedString(30044));
 }
 
 void CVNSIClientInstance::OnReconnect()
 {
   EnableStatusInterface(true, false);
 
+  if (m_startInformThread.joinable())
+    m_startInformThread.join();
+
   m_startInformThread = std::thread([&]() {
     kodi::addon::CInstancePVRClient::ConnectionStateChange("vnsi connection established",
                                                           PVR_CONNECTION_STATE_CONNECTED,
-                                                          kodi::GetLocalizedString(30045));
+                                                          kodi::addon::GetLocalizedString(30045));
 
     kodi::addon::CInstancePVRClient::TriggerChannelUpdate();
     kodi::addon::CInstancePVRClient::TriggerTimerUpdate();
@@ -201,6 +205,7 @@ PVR_ERROR CVNSIClientInstance::GetCapabi
 {
   capabilities.SetSupportsEPG(true);
   capabilities.SetSupportsRecordings(true);
+  capabilities.SetSupportsRecordingsDelete(true);
   capabilities.SetSupportsRecordingEdl(true);
   capabilities.SetSupportsTimers(true);
   capabilities.SetSupportsTV(true);
@@ -383,14 +388,22 @@ PVR_ERROR CVNSIClientInstance::GetChanne
       if (m_protocol >= 6)
       {
         std::string path = CVNSISettings::Get().GetIconPath();
-        std::string ref = vresp->extract_String();
+        std::string ref = vresp->extract_String(); // Picon ref
         if (!path.empty())
         {
           if (path[path.length() - 1] != '/')
             path += '/';
-          path += ref;
-          path += ".png";
-          tag.SetIconPath(path);
+
+          ref += ".png";
+          std::string image_path = path + ref;
+          if (!kodi::vfs::FileExists(image_path)) // Use channel name
+          {
+            std::string channelNameImage = tag.GetChannelName();
+            std::transform(channelNameImage.begin(), channelNameImage.end(), channelNameImage.begin(), ::tolower);
+            channelNameImage += ".png";
+            image_path = path + channelNameImage;
+          }
+          tag.SetIconPath(image_path);
         }
       }
       tag.SetIsRadio(radio);
@@ -947,7 +960,7 @@ PVR_ERROR CVNSIClientInstance::GetTimerT
       kodi::addon::PVRTimerType type;
 
       type.SetId(VNSI_TIMER_TYPE_MAN);
-      type.SetDescription(kodi::GetLocalizedString(30200));
+      type.SetDescription(kodi::addon::GetLocalizedString(30200));
       type.SetAttributes(PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE |
                          PVR_TIMER_TYPE_SUPPORTS_CHANNELS | PVR_TIMER_TYPE_SUPPORTS_START_TIME |
                          PVR_TIMER_TYPE_SUPPORTS_END_TIME | PVR_TIMER_TYPE_SUPPORTS_PRIORITY |
@@ -962,7 +975,7 @@ PVR_ERROR CVNSIClientInstance::GetTimerT
       kodi::addon::PVRTimerType type;
 
       type.SetId(VNSI_TIMER_TYPE_MAN_REPEAT);
-      type.SetDescription(kodi::GetLocalizedString(30201));
+      type.SetDescription(kodi::addon::GetLocalizedString(30201));
       type.SetAttributes(PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_IS_REPEATING |
                          PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE | PVR_TIMER_TYPE_SUPPORTS_CHANNELS |
                          PVR_TIMER_TYPE_SUPPORTS_START_TIME | PVR_TIMER_TYPE_SUPPORTS_END_TIME |
@@ -978,7 +991,7 @@ PVR_ERROR CVNSIClientInstance::GetTimerT
       kodi::addon::PVRTimerType type;
 
       type.SetId(VNSI_TIMER_TYPE_MAN_REPEAT_CHILD);
-      type.SetDescription(kodi::GetLocalizedString(30205));
+      type.SetDescription(kodi::addon::GetLocalizedString(30205));
       type.SetAttributes(PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_IS_READONLY |
                          PVR_TIMER_TYPE_SUPPORTS_CHANNELS | PVR_TIMER_TYPE_SUPPORTS_START_TIME |
                          PVR_TIMER_TYPE_SUPPORTS_END_TIME | PVR_TIMER_TYPE_SUPPORTS_PRIORITY |
@@ -993,7 +1006,7 @@ PVR_ERROR CVNSIClientInstance::GetTimerT
       kodi::addon::PVRTimerType type;
 
       type.SetId(VNSI_TIMER_TYPE_EPG);
-      type.SetDescription(kodi::GetLocalizedString(30202));
+      type.SetDescription(kodi::addon::GetLocalizedString(30202));
       type.SetAttributes(
           PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE | PVR_TIMER_TYPE_REQUIRES_EPG_TAG_ON_CREATE |
           PVR_TIMER_TYPE_SUPPORTS_CHANNELS | PVR_TIMER_TYPE_SUPPORTS_START_TIME |
@@ -1022,7 +1035,7 @@ PVR_ERROR CVNSIClientInstance::GetTimerT
         kodi::addon::PVRTimerType type;
 
         type.SetId(VNSI_TIMER_TYPE_EPG_SEARCH);
-        type.SetDescription(kodi::GetLocalizedString(30204));
+        type.SetDescription(kodi::addon::GetLocalizedString(30204));
         type.SetAttributes(PVR_TIMER_TYPE_IS_REPEATING | PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE |
                            PVR_TIMER_TYPE_SUPPORTS_CHANNELS |
                            PVR_TIMER_TYPE_SUPPORTS_TITLE_EPG_MATCH |
@@ -1034,7 +1047,7 @@ PVR_ERROR CVNSIClientInstance::GetTimerT
       kodi::addon::PVRTimerType type;
 
       type.SetId(VNSI_TIMER_TYPE_VPS);
-      type.SetDescription(kodi::GetLocalizedString(30203));
+      type.SetDescription(kodi::addon::GetLocalizedString(30203));
       type.SetAttributes(PVR_TIMER_TYPE_IS_MANUAL | PVR_TIMER_TYPE_SUPPORTS_ENABLE_DISABLE |
                          PVR_TIMER_TYPE_SUPPORTS_CHANNELS | PVR_TIMER_TYPE_SUPPORTS_START_TIME |
                          PVR_TIMER_TYPE_SUPPORTS_END_TIME | PVR_TIMER_TYPE_SUPPORTS_PRIORITY |
diff -pruN 19.0.3+ds1-1/src/ClientInstance.h 20.3.1+ds1-1/src/ClientInstance.h
--- 19.0.3+ds1-1/src/ClientInstance.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/ClientInstance.h	2022-06-20 21:32:29.000000000 +0000
@@ -24,11 +24,11 @@ class cRequestPacket;
 class cVNSIDemux;
 class cVNSIRecording;
 
-class ATTRIBUTE_HIDDEN CVNSIClientInstance : public kodi::addon::CInstancePVRClient,
-                                             public cVNSISession
+class ATTR_DLL_LOCAL CVNSIClientInstance : public kodi::addon::CInstancePVRClient,
+                                           public cVNSISession
 {
 public:
-  CVNSIClientInstance(const CPVRAddon& base, KODI_HANDLE instance, const std::string& kodiVersion);
+  CVNSIClientInstance(const CPVRAddon& base, const kodi::addon::IInstanceInfo& instance);
   ~CVNSIClientInstance() override;
 
   bool Start(const std::string& hostname,
diff -pruN 19.0.3+ds1-1/src/GUIWindowAdmin.cpp 20.3.1+ds1-1/src/GUIWindowAdmin.cpp
--- 19.0.3+ds1-1/src/GUIWindowAdmin.cpp	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/GUIWindowAdmin.cpp	2022-06-20 21:32:29.000000000 +0000
@@ -279,7 +279,7 @@ void cOSDRender::SetBlock(
 
 #if defined(HAS_GL) || defined(HAS_GLES)
 
-class ATTRIBUTE_HIDDEN cOSDRenderGL : public cOSDRender, public kodi::gui::gl::CShaderProgram
+class ATTR_DLL_LOCAL cOSDRenderGL : public cOSDRender, public kodi::gui::gl::CShaderProgram
 {
 public:
   cOSDRenderGL();
@@ -330,8 +330,10 @@ cOSDRenderGL::~cOSDRenderGL()
 
 bool cOSDRenderGL::Init()
 {
-  std::string fraqShader = kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/frag.glsl");
-  std::string vertShader = kodi::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/vert.glsl");
+  std::string fraqShader =
+      kodi::addon::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/frag.glsl");
+  std::string vertShader =
+      kodi::addon::GetAddonPath("resources/shaders/" GL_TYPE_STRING "/vert.glsl");
   if (!LoadShaderFiles(vertShader, fraqShader) || !CompileAndLink())
     return false;
 
@@ -693,14 +695,14 @@ bool cVNSIAdmin::OnFocus(int controlId)
 {
   if (controlId == CONTROL_OSD_BUTTON)
   {
-    SetControlLabel(CONTROL_OSD_BUTTON, kodi::GetLocalizedString(30102));
+    SetControlLabel(CONTROL_OSD_BUTTON, kodi::addon::GetLocalizedString(30102));
     MarkDirtyRegion();
     m_bIsOsdControl = true;
     return true;
   }
   else if (m_bIsOsdControl)
   {
-    SetControlLabel(CONTROL_OSD_BUTTON, kodi::GetLocalizedString(30103));
+    SetControlLabel(CONTROL_OSD_BUTTON, kodi::addon::GetLocalizedString(30103));
     MarkDirtyRegion();
     m_bIsOsdControl = false;
     return true;
@@ -837,7 +839,7 @@ bool cVNSIAdmin::OnAction(ADDON_ACTION a
   if (GetFocusId() != CONTROL_OSD_BUTTON && m_bIsOsdControl)
   {
     m_bIsOsdControl = false;
-    SetControlLabel(CONTROL_OSD_BUTTON, kodi::GetLocalizedString(30103));
+    SetControlLabel(CONTROL_OSD_BUTTON, kodi::addon::GetLocalizedString(30103));
     MarkDirtyRegion();
   }
   else if (GetFocusId() == CONTROL_OSD_BUTTON)
@@ -1192,7 +1194,7 @@ void cVNSIAdmin::LoadListItemsProviders(
     if (!m_channels.m_providers[i].m_name.empty())
       tmp = m_channels.m_providers[i].m_name;
     else
-      tmp = kodi::GetLocalizedString(30114);
+      tmp = kodi::addon::GetLocalizedString(30114);
     if (m_channels.m_providers[i].m_caid == 0)
     {
       tmp += " - FTA";
@@ -1235,7 +1237,7 @@ void cVNSIAdmin::LoadListItemsChannels()
     if (!m_channels.m_channels[i].m_provider.empty())
       tmp += m_channels.m_channels[i].m_provider;
     else
-      tmp += kodi::GetLocalizedString(30114);
+      tmp += kodi::addon::GetLocalizedString(30114);
     tmp += ")";
     std::shared_ptr<kodi::gui::CListItem> item = std::make_shared<kodi::gui::CListItem>(tmp);
     item->SetProperty("identifier", std::to_string(i));
diff -pruN 19.0.3+ds1-1/src/GUIWindowAdmin.h 20.3.1+ds1-1/src/GUIWindowAdmin.h
--- 19.0.3+ds1-1/src/GUIWindowAdmin.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/GUIWindowAdmin.h	2022-06-20 21:32:29.000000000 +0000
@@ -19,8 +19,7 @@
 
 class cOSDRender;
 
-class ATTRIBUTE_HIDDEN cVNSIAdmin : public cVNSISession,
-                                    public kodi::gui::CWindow
+class ATTR_DLL_LOCAL cVNSIAdmin : public cVNSISession, public kodi::gui::CWindow
 {
 public:
   cVNSIAdmin(kodi::addon::CInstancePVRClient& instance);
diff -pruN 19.0.3+ds1-1/src/GUIWindowChannelScan.cpp 20.3.1+ds1-1/src/GUIWindowChannelScan.cpp
--- 19.0.3+ds1-1/src/GUIWindowChannelScan.cpp	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/GUIWindowChannelScan.cpp	2022-06-20 21:32:29.000000000 +0000
@@ -206,7 +206,7 @@ bool cVNSIChannelScan::OnClick(int contr
         m_stopped = false;
         m_Canceled = false;
         SetProperty("Scanning", "running");
-        SetControlLabel(BUTTON_START, kodi::GetLocalizedString(222));
+        SetControlLabel(BUTTON_START, kodi::addon::GetLocalizedString(222));
         StartScan();
       }
       else if (!m_stopped)
@@ -237,8 +237,8 @@ bool cVNSIChannelScan::OnAction(ADDON_AC
 
 void cVNSIChannelScan::StartScan()
 {
-  m_header = kodi::GetLocalizedString(30025);
-  m_Signal = kodi::GetLocalizedString(30029);
+  m_header = kodi::addon::GetLocalizedString(30025);
+  m_Signal = kodi::addon::GetLocalizedString(30029);
   SetProgress(0);
   SetSignal(0, false);
 
@@ -255,10 +255,10 @@ void cVNSIChannelScan::StartScan()
       SetControlLabel(LABEL_TYPE, "DVB-S/S2");
       break;
     case PVRINPUT:
-      SetControlLabel(LABEL_TYPE, kodi::GetLocalizedString(30032));
+      SetControlLabel(LABEL_TYPE, kodi::addon::GetLocalizedString(30032));
       break;
     case PVRINPUT_FM:
-      SetControlLabel(LABEL_TYPE, kodi::GetLocalizedString(30033));
+      SetControlLabel(LABEL_TYPE, kodi::addon::GetLocalizedString(30033));
       break;
     case DVB_ATSC:
       SetControlLabel(LABEL_TYPE, "ATSC");
@@ -296,9 +296,9 @@ void cVNSIChannelScan::StartScan()
 
 SCANError:
   kodi::Log(ADDON_LOG_ERROR, "%s - Return error after start (%i)", __func__, retCode);
-  SetControlLabel(LABEL_STATUS, kodi::GetLocalizedString(24071));
-  SetControlLabel(BUTTON_START, kodi::GetLocalizedString(30024));
-  SetControlLabel(HEADER_LABEL, kodi::GetLocalizedString(30043));
+  SetControlLabel(LABEL_STATUS, kodi::addon::GetLocalizedString(24071));
+  SetControlLabel(BUTTON_START, kodi::addon::GetLocalizedString(30024));
+  SetControlLabel(HEADER_LABEL, kodi::addon::GetLocalizedString(30043));
   m_stopped = true;
 }
 
@@ -315,9 +315,9 @@ void cVNSIChannelScan::StopScan()
   if (retCode != VNSI_RET_OK)
   {
     kodi::Log(ADDON_LOG_ERROR, "%s - Return error after stop (%i)", __func__, retCode);
-    SetControlLabel(LABEL_STATUS, kodi::GetLocalizedString(24071));
-    SetControlLabel(BUTTON_START, kodi::GetLocalizedString(30024));
-    SetControlLabel(HEADER_LABEL, kodi::GetLocalizedString(30043));
+    SetControlLabel(LABEL_STATUS, kodi::addon::GetLocalizedString(24071));
+    SetControlLabel(BUTTON_START, kodi::addon::GetLocalizedString(30024));
+    SetControlLabel(HEADER_LABEL, kodi::addon::GetLocalizedString(30043));
     m_stopped = true;
   }
   return;
@@ -329,8 +329,8 @@ void cVNSIChannelScan::ReturnFromProcess
   {
     m_running = false;
     ClearProperties();
-    SetControlLabel(BUTTON_START, kodi::GetLocalizedString(30010));
-    SetControlLabel(HEADER_LABEL, kodi::GetLocalizedString(30009));
+    SetControlLabel(BUTTON_START, kodi::addon::GetLocalizedString(30010));
+    SetControlLabel(HEADER_LABEL, kodi::addon::GetLocalizedString(30009));
 
     m_progressDone->SetVisible(false);
     m_progressSignal->SetVisible(false);
@@ -498,13 +498,13 @@ bool cVNSIChannelScan::OnResponsePacket(
   {
     if (!m_Canceled)
     {
-      SetControlLabel(HEADER_LABEL, kodi::GetLocalizedString(30036));
-      SetControlLabel(BUTTON_START, kodi::GetLocalizedString(30024));
-      SetControlLabel(LABEL_STATUS, kodi::GetLocalizedString(30041));
+      SetControlLabel(HEADER_LABEL, kodi::addon::GetLocalizedString(30036));
+      SetControlLabel(BUTTON_START, kodi::addon::GetLocalizedString(30024));
+      SetControlLabel(LABEL_STATUS, kodi::addon::GetLocalizedString(30041));
     }
     else
     {
-      SetControlLabel(HEADER_LABEL, kodi::GetLocalizedString(30042));
+      SetControlLabel(HEADER_LABEL, kodi::addon::GetLocalizedString(30042));
     }
   }
   else if (requestID == VNSI_SCANNER_STATUS)
@@ -513,27 +513,27 @@ bool cVNSIChannelScan::OnResponsePacket(
     if (status == 0)
     {
       if (m_Canceled)
-        SetControlLabel(LABEL_STATUS, kodi::GetLocalizedString(16200));
+        SetControlLabel(LABEL_STATUS, kodi::addon::GetLocalizedString(16200));
       else
-        SetControlLabel(LABEL_STATUS, kodi::GetLocalizedString(30040));
+        SetControlLabel(LABEL_STATUS, kodi::addon::GetLocalizedString(30040));
 
-      SetControlLabel(BUTTON_START, kodi::GetLocalizedString(30024));
+      SetControlLabel(BUTTON_START, kodi::addon::GetLocalizedString(30024));
       m_stopped = true;
     }
     else if (status == 1)
     {
-      SetControlLabel(LABEL_STATUS, kodi::GetLocalizedString(30039));
+      SetControlLabel(LABEL_STATUS, kodi::addon::GetLocalizedString(30039));
     }
     else if (status == 2)
     {
-      SetControlLabel(LABEL_STATUS, kodi::GetLocalizedString(30037));
-      SetControlLabel(BUTTON_START, kodi::GetLocalizedString(30024));
-      SetControlLabel(HEADER_LABEL, kodi::GetLocalizedString(30043));
+      SetControlLabel(LABEL_STATUS, kodi::addon::GetLocalizedString(30037));
+      SetControlLabel(BUTTON_START, kodi::addon::GetLocalizedString(30024));
+      SetControlLabel(HEADER_LABEL, kodi::addon::GetLocalizedString(30043));
       m_stopped = true;
     }
     else if (status == 3)
     {
-      SetControlLabel(LABEL_STATUS, kodi::GetLocalizedString(30038));
+      SetControlLabel(LABEL_STATUS, kodi::addon::GetLocalizedString(30038));
     }
   }
   else
diff -pruN 19.0.3+ds1-1/src/GUIWindowChannelScan.h 20.3.1+ds1-1/src/GUIWindowChannelScan.h
--- 19.0.3+ds1-1/src/GUIWindowChannelScan.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/GUIWindowChannelScan.h	2022-06-20 21:32:29.000000000 +0000
@@ -32,8 +32,7 @@ typedef enum scantype
 
 class CPVRAddon;
 
-class ATTRIBUTE_HIDDEN cVNSIChannelScan : public cVNSISession,
-                                          public kodi::gui::CWindow
+class ATTR_DLL_LOCAL cVNSIChannelScan : public cVNSISession, public kodi::gui::CWindow
 {
 public:
   cVNSIChannelScan(kodi::addon::CInstancePVRClient& instance);
diff -pruN 19.0.3+ds1-1/src/InputstreamDemux.cpp 20.3.1+ds1-1/src/InputstreamDemux.cpp
--- 19.0.3+ds1-1/src/InputstreamDemux.cpp	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/InputstreamDemux.cpp	2022-06-20 21:32:29.000000000 +0000
@@ -371,7 +371,8 @@ void cVNSIDemux::StreamChange(cResponseP
       props.SetBlockAlign(resp->extract_U32());
       props.SetBitRate(resp->extract_U32());
       props.SetBitsPerSample(resp->extract_U32());
-      props.SetLanguage(language);
+      if (std::strlen(language) == 3)
+        props.SetLanguage(language);
     }
     else if (codecId.GetCodecType() == PVR_CODEC_TYPE_VIDEO)
     {
@@ -396,7 +397,8 @@ void cVNSIDemux::StreamChange(cResponseP
     {
       const char* language = resp->extract_String();
       uint32_t rel_channel_pid(resp->extract_U32());
-      props.SetLanguage(language);
+      if (std::strlen(language) == 3)
+        props.SetLanguage(language);
     }
     else
     {
diff -pruN 19.0.3+ds1-1/src/InputstreamDemux.h 20.3.1+ds1-1/src/InputstreamDemux.h
--- 19.0.3+ds1-1/src/InputstreamDemux.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/InputstreamDemux.h	2022-06-20 21:32:29.000000000 +0000
@@ -16,7 +16,7 @@
 
 class cResponsePacket;
 
-class ATTRIBUTE_HIDDEN CVNSIDemuxStatus : public cVNSISession
+class ATTR_DLL_LOCAL CVNSIDemuxStatus : public cVNSISession
 {
 public:
   CVNSIDemuxStatus(kodi::addon::CInstancePVRClient& instance);
@@ -28,7 +28,7 @@ public:
   bool IsConnected();
 };
 
-class ATTRIBUTE_HIDDEN cVNSIDemux : public cVNSISession
+class ATTR_DLL_LOCAL cVNSIDemux : public cVNSISession
 {
 public:
   cVNSIDemux(kodi::addon::CInstancePVRClient& instance);
diff -pruN 19.0.3+ds1-1/src/InputstreamRecording.h 20.3.1+ds1-1/src/InputstreamRecording.h
--- 19.0.3+ds1-1/src/InputstreamRecording.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/InputstreamRecording.h	2022-06-20 21:32:29.000000000 +0000
@@ -12,7 +12,7 @@
 
 #include <kodi/addon-instance/pvr/Stream.h>
 
-class ATTRIBUTE_HIDDEN cVNSIRecording : public cVNSISession
+class ATTR_DLL_LOCAL cVNSIRecording : public cVNSISession
 {
 public:
   cVNSIRecording(kodi::addon::CInstancePVRClient& instance);
diff -pruN 19.0.3+ds1-1/src/RequestPacket.h 20.3.1+ds1-1/src/RequestPacket.h
--- 19.0.3+ds1-1/src/RequestPacket.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/RequestPacket.h	2022-06-20 21:32:29.000000000 +0000
@@ -12,7 +12,7 @@
 #include <stddef.h>
 #include <stdint.h>
 
-class ATTRIBUTE_HIDDEN cRequestPacket
+class ATTR_DLL_LOCAL cRequestPacket
 {
 public:
   cRequestPacket() = default;
diff -pruN 19.0.3+ds1-1/src/ResponsePacket.h 20.3.1+ds1-1/src/ResponsePacket.h
--- 19.0.3+ds1-1/src/ResponsePacket.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/ResponsePacket.h	2022-06-20 21:32:29.000000000 +0000
@@ -13,7 +13,7 @@
 #include <stdint.h>
 #include <stdio.h>
 
-class ATTRIBUTE_HIDDEN cResponsePacket
+class ATTR_DLL_LOCAL cResponsePacket
 {
 public:
   cResponsePacket(kodi::addon::CInstancePVRClient& instance);
diff -pruN 19.0.3+ds1-1/src/Session.h 20.3.1+ds1-1/src/Session.h
--- 19.0.3+ds1-1/src/Session.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/Session.h	2022-06-20 21:32:29.000000000 +0000
@@ -25,7 +25,7 @@ namespace P8PLATFORM
 class CTcpConnection;
 }
 
-class ATTRIBUTE_HIDDEN cVNSISession
+class ATTR_DLL_LOCAL cVNSISession
 {
 public:
   cVNSISession(kodi::addon::CInstancePVRClient& instance);
diff -pruN 19.0.3+ds1-1/src/Settings.cpp 20.3.1+ds1-1/src/Settings.cpp
--- 19.0.3+ds1-1/src/Settings.cpp	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/Settings.cpp	2022-06-20 21:32:29.000000000 +0000
@@ -25,7 +25,7 @@ CVNSISettings& CVNSISettings::Get()
 bool CVNSISettings::Load()
 {
   // Read setting "host" from settings.xml
-  if (!kodi::CheckSettingString("host", m_szHostname))
+  if (!kodi::addon::CheckSettingString("host", m_szHostname))
   {
     // If setting is unknown fallback to defaults
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'host' setting, falling back to '%s' as default",
@@ -34,7 +34,7 @@ bool CVNSISettings::Load()
   }
 
   // Read setting "wol_mac" from settings.xml
-  if (!kodi::CheckSettingString("wol_mac", m_szWolMac))
+  if (!kodi::addon::CheckSettingString("wol_mac", m_szWolMac))
   {
     // If setting is unknown fallback to empty default
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'wol_mac' setting, falling back to default");
@@ -42,7 +42,7 @@ bool CVNSISettings::Load()
   }
 
   // Read setting "port" from settings.xml
-  if (!kodi::CheckSettingInt("port", m_iPort))
+  if (!kodi::addon::CheckSettingInt("port", m_iPort))
   {
     // If setting is unknown fallback to defaults
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'port' setting, falling back to '%i' as default",
@@ -52,7 +52,7 @@ bool CVNSISettings::Load()
 
   // Read setting "priority" from settings.xml
   int prio = DEFAULT_PRIORITY;
-  if (kodi::CheckSettingInt("priority", prio))
+  if (kodi::addon::CheckSettingInt("priority", prio))
   {
     m_iPriority = prioVals[prio];
   }
@@ -65,7 +65,7 @@ bool CVNSISettings::Load()
   }
 
   /* Read setting "timeshift" from settings.xml */
-  if (!kodi::CheckSettingInt("timeshift", m_iTimeshift))
+  if (!kodi::addon::CheckSettingInt("timeshift", m_iTimeshift))
   {
     // If setting is unknown fallback to defaults
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'timeshift' setting, falling back to %i as default",
@@ -74,7 +74,7 @@ bool CVNSISettings::Load()
   }
 
   // Read setting "convertchar" from settings.xml
-  if (!kodi::CheckSettingBoolean("convertchar", m_bCharsetConv))
+  if (!kodi::addon::CheckSettingBoolean("convertchar", m_bCharsetConv))
   {
     /* If setting is unknown fallback to defaults */
     kodi::Log(ADDON_LOG_ERROR,
@@ -83,7 +83,7 @@ bool CVNSISettings::Load()
   }
 
   // Read setting "timeout" from settings.xml
-  if (!kodi::CheckSettingInt("timeout", m_iConnectTimeout))
+  if (!kodi::addon::CheckSettingInt("timeout", m_iConnectTimeout))
   {
     /* If setting is unknown fallback to defaults */
     kodi::Log(ADDON_LOG_ERROR,
@@ -93,7 +93,7 @@ bool CVNSISettings::Load()
   }
 
   // Read setting "autochannelgroups" from settings.xml
-  if (!kodi::CheckSettingBoolean("autochannelgroups", m_bAutoChannelGroups))
+  if (!kodi::addon::CheckSettingBoolean("autochannelgroups", m_bAutoChannelGroups))
   {
     // If setting is unknown fallback to defaults
     kodi::Log(ADDON_LOG_ERROR,
@@ -102,7 +102,7 @@ bool CVNSISettings::Load()
   }
 
   // Read setting "iconpath" from settings.xml
-  if (!kodi::CheckSettingString("iconpath", m_szIconPath))
+  if (!kodi::addon::CheckSettingString("iconpath", m_szIconPath))
   {
     // If setting is unknown fallback to defaults
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'iconpath' setting");
@@ -110,7 +110,7 @@ bool CVNSISettings::Load()
   }
 
   // Read setting "chunksize" from settings.xml
-  if (!kodi::CheckSettingInt("chunksize", m_iChunkSize))
+  if (!kodi::addon::CheckSettingInt("chunksize", m_iChunkSize))
   {
     /* If setting is unknown fallback to defaults */
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'chunksize' setting, falling back to %i as default",
@@ -122,7 +122,7 @@ bool CVNSISettings::Load()
 }
 
 ADDON_STATUS CVNSISettings::SetSetting(const std::string& settingName,
-                                       const kodi::CSettingValue& settingValue)
+                                       const kodi::addon::CSettingValue& settingValue)
 {
   if (settingName == "host")
   {
diff -pruN 19.0.3+ds1-1/src/Settings.h 20.3.1+ds1-1/src/Settings.h
--- 19.0.3+ds1-1/src/Settings.h	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/src/Settings.h	2022-06-20 21:32:29.000000000 +0000
@@ -19,13 +19,14 @@
 #define DEFAULT_AUTOGROUPS false
 #define DEFAULT_CHUNKSIZE 65536
 
-class ATTRIBUTE_HIDDEN CVNSISettings
+class ATTR_DLL_LOCAL CVNSISettings
 {
 public:
   static CVNSISettings& Get();
 
   bool Load();
-  ADDON_STATUS SetSetting(const std::string& settingName, const kodi::CSettingValue& settingValue);
+  ADDON_STATUS SetSetting(const std::string& settingName,
+                          const kodi::addon::CSettingValue& settingValue);
 
   const std::string& GetHostname() const { return m_szHostname; }
   const std::string& GetWolMac() const { return m_szWolMac; }
diff -pruN 19.0.3+ds1-1/.travis.yml 20.3.1+ds1-1/.travis.yml
--- 19.0.3+ds1-1/.travis.yml	2022-01-16 19:13:08.000000000 +0000
+++ 20.3.1+ds1-1/.travis.yml	2022-06-20 21:32:29.000000000 +0000
@@ -31,7 +31,7 @@ matrix:
       osx_image: xcode10.2
 
 before_install:
-  - if [[ $DEBIAN_BUILD == true ]]; then sudo add-apt-repository -y ppa:team-xbmc/ppa; fi
+  - if [[ $DEBIAN_BUILD == true ]]; then sudo add-apt-repository -y ppa:team-xbmc/xbmc-nightly; fi
   - if [[ $DEBIAN_BUILD == true ]]; then sudo apt-get install fakeroot; fi
   - if [[ $DEBIAN_BUILD != true ]] && [[ $TRAVIS_OS_NAME == linux ]]; then sudo apt-get install -y libgl1-mesa-dev; fi
 
@@ -41,12 +41,12 @@ before_install:
 #
 before_script:
   - if [[ $DEBIAN_BUILD != true ]]; then cd $TRAVIS_BUILD_DIR/..; fi
-  - if [[ $DEBIAN_BUILD != true ]]; then git clone --branch Matrix --depth=1 https://github.com/xbmc/xbmc.git; fi
+  - if [[ $DEBIAN_BUILD != true ]]; then git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git; fi
   - if [[ $DEBIAN_BUILD != true ]]; then cd ${app_id} && mkdir build && cd build; fi
   - if [[ $DEBIAN_BUILD != true ]]; then mkdir -p definition/${app_id}; fi
   - if [[ $DEBIAN_BUILD != true ]]; then echo ${app_id} $TRAVIS_BUILD_DIR $TRAVIS_COMMIT > definition/${app_id}/${app_id}.txt; fi
   - if [[ $DEBIAN_BUILD != true ]]; then cmake -DADDONS_TO_BUILD=${app_id} -DADDON_SRC_PREFIX=$TRAVIS_BUILD_DIR/.. -DADDONS_DEFINITION_DIR=$TRAVIS_BUILD_DIR/build/definition -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=$TRAVIS_BUILD_DIR/../xbmc/addons -DPACKAGE_ZIP=1 $TRAVIS_BUILD_DIR/../xbmc/cmake/addons; fi
-  - if [[ $DEBIAN_BUILD == true ]]; then wget https://raw.githubusercontent.com/xbmc/xbmc/Matrix/xbmc/addons/kodi-dev-kit/tools/debian-addon-package-test.sh && chmod +x ./debian-addon-package-test.sh; fi
+  - if [[ $DEBIAN_BUILD == true ]]; then wget https://raw.githubusercontent.com/xbmc/xbmc/master/xbmc/addons/kodi-dev-kit/tools/debian-addon-package-test.sh && chmod +x ./debian-addon-package-test.sh; fi
   - if [[ $DEBIAN_BUILD == true ]]; then sudo apt-get build-dep $TRAVIS_BUILD_DIR; fi
 
 script:
