diff --git a/software/kvm/buildout.hash.cfg b/software/kvm/buildout.hash.cfg
new file mode 100644
index 0000000000000000000000000000000000000000..a568ebf7e0ce344dcf23af016bb6ef0cb616fb06
--- /dev/null
+++ b/software/kvm/buildout.hash.cfg
@@ -0,0 +1,86 @@
+# THIS IS NOT A BUILDOUT FILE, despite purposedly using a compatible syntax.
+# The only allowed lines here are (regexes):
+# - "^#" comments, copied verbatim
+# - "^[" section beginings, copied verbatim
+# - lines containing an "=" sign which must fit in the following categorie.
+#   - "^\s*filename\s*=\s*path\s*$" where "path" is relative to this file
+#     Copied verbatim.
+#   - "^\s*hashtype\s*=.*" where "hashtype" is one of the values supported
+#     by the re-generation script.
+#     Re-generated.
+# - other lines are copied verbatim
+# Substitution (${...:...}), extension ([buildout] extends = ...) and
+# section inheritance (< = ...) are NOT supported (but you should really
+# not need these here).
+
+[template]
+filename = instance.cfg.in
+md5sum = 028b6a6456d744c11b1bb2c51ecd51b2
+
+[template-kvm]
+filename = instance-kvm.cfg.jinja2
+md5sum = e30912b1256bb093329ee3c108666f05
+
+[template-kvm-cluster]
+filename = instance-kvm-cluster.cfg.jinja2.in
+md5sum = 63fa784d8946d0b6e3fbd6381e1ea9f4
+
+[template-kvm-resilient]
+filename = instance-kvm-resilient.cfg.jinja2
+md5sum = c189bce8b196a3b5bcb01526a3f9b2aa
+
+[template-kvm-import]
+filename = instance-kvm-import.cfg.jinja2.in
+md5sum = dc3f3ad9ebd8b3b5c3ded57b91cee9c7
+
+[template-kvm-import-script]
+filename = template/kvm-import.sh.jinja2
+md5sum = cd0008f1689dfca9b77370bc4d275b70
+
+[template-kvm-export]
+filename = instance-kvm-export.cfg.jinja2
+md5sum = 00ce5e6da3c833d9d9d1825311f11a81
+
+[template-kvm-export-script]
+filename = template/kvm-export.sh.jinja2
+md5sum = b617d64de73de1eed518185f310bbc82
+
+[template-nbd]
+filename = instance-nbd.cfg.in
+md5sum = f634a5249b773658b7a7bc9fa9bb0368
+
+[template-frontend]
+filename = instance-frontend.cfg.in
+md5sum = cdb690495e9eb007d2b7d2f8e12f5c59
+
+[template-ansible-promise]
+filename = template/ansible-promise.in
+md5sum = 2036bf145f472f62ef8dee5e729328fd
+
+[template-kvm-run]
+filename = template/template-kvm-run.in
+md5sum = 9e40246b4bc4f968f0631016c939b014
+
+[template-kvm-controller]
+filename = template/kvm-controller-run.in
+md5sum = b96cba47c97f277c857176d69e086a12
+
+[template-apache-conf]
+filename = template/apache.conf.in
+md5sum = ac97f6a52e1c5a19a646242ef85abb8a
+
+[template-content]
+filename = template/template-content.in
+md5sum = 822737e483864bf255ad1259237bef2a
+
+[template-qemu-ready]
+filename = template/qemu-is-ready.in
+md5sum = b304eec8e2cb71f10ea83cac22f6db12
+
+[file-download-script]
+filename = template/download_file.in
+md5sum = 599dbbbd438fe7801e3f8642ae9e9a78
+
+[template-httpd]
+filename = instance-kvm-http.cfg.in
+md5sum = 26a181a48046ce88570adb32334747ef
diff --git a/software/kvm/software.cfg b/software/kvm/software.cfg
index 77305e7e8b99059efac3329f35efae7f480c93f3..460f5292cd1127853e8089123e350831ff42a4a2 100644
--- a/software/kvm/software.cfg
+++ b/software/kvm/software.cfg
@@ -12,6 +12,7 @@ extends =
   ../../stack/slapos.cfg
   ../../component/nodejs/buildout.cfg
   ../../stack/resilient/buildout.cfg
+  buildout.hash.cfg
 
 # stacks are listed from most generic to most specific,
 # to avoid versioning issues
@@ -86,158 +87,101 @@ command =
 
 
 # Create all templates that will be used to deploy instances
+[download-base]
+recipe = hexagonit.recipe.download
+url = ${:_profile_base_location_}/${:filename}
+mode = 0644
 
-[template]
+[download-file-base]
+<= download-base
+ignore-existing = true
+download-only = true
+
+[download-template-base]
+<= download-file-base
+url = ${:_profile_base_location_}/template/${:path}
+path = ${:filename}
+
+[template-file-base]
 recipe = slapos.recipe.template
-url = ${:_profile_base_location_}/instance.cfg.in
-md5sum = 028b6a6456d744c11b1bb2c51ecd51b2
-output = ${buildout:directory}/template.cfg
+url = ${:_profile_base_location_}/${:filename}
 mode = 0644
 
+[template]
+<= template-file-base
+output = ${buildout:directory}/template.cfg
+
 [template-kvm]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/instance-kvm.cfg.jinja2
-mode = 644
-md5sum = e30912b1256bb093329ee3c108666f05
-download-only = true
+<= download-file-base
 on-update = true
 
 [template-kvm-cluster]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/instance-kvm-cluster.cfg.jinja2.in
-mode = 644
-md5sum = 63fa784d8946d0b6e3fbd6381e1ea9f4
-download-only = true
+<= download-file-base
 on-update = true
 
 [template-kvm-resilient]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/instance-kvm-resilient.cfg.jinja2
-mode = 644
-md5sum = c189bce8b196a3b5bcb01526a3f9b2aa
-download-only = true
+<= download-file-base
 on-update = true
 
 [template-kvm-import]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/instance-kvm-import.cfg.jinja2.in
-md5sum = dc3f3ad9ebd8b3b5c3ded57b91cee9c7
-mode = 0644
-download-only = true
+<= download-file-base
 on-update = true
 
 [template-kvm-import-script]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/kvm-import.sh.jinja2
+<= download-template-base
 filename = kvm-import.sh.jinja2
-md5sum = cd0008f1689dfca9b77370bc4d275b70
-download-only = true
 mode = 0755
 
 [template-kvm-export]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/instance-kvm-export.cfg.jinja2
-mode = 644
-md5sum = 00ce5e6da3c833d9d9d1825311f11a81
-download-only = true
+<= download-file-base
 on-update = true
 
 [template-kvm-export-script]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/kvm-export.sh.jinja2
+<= download-template-base
 filename = kvm-export.sh.jinja2
-md5sum = b617d64de73de1eed518185f310bbc82
-download-only = true
 mode = 0755
 
 [template-nbd]
-recipe = slapos.recipe.template
-url = ${:_profile_base_location_}/instance-nbd.cfg.in
-md5sum = f634a5249b773658b7a7bc9fa9bb0368
+<= template-file-base
 output = ${buildout:directory}/template-nbd.cfg
-mode = 0644
 
 [template-frontend]
-recipe = slapos.recipe.template
-url = ${:_profile_base_location_}/instance-frontend.cfg.in
-md5sum = cdb690495e9eb007d2b7d2f8e12f5c59
+<= template-file-base
 output = ${buildout:directory}/template-frontend.cfg
-mode = 0644
 
 [template-ansible-promise]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/ansible-promise.in
-md5sum = 2036bf145f472f62ef8dee5e729328fd
-mode = 0644
-download-only = true
+<= download-template-base
 filename = ansible-promise.in
 
 [template-kvm-run]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/template-kvm-run.in
-mode = 644
+<= download-template-base
 filename = template-kvm-run.in
-md5sum = 9e40246b4bc4f968f0631016c939b014
-download-only = true
 on-update = true
 
 [template-kvm-controller]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/kvm-controller-run.in
-mode = 644
+<= download-template-base
 filename = kvm-controller-run.in
-md5sum = b96cba47c97f277c857176d69e086a12
-download-only = true
 on-update = true
 
 [template-apache-conf]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/apache.conf.in
-mode = 644
+<= download-template-base
 filename = apache.conf.in
-md5sum = ac97f6a52e1c5a19a646242ef85abb8a
-download-only = true
 on-update = true
 
 [template-content]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/template-content.in
-mode = 644
+<= download-template-base
 filename = template-content.in
-md5sum = 822737e483864bf255ad1259237bef2a
-download-only = true
 on-update = true
 
 [template-qemu-ready]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/qemu-is-ready.in
-mode = 644
+<= download-template-base
 filename = qemu-is-ready.in
-md5sum = b304eec8e2cb71f10ea83cac22f6db12
-download-only = true
 on-update = true
 
 [file-download-script]
-recipe = hexagonit.recipe.download
-ignore-existing = true
-url = ${:_profile_base_location_}/template/download_file.in
-mode = 644
+<= download-template-base
+path = download_file.in
 filename = download_file
-md5sum = 599dbbbd438fe7801e3f8642ae9e9a78
-download-only = true
 on-update = true
 
 [template-httpd]