diff --git a/libraries/FS/src/FS.cpp b/libraries/FS/src/FS.cpp
index 8d89b1c1e5e..75821bd4ac0 100644
--- a/libraries/FS/src/FS.cpp
+++ b/libraries/FS/src/FS.cpp
@@ -203,6 +203,15 @@ String File::getNextFileName(void)
 
 }
 
+String File::getNextFileName(bool *isDir)
+{
+    if (!_p) {
+        return ""; 
+    }
+    return _p->getNextFileName(isDir);
+
+}
+
 void File::rewindDirectory(void)
 {
     if (!*this) {
diff --git a/libraries/FS/src/FS.h b/libraries/FS/src/FS.h
index 95e6f265deb..ef1a26915bb 100644
--- a/libraries/FS/src/FS.h
+++ b/libraries/FS/src/FS.h
@@ -81,6 +81,7 @@ class File : public Stream
     boolean seekDir(long position);
     File openNextFile(const char* mode = FILE_READ);
     String getNextFileName(void);
+    String getNextFileName(boolean *isDir);
     void rewindDirectory(void);
 
 protected:
diff --git a/libraries/FS/src/FSImpl.h b/libraries/FS/src/FSImpl.h
index 263ab191d8a..dc7b81b3899 100644
--- a/libraries/FS/src/FSImpl.h
+++ b/libraries/FS/src/FSImpl.h
@@ -45,6 +45,7 @@ class FileImpl
     virtual FileImplPtr openNextFile(const char* mode) = 0;
     virtual boolean seekDir(long position);
     virtual String getNextFileName(void);
+    virtual String getNextFileName(bool *isDir);
     virtual void rewindDirectory(void) = 0;
     virtual operator bool() = 0;
 };
diff --git a/libraries/FS/src/vfs_api.cpp b/libraries/FS/src/vfs_api.cpp
index e65a537c03d..1dd8da94ac9 100644
--- a/libraries/FS/src/vfs_api.cpp
+++ b/libraries/FS/src/vfs_api.cpp
@@ -540,6 +540,32 @@ String VFSFileImpl::getNextFileName()
     return name;
 }
 
+String VFSFileImpl::getNextFileName(bool *isDir)
+{
+    if (!_isDirectory || !_d) {
+        return "";
+    }
+    struct dirent *file = readdir(_d);
+    if (file == NULL) {
+        return "";
+    }
+    if (file->d_type != DT_REG && file->d_type != DT_DIR) {
+        return "";
+    }
+    String fname = String(file->d_name);
+    String name = String(_path);
+    if (!fname.startsWith("/") && !name.endsWith("/")) {
+        name += "/";
+    }
+    name += fname;
+
+    // check entry is a directory
+    if (isDir) {
+        *isDir = (file->d_type == DT_DIR);
+    }
+    return name;
+}
+
 void VFSFileImpl::rewindDirectory(void)
 {
     if(!_isDirectory || !_d) {
diff --git a/libraries/FS/src/vfs_api.h b/libraries/FS/src/vfs_api.h
index fe475bd35cb..ae2a4d0055c 100644
--- a/libraries/FS/src/vfs_api.h
+++ b/libraries/FS/src/vfs_api.h
@@ -73,6 +73,7 @@ class VFSFileImpl : public FileImpl
     boolean     isDirectory(void) override;
     boolean     seekDir(long position) override;
     String      getNextFileName(void) override;
+    String      getNextFileName(bool *isDir) override;
     FileImplPtr openNextFile(const char* mode) override;
     void        rewindDirectory(void) override;
     operator    bool();