--- b/.github/workflows/ci.yml
+++ a/.github/workflows/ci.yml
@@ -33,7 +33,7 @@
         DEBIAN_FRONTEND: noninteractive
       run: |
         apt-get update
+        apt-get -y install build-essential g++ autoconf autoconf-archive automake libtool libtorrent-rasterbar-dev libfuse-dev libcurl4-openssl-dev
-        apt-get -y install build-essential g++ autoconf autoconf-archive automake libtool libtorrent-rasterbar-dev libfuse3-dev libcurl4-openssl-dev
     - name: Build
       run: |
         autoreconf -i
--- b/README.md
+++ a/README.md
@@ -47,13 +47,13 @@
 
 ## Dependencies (on Linux)
 
+* fuse ("fuse" in Ubuntu 16.04)
+* libtorrent ("libtorrent-rasterbar8" in Ubuntu 16.04)
+* libcurl ("libcurl3" in Ubuntu 16.04)
-* fuse3 ("fuse3" in Ubuntu 22.04)
-* libtorrent ("libtorrent-rasterbar8" in Ubuntu 22.04)
-* libcurl ("libcurl4" in Ubuntu 22.04)
 
 ## Building from git on a recent Debian/Ubuntu
 
+    $ sudo apt-get install autoconf automake libfuse-dev libtorrent-rasterbar-dev libcurl4-openssl-dev g++
-    $ sudo apt-get install autoconf automake libfuse3-dev libtorrent-rasterbar-dev libcurl4-openssl-dev g++
     $ git clone https://github.com/johang/btfs.git btfs
     $ cd btfs
     $ autoreconf -i
@@ -68,7 +68,7 @@
 
 Use [`brew`](https://brew.sh) to get the dependencies.
 
+    $ brew install Caskroom/cask/osxfuse libtorrent-rasterbar autoconf automake pkg-config
-    $ brew install --cask macfuse libtorrent-rasterbar autoconf automake pkg-config
     $ git clone https://github.com/johang/btfs.git btfs
     $ cd btfs
     $ autoreconf -i
--- b/configure.ac
+++ a/configure.ac
@@ -1,5 +1,5 @@
 AC_PREREQ([2.69])
+AC_INIT(btfs, 3.1, johan.gunnarsson@gmail.com, btfs, https://github.com/johang/btfs)
-AC_INIT([btfs],[3.1],[johan.gunnarsson@gmail.com],[btfs],[https://github.com/johang/btfs])
 AC_CONFIG_SRCDIR([src/btfs.cc])
 
 AM_INIT_AUTOMAKE
@@ -8,7 +8,7 @@
 AC_PROG_CXX
 
 # Checks for libraries.
+PKG_CHECK_MODULES(FUSE, fuse >= 2.8.0)
-PKG_CHECK_MODULES(FUSE, fuse3 >= 3.0)
 PKG_CHECK_MODULES(LIBTORRENT, libtorrent-rasterbar >= 1.0.0)
 PKG_CHECK_MODULES(LIBCURL, libcurl >= 7.22.0)
 
@@ -25,5 +25,4 @@
 # Check if -latomic is needed.
 AC_SEARCH_LIBS(__atomic_load, atomic)
 
+AC_OUTPUT(Makefile src/Makefile scripts/Makefile man/Makefile)
-AC_CONFIG_FILES([Makefile src/Makefile scripts/Makefile man/Makefile])
-AC_OUTPUT
--- b/src/btfs.cc
+++ a/src/btfs.cc
@@ -17,7 +17,7 @@
 along with BTFS.  If not, see <http://www.gnu.org/licenses/>.
 */
 
+#define FUSE_USE_VERSION 26
-#define FUSE_USE_VERSION 31
 
 #include <cstdlib>
 #include <iostream>
@@ -27,8 +27,7 @@
 #include <sys/types.h>
 #include <sys/stat.h>
 
+#include <fuse.h>
-#include <fuse3/fuse.h>
-#include <fuse3/fuse_opt.h>
 
 // The below pragma lines will silence lots of compiler warnings in the
 // libtorrent headers file. Not btfs' fault.
@@ -421,9 +420,7 @@
 }
 
 static int
+btfs_getattr(const char *path, struct stat *stbuf) {
-btfs_getattr(const char *path, struct stat *stbuf,
-		struct fuse_file_info *fi) {
-	(void) fi;
 	if (!is_dir(path) && !is_file(path) && !is_root(path))
 		return -ENOENT;
 
@@ -468,9 +465,7 @@
 
 static int
 btfs_readdir(const char *path, void *buf, fuse_fill_dir_t filler,
+		off_t offset, struct fuse_file_info *fi) {
-		off_t offset, struct fuse_file_info *fi,
-		enum fuse_readdir_flags flags) {
-	(void)flags;
 	if (!is_dir(path) && !is_file(path) && !is_root(path))
 		return -ENOENT;
 
@@ -479,12 +474,12 @@
 
 	pthread_mutex_lock(&lock);
 
+	filler(buf, ".", NULL, 0);
+	filler(buf, "..", NULL, 0);
-	filler(buf, ".", NULL, 0, (enum fuse_fill_dir_flags)0);
-	filler(buf, "..", NULL, 0, (enum fuse_fill_dir_flags)0);
 
 	for (std::set<std::string>::iterator i = dirs[path].begin();
 			i != dirs[path].end(); ++i) {
+		filler(buf, i->c_str(), NULL, 0);
-		filler(buf, i->c_str(), NULL, 0, (enum fuse_fill_dir_flags)0);
 	}
 
 	pthread_mutex_unlock(&lock);
@@ -560,8 +555,7 @@
 }
 
 static void *
+btfs_init(struct fuse_conn_info *conn) {
-btfs_init(struct fuse_conn_info *conn,
-		struct fuse_config *cfg) {
 	pthread_mutex_lock(&lock);
 
 	time_of_mount = time(NULL);
