diff --git a/Makefile b/Makefile
index 0fd99021fb99cb69ba9b8dd49070260b5abeeb3f..cc196c5e0473e95633ba6d78c3e16d38516d8f75 100644
--- a/Makefile
+++ b/Makefile
@@ -48,6 +48,37 @@ define to_arch =
 $(if $(subst amd64,,$1),$(if $(subst i386,,$1),$1,i686),x86_64)
 endef
 
+#Some targets require the image partition to be mounted.
+#Although, it is easy to detect this (and mount the partition)
+#by depending on the phony target image_mount_if, make is unable
+#to calculate the dependencies correctly. The reason is that some
+#dependencies are located on the partition (which is not mounted
+#when scanning for dependencies). Hence, make will rebuild all
+#targets (after it mounted the partition) regardless of the state
+#of these files.
+#
+#To solve this issue we call ensure_mount on phony targets invoked
+#by the user. The actual target will serve as a wrapper which
+#mounts the partition and then invokes the actual target renamed
+#to <name>__ignore_mount. Note that both targets will be marked
+#as phony, since the renaming makes no sense for files (and most
+#probably this is a file on the partition anyway...) and the user
+#will invoke a phony target anyway.
+#
+#tl;dr every target that requires the image partition to be mounted
+#should be encapsulated in $(call ensure_mount,<target_name>).
+#
+#Finally, do not change _any_ whitespaces in the defintion of
+#ensure_mount without knowing exactly what you are doing. This is
+#dark magic!
+define ensure_mount =
+$(eval
+.PHONY : $(strip $1) $(strip $1)__ignore_mount
+$(strip $1): image_mount_if
+	$(MAKE) $(strip $1)__ignore_mount
+)$(strip $1)__ignore_mount
+endef
+
 RSYNC=rsync -a
 LZMA_FLAGS=-T 0