diff -pruN 19.0.1+ds1-1/appveyor.yml 20.1.0+ds1-1/appveyor.yml
--- 19.0.1+ds1-1/appveyor.yml	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/appveyor.yml	2022-01-02 11:42:48.000000000 +0000
@@ -23,7 +23,7 @@ environment:
 
 build_script:
   - cd ..
-  - git clone --branch Matrix --depth=1 https://github.com/xbmc/xbmc.git
+  - git clone --branch master --depth=1 https://github.com/xbmc/xbmc.git
   - cd %app_id%
   - mkdir build
   - cd build
diff -pruN 19.0.1+ds1-1/azure-pipelines.yml 20.1.0+ds1-1/azure-pipelines.yml
--- 19.0.1+ds1-1/azure-pipelines.yml	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/azure-pipelines.yml	2022-01-02 11:42:48.000000000 +0000
@@ -47,7 +47,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.1+ds1-1/debian/changelog 20.1.0+ds1-1/debian/changelog
--- 19.0.1+ds1-1/debian/changelog	2022-03-21 17:49:46.000000000 +0000
+++ 20.1.0+ds1-1/debian/changelog	2022-08-04 09:55:37.000000000 +0000
@@ -1,3 +1,10 @@
+kodi-vfs-sftp (20.1.0+ds1-1) unstable; urgency=medium
+
+  * New upstream version 20.1.0+ds1
+  * Prepare for v20 in unstable
+
+ -- Vasyl Gello <vasek.gello@gmail.com>  Thu, 04 Aug 2022 09:55:37 +0000
+
 kodi-vfs-sftp (19.0.1+ds1-1) unstable; urgency=medium
 
   * New upstream version 19.0.1+ds1
diff -pruN 19.0.1+ds1-1/debian/control 20.1.0+ds1-1/debian/control
--- 19.0.1+ds1-1/debian/control	2022-03-21 17:49:46.000000000 +0000
+++ 20.1.0+ds1-1/debian/control	2022-08-04 09:55:37.000000000 +0000
@@ -4,10 +4,10 @@ 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,
                libssh-dev
-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-vfs-sftp
 Vcs-Git: https://salsa.debian.org/multimedia-team/kodi-media-center/kodi-vfs-sftp.git
diff -pruN 19.0.1+ds1-1/debian/copyright 20.1.0+ds1-1/debian/copyright
--- 19.0.1+ds1-1/debian/copyright	2021-01-20 08:10:30.000000000 +0000
+++ 20.1.0+ds1-1/debian/copyright	2022-08-04 09:55:37.000000000 +0000
@@ -5,12 +5,12 @@ Files-Excluded: depends
 
 Files: *
 Copyright: Arne Morten Kvarving <arne.morten.kvarving@sintef.no>
-           2005-2021 Team Kodi
+           2005-2022 Team Kodi
 License: GPL-2+
 
 Files: debian/*
 Copyright: 2019-2020 Christian Marillat <marillat@deb-multimedia.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.1+ds1-1/debian/watch 20.1.0+ds1-1/debian/watch
--- 19.0.1+ds1-1/debian/watch	2021-08-26 10:50:38.000000000 +0000
+++ 20.1.0+ds1-1/debian/watch	2022-08-04 09:55:37.000000000 +0000
@@ -5,4 +5,4 @@ opts="repack, \
       repacksuffix=+ds1, \
       dversionmangle=auto" \
 https://github.com/xbmc/vfs.sftp/releases \
-/xbmc/vfs.sftp/archive/refs/tags/?(\d\S*)-Matrix\.tar\.gz
+/xbmc/vfs.sftp/archive/refs/tags/?(\d\S*)-Nexus\.tar\.gz
diff -pruN 19.0.1+ds1-1/.github/workflows/build.yml 20.1.0+ds1-1/.github/workflows/build.yml
--- 19.0.1+ds1-1/.github/workflows/build.yml	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/.github/workflows/build.yml	2022-01-02 11:42:48.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 vfs.sftp 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.1+ds1-1/Jenkinsfile 20.1.0+ds1-1/Jenkinsfile
--- 19.0.1+ds1-1/Jenkinsfile	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/Jenkinsfile	2022-01-02 11:42:48.000000000 +0000
@@ -1 +1 @@
-buildPlugin(version: "Matrix")
+buildPlugin(version: "Nexus")
diff -pruN 19.0.1+ds1-1/README.md 20.1.0+ds1-1/README.md
--- 19.0.1+ds1-1/README.md	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/README.md	2022-01-02 11:42:48.000000000 +0000
@@ -3,15 +3,15 @@
 This is a [Kodi](https://kodi.tv) VFS addon to support SFTP file systems.
 
 [![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/xbmc/vfs.sftp/actions/workflows/build.yml/badge.svg?branch=Matrix)](https://github.com/xbmc/vfs.sftp/actions/workflows/build.yml)
-[![Build Status](https://dev.azure.com/teamkodi/binary-addons/_apis/build/status/xbmc.vfs.sftp?branchName=Matrix)](https://dev.azure.com/teamkodi/binary-addons/_build/latest?definitionId=54&branchName=Matrix)
-[![Build Status](https://jenkins.kodi.tv/view/Addons/job/xbmc/job/vfs.sftp/job/Matrix/badge/icon)](https://jenkins.kodi.tv/blue/organizations/jenkins/xbmc%2Fvfs.sftp/branches/)
+[![Build and run tests](https://github.com/xbmc/vfs.sftp/actions/workflows/build.yml/badge.svg?branch=Nexus)](https://github.com/xbmc/vfs.sftp/actions/workflows/build.yml)
+[![Build Status](https://dev.azure.com/teamkodi/binary-addons/_apis/build/status/xbmc.vfs.sftp?branchName=Nexus)](https://dev.azure.com/teamkodi/binary-addons/_build/latest?definitionId=54&branchName=Nexus)
+[![Build Status](https://jenkins.kodi.tv/view/Addons/job/xbmc/job/vfs.sftp/job/Nexus/badge/icon)](https://jenkins.kodi.tv/blue/organizations/jenkins/xbmc%2Fvfs.sftp/branches/)
 <!--- [![Build Status](https://ci.appveyor.com/api/projects/status/github/xbmc/vfs.sftp?svg=true)](https://ci.appveyor.com/project/xbmc/vfs-sftp) -->
 
 ## Build instructions
 
 When building the addon you have to use the correct branch depending on which version of Kodi you're building against.
-If you want to build the addon to be compatible with the latest kodi `Matrix` commit, you need to checkout the branch with the current kodi codename.
+If you want to build the addon to be compatible with the latest kodi `master` commit, you need to checkout the branch with the current kodi codename.
 Also make sure you follow this README from the branch in question.
 
 ### Linux
@@ -19,7 +19,7 @@ Also make sure you follow this README fr
 The following instructions assume you will have built Kodi already in the `kodi-build` directory 
 suggested by the README.
 
-1. `git clone --branch Matrix https://github.com/xbmc/xbmc.git kodi`
+1. `git clone --branch master https://github.com/xbmc/xbmc.git kodi`
 2. `git clone --branch Matrix https://github.com/xbmc/vfs.sftp.git`
 3. `cd vfs.sftp && mkdir build && cd build`
 4. `cmake -DADDONS_TO_BUILD=vfs.sftp -DADDON_SRC_PREFIX=../.. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=../../kodi/kodi-build/addons -DPACKAGE_ZIP=1 ../../kodi/cmake/addons`
diff -pruN 19.0.1+ds1-1/src/SFTPFile.cpp 20.1.0+ds1-1/src/SFTPFile.cpp
--- 19.0.1+ds1-1/src/SFTPFile.cpp	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/src/SFTPFile.cpp	2022-01-02 11:42:48.000000000 +0000
@@ -5,14 +5,24 @@
  *  See LICENSE.md for more information.
  */
 
+
+#include <map>
+#include <sstream>
+#include <fcntl.h>
 #include "SFTPSession.h"
 
+// This works around a Windows build bug whereby those functions are defined as macro
+#if defined(CreateDirectory)
+#undef CreateDirectory
+#endif
+#if defined(RemoveDirectory)
+#undef RemoveDirectory
+#endif
+
 #include <kodi/General.h>
 #include <kodi/addon-instance/VFS.h>
-#include <map>
-#include <sstream>
 
-class ATTRIBUTE_HIDDEN CSFTPFile : public kodi::addon::CInstanceVFS
+class ATTR_DLL_LOCAL CSFTPFile : public kodi::addon::CInstanceVFS
 {
   struct SFTPContext
   {
@@ -22,26 +32,11 @@ class ATTRIBUTE_HIDDEN CSFTPFile : publi
   };
 
 public:
-  CSFTPFile(KODI_HANDLE instance, const std::string& version) : CInstanceVFS(instance, version) {}
+  CSFTPFile(const kodi::addon::IInstanceInfo& instance) : CInstanceVFS(instance) {}
 
   kodi::addon::VFSFileHandle Open(const kodi::addon::VFSUrl& url) override
   {
-    SFTPContext* result = new SFTPContext;
-
-    result->session = CSFTPSessionManager::Get().CreateSession(url);
-
-    if (result->session)
-    {
-      result->file = url.GetFilename().c_str();
-      result->sftp_handle = result->session->CreateFileHande(result->file);
-      if (result->sftp_handle)
-        return result;
-    }
-    else
-      kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to allocate session");
-
-    delete result;
-    return nullptr;
+    return OpenInternal(url, O_RDONLY);
   }
 
   ssize_t Read(kodi::addon::VFSFileHandle context, uint8_t* buffer, size_t uiBufSize) override
@@ -54,7 +49,7 @@ public:
       if (rc >= 0)
         return rc;
       else
-        kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to read %i", rc);
+        kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to read %s", ctx->file.c_str());
     }
     else
       kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Can't read without a handle");
@@ -62,6 +57,24 @@ public:
     return -1;
   }
 
+  ssize_t Write(kodi::addon::VFSFileHandle context, const uint8_t* buffer, size_t uiBufSize) override
+  {
+    SFTPContext* ctx = static_cast<SFTPContext*>(context);
+    if (ctx && ctx->session && ctx->sftp_handle)
+    {
+      int writeBytes = ctx->session->Write(ctx->sftp_handle, buffer, uiBufSize);
+
+      if (writeBytes >= 0)
+        return writeBytes;
+      else
+        kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to write %s", ctx->file.c_str());
+    }
+    else
+      kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Can't write without a handle");
+
+    return -1;
+  }
+
   int64_t Seek(kodi::addon::VFSFileHandle context, int64_t iFilePosition, int whence) override
   {
     SFTPContext* ctx = static_cast<SFTPContext*>(context);
@@ -173,22 +186,119 @@ public:
 
     return session->GetDirectory(str.str(), url.GetFilename(), items);
   }
+
+  bool Delete(const kodi::addon::VFSUrl& url) override
+  {
+    CSFTPSessionPtr session = CSFTPSessionManager::Get().CreateSession(url);
+    if (session)
+      return session->DeleteFile(url.GetFilename());
+    else
+    {
+      kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to create session to delete file '%s'",
+                url.GetFilename().c_str());
+      return false;
+    }
+  }
+
+  bool RemoveDirectory(const kodi::addon::VFSUrl& url) override
+  {
+    CSFTPSessionPtr session = CSFTPSessionManager::Get().CreateSession(url);
+    if (session)
+      return session->DeleteDirectory(url.GetFilename());
+    else
+    {
+      kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to create session to delete folder '%s'",
+                url.GetFilename().c_str());
+      return false;
+    }
+  }
+
+  bool CreateDirectory(const kodi::addon::VFSUrl& url) override
+  {
+    CSFTPSessionPtr session = CSFTPSessionManager::Get().CreateSession(url);
+    if (session)
+      return session->MakeDirectory(url.GetFilename());
+    else
+    {
+      kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to create session to create folder '%s'",
+                url.GetFilename().c_str());
+      return false;
+    }
+  }
+
+  bool Rename(const kodi::addon::VFSUrl& url_from, const kodi::addon::VFSUrl& url_to) override
+  {
+    CSFTPSessionPtr session = CSFTPSessionManager::Get().CreateSession(url_from);
+    if (session)
+      return session->RenameFile(url_from.GetFilename(), url_to.GetFilename());
+    else
+    {
+      kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to create session to rename file '%s'",
+                url_from.GetFilename().c_str());
+      return false;
+    }
+  }
+
+  bool ContainsFiles(const kodi::addon::VFSUrl& url,
+                    std::vector<kodi::vfs::CDirEntry>& items,
+                    std::string &rootPath) override
+  {
+    return DirectoryExists(url) && !items.empty();
+  }
+
+  kodi::addon::VFSFileHandle OpenForWrite(const kodi::addon::VFSUrl& url, bool overWrite) override
+  {
+    if (overWrite)
+      return OpenInternal(url, O_RDWR | O_CREAT | O_TRUNC);
+    else
+      return OpenInternal(url, O_RDWR | O_CREAT);
+  }
+
+  int Truncate(kodi::addon::VFSFileHandle context, int64_t size) override
+  {
+    kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Truncate is not implemented");
+    return -1;
+  }
+
+  bool IoControlGetCacheStatus (kodi::addon::VFSFileHandle context, kodi::vfs::CacheStatus &status) override { return false; }
+
+  bool IoControlSetCacheRate (kodi::addon::VFSFileHandle context, uint32_t rate) override { return false; }
+
+  bool IoControlSetRetry (kodi::addon::VFSFileHandle context, bool retry) override { return false; }
+
+private:
+  kodi::addon::VFSFileHandle OpenInternal(const kodi::addon::VFSUrl& url, mode_t mode)
+  {
+    SFTPContext* result = new SFTPContext;
+
+    result->session = CSFTPSessionManager::Get().CreateSession(url);
+
+    if (result->session)
+    {
+      result->file = url.GetFilename().c_str();
+      result->sftp_handle = result->session->CreateFileHande(result->file, mode);
+      if (result->sftp_handle)
+        return result;
+    }
+    else
+      kodi::Log(ADDON_LOG_ERROR, "SFTPFile: Failed to allocate session");
+
+    delete result;
+    return nullptr;
+  }
 };
 
-class ATTRIBUTE_HIDDEN CMyAddon : public kodi::addon::CAddonBase
+class ATTR_DLL_LOCAL CMyAddon : public kodi::addon::CAddonBase
 {
 public:
   CMyAddon() { ssh_init(); }
 
   ~CMyAddon() override { ssh_finalize(); }
 
-  ADDON_STATUS CreateInstance(int instanceType,
-                              const std::string& instanceID,
-                              KODI_HANDLE instance,
-                              const std::string& version,
-                              KODI_HANDLE& addonInstance) override
+  ADDON_STATUS CreateInstance(const kodi::addon::IInstanceInfo& instance,
+                              KODI_ADDON_INSTANCE_HDL& hdl) override
   {
-    addonInstance = new CSFTPFile(instance, version);
+    hdl = new CSFTPFile(instance);
     return ADDON_STATUS_OK;
   }
 };
diff -pruN 19.0.1+ds1-1/src/SFTPSession.cpp 20.1.0+ds1-1/src/SFTPSession.cpp
--- 19.0.1+ds1-1/src/SFTPSession.cpp	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/src/SFTPSession.cpp	2022-01-02 11:42:48.000000000 +0000
@@ -23,6 +23,15 @@
 #ifndef S_ISLNK
 #define S_ISLNK(m) ((((m)) & 0170000) == (0120000))
 #endif
+#ifndef S_IWUSR
+#define S_IWUSR 00200
+#endif
+#ifndef S_IRUSR
+#define S_IRUSR 00400
+#endif
+#ifndef S_IRWXU
+#define S_IRWXU 00700
+#endif
 
 
 static std::string CorrectPath(const std::string& path)
@@ -90,13 +99,13 @@ CSFTPSession::~CSFTPSession()
   Disconnect();
 }
 
-sftp_file CSFTPSession::CreateFileHande(const std::string& file)
+sftp_file CSFTPSession::CreateFileHande(const std::string& file, mode_t mode)
 {
   if (m_connected)
   {
     std::unique_lock<std::recursive_mutex> lock(m_lock);
     m_LastActive = std::chrono::high_resolution_clock::now();
-    sftp_file handle = sftp_open(m_sftp_session, CorrectPath(file).c_str(), O_RDONLY, 0);
+    sftp_file handle = sftp_open(m_sftp_session, CorrectPath(file).c_str(), mode, S_IRUSR | S_IWUSR);
     if (handle)
     {
       sftp_file_set_blocking(handle);
@@ -291,6 +300,14 @@ int CSFTPSession::Read(sftp_file handle,
   return result;
 }
 
+int CSFTPSession::Write(sftp_file handle, const void* buffer, size_t length)
+{
+  std::unique_lock<std::recursive_mutex> lock(m_lock);
+  m_LastActive = std::chrono::high_resolution_clock::now();
+  int result = sftp_write(handle, buffer, length);
+  return result;
+}
+
 int64_t CSFTPSession::GetPosition(sftp_file handle)
 {
   std::unique_lock<std::recursive_mutex> lock(m_lock);
@@ -307,6 +324,38 @@ bool CSFTPSession::IsIdle()
          90000;
 }
 
+bool CSFTPSession::DeleteFile(const std::string& path)
+{
+  std::unique_lock<std::recursive_mutex> lock(m_lock);
+  m_LastActive = std::chrono::high_resolution_clock::now();
+  int result = sftp_unlink(m_sftp_session, CorrectPath(path).c_str());
+  return result == 0 ? true : false;
+}
+
+bool CSFTPSession::DeleteDirectory(const std::string& path)
+{
+  std::unique_lock<std::recursive_mutex> lock(m_lock);
+  m_LastActive = std::chrono::high_resolution_clock::now();
+  int result = sftp_rmdir(m_sftp_session, CorrectPath(path).c_str());
+  return result == 0 ? true : false;
+}
+
+bool CSFTPSession::MakeDirectory(const std::string& path)
+{
+  std::unique_lock<std::recursive_mutex> lock(m_lock);
+  m_LastActive = std::chrono::high_resolution_clock::now();
+  int result = sftp_mkdir(m_sftp_session, CorrectPath(path).c_str(), S_IRWXU);
+  return result == 0 ? true : false;
+}
+
+bool CSFTPSession::RenameFile(const std::string& path_from, const std::string& path_to)
+{
+  std::unique_lock<std::recursive_mutex> lock(m_lock);
+  m_LastActive = std::chrono::high_resolution_clock::now();
+  int result = sftp_rename(m_sftp_session, CorrectPath(path_from).c_str(), CorrectPath(path_to).c_str());
+  return result == 0 ? true : false;
+}
+
 bool CSFTPSession::VerifyKnownHost(ssh_session session)
 {
 #if !(LIBSSH_VERSION_MAJOR == 0 && LIBSSH_VERSION_MINOR < 8)
diff -pruN 19.0.1+ds1-1/src/SFTPSession.h 20.1.0+ds1-1/src/SFTPSession.h
--- 19.0.1+ds1-1/src/SFTPSession.h	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/src/SFTPSession.h	2022-01-02 11:42:48.000000000 +0000
@@ -23,7 +23,7 @@ public:
   CSFTPSession(const kodi::addon::VFSUrl& url);
   virtual ~CSFTPSession();
 
-  sftp_file CreateFileHande(const std::string& file);
+  sftp_file CreateFileHande(const std::string& file, mode_t mode);
   void CloseFileHandle(sftp_file handle);
   bool GetDirectory(const std::string& base,
                     const std::string& folder,
@@ -33,8 +33,13 @@ public:
   int Stat(const std::string& path, kodi::vfs::FileStatus& buffer);
   int Seek(sftp_file handle, uint64_t position);
   int Read(sftp_file handle, void* buffer, size_t length);
+  int Write(sftp_file handle, const void* buffer, size_t length);
   int64_t GetPosition(sftp_file handle);
   bool IsIdle();
+  bool DeleteFile(const std::string& path);
+  bool DeleteDirectory(const std::string& path);
+  bool MakeDirectory(const std::string& path);
+  bool RenameFile(const std::string& path_from, const std::string& path_to);
 
 private:
   bool VerifyKnownHost(ssh_session session);
diff -pruN 19.0.1+ds1-1/.travis.yml 20.1.0+ds1-1/.travis.yml
--- 19.0.1+ds1-1/.travis.yml	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/.travis.yml	2022-01-02 11:42:48.000000000 +0000
@@ -28,7 +28,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
 
 #
@@ -37,12 +37,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: 
diff -pruN 19.0.1+ds1-1/vfs.sftp/addon.xml.in 20.1.0+ds1-1/vfs.sftp/addon.xml.in
--- 19.0.1+ds1-1/vfs.sftp/addon.xml.in	2022-01-02 11:43:40.000000000 +0000
+++ 20.1.0+ds1-1/vfs.sftp/addon.xml.in	2022-01-02 11:42:48.000000000 +0000
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <addon
   id="vfs.sftp"
-  version="19.0.1"
+  version="20.1.0"
   name="SFTP support"
   provider-name="spiff">
   <requires>@ADDON_DEPENDS@</requires>
@@ -16,6 +16,7 @@
     supportPassword="true"
     supportPort="true"
     supportBrowsing="false"
+    supportWrite="true"
     defaultPort="22"
     type="sftp"
     label="20260"
