diff --git a/Makefile b/Makefile
index ed1ab3cf9d7f4e337b34292b91a32afd4c7aa4e8..e101cc3da18b9d523b594e1cb55a08c884620988 100644
--- a/Makefile
+++ b/Makefile
@@ -54,6 +54,9 @@ repo: $(BUILD)/repo.tag
 # Podman build recipes and vars
 include mk/podman.mk
 
+# Disk Imaging and Cookbook tools
+include mk/fstools.mk
+
 # Cross compiler recipes
 include mk/prefix.mk
 
diff --git a/mk/config.mk b/mk/config.mk
index 598f046654d0002a9add904af60ec6fbb4203fbf..d0eff35eeef80fcf6c667e611d364737d5167df5 100644
--- a/mk/config.mk
+++ b/mk/config.mk
@@ -63,6 +63,8 @@ INSTALLER+=--cookbook=cookbook
 REPO_TAG=$(BUILD)/repo.tag
 endif
 
+FSTOOLS_TAG=build/fstools.tag
+
 ## Cross compiler variables
 AR=$(TARGET)-gcc-ar
 AS=$(TARGET)-as
diff --git a/mk/disk.mk b/mk/disk.mk
index 328e0ebf9482546343c9bc4d4e0dd745842b09cf..f73858f73ba91a074f9beb8e4786e004cb86709b 100644
--- a/mk/disk.mk
+++ b/mk/disk.mk
@@ -1,4 +1,4 @@
-$(BUILD)/harddrive.img: $(REPO_TAG)
+$(BUILD)/harddrive.img: $(FSTOOLS_TAG) $(REPO_TAG)
 	mkdir -p $(BUILD)
 	rm -rf $@  $@.partial
 	-$(FUMOUNT) /tmp/redox_installer || true
@@ -6,7 +6,7 @@ $(BUILD)/harddrive.img: $(REPO_TAG)
 	$(INSTALLER) -c $(FILESYSTEM_CONFIG) $@.partial
 	mv $@.partial $@
 
-$(BUILD)/livedisk.iso: $(REPO_TAG)
+$(BUILD)/livedisk.iso: $(FSTOOLS_TAG) $(REPO_TAG)
 	mkdir -p $(BUILD)
 	rm -rf $@  $@.partial
 	-$(FUMOUNT) /tmp/redox_installer || true
@@ -14,9 +14,8 @@ $(BUILD)/livedisk.iso: $(REPO_TAG)
 	$(INSTALLER) -c $(FILESYSTEM_CONFIG) --live $@.partial
 	mv $@.partial $@
 
-$(BUILD)/filesystem.img: $(REPO_TAG)
+$(BUILD)/filesystem.img: $(FSTOOLS_TAG) $(REPO_TAG)
 	mkdir -p $(BUILD)
-	$(HOST_CARGO) build --manifest-path redoxfs/Cargo.toml --release
 	-$(FUMOUNT) $(BUILD)/filesystem/ || true
 	rm -rf $@  $@.partial $(BUILD)/filesystem/
 	-$(FUMOUNT) /tmp/redox_installer || true
@@ -32,16 +31,14 @@ $(BUILD)/filesystem.img: $(REPO_TAG)
 	rm -rf $(BUILD)/filesystem/
 	mv $@.partial $@
 
-mount: FORCE
+mount: $(FSTOOLS_TAG) FORCE
 	mkdir -p $(BUILD)/filesystem/
-	$(HOST_CARGO) build --manifest-path redoxfs/Cargo.toml --release --bin redoxfs
 	redoxfs/target/release/redoxfs $(BUILD)/harddrive.img $(BUILD)/filesystem/
 	sleep 2
 	pgrep redoxfs
 
-mount_extra: FORCE
+mount_extra: $(FSTOOLS_TAG) FORCE
 	mkdir -p $(BUILD)/filesystem/
-	$(HOST_CARGO) build --manifest-path redoxfs/Cargo.toml --release --bin redoxfs
 	redoxfs/target/release/redoxfs $(BUILD)/extra.img $(BUILD)/filesystem/
 	sleep 2
 	pgrep redoxfs
diff --git a/mk/fstools.mk b/mk/fstools.mk
new file mode 100644
index 0000000000000000000000000000000000000000..ab14f8738768d26cd201afda93ddc40a9c58e2c2
--- /dev/null
+++ b/mk/fstools.mk
@@ -0,0 +1,21 @@
+fstools: $(FSTOOLS_TAG)
+
+$(FSTOOLS_TAG): cookbook installer redoxfs $(CONTAINER_TAG)
+ifeq ($(PODMAN_BUILD),1)
+	$(PODMAN_RUN) $(MAKE) $@
+else
+	$(HOST_CARGO) build --manifest-path cookbook/Cargo.toml --release
+	$(HOST_CARGO) build --manifest-path installer/Cargo.toml --release
+	$(HOST_CARGO) build --manifest-path redoxfs/Cargo.toml --release --bin redoxfs
+	touch $@
+endif
+
+fstools_clean: FORCE $(CONTAINER_TAG)
+ifeq ($(PODMAN_BUILD),1)
+	$(PODMAN_RUN) $(MAKE) $@
+else
+	$(HOST_CARGO) clean --manifest-path cookbook/Cargo.toml
+	$(HOST_CARGO) clean --manifest-path installer/Cargo.toml
+	$(HOST_CARGO) clean --manifest-path redoxfs/Cargo.toml
+	rm -f $(FSTOOLS_TAG)
+endif
\ No newline at end of file
diff --git a/mk/repo.mk b/mk/repo.mk
index 551b8f3a02673c83077d18cdb48d162f9076a797..84938e8d234c336963963b8732940b3786a3ecac 100644
--- a/mk/repo.mk
+++ b/mk/repo.mk
@@ -1,9 +1,7 @@
-$(BUILD)/fetch.tag: cookbook installer prefix $(FILESYSTEM_CONFIG) $(CONTAINER_TAG)
+$(BUILD)/fetch.tag: prefix $(FSTOOLS_TAG) $(FILESYSTEM_CONFIG) $(CONTAINER_TAG)
 ifeq ($(PODMAN_BUILD),1)
 	$(PODMAN_RUN) $(MAKE) $@
 else
-	$(HOST_CARGO) build --manifest-path cookbook/Cargo.toml --release
-	$(HOST_CARGO) build --manifest-path installer/Cargo.toml --release
 	PACKAGES="$$($(INSTALLER) --list-packages -c $(FILESYSTEM_CONFIG))" && \
 	cd cookbook && \
 	./fetch.sh "$${PACKAGES}"
@@ -11,12 +9,10 @@ else
 	touch $@
 endif
 
-$(BUILD)/repo.tag: $(BUILD)/fetch.tag $(CONTAINER_TAG)
+$(BUILD)/repo.tag: $(BUILD)/fetch.tag $(FSTOOLS_TAG) $(CONTAINER_TAG)
 ifeq ($(PODMAN_BUILD),1)
 	$(PODMAN_RUN) $(MAKE) $@
 else
-	$(HOST_CARGO) build --manifest-path cookbook/Cargo.toml --release
-	$(HOST_CARGO) build --manifest-path installer/Cargo.toml --release
 	export PATH="$(PREFIX_PATH):$$PATH" && \
 	PACKAGES="$$($(INSTALLER) --list-packages -c $(FILESYSTEM_CONFIG))" && \
 	cd cookbook && \
@@ -28,7 +24,7 @@ else
 endif
 
 # Invoke clean.sh for a single target
-c.%: FORCE
+c.%: $(FSTOOLS_TAG) FORCE
 ifeq ($(PODMAN_BUILD),1)
 	$(PODMAN_RUN) $(MAKE) $@
 else
@@ -38,7 +34,7 @@ else
 endif
 
 # Invoke fetch.sh for a single target
-f.%: FORCE
+f.%: $(FSTOOLS_TAG) FORCE
 ifeq ($(PODMAN_BUILD),1)
 	$(PODMAN_RUN) $(MAKE) $@
 else
@@ -48,7 +44,7 @@ else
 endif
 
 # Invoke repo.sh for a single target
-r.%: FORCE
+r.%: $(FSTOOLS_TAG) FORCE
 ifeq ($(PODMAN_BUILD),1)
 	$(PODMAN_RUN) $(MAKE) $@
 else