diff --git a/libraries/FFat/examples/FFat_Test/FFat_Test.ino b/libraries/FFat/examples/FFat_Test/FFat_Test.ino
index 26a0bcac3bd..9ae55a8c5e4 100644
--- a/libraries/FFat/examples/FFat_Test/FFat_Test.ino
+++ b/libraries/FFat/examples/FFat_Test/FFat_Test.ino
@@ -27,7 +27,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             Serial.print("  DIR : ");
             Serial.println(file.name());
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/FFat/examples/FFat_time/FFat_time.ino b/libraries/FFat/examples/FFat_time/FFat_time.ino
index 1e3794514c5..475cfea026b 100644
--- a/libraries/FFat/examples/FFat_time/FFat_time.ino
+++ b/libraries/FFat/examples/FFat_time/FFat_time.ino
@@ -31,7 +31,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             struct tm * tmstruct = localtime(&t);
             Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec);
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp
index 3bfcd54fcc0..3050ec41fd8 100644
--- a/libraries/FS/src/FS.cpp
+++ b/libraries/FS/src/FS.cpp
@@ -143,6 +143,15 @@ File::operator bool() const
     return _p != nullptr && *_p != false;
 }
 
+const char* File::path() const
+{
+    if (!*this) {
+        return nullptr;
+    }
+
+    return _p->path();
+}
+
 const char* File::name() const
 {
     if (!*this) {
diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h
index d63fc5da305..2c4aa3011c1 100644
--- a/libraries/FS/src/FS.h
+++ b/libraries/FS/src/FS.h
@@ -73,6 +73,7 @@ class File : public Stream
     void close();
     operator bool() const;
     time_t getLastWrite();
+    const char* path() const;
     const char* name() const;
 
     boolean isDirectory(void);
diff --git a/libraries/FS/src/FSImpl.h b/libraries/FS/src/FSImpl.h
index 70e5cb1e3cb..51c5915a069 100644
--- a/libraries/FS/src/FSImpl.h
+++ b/libraries/FS/src/FSImpl.h
@@ -38,6 +38,7 @@ class FileImpl
     virtual size_t size() const = 0;
     virtual void close() = 0;
     virtual time_t getLastWrite() = 0;
+    virtual const char* path() const = 0;
     virtual const char* name() const = 0;
     virtual boolean isDirectory(void) = 0;
     virtual FileImplPtr openNextFile(const char* mode) = 0;
diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp
index 346b7a93248..aea37b1e3d6 100644
--- a/libraries/FS/src/vfs_api.cpp
+++ b/libraries/FS/src/vfs_api.cpp
@@ -16,41 +16,41 @@
 
 using namespace fs;
 
-FileImplPtr VFSImpl::open(const char* path, const char* mode)
+FileImplPtr VFSImpl::open(const char* fpath, const char* mode)
 {
     if(!_mountpoint) {
         log_e("File system is not mounted");
         return FileImplPtr();
     }
 
-    if(!path || path[0] != '/') {
-        log_e("%s does not start with /", path);
+    if(!fpath || fpath[0] != '/') {
+        log_e("%s does not start with /", fpath);
         return FileImplPtr();
     }
 
-    char * temp = (char *)malloc(strlen(path)+strlen(_mountpoint)+2);
+    char * temp = (char *)malloc(strlen(fpath)+strlen(_mountpoint)+2);
     if(!temp) {
         log_e("malloc failed");
         return FileImplPtr();
     }
 
-    sprintf(temp,"%s%s", _mountpoint, path);
+    sprintf(temp,"%s%s", _mountpoint, fpath);
 
     struct stat st;
     //file lound
     if(!stat(temp, &st)) {
         free(temp);
         if (S_ISREG(st.st_mode) || S_ISDIR(st.st_mode)) {
-            return std::make_shared<VFSFileImpl>(this, path, mode);
+            return std::make_shared<VFSFileImpl>(this, fpath, mode);
         }
-        log_e("%s has wrong mode 0x%08X", path, st.st_mode);
+        log_e("%s has wrong mode 0x%08X", fpath, st.st_mode);
         return FileImplPtr();
     }
 
     //file not found but mode permits creation
     if(mode && mode[0] != 'r') {
         free(temp);
-        return std::make_shared<VFSFileImpl>(this, path, mode);
+        return std::make_shared<VFSFileImpl>(this, fpath, mode);
     }
 
     //try to open this as directory (might be mount point)
@@ -58,7 +58,7 @@ FileImplPtr VFSImpl::open(const char* path, const char* mode)
     if(d) {
         closedir(d);
         free(temp);
-        return std::make_shared<VFSFileImpl>(this, path, mode);
+        return std::make_shared<VFSFileImpl>(this, fpath, mode);
     }
 
     log_e("%s does not exist", temp);
@@ -66,14 +66,14 @@ FileImplPtr VFSImpl::open(const char* path, const char* mode)
     return FileImplPtr();
 }
 
-bool VFSImpl::exists(const char* path)
+bool VFSImpl::exists(const char* fpath)
 {
     if(!_mountpoint) {
         log_e("File system is not mounted");
         return false;
     }
 
-    VFSFileImpl f(this, path, "r");
+    VFSFileImpl f(this, fpath, "r");
     if(f) {
         f.close();
         return true;
@@ -115,69 +115,69 @@ bool VFSImpl::rename(const char* pathFrom, const char* pathTo)
     return rc == 0;
 }
 
-bool VFSImpl::remove(const char* path)
+bool VFSImpl::remove(const char* fpath)
 {
     if(!_mountpoint) {
         log_e("File system is not mounted");
         return false;
     }
 
-    if(!path || path[0] != '/') {
+    if(!fpath || fpath[0] != '/') {
         log_e("bad arguments");
         return false;
     }
 
-    VFSFileImpl f(this, path, "r");
+    VFSFileImpl f(this, fpath, "r");
     if(!f || f.isDirectory()) {
         if(f) {
             f.close();
         }
-        log_e("%s does not exists or is directory", path);
+        log_e("%s does not exists or is directory", fpath);
         return false;
     }
     f.close();
 
-    char * temp = (char *)malloc(strlen(path)+strlen(_mountpoint)+1);
+    char * temp = (char *)malloc(strlen(fpath)+strlen(_mountpoint)+1);
     if(!temp) {
         log_e("malloc failed");
         return false;
     }
-    sprintf(temp,"%s%s", _mountpoint, path);
+    sprintf(temp,"%s%s", _mountpoint, fpath);
     auto rc = unlink(temp);
     free(temp);
     return rc == 0;
 }
 
-bool VFSImpl::mkdir(const char *path)
+bool VFSImpl::mkdir(const char *fpath)
 {
     if(!_mountpoint) {
         log_e("File system is not mounted");
         return false;
     }
 
-    VFSFileImpl f(this, path, "r");
+    VFSFileImpl f(this, fpath, "r");
     if(f && f.isDirectory()) {
         f.close();
-        //log_w("%s already exists", path);
+        //log_w("%s already exists", fpath);
         return true;
     } else if(f) {
         f.close();
-        log_e("%s is a file", path);
+        log_e("%s is a file", fpath);
         return false;
     }
 
-    char * temp = (char *)malloc(strlen(path)+strlen(_mountpoint)+1);
+    char * temp = (char *)malloc(strlen(fpath)+strlen(_mountpoint)+1);
     if(!temp) {
         log_e("malloc failed");
         return false;
     }
-    sprintf(temp,"%s%s", _mountpoint, path);
+    sprintf(temp,"%s%s", _mountpoint, fpath);
     auto rc = ::mkdir(temp, ACCESSPERMS);
     free(temp);
     return rc == 0;
 }
 
-bool VFSImpl::rmdir(const char *path)
+bool VFSImpl::rmdir(const char *fpath)
 {
     if(!_mountpoint) {
         log_e("File system is not mounted");
@@ -189,22 +189,22 @@ bool VFSImpl::rmdir(const char *path)
         return false;
     }
 
-    VFSFileImpl f(this, path, "r");
+    VFSFileImpl f(this, fpath, "r");
     if(!f || !f.isDirectory()) {
         if(f) {
             f.close();
         }
-        log_e("%s does not exists or is a file", path);
+        log_e("%s does not exists or is a file", fpath);
         return false;
     }
     f.close();
 
-    char * temp = (char *)malloc(strlen(path)+strlen(_mountpoint)+1);
+    char * temp = (char *)malloc(strlen(fpath)+strlen(_mountpoint)+1);
     if(!temp) {
         log_e("malloc failed");
         return false;
     }
-    sprintf(temp,"%s%s", _mountpoint, path);
+    sprintf(temp,"%s%s", _mountpoint, fpath);
     auto rc = ::rmdir(temp);
     free(temp);
     return rc == 0;
@@ -213,7 +213,7 @@ bool VFSImpl::rmdir(const char *path)
 
 
 
-VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* path, const char* mode)
+VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* fpath, const char* mode)
     : _fs(fs)
     , _f(NULL)
     , _d(NULL)
@@ -221,15 +221,15 @@ VFSFileImpl::VFSFileImpl(VFSImpl* fs, const char* path, const char* mode)
     , _isDirectory(false)
     , _written(false)
 {
-    char * temp = (char *)malloc(strlen(path)+strlen(_fs->_mountpoint)+1);
+    char * temp = (char *)malloc(strlen(fpath)+strlen(_fs->_mountpoint)+1);
     if(!temp) {
         return;
     }
-    sprintf(temp,"%s%s", _fs->_mountpoint, path);
+    sprintf(temp,"%s%s", _fs->_mountpoint, fpath);
 
-    _path = strdup(path);
+    _path = strdup(fpath);
     if(!_path) {
-        log_e("strdup(%s) failed", path);
+        log_e("strdup(%s) failed", fpath);
         free(temp);
         return;
     }
@@ -377,11 +377,16 @@ size_t VFSFileImpl::size() const
     return _stat.st_size;
 }
 
-const char* VFSFileImpl::name() const
+const char* VFSFileImpl::path() const
 {
     return (const char*) _path;
 }
 
+const char* VFSFileImpl::name() const
+{
+    return pathToFileName(path());
+}
+
 //to implement
 boolean VFSFileImpl::isDirectory(void)
 {
diff --git a/libraries/FS/src/vfs_api.h b/libraries/FS/src/vfs_api.h
index c5649130f60..58fd86fdd26 100644
--- a/libraries/FS/src/vfs_api.h
+++ b/libraries/FS/src/vfs_api.h
@@ -66,6 +66,7 @@ class VFSFileImpl : public FileImpl
     size_t      position() const override;
     size_t      size() const override;
     void        close() override;
+    const char* path() const override;
     const char* name() const override;
     time_t getLastWrite()  override;
     boolean     isDirectory(void) override;
diff --git a/libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino b/libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino
index f905511d5dc..4d594ea9e12 100644
--- a/libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino
+++ b/libraries/LITTLEFS/examples/LITTLEFS_test/LITTLEFS_test.ino
@@ -32,7 +32,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             Serial.print("  DIR : ");
             Serial.println(file.name());
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino b/libraries/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino
index d4f4aaf1136..3f03c227a94 100644
--- a/libraries/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino
+++ b/libraries/LITTLEFS/examples/LITTLEFS_time/LITTLEFS_time.ino
@@ -43,7 +43,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             struct tm * tmstruct = localtime(&t);
             Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec);
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/SD/examples/SD_Test/SD_Test.ino b/libraries/SD/examples/SD_Test/SD_Test.ino
index 6059446e600..8084ee17dae 100644
--- a/libraries/SD/examples/SD_Test/SD_Test.ino
+++ b/libraries/SD/examples/SD_Test/SD_Test.ino
@@ -35,7 +35,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             Serial.print("  DIR : ");
             Serial.println(file.name());
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/SD/examples/SD_time/SD_time.ino b/libraries/SD/examples/SD_time/SD_time.ino
index 5fc871627b5..cef80dd600c 100644
--- a/libraries/SD/examples/SD_time/SD_time.ino
+++ b/libraries/SD/examples/SD_time/SD_time.ino
@@ -47,7 +47,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             struct tm * tmstruct = localtime(&t);
             Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec);
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino b/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino
index b9e872850a0..024ea4bfdea 100644
--- a/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino
+++ b/libraries/SD_MMC/examples/SDMMC_Test/SDMMC_Test.ino
@@ -35,7 +35,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             Serial.print("  DIR : ");
             Serial.println(file.name());
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino b/libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino
index 43dad45427f..4472f8c6c37 100644
--- a/libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino
+++ b/libraries/SD_MMC/examples/SDMMC_time/SDMMC_time.ino
@@ -47,7 +47,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             struct tm * tmstruct = localtime(&t);
             Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec);
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino b/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino
index 15a71245d07..9ee67e6c12f 100644
--- a/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino
+++ b/libraries/SPIFFS/examples/SPIFFS_Test/SPIFFS_Test.ino
@@ -25,7 +25,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             Serial.print("  DIR : ");
             Serial.println(file.name());
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino b/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino
index 958e805ee95..a86759693a9 100644
--- a/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino
+++ b/libraries/SPIFFS/examples/SPIFFS_time/SPIFFS_time.ino
@@ -31,7 +31,7 @@ void listDir(fs::FS &fs, const char * dirname, uint8_t levels){
             struct tm * tmstruct = localtime(&t);
             Serial.printf("  LAST WRITE: %d-%02d-%02d %02d:%02d:%02d\n",(tmstruct->tm_year)+1900,( tmstruct->tm_mon)+1, tmstruct->tm_mday,tmstruct->tm_hour , tmstruct->tm_min, tmstruct->tm_sec);
             if(levels){
-                listDir(fs, file.name(), levels -1);
+                listDir(fs, file.path(), levels -1);
             }
         } else {
             Serial.print("  FILE: ");
diff --git a/libraries/WebServer/examples/FSBrowser/FSBrowser.ino b/libraries/WebServer/examples/FSBrowser/FSBrowser.ino
index f33f5dbe233..093ff08bf9f 100644
--- a/libraries/WebServer/examples/FSBrowser/FSBrowser.ino
+++ b/libraries/WebServer/examples/FSBrowser/FSBrowser.ino
@@ -207,7 +207,7 @@ void handleFileList() {
           output += "{\"type\":\"";
           output += (file.isDirectory()) ? "dir" : "file";
           output += "\",\"name\":\"";
-          output += String(file.name()).substring(1);
+          output += String(file.path()).substring(1);
           output += "\"}";
           file = root.openNextFile();
       }
diff --git a/libraries/WebServer/examples/SDWebServer/SDWebServer.ino b/libraries/WebServer/examples/SDWebServer/SDWebServer.ino
index 3d0e3942fb1..9e0b8456e28 100644
--- a/libraries/WebServer/examples/SDWebServer/SDWebServer.ino
+++ b/libraries/WebServer/examples/SDWebServer/SDWebServer.ino
@@ -229,7 +229,7 @@ void printDirectory() {
     output += "{\"type\":\"";
     output += (entry.isDirectory()) ? "dir" : "file";
     output += "\",\"name\":\"";
-    output += entry.name();
+    output += entry.path();
     output += "\"";
     output += "}";
     server.sendContent(output);