diff --git a/Makefile.am b/Makefile.am
index 0c05160e95e33bcfe8f307a4deeae03934cd42b9..6616b80f7c82868877b5dc7034416a24f8a43e12 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -35,14 +35,16 @@ MODULES =					\
 
 GOBJECTS = $(MODULES:%.scm=%.go)
 
-nobase_dist_guilemodule_DATA =			\
-  $(MODULES)					\
-  distro/guile-1.8-cpp-4.5.patch		\
-  distro/m4-readlink-EINVAL.patch		\
-  distro/m4-s_isdir.patch			\
-  distro/make-impure-dirs.patch			\
-  distro/findutils-absolute-paths.patch		\
-  distro/readline-link-ncurses.patch
+nobase_dist_guilemodule_DATA = $(MODULES)
+
+patchdir = $(pkgdatadir)/patches
+dist_patch_DATA =				\
+  distro/patches/guile-1.8-cpp-4.5.patch	\
+  distro/patches/m4-readlink-EINVAL.patch	\
+  distro/patches/m4-s_isdir.patch		\
+  distro/patches/make-impure-dirs.patch		\
+  distro/patches/findutils-absolute-paths.patch	\
+  distro/patches/readline-link-ncurses.patch
 
 nobase_nodist_guilemodule_DATA = $(GOBJECTS)
 
@@ -57,6 +59,7 @@ TESTS_ENVIRONMENT =								\
   NIX_HASH="$(NIX_HASH)";							\
   NIX_INSTANTIATE="$(NIX_INSTANTIATE)";						\
   NIXPKGS="$(NIXPKGS)";								\
+  DISTRO_PATCH_DIRECTORY="$(top_srcdir)/distro/patches"				\
   GUILE_LOAD_COMPILED_PATH="$(top_builddir):$$GUILE_LOAD_COMPILED_PATH";	\
   export NIX_HASH NIX_INSTANTIATE NIXPKGS GUILE_LOAD_COMPILED_PATH;
 
@@ -78,6 +81,8 @@ CLEANFILES = $(GOBJECTS) *.log
 	NIX_INSTANTIATE="$(NIX_INSTANTIATE)"					\
 	NIXPKGS="$(NIXPKGS)"							\
 	LIBGCRYPT="$(LIBGCRYPT)"						\
+	DISTRO_PATCH_DIRECTORY="$(top_srcdir)/distro/patches"			\
+	DISTRO_INSTALLED_PATCH_DIRECTORY="$(patchdir)"				\
 	GUILE_AUTO_COMPILE=0							\
 	GUILE_LOAD_COMPILED_PATH="$(top_builddir):$$GUILE_LOAD_COMPILED_PATH"	\
 	$(GUILD) compile -L "$(top_srcdir)"					\
diff --git a/distro.scm b/distro.scm
index 784e537debc24de5e877c6123438aee4ee08fd2e..b21b0e61846bcb9efb96dc0565417a8accc852c2 100644
--- a/distro.scm
+++ b/distro.scm
@@ -18,10 +18,14 @@
 
 (define-module (distro)
   #:use-module (guix packages)
+  #:use-module (guix utils)
   #:use-module (ice-9 ftw)
   #:use-module (srfi srfi-1)
   #:use-module (srfi srfi-26)
-  #:export (find-packages-by-name))
+  #:use-module (srfi srfi-39)
+  #:export (search-patch
+            %patch-directory
+            find-packages-by-name))
 
 ;;; Commentary:
 ;;;
@@ -32,6 +36,15 @@ (define-module (distro)
 
 (define _ (cut gettext <> "guix"))
 
+(define %patch-directory
+  (make-parameter
+   (or (getenv "DISTRO_PATCH_DIRECTORY")
+       (compile-time-value (getenv "DISTRO_INSTALLED_PATCH_DIRECTORY")))))
+
+(define (search-patch file-name)
+  "Search the patch FILE-NAME."
+  (search-path (list (%patch-directory)) file-name))
+
 (define %distro-module-directory
   ;; Absolute path of the (distro ...) module root.
   (string-append (dirname (search-path %load-path "distro.scm"))
diff --git a/distro/base.scm b/distro/base.scm
index 16f5b40e30501672fbd95ff4f76fb7e3406b691e..179910a1296c02dac27b7668d283d2a6e282a276 100644
--- a/distro/base.scm
+++ b/distro/base.scm
@@ -17,6 +17,7 @@
 ;;; along with Guix.  If not, see <http://www.gnu.org/licenses/>.
 
 (define-module (distro base)
+  #:use-module (distro)
   #:use-module (guix packages)
   #:use-module (guix http)
   #:use-module (guix build-system gnu)
@@ -191,7 +192,7 @@ (define-public findutils
    (build-system gnu-build-system)
    (native-inputs
     `(("patch/absolute-paths"
-       ,(search-path %load-path "distro/findutils-absolute-paths.patch"))))
+       ,(search-patch "findutils-absolute-paths.patch"))))
    (arguments
     (case-lambda
       ((system)
@@ -245,10 +246,9 @@ (define-public m4
                  `(#:patches (list (assoc-ref %build-inputs "patch/s_isdir")
                                    (assoc-ref %build-inputs
                                               "patch/readlink-EINVAL"))))))
-   (inputs `(("patch/s_isdir"
-              ,(search-path %load-path "distro/m4-s_isdir.patch"))
+   (inputs `(("patch/s_isdir" ,(search-patch "m4-s_isdir.patch"))
              ("patch/readlink-EINVAL"
-              ,(search-path %load-path "distro/m4-readlink-EINVAL.patch"))))
+              ,(search-patch "m4-readlink-EINVAL.patch"))))
    (description "GNU M4, a macro processor")
    (long-description
     "GNU M4 is an implementation of the traditional Unix macro processor.  It
@@ -280,8 +280,7 @@ (define-public gnu-make
               "0ri98385hsd7li6rh4l5afcq92v8l2lgiaz85wgcfh4w2wzsghg2"))))
    (build-system gnu-build-system)
    (native-inputs
-    `(("patch/impure-dirs"
-       ,(search-path %load-path "distro/make-impure-dirs.patch"))))
+    `(("patch/impure-dirs" ,(search-patch "make-impure-dirs.patch"))))
    (arguments `(#:patches (list (assoc-ref %build-inputs
                                            "patch/impure-dirs"))))
    (description "GNU Make, a program controlling the generation of non-source
@@ -481,8 +480,7 @@ (define-public readline
    (build-system gnu-build-system)
    (propagated-inputs `(("ncurses" ,ncurses)))
    (inputs `(("patch/link-ncurses"
-              ,(search-path %load-path
-                            "distro/readline-link-ncurses.patch"))))
+              ,(search-patch "readline-link-ncurses.patch"))))
    (arguments `(#:patches (list (assoc-ref %build-inputs
                                            "patch/link-ncurses"))
                 #:patch-flags '("-p0")))
@@ -664,8 +662,7 @@ (define-public guile-1.8
                                                    match
                                                    (assoc-ref outputs "out")))))
                            %standard-phases)))
-   (inputs `(("patch/snarf"
-              ,(search-path %load-path "distro/guile-1.8-cpp-4.5.patch"))
+   (inputs `(("patch/snarf" ,(search-patch "guile-1.8-cpp-4.5.patch"))
              ("gawk" ,gawk)
              ("readline" ,readline)))
 
diff --git a/distro/findutils-absolute-paths.patch b/distro/patches/findutils-absolute-paths.patch
similarity index 100%
rename from distro/findutils-absolute-paths.patch
rename to distro/patches/findutils-absolute-paths.patch
diff --git a/distro/guile-1.8-cpp-4.5.patch b/distro/patches/guile-1.8-cpp-4.5.patch
similarity index 100%
rename from distro/guile-1.8-cpp-4.5.patch
rename to distro/patches/guile-1.8-cpp-4.5.patch
diff --git a/distro/m4-readlink-EINVAL.patch b/distro/patches/m4-readlink-EINVAL.patch
similarity index 100%
rename from distro/m4-readlink-EINVAL.patch
rename to distro/patches/m4-readlink-EINVAL.patch
diff --git a/distro/m4-s_isdir.patch b/distro/patches/m4-s_isdir.patch
similarity index 100%
rename from distro/m4-s_isdir.patch
rename to distro/patches/m4-s_isdir.patch
diff --git a/distro/make-impure-dirs.patch b/distro/patches/make-impure-dirs.patch
similarity index 100%
rename from distro/make-impure-dirs.patch
rename to distro/patches/make-impure-dirs.patch
diff --git a/distro/readline-link-ncurses.patch b/distro/patches/readline-link-ncurses.patch
similarity index 100%
rename from distro/readline-link-ncurses.patch
rename to distro/patches/readline-link-ncurses.patch