diff -pruN 19.0.2-1/azure-pipelines.yml 20.2.1-1/azure-pipelines.yml
--- 19.0.2-1/azure-pipelines.yml	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/azure-pipelines.yml	2022-01-02 12:41:34.000000000 +0000
@@ -4,7 +4,7 @@ variables:
 trigger:
   branches:
     include:
-    - Matrix
+    - Nexus
     - releases/*
   paths:
     include:
@@ -46,7 +46,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.2-1/debian/changelog 20.2.1-1/debian/changelog
--- 19.0.2-1/debian/changelog	2022-03-21 17:50:07.000000000 +0000
+++ 20.2.1-1/debian/changelog	2022-08-04 09:56:00.000000000 +0000
@@ -1,3 +1,10 @@
+kodi-pvr-wmc (20.2.1-1) unstable; urgency=medium
+
+  * New upstream version 20.2.1
+  * Prepare for v20 in unstable
+
+ -- Vasyl Gello <vasek.gello@gmail.com>  Thu, 04 Aug 2022 09:56:00 +0000
+
 kodi-pvr-wmc (19.0.2-1) unstable; urgency=medium
 
   * New upstream version 19.0.2
diff -pruN 19.0.2-1/debian/control 20.2.1-1/debian/control
--- 19.0.2-1/debian/control	2022-03-21 17:50:07.000000000 +0000
+++ 20.2.1-1/debian/control	2022-08-04 09:56:00.000000000 +0000
@@ -4,9 +4,9 @@ Section: libs
 Maintainer: Debian Multimedia Maintainers <debian-multimedia@lists.debian.org>
 Uploaders: 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,
-Standards-Version: 4.6.0
+Standards-Version: 4.6.1
 Rules-Requires-Root: no
 Vcs-Browser: https://salsa.debian.org/multimedia-team/kodi-media-center/kodi-pvr-wmc
 Vcs-Git: https://salsa.debian.org/multimedia-team/kodi-media-center/kodi-pvr-wmc.git
diff -pruN 19.0.2-1/debian/copyright 20.2.1-1/debian/copyright
--- 19.0.2-1/debian/copyright	2021-01-20 07:57:29.000000000 +0000
+++ 20.2.1-1/debian/copyright	2022-08-04 09:56:00.000000000 +0000
@@ -3,12 +3,12 @@ Upstream-Name: pvr.hts
 Source: https://github.com/kodi-pvr/pvr.wmc
 
 Files: *
-Copyright: 2005-2021, Team Kodi
+Copyright: 2005-2022, Team Kodi
 License: GPL-2+
 
 Files: debian/*
 Copyright: 2015 Balint Reczey <balint@balintreczey.hu>
-           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.2-1/debian/watch 20.2.1-1/debian/watch
--- 19.0.2-1/debian/watch	2021-08-26 10:43:04.000000000 +0000
+++ 20.2.1-1/debian/watch	2022-08-04 09:56:00.000000000 +0000
@@ -1,3 +1,3 @@
 version=4
 https://github.com/kodi-pvr/pvr.wmc/releases \
-/kodi-pvr/pvr.wmc/archive/refs/tags/?(\d\S*)-Matrix\.tar\.gz
+/kodi-pvr/pvr.wmc/archive/refs/tags/?(\d\S*)-Nexus\.tar\.gz
diff -pruN 19.0.2-1/.github/workflows/build.yml 20.2.1-1/.github/workflows/build.yml
--- 19.0.2-1/.github/workflows/build.yml	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/.github/workflows/build.yml	2022-01-02 12:41:34.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.wmc 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.2-1/.github/workflows/changelog-and-release.yml 20.2.1-1/.github/workflows/changelog-and-release.yml
--- 19.0.2-1/.github/workflows/changelog-and-release.yml	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/.github/workflows/changelog-and-release.yml	2022-01-02 12:41:34.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.2-1/.github/workflows/release.yml 20.2.1-1/.github/workflows/release.yml
--- 19.0.2-1/.github/workflows/release.yml	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/.github/workflows/release.yml	2022-01-02 12:41:34.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.2-1/Jenkinsfile 20.2.1-1/Jenkinsfile
--- 19.0.2-1/Jenkinsfile	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/Jenkinsfile	2022-01-02 12:41:34.000000000 +0000
@@ -1 +1 @@
-buildPlugin(version: "Matrix")
+buildPlugin(version: "Nexus")
diff -pruN 19.0.2-1/pvr.wmc/addon.xml.in 20.2.1-1/pvr.wmc/addon.xml.in
--- 19.0.2-1/pvr.wmc/addon.xml.in	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/pvr.wmc/addon.xml.in	2022-01-02 12:41:34.000000000 +0000
@@ -1,8 +1,8 @@
 ﻿<?xml version="1.0" encoding="UTF-8"?>
 <addon
   id="pvr.wmc"
-  version="19.0.2"
-  name="PVR WMC Client"
+  version="20.2.1"
+  name="Windows Media Center Client"
   provider-name="KrustyReturns and scarecrow420">
   <requires>@ADDON_DEPENDS@</requires>
   <extension
diff -pruN 19.0.2-1/pvr.wmc/changelog.txt 20.2.1-1/pvr.wmc/changelog.txt
--- 19.0.2-1/pvr.wmc/changelog.txt	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/pvr.wmc/changelog.txt	2022-01-02 12:41:34.000000000 +0000
@@ -1,17 +1,25 @@
-v19.0.2
-- Translations updates from Weblate
-	- es_ar
+v20.2.1
+- Change name to make add-on easier to find in UI
+
+v20.2.0
+- Translation updates by Weblate
+- Kodi main API update to version 2.0.0
 
-v19.0.1:
+v20.1.1:
 - Make builds reproducible
 
-v19.0.0
+v20.1.0
+- Kodi PVR API to 8.0.0
+  - Add supports recordings delete capability
+  - Enforce EDL limits
+
+v20.0.0
 - Translations updates from Weblate
   - da_dk, ko_kr, ml_in, pl_pl
   - Also allow addon.xml content update by Weblate
 - Improved debian packaging
-- 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.2-1/README.md 20.2.1-1/README.md
--- 19.0.2-1/README.md	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/README.md	2022-01-02 12:41:34.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.wmc/actions/workflows/build.yml/badge.svg?branch=Matrix)](https://github.com/kodi-pvr/pvr.wmc/actions/workflows/build.yml)
-[![Build Status](https://dev.azure.com/teamkodi/kodi-pvr/_apis/build/status/kodi-pvr.pvr.wmc?branchName=Matrix)](https://dev.azure.com/teamkodi/kodi-pvr/_build/latest?definitionId=67&branchName=Matrix)
-[![Build Status](https://jenkins.kodi.tv/view/Addons/job/kodi-pvr/job/pvr.wmc/job/Matrix/badge/icon)](https://jenkins.kodi.tv/blue/organizations/jenkins/kodi-pvr%2Fpvr.wmc/branches/)
+[![Build and run tests](https://github.com/kodi-pvr/pvr.wmc/actions/workflows/build.yml/badge.svg?branch=Nexus)](https://github.com/kodi-pvr/pvr.wmc/actions/workflows/build.yml)
+[![Build Status](https://dev.azure.com/teamkodi/kodi-pvr/_apis/build/status/kodi-pvr.pvr.wmc?branchName=Nexus)](https://dev.azure.com/teamkodi/kodi-pvr/_build/latest?definitionId=67&branchName=Nexus)
+[![Build Status](https://jenkins.kodi.tv/view/Addons/job/kodi-pvr/job/pvr.wmc/job/Nexus/badge/icon)](https://jenkins.kodi.tv/blue/organizations/jenkins/kodi-pvr%2Fpvr.wmc/branches/)
 [![Coverity Scan Build Status](https://scan.coverity.com/projects/5120/badge.svg)](https://scan.coverity.com/projects/5120)
 
 # Windows Media Center PVR
@@ -11,8 +11,8 @@ Windows Media Center PVR client addon fo
 
 ### Linux
 
-1. `git clone --branch Matrix https://github.com/xbmc/xbmc.git`
-2. `git clone --branch Matrix https://github.com/kodi-pvr/pvr.wmc.git`
+1. `git clone --branch master https://github.com/xbmc/xbmc.git`
+2. `git clone https://github.com/kodi-pvr/pvr.wmc.git`
 3. `cd pvr.wmc && mkdir build && cd build`
 4. `cmake -DADDONS_TO_BUILD=pvr.wmc -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../xbmc/addons -DPACKAGE_ZIP=1 ../../xbmc/cmake/addons`
 5. `make`
diff -pruN 19.0.2-1/src/addon.cpp 20.2.1-1/src/addon.cpp
--- 19.0.2-1/src/addon.cpp	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/src/addon.cpp	2022-01-02 12:41:34.000000000 +0000
@@ -9,21 +9,18 @@
 
 #include "pvr2wmc.h"
 
-ADDON_STATUS CPvr2WmcAddon::CreateInstance(int instanceType,
-                                           const std::string& instanceID,
-                                           KODI_HANDLE instance,
-                                           const std::string& version,
-                                           KODI_HANDLE& addonInstance)
+ADDON_STATUS CPvr2WmcAddon::CreateInstance(const kodi::addon::IInstanceInfo& instance,
+                                           KODI_ADDON_INSTANCE_HDL& hdl)
 {
   ADDON_STATUS status = ADDON_STATUS_UNKNOWN;
 
-  if (instanceType == ADDON_INSTANCE_PVR)
+  if (instance.IsType(ADDON_INSTANCE_PVR))
   {
     kodi::Log(ADDON_LOG_DEBUG, "%s - Creating the PVR-WMC add-on instance", __func__);
 
     _settings.Load();
 
-    Pvr2Wmc* client = new Pvr2Wmc(*this, instance, version); // create interface to ServerWMC
+    Pvr2Wmc* client = new Pvr2Wmc(*this, instance); // create interface to ServerWMC
     if (client->IsServerDown()) // check if server is down, if it is shut her down
     {
       status = ADDON_STATUS_LOST_CONNECTION;
@@ -33,22 +30,21 @@ ADDON_STATUS CPvr2WmcAddon::CreateInstan
       status = ADDON_STATUS_OK;
     }
 
-    addonInstance = client;
-    _usedInstances.emplace(std::make_pair(instanceID, client));
+    hdl = client;
+    _usedInstances.emplace(std::make_pair(instance.GetID(), client));
   }
 
   return status;
 }
 
-void CPvr2WmcAddon::DestroyInstance(int instanceType,
-                                    const std::string& instanceID,
-                                    KODI_HANDLE addonInstance)
+void CPvr2WmcAddon::DestroyInstance(const kodi::addon::IInstanceInfo& instance,
+                                    const KODI_ADDON_INSTANCE_HDL hdl)
 {
-  if (instanceType == ADDON_INSTANCE_PVR)
+  if (instance.IsType(ADDON_INSTANCE_PVR))
   {
     kodi::Log(ADDON_LOG_DEBUG, "%s - Destoying the PVR-WMC add-on instance", __func__);
 
-    const auto& it = _usedInstances.find(instanceID);
+    const auto& it = _usedInstances.find(instance.GetID());
     if (it != _usedInstances.end())
     {
       it->second->UnLoading();
@@ -58,7 +54,7 @@ void CPvr2WmcAddon::DestroyInstance(int
 }
 
 ADDON_STATUS CPvr2WmcAddon::SetSetting(const std::string& settingName,
-                                       const kodi::CSettingValue& settingValue)
+                                       const kodi::addon::CSettingValue& settingValue)
 {
   return _settings.SetSetting(settingName, settingValue);
 }
diff -pruN 19.0.2-1/src/addon.h 20.2.1-1/src/addon.h
--- 19.0.2-1/src/addon.h	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/src/addon.h	2022-01-02 12:41:34.000000000 +0000
@@ -14,22 +14,18 @@
 
 class Pvr2Wmc;
 
-class ATTRIBUTE_HIDDEN CPvr2WmcAddon : public kodi::addon::CAddonBase
+class ATTR_DLL_LOCAL CPvr2WmcAddon : public kodi::addon::CAddonBase
 {
 public:
   CPvr2WmcAddon() = default;
 
-  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;
+  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;
 
   ADDON_STATUS SetSetting(const std::string& settingName,
-                          const kodi::CSettingValue& settingValue) override;
+                          const kodi::addon::CSettingValue& settingValue) override;
   CSettings& GetSettings() { return _settings; }
 
 private:
diff -pruN 19.0.2-1/src/pvr2wmc.cpp 20.2.1-1/src/pvr2wmc.cpp
--- 19.0.2-1/src/pvr2wmc.cpp	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/src/pvr2wmc.cpp	2022-01-02 12:41:34.000000000 +0000
@@ -15,8 +15,8 @@
 long Pvr2Wmc::_buffTimesCnt; // filter how often we do buffer status reads
 long Pvr2Wmc::_buffTimeFILTER;
 
-Pvr2Wmc::Pvr2Wmc(CPvr2WmcAddon& addon, KODI_HANDLE instance, const std::string& kodiVersion)
-  : kodi::addon::CInstancePVRClient(instance, kodiVersion), _socketClient(*this), _addon(addon)
+Pvr2Wmc::Pvr2Wmc(CPvr2WmcAddon& addon, const kodi::addon::IInstanceInfo& instance)
+  : kodi::addon::CInstancePVRClient(instance), _socketClient(*this), _addon(addon)
 {
   _socketClient.SetServerName(_addon.GetSettings().GetServerName());
   _socketClient.SetClientName(_addon.GetSettings().GetClientName());
@@ -52,6 +52,7 @@ PVR_ERROR Pvr2Wmc::GetCapabilities(kodi:
   capabilities.SetSupportsTV(true);
   capabilities.SetSupportsRadio(true);
   capabilities.SetSupportsRecordings(true);
+  capabilities.SetSupportsRecordingsDelete(true);
   capabilities.SetSupportsRecordingsUndelete(false);
   capabilities.SetSupportsTimers(true);
   capabilities.SetSupportsChannelGroups(true);
@@ -104,13 +105,13 @@ PVR_ERROR Pvr2Wmc::GetBackendVersion(std
       if (!kodi::vfs::DirectoryExists(results[2]))
       {
         kodi::Log(ADDON_LOG_ERROR, "Recorded tv '%s' does not exist", results[2].c_str());
-        std::string infoStr = kodi::GetLocalizedString(30017);
+        std::string infoStr = kodi::addon::GetLocalizedString(30017);
         kodi::QueueNotification(QUEUE_ERROR, "", infoStr);
       }
       else if (!kodi::vfs::GetDirectory(results[2], "", items))
       {
         kodi::Log(ADDON_LOG_ERROR, "Recorded tv '%s' count not be opened", results[2].c_str());
-        std::string infoStr = kodi::GetLocalizedString(30018);
+        std::string infoStr = kodi::addon::GetLocalizedString(30018);
         kodi::QueueNotification(QUEUE_ERROR, "", infoStr);
       }
     }
@@ -121,7 +122,7 @@ PVR_ERROR Pvr2Wmc::GetBackendVersion(std
       _addon.GetSettings().SetServerMAC(results[3]);
 
       // Attempt to save MAC address to custom addon data
-      Utils::WriteFileContents(kodi::GetBaseUserPath("ServerMACAddr.txt"),
+      Utils::WriteFileContents(kodi::addon::GetUserPath("ServerMACAddr.txt"),
                                _addon.GetSettings().GetServerMAC());
     }
 
@@ -187,45 +188,45 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
   static std::vector<kodi::addon::PVRTypeIntValue> priorityValues;
   if (priorityValues.size() == 0)
   {
-    priorityValues.emplace_back(WMC_PRIORITY_NORMAL, kodi::GetLocalizedString(30140));
-    priorityValues.emplace_back(WMC_PRIORITY_HIGH, kodi::GetLocalizedString(30141));
-    priorityValues.emplace_back(WMC_PRIORITY_LOW, kodi::GetLocalizedString(30142));
+    priorityValues.emplace_back(WMC_PRIORITY_NORMAL, kodi::addon::GetLocalizedString(30140));
+    priorityValues.emplace_back(WMC_PRIORITY_HIGH, kodi::addon::GetLocalizedString(30141));
+    priorityValues.emplace_back(WMC_PRIORITY_LOW, kodi::addon::GetLocalizedString(30142));
   }
 
   /* PVR_Timer.iLifeTime values and presentation.*/
   static std::vector<kodi::addon::PVRTypeIntValue> lifetimeValues;
   if (lifetimeValues.size() == 0)
   {
-    lifetimeValues.emplace_back(WMC_LIFETIME_NOTSET, kodi::GetLocalizedString(30160));
-    lifetimeValues.emplace_back(WMC_LIFETIME_LATEST, kodi::GetLocalizedString(30161));
-    lifetimeValues.emplace_back(WMC_LIFETIME_WATCHED, kodi::GetLocalizedString(30162));
-    lifetimeValues.emplace_back(WMC_LIFETIME_ELIGIBLE, kodi::GetLocalizedString(30163));
-    lifetimeValues.emplace_back(WMC_LIFETIME_DELETED, kodi::GetLocalizedString(30164));
-    lifetimeValues.emplace_back(WMC_LIFETIME_ONEWEEK, kodi::GetLocalizedString(30165));
+    lifetimeValues.emplace_back(WMC_LIFETIME_NOTSET, kodi::addon::GetLocalizedString(30160));
+    lifetimeValues.emplace_back(WMC_LIFETIME_LATEST, kodi::addon::GetLocalizedString(30161));
+    lifetimeValues.emplace_back(WMC_LIFETIME_WATCHED, kodi::addon::GetLocalizedString(30162));
+    lifetimeValues.emplace_back(WMC_LIFETIME_ELIGIBLE, kodi::addon::GetLocalizedString(30163));
+    lifetimeValues.emplace_back(WMC_LIFETIME_DELETED, kodi::addon::GetLocalizedString(30164));
+    lifetimeValues.emplace_back(WMC_LIFETIME_ONEWEEK, kodi::addon::GetLocalizedString(30165));
   }
 
   /* PVR_Timer.iMaxRecordings values and presentation. */
   static std::vector<kodi::addon::PVRTypeIntValue> recordingLimitValues;
   if (recordingLimitValues.size() == 0)
   {
-    recordingLimitValues.emplace_back(WMC_LIMIT_ASMANY, kodi::GetLocalizedString(30170));
-    recordingLimitValues.emplace_back(WMC_LIMIT_1, kodi::GetLocalizedString(30171));
-    recordingLimitValues.emplace_back(WMC_LIMIT_2, kodi::GetLocalizedString(30172));
-    recordingLimitValues.emplace_back(WMC_LIMIT_3, kodi::GetLocalizedString(30173));
-    recordingLimitValues.emplace_back(WMC_LIMIT_4, kodi::GetLocalizedString(30174));
-    recordingLimitValues.emplace_back(WMC_LIMIT_5, kodi::GetLocalizedString(30175));
-    recordingLimitValues.emplace_back(WMC_LIMIT_6, kodi::GetLocalizedString(30176));
-    recordingLimitValues.emplace_back(WMC_LIMIT_7, kodi::GetLocalizedString(30177));
-    recordingLimitValues.emplace_back(WMC_LIMIT_10, kodi::GetLocalizedString(30178));
+    recordingLimitValues.emplace_back(WMC_LIMIT_ASMANY, kodi::addon::GetLocalizedString(30170));
+    recordingLimitValues.emplace_back(WMC_LIMIT_1, kodi::addon::GetLocalizedString(30171));
+    recordingLimitValues.emplace_back(WMC_LIMIT_2, kodi::addon::GetLocalizedString(30172));
+    recordingLimitValues.emplace_back(WMC_LIMIT_3, kodi::addon::GetLocalizedString(30173));
+    recordingLimitValues.emplace_back(WMC_LIMIT_4, kodi::addon::GetLocalizedString(30174));
+    recordingLimitValues.emplace_back(WMC_LIMIT_5, kodi::addon::GetLocalizedString(30175));
+    recordingLimitValues.emplace_back(WMC_LIMIT_6, kodi::addon::GetLocalizedString(30176));
+    recordingLimitValues.emplace_back(WMC_LIMIT_7, kodi::addon::GetLocalizedString(30177));
+    recordingLimitValues.emplace_back(WMC_LIMIT_10, kodi::addon::GetLocalizedString(30178));
   }
 
   /* PVR_Timer.iPreventDuplicateEpisodes values and presentation.*/
   static std::vector<kodi::addon::PVRTypeIntValue> showTypeValues;
   if (showTypeValues.size() == 0)
   {
-    showTypeValues.emplace_back(WMC_SHOWTYPE_FIRSTRUNONLY, kodi::GetLocalizedString(30150));
-    showTypeValues.emplace_back(WMC_SHOWTYPE_ANY, kodi::GetLocalizedString(30151));
-    showTypeValues.emplace_back(WMC_SHOWTYPE_LIVEONLY, kodi::GetLocalizedString(30152));
+    showTypeValues.emplace_back(WMC_SHOWTYPE_FIRSTRUNONLY, kodi::addon::GetLocalizedString(30150));
+    showTypeValues.emplace_back(WMC_SHOWTYPE_ANY, kodi::addon::GetLocalizedString(30151));
+    showTypeValues.emplace_back(WMC_SHOWTYPE_LIVEONLY, kodi::addon::GetLocalizedString(30152));
   }
 
   static std::vector<kodi::addon::PVRTypeIntValue> emptyList;
@@ -274,7 +275,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_MANUAL_ATTRIBS,
             /* Description. */
-            kodi::GetLocalizedString(30131), // "One time (manual)",
+            kodi::addon::GetLocalizedString(30131), // "One time (manual)",
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -287,7 +288,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_EPG_ATTRIBS,
             /* Description. */
-            kodi::GetLocalizedString(30132), // "One time (guide)",
+            kodi::addon::GetLocalizedString(30132), // "One time (guide)",
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -300,7 +301,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_KEYWORD_ATTRIBS,
             /* Description. */
-            kodi::GetLocalizedString(30133), // "One time (wishlist)"
+            kodi::addon::GetLocalizedString(30133), // "One time (wishlist)"
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -313,7 +314,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_MANUAL_ATTRIBS | TIMER_CHILD_ATTRIBUTES,
             /* Description. */
-            kodi::GetLocalizedString(30130), // "Created by Repeating Timer"
+            kodi::addon::GetLocalizedString(30130), // "Created by Repeating Timer"
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -326,7 +327,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_EPG_ATTRIBS | TIMER_CHILD_ATTRIBUTES,
             /* Description. */
-            kodi::GetLocalizedString(30130), // "Created by Repeating Timer"
+            kodi::addon::GetLocalizedString(30130), // "Created by Repeating Timer"
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -339,7 +340,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_KEYWORD_ATTRIBS | TIMER_CHILD_ATTRIBUTES,
             /* Description. */
-            kodi::GetLocalizedString(30130), // "Created by Repeating Timer"
+            kodi::addon::GetLocalizedString(30130), // "Created by Repeating Timer"
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -352,7 +353,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_MANUAL_ATTRIBS | TIMER_REPEATING_MANUAL_ATTRIBS,
             /* Description. */
-            kodi::GetLocalizedString(30134), // "Repeating (manual)"
+            kodi::addon::GetLocalizedString(30134), // "Repeating (manual)"
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -365,7 +366,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_EPG_ATTRIBS | TIMER_REPEATING_EPG_ATTRIBS,
             /* Description. */
-            kodi::GetLocalizedString(30135), // "Repeating (guide)"
+            kodi::addon::GetLocalizedString(30135), // "Repeating (guide)"
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -378,7 +379,7 @@ PVR_ERROR Pvr2Wmc::GetTimerTypes(std::ve
             /* Attributes. */
             TIMER_KEYWORD_ATTRIBS | TIMER_REPEATING_KEYWORD_ATTRIBS,
             /* Description. */
-            kodi::GetLocalizedString(30136), // "Repeating (wishlist)"
+            kodi::addon::GetLocalizedString(30136), // "Repeating (wishlist)"
             /* Values definitions for attributes. */
             priorityValues, _defaultPriority, lifetimeValues, _defaultLiftetime,
             recordingLimitValues, _defaultLimit, showTypeValues, _defaultShowType)));
@@ -414,7 +415,7 @@ bool isServerError(std::vector<std::stri
       int errorID = atoi(results[2].c_str());
       if (errorID != 0)
       {
-        std::string errStr = kodi::GetLocalizedString(errorID);
+        std::string errStr = kodi::addon::GetLocalizedString(errorID);
         kodi::QueueNotification(QUEUE_ERROR, "", errStr);
       }
     }
@@ -477,7 +478,7 @@ void Pvr2Wmc::TriggerUpdates(std::vector
 
       // Get localised string for this stringID
       int stringId = atoi(v[2].c_str());
-      infoStr = kodi::GetLocalizedString(stringId);
+      infoStr = kodi::addon::GetLocalizedString(stringId);
 
       // Use text from backend if stringID not found
       if (infoStr == "")
@@ -825,7 +826,7 @@ PVR_ERROR Pvr2Wmc::AddTimer(const kodi::
           kodi::Log(ADDON_LOG_DEBUG, "timer channel changed by wmc to '%s'",
                     splitResult[1].c_str());
           // build info string and notify user of channel change
-          infoStr = kodi::GetLocalizedString(30009) + splitResult[1];
+          infoStr = kodi::addon::GetLocalizedString(30009) + splitResult[1];
           kodi::QueueNotification(QUEUE_WARNING, "", infoStr);
         }
         else if (splitResult[0] ==
@@ -834,7 +835,7 @@ PVR_ERROR Pvr2Wmc::AddTimer(const kodi::
           kodi::Log(ADDON_LOG_DEBUG, "timer start time changed by wmc to '%s'",
                     splitResult[1].c_str());
           // build info string and notify user of time change
-          infoStr = kodi::GetLocalizedString(30010) + splitResult[1];
+          infoStr = kodi::addon::GetLocalizedString(30010) + splitResult[1];
           kodi::QueueNotification(QUEUE_WARNING, "", infoStr);
         }
         else if (splitResult[0] ==
@@ -843,7 +844,7 @@ PVR_ERROR Pvr2Wmc::AddTimer(const kodi::
           kodi::Log(ADDON_LOG_DEBUG, "instant record end time increased by '%s' minutes",
                     splitResult[1].c_str());
           // build info string and notify user of time increase
-          infoStr = kodi::GetLocalizedString(30013) + splitResult[1] + " min";
+          infoStr = kodi::addon::GetLocalizedString(30013) + splitResult[1] + " min";
           kodi::QueueNotification(QUEUE_INFO, "", infoStr);
         }
       }
@@ -1437,7 +1438,8 @@ int Pvr2Wmc::ReadStream(unsigned char* p
                -1) // if fileSize -1, server is reporting an 'unkown' error with the stream
       {
         kodi::QueueNotification(
-            QUEUE_ERROR, "", kodi::GetLocalizedString(30003)); // display generic error with stream
+            QUEUE_ERROR, "",
+            kodi::addon::GetLocalizedString(30003)); // display generic error with stream
         kodi::Log(ADDON_LOG_DEBUG, "live tv error, server reported error");
         _lostStream = true; // flag that stream is down
         return -1;
@@ -1448,13 +1450,14 @@ int Pvr2Wmc::ReadStream(unsigned char* p
         _lostStream = true; // flag that stream is down
         if (currentPos == 0 && fileSize == 0) // if no data was ever read, assume no video signal
         {
-          kodi::QueueNotification(QUEUE_ERROR, "", kodi::GetLocalizedString(30004));
+          kodi::QueueNotification(QUEUE_ERROR, "", kodi::addon::GetLocalizedString(30004));
           kodi::Log(ADDON_LOG_DEBUG, "no video found for stream");
         }
         else // a mysterious reason caused timeout
         {
           kodi::QueueNotification(
-              QUEUE_ERROR, "", kodi::GetLocalizedString(30003)); // otherwise display generic error
+              QUEUE_ERROR, "",
+              kodi::addon::GetLocalizedString(30003)); // otherwise display generic error
           kodi::Log(ADDON_LOG_DEBUG, "live tv timed out, unknown reason");
         }
         return -1; // this makes xbmc call closelivestream
diff -pruN 19.0.2-1/src/pvr2wmc.h 20.2.1-1/src/pvr2wmc.h
--- 19.0.2-1/src/pvr2wmc.h	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/src/pvr2wmc.h	2022-01-02 12:41:34.000000000 +0000
@@ -75,10 +75,10 @@ enum backend_status
   BACKEND_UP
 };
 
-class ATTRIBUTE_HIDDEN Pvr2Wmc : public kodi::addon::CInstancePVRClient
+class ATTR_DLL_LOCAL Pvr2Wmc : public kodi::addon::CInstancePVRClient
 {
 public:
-  Pvr2Wmc(CPvr2WmcAddon& addon, KODI_HANDLE instance, const std::string& kodiVersion);
+  Pvr2Wmc(CPvr2WmcAddon& addon, const kodi::addon::IInstanceInfo& instance);
   ~Pvr2Wmc() override = default;
 
   bool IsServerDown();
diff -pruN 19.0.2-1/src/settings.cpp 20.2.1-1/src/settings.cpp
--- 19.0.2-1/src/settings.cpp	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/src/settings.cpp	2022-01-02 12:41:34.000000000 +0000
@@ -14,12 +14,12 @@
 bool CSettings::Load()
 {
   /* Read setting "port" from settings.xml */
-  if (!kodi::CheckSettingInt("port", _port))
+  if (!kodi::addon::CheckSettingInt("port", _port))
   {
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'port' setting, using '%i'", DEFAULT_PORT);
   }
 
-  if (kodi::CheckSettingString("host", _strServerName))
+  if (kodi::addon::CheckSettingString("host", _strServerName))
   {
     kodi::Log(ADDON_LOG_DEBUG, "Settings: host='%s', port=%i", _strServerName.c_str(), _port);
   }
@@ -28,7 +28,7 @@ bool CSettings::Load()
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'host' setting, using '127.0.0.1'");
   }
 
-  if (!kodi::CheckSettingBoolean("wake_on_lan", _bWakeOnLAN))
+  if (!kodi::addon::CheckSettingBoolean("wake_on_lan", _bWakeOnLAN))
   {
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'wake_on_lan' setting, using '%s'",
               DEFAULT_WAKEONLAN_ENABLE);
@@ -47,18 +47,18 @@ bool CSettings::Load()
               "Couldn't get ServerWMC MAC address from custom addondata, using empty value");
   }
 
-  if (!kodi::CheckSettingBoolean("signal", _bSignalEnable))
+  if (!kodi::addon::CheckSettingBoolean("signal", _bSignalEnable))
   {
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'signal' setting, using '%s'", DEFAULT_SIGNAL_ENABLE);
   }
 
-  if (!kodi::CheckSettingInt("signal_throttle", _signalThrottle))
+  if (!kodi::addon::CheckSettingInt("signal_throttle", _signalThrottle))
   {
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'signal_throttle' setting, using '%s'",
               DEFAULT_SIGNAL_THROTTLE);
   }
 
-  if (!kodi::CheckSettingBoolean("multiResume", _bEnableMultiResume))
+  if (!kodi::addon::CheckSettingBoolean("multiResume", _bEnableMultiResume))
   {
     kodi::Log(ADDON_LOG_ERROR, "Couldn't get 'multiResume' setting, using '%s'",
               DEFAULT_MULTI_RESUME);
@@ -84,7 +84,7 @@ bool CSettings::Load()
 }
 
 ADDON_STATUS CSettings::SetSetting(const std::string& settingName,
-                                   const kodi::CSettingValue& settingValue)
+                                   const kodi::addon::CSettingValue& settingValue)
 {
   std::string sName = settingName;
 
diff -pruN 19.0.2-1/src/settings.h 20.2.1-1/src/settings.h
--- 19.0.2-1/src/settings.h	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/src/settings.h	2022-01-02 12:41:34.000000000 +0000
@@ -17,13 +17,14 @@
 #define DEFAULT_SIGNAL_THROTTLE 10
 #define DEFAULT_MULTI_RESUME true
 
-class ATTRIBUTE_HIDDEN CSettings
+class ATTR_DLL_LOCAL CSettings
 {
 public:
   CSettings() = default;
 
   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& GetServerName() const { return _strServerName; }
   const std::string& GetClientName() const { return _strClientName; }
diff -pruN 19.0.2-1/src/Socket.cpp 20.2.1-1/src/Socket.cpp
--- 19.0.2-1/src/Socket.cpp	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/src/Socket.cpp	2022-01-02 12:41:34.000000000 +0000
@@ -621,7 +621,7 @@ std::vector<std::string> Socket::GetVect
                   _client.GetSettings().GetServerMAC().c_str());
         if (_client.GetBackendStatus() != BACKEND_UNKNOWN)
         {
-          std::string infoStr = kodi::GetLocalizedString(30026);
+          std::string infoStr = kodi::addon::GetLocalizedString(30026);
           kodi::QueueNotification(QUEUE_INFO, "", infoStr); // Notify WOL is being sent
         }
         kodi::network::WakeOnLan(_client.GetSettings().GetServerMAC()); // Send WOL request
diff -pruN 19.0.2-1/src/Socket.h 20.2.1-1/src/Socket.h
--- 19.0.2-1/src/Socket.h	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/src/Socket.h	2022-01-02 12:41:34.000000000 +0000
@@ -105,7 +105,7 @@ enum SocketProtocol
 #endif
 };
 
-class ATTRIBUTE_HIDDEN Socket
+class ATTR_DLL_LOCAL Socket
 {
 public:
   /*!
diff -pruN 19.0.2-1/.travis.yml 20.2.1-1/.travis.yml
--- 19.0.2-1/.travis.yml	2022-01-02 11:23:29.000000000 +0000
+++ 20.2.1-1/.travis.yml	2022-01-02 12:41:34.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 update; fi
   - if [[ $DEBIAN_BUILD == true ]]; then sudo apt-get install fakeroot; 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: 
