diff --git a/apps/Dirwalk.cpp b/apps/Dirwalk.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..42eb5a277fd95d77c43ac36600a32047fc958c6d
--- /dev/null
+++ b/apps/Dirwalk.cpp
@@ -0,0 +1,49 @@
+// SPDX-License-Identifier: LGPL-3.0-or-later
+// Copyright © 2022 Florian Schmaus
+#include <cstdlib>
+#include <filesystem>
+#include <iostream>
+#include <sstream>
+#include <string>
+#include <vector>
+
+#include "Fiber.hpp"
+#include "Fibril.hpp"
+#include "Runtime.hpp"
+#include "emper-common.h"
+
+namespace fs = std::filesystem;
+
+// NOLINTNEXTLINE(clang-diagnostic-unknown-attributes)
+emper_fibril void fibril_recursive_directory_print_walk(const fs::path* dirpath) {
+	std::cout << "DIR: " << *dirpath << std::endl;
+
+	std::vector<fs::path> subdirs;
+	for (const auto& path : fs::directory_iterator(*dirpath)) {
+		if (path.is_directory()) {
+			subdirs.push_back(path);
+			continue;
+		}
+
+		std::cout << path << std::endl;
+	}
+
+	Fibril fibril;
+	for (const auto& subdir : subdirs) {
+		fibril.spawn(fibril_recursive_directory_print_walk, &subdir);
+	}
+}
+
+auto main(UNUSED_ARG int argc, UNUSED_ARG char* argv[]) -> int {
+	Runtime runtime;
+
+	auto* fiber = Fiber::from([] {
+		auto cwd = fs::current_path();
+		fibril_recursive_directory_print_walk(&cwd);
+		Runtime::getRuntime()->initiateTermination();
+	});
+	runtime.scheduleFromAnywhere(*fiber);
+
+	runtime.waitUntilFinished();
+	return EXIT_SUCCESS;
+}
diff --git a/apps/meson.build b/apps/meson.build
index 1ab32678dbc98c398f05c22050bf0b95ce81cf4e..959cf569a8cca0fb7936b0263a44cc98df85ea29 100644
--- a/apps/meson.build
+++ b/apps/meson.build
@@ -40,6 +40,12 @@ qsort = executable(
   dependencies: emper_dep,
 )
 
+qsort = executable(
+  'dirwalk',
+  'Dirwalk.cpp',
+  dependencies: emper_dep,
+)
+
 boost_program_options_dep = dependency('boost', modules: ['program_options'])
 
 boost_program_options_code = '''