diff --git a/dist/style_prive.html b/dist/style_prive.html
index e5356a5c98c94432dc3d4f618123ee77900854e0..799cdcc2c372e6bdca0922412d15e6d6b65a4ff9 100644
--- a/dist/style_prive.html
+++ b/dist/style_prive.html
@@ -10,7 +10,7 @@
 	ATTENTION: il faut absolument le charset sinon Firefox croit que
 	c'est du text/html !
 ]
-#CACHE{360*1000}
+#CACHE{3600*100,cache-client}
 #HTTP_HEADER{Content-Type: text/css; charset=iso-8859-15}
 #HTTP_HEADER{Vary: Accept-Encoding}
 body { 
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 54609700fe4a39b9e84c5ab9246b700615d048ad..bed6ee08f532e9fc0621be7d56db2c272e8becbe 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -95,20 +95,21 @@ function assembler_page ($fond) {
 
 	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
 
-	// une perennite valide a meme reponse qu'une requete HEAD
-
-	if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) AND !$var_mode
-	AND $chemin_cache AND !$flag_dynamique
-	// l'admin connecte veut voir ses boutons a jour
-	AND (!$_COOKIE['spip_admin'] OR (_request('var_fragment')!==null))) {
-		if (!strstr('IIS/', $_SERVER['SERVER_SOFTWARE'])) {
-			$since = preg_replace('/;.*/', '',
-				$_SERVER['HTTP_IF_MODIFIED_SINCE']);
-			$since = str_replace('GMT', '', $since);
-			if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) {
-				$page['status'] = 304;
-				$headers_only = true;
-			}
+	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
+	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
+	// pages sont dynamiques)
+	if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
+	AND !$var_mode
+	AND $chemin_cache
+	AND !$flag_dynamique
+	AND !strstr('IIS/', $_SERVER['SERVER_SOFTWARE'])
+	) {
+		$since = preg_replace('/;.*/', '',
+			$_SERVER['HTTP_IF_MODIFIED_SINCE']);
+		$since = str_replace('GMT', '', $since);
+		if (trim($since) == gmdate("D, d M Y H:i:s", $lastmodified)) {
+			$page['status'] = 304;
+			$headers_only = true;
 		}
 	}
 
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index adc4c99866dd12948905e3df34c9ae737d0cb20f..d9119f38011b912051477134ad82901ea1bed7cd 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -1211,6 +1211,8 @@ function balise_HTTP_HEADER_dist($p) {
 // #CACHE
 // definit la duree de vie ($delais) du squelette
 // #CACHE{24*3600}
+// parametre(s) supplementaire(s) :
+// #CACHE{24*3600, cache-client} autorise gestion du IF_MODIFIED_SINCE
 // http://doc.spip.org/@balise_CACHE_dist
 function balise_CACHE_dist($p) {
 	$duree = valeur_numerique($p->param[0][1][0]->texte);
@@ -1220,18 +1222,25 @@ function balise_CACHE_dist($p) {
 		. $duree
 		. '"); ?'.'>\'';
 
-	// remplir le header Cache-Control
-	if ($duree > 0)
-		$p->code .= '.\'<'.'?php header("Cache-Control: max-age='
-			. $duree
-			. '"); ?'.'>\'';
-	else
+	// Remplir le header Cache-Control
+	// cas #CACHE{0}
+	if ($duree == 0)
 		$p->code .= '.\'<'
 		.'?php header("Cache-Control: no-store, no-cache, must-revalidate"); ?'
 		.'><'
 		.'?php header("Pragma: no-cache"); ?'
 		.'>\'';
 
+	// cas #CACHE{360, cache-client}
+	if (isset($p->param[0][2])) {
+		$second = ($p->param[0][2][0]->texte);
+		if ($second == 'cache-client'
+		AND $duree > 0)
+			$p->code .= '.\'<'.'?php header("Cache-Control: max-age='
+				. $duree
+				. '"); ?'.'>\'';
+	}
+
 	$p->interdire_scripts = false;
 	return $p;
 }
diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php
index 9c959d95393533a6a661ac03fa9129ce5f41eaf7..71ca9512a39a3d9e66e27070df40082c1f229bf3 100644
--- a/ecrire/public/cacher.php
+++ b/ecrire/public/cacher.php
@@ -231,7 +231,8 @@ function restaurer_meta_donnees ($contenu) {
 			}
 		}
 		$page['texte'] = substr($contenu, strlen($match[0]));
-	} else	$page['texte'] = $contenu;
+	} else
+		$page['texte'] = $contenu;
 
 	return $page;
 }
@@ -254,12 +255,12 @@ function nettoyer_petit_cache($prefix, $duree = 300) {
 
 // Interface du gestionnaire de cache
 // Si son 3e argument est non vide, elle passe la main a creer_cache
-// Sinon, elle recoit un contexte (ou le construit a partir de REQUEST_URI) 
+// Sinon, elle recoit un contexte (ou le construit a partir de REQUEST_URI)
 // et affecte les 4 autres parametres recus par reference:
 // - use_cache qui est
-//	< 0 s'il faut calculer la page sans la mettre en cache
-// 	= 0 si on peut utiliser un cache existant
-//	> 0 s'il faut calculer la page et la mette en cache use_cache secondes
+//     < 0 s'il faut calculer la page sans la mettre en cache
+//     = 0 si on peut utiliser un cache existant
+//     > 0 s'il faut calculer la page et la mette en cache use_cache secondes
 // - chemin_cache qui est le chemin d'acces au fichier ou vide si pas cachable
 // - page qui est le tableau decrivant la page, si le cache la contenait
 // - lastmodified qui vaut la date de derniere modif du fichier.
@@ -304,9 +305,9 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 
 	// cas sans jamais de cache pour raison interne
 	if (isset($GLOBALS['var_mode']) &&
-	    (isset($_COOKIE['spip_session'])
-	    || isset($_COOKIE['spip_admin'])
-		 || @file_exists(_ACCESS_FILE_NAME))) {
+		(isset($_COOKIE['spip_session'])
+		|| isset($_COOKIE['spip_admin'])
+		|| @file_exists(_ACCESS_FILE_NAME))) {
 			supprimer_fichier(_DIR_CACHE . $chemin_cache);
 	}