diff --git a/SimoxUtility/filesystem/list_directory.cpp b/SimoxUtility/filesystem/list_directory.cpp
index 00ab3514bfe6a3eb355769f0b4cf5dcef4f2a697..a1b80b0b4fad872b4d06fd039a9715a3ee199cb5 100644
--- a/SimoxUtility/filesystem/list_directory.cpp
+++ b/SimoxUtility/filesystem/list_directory.cpp
@@ -2,31 +2,51 @@
 
 #include <algorithm>
 
-
 namespace simox
 {
-    std::vector<fs::path> fs::list_directory(const path& directory, bool local, bool sort)
+
+    namespace impl
     {
-        std::vector<path> entries;
-        for (const auto& entry : directory_iterator(directory))
-        {
-            entries.push_back(entry.path());
-        }
 
-        if (sort)
-        {
-            std::sort(entries.begin(), entries.end());
-        }
 
-        if (local)
+        template <class DirectoryIteratorT>
+        std::vector<fs::path>
+        list_directory(const fs::path& directory, bool local, bool sort)
         {
-            for (auto& entry : entries)
+            std::vector<fs::path> entries;
+            for (const auto& entry : DirectoryIteratorT(directory))
+            {
+                entries.push_back(entry.path());
+            }
+
+            if (sort)
             {
-                entry = entry.filename();
+                std::sort(entries.begin(), entries.end());
             }
+
+            if (local)
+            {
+                for (auto& entry : entries)
+                {
+                    entry = entry.filename();
+                }
+            }
+            return entries;
         }
-        return entries;
+
+    } // namespace impl
+
+    std::vector<fs::path>
+    fs::list_directory(const path& directory, bool local, bool sort)
+    {
+        return impl::list_directory<std::filesystem::directory_iterator>(directory, local, sort);
     }
 
-}
+    std::vector<std::filesystem::__cxx11::path>
+    fs::list_directory_recursive(const path& directory, bool local, bool sort)
+    {
+        return impl::list_directory<std::filesystem::recursive_directory_iterator>(
+            directory, local, sort);
+    }
 
+} // namespace simox
diff --git a/SimoxUtility/filesystem/list_directory.h b/SimoxUtility/filesystem/list_directory.h
index c0342d8c42e04c2bacbbf698f896f4d2b99a4ef4..b5eeea79ddb3929df705ffaaa5ad1ca8268761ff 100644
--- a/SimoxUtility/filesystem/list_directory.h
+++ b/SimoxUtility/filesystem/list_directory.h
@@ -3,7 +3,6 @@
 #include <filesystem>
 #include <vector>
 
-
 namespace simox::fs
 {
     using namespace std::filesystem;
@@ -18,5 +17,11 @@ namespace simox::fs
      * @return The entries in `directory`.
      */
     std::vector<path> list_directory(const path& directory, bool local = false, bool sort = true);
-}
 
+    /**
+     * @brief Same as list_directory(), but recurses into subdirectories.
+     */
+    std::vector<path>
+    list_directory_recursive(const path& directory, bool local = false, bool sort = true);
+
+} // namespace simox::fs