diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php
index 3990a825e88ecaf624afef0e7feb158d2aa0be2d..4bc74a8197811b5918233b366f31948728c9971f 100644
--- a/ecrire/public/cacher.php
+++ b/ecrire/public/cacher.php
@@ -132,6 +132,14 @@ function cache_valide(&$page, $date) {
 		return 0;
 }
 
+function cache_sessionne($chemin_cache, $creer=false) {
+	$fs = substr(md5($chemin_cache),0,8);
+	$a = substr($fs,0,1);
+	$b = sous_repertoire(_DIR_CACHE, $a);
+	if ($creer)
+		sous_repertoire($b, $fs);
+	return $a.'/'.$fs.'/_';
+}
 
 // Creer le fichier cache
 # Passage par reference de $page par souci d'economie
@@ -139,13 +147,14 @@ function cache_valide(&$page, $date) {
 function creer_cache(&$page, &$chemin_cache) {
 
 	// Si la page c1234 a un invalideur de session 'zz', sauver dans
-	// 'tmp/cache/a/c1234-zz.gz'
+	// 'tmp/cache/MD5(chemin_cache)/_zz'
 	// en prenant soin de supprimer un eventuel cache non-sessionne
 	// si l'ajout de #SESSION dans le squelette est recent
 	if (isset($page['invalideurs'])
 	AND isset($page['invalideurs']['session'])) {
 		supprimer_fichier(_DIR_CACHE . $chemin_cache);
-		$chemin_cache .= '-'.$page['invalideurs']['session'];
+		$chemin_cache = cache_sessionne($chemin_cache, true).$page['invalideurs']['session'];
+		
 	}
 
 	// l'enregistrer, compresse ou non...
@@ -215,11 +224,10 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 	}
 
 	// Controler l'existence d'un cache nous correspondant, dans les
-	// quatre versions possibles : gzip ou non, session ou non
+	// deux versions possibles : session ou non
 	$chemin_cache = generer_nom_fichier_cache($contexte, $page);
-
-	if (@file_exists(_DIR_CACHE . ($f = $g = $chemin_cache))
-	OR (@file_exists(_DIR_CACHE . ($f = $chemin_cache.'-'.spip_session())))
+	if (@file_exists(_DIR_CACHE . ($f = $chemin_cache))
+	OR $fs = @file_exists(_DIR_CACHE . ($f = cache_sessionne($f).spip_session()))
 	) {
 		$lastmodified = @filemtime(_DIR_CACHE . $f);
 	} else
@@ -249,8 +257,11 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la
 		|| @file_exists(_ACCESS_FILE_NAME))
 	) {
 		supprimer_fichier(_DIR_CACHE . $f);
-		if (in_array($GLOBALS['var_mode'], array('calcul', 'recalcul')))
-			array_map('supprimer_fichier', preg_files(_DIR_CACHE . $g));
+		if (in_array($GLOBALS['var_mode'], array('calcul', 'recalcul'))
+		AND $fs) {
+			include_spip('inc/invalideur');
+			purger_repertoire(dirname(_DIR_CACHE.$f));
+		}
 	}
 
 	// $delais par defaut (pour toutes les pages sans #CACHE{})