diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 8fbdf9ed0bb4b1eff7660492a9e6f89e947fd9ec..553aa69e3e891f9bb5c97f27f1479ec5ad59ac93 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -126,13 +126,9 @@ function assembler($fond, $connect='') {
 			if (!strlen($fond))
 				$fond = 'sommaire';
 
-			// preparer le contexte
-			$parametrer = charger_fonction('parametrer', 'public');
-			$page = $parametrer($fond, $GLOBALS['contexte'], $chemin_cache, $connect);
-
-			// Stocker le cache sur le disque
-			if ($page AND $chemin_cache)
-				$cacher(NULL, $use_cache, $chemin_cache, $page, $lastmodified);
+			// produire la page : peut mettre a jour $lastmodified
+			$produire_page = charger_fonction('produire_page','public');
+			$page = $produire_page($fond, $GLOBALS['contexte'], $use_cache, $chemin_cache, NULL, $page, $lastmodified, $connect);
 		}
 
 		if ($page AND $chemin_cache) $page['cache'] = $chemin_cache;
@@ -226,23 +222,46 @@ function inclure_page($fond, $contexte, $connect='') {
 	$res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude);
 	if ($res) {return array('texte' => $res);}
 
-	// Si use_cache vaut 0, la page a ete tiree du cache et se trouve dans $page
-	if (!$use_cache) {
-		$lastmodified = max($lastmodified, $lastinclude);
-	} else {
-		$parametrer = charger_fonction('parametrer', 'public');
-		$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
-		$lastmodified = time();
-		// et on l'enregistre sur le disque
-		if ($page AND $chemin_cache
-		AND $page['entetes']['X-Spip-Cache'] > 0)
-			$cacher($contexte, $use_cache, $chemin_cache, $page,
-				$lastmodified);
+	// Si use_cache ne vaut pas 0, la page doit etre calculee
+	// produire la page : peut mettre a jour $lastinclude
+	if ($use_cache) {
+		$produire_page = charger_fonction('produire_page','public');
+		$page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect);
 	}
+	// dans tous les cas, mettre a jour $lastmodified
+	$lastmodified = max($lastmodified, $lastinclude);
 
 	return $page;
 }
 
+/**
+ * Produire la page et la mettre en cache
+ * lorsque c'est necessaire
+ *
+ * @param string $fond
+ * @param array $contexte
+ * @param int $use_cache
+ * @param string $chemin_cache
+ * @param array $contexte_cache
+ * @param array $page
+ * @param int $lastinclude
+ * @param string $connect
+ * @return array
+ */
+function public_produire_page_dist($fond, $contexte, $use_cache, $chemin_cache, $contexte_cache, &$page, &$lastinclude, $connect=''){
+	$parametrer = charger_fonction('parametrer', 'public');
+	$page = $parametrer($fond, $contexte, $chemin_cache, $connect);
+	// et on l'enregistre sur le disque
+	if ($chemin_cache
+	AND $page['entetes']['X-Spip-Cache'] > 0){
+		$cacher = charger_fonction('cacher', 'public');
+		$lastinclude = time();
+		$cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude);
+	}
+	return $page;
+}
+
+
 // Fonction inseree par le compilateur dans le code compile.
 // Elle recoit un contexte pour inclure un squelette, 
 // et les valeurs du contexte de compil prepare par memoriser_contexte_compil
diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php
index 1ec447585511a56f58f7406967b81a8b368ce275..ccf67bddcd8b4f42613f83d607168c42d5095fe4 100644
--- a/ecrire/public/cacher.php
+++ b/ecrire/public/cacher.php
@@ -76,8 +76,10 @@ function gzip_page($page) {
 // (passage par reference pour alleger)
 // http://doc.spip.org/@gunzip_page
 function gunzip_page(&$page) {
-	if ($page['gz'])
+	if ($page['gz']) {
 		$page['texte'] = gzuncompress($page['texte']);
+		$page['gz'] = false; // ne pas gzuncompress deux fois une meme page
+	}
 }
 
 /**