diff --git a/ecrire/action/purger.php b/ecrire/action/purger.php
index 1dd09d2762f654b10972f582e02aa816052f8aa2..6ff2b95ff17c333d997193eaaa00ccb255488a29 100644
--- a/ecrire/action/purger.php
+++ b/ecrire/action/purger.php
@@ -31,6 +31,7 @@ function action_purger_dist()
 		@spip_unlink(_CACHE_PLUGINS_OPT);
 		@spip_unlink(_CACHE_PLUGINS_FCT);
 		@spip_unlink(_CACHE_PLUGINS_VERIF);
+		@spip_unlink(_CACHE_CHEMIN);
 		purger_repertoire(_DIR_CACHE);
 		purger_repertoire(_DIR_AIDE);
 		purger_repertoire(_DIR_VAR.'cache-css');
diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php
index 8618126c68a4670f2ef6a55016cbed1e9cae4328..e262dbb5cf2daef233ef3ba9c0e59c7fb7337a5a 100644
--- a/ecrire/inc/plugin.php
+++ b/ecrire/inc/plugin.php
@@ -449,6 +449,7 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') {
 	}
 	ecrire_fichier(_CACHE_PLUGINS_VERIF,
 		serialize($liste_fichier_verif));
+	@spip_unlink(_CACHE_CHEMIN);
 }
 
 // precompilation des pipelines
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 15f9bbfb3d33e2416c0e442137c2014266f99a93..7a7d7f2ce3f4c0aac76fef25018214f2dcc10fc2 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -695,17 +695,20 @@ function chemin_image($icone){
 // si on donne un sous-repertoire en 2e arg optionnel, il FAUT le / final
 // si 3e arg vrai, on inclut si ce n'est fait.
 define('_ROOT_CWD', getcwd().'/');
+$GLOBALS['path_files'] = null;
 
 // http://doc.spip.org/@find_in_path
 function find_in_path ($file, $dirname='', $include=false) {
-	static $files=array(), $dirs=array();
+	static $dirs=array();
 	static $inc = array(); # cf http://trac.rezo.net/trac/spip/changeset/14743
-	if (isset($files[$dirname][$file])) {
+	if (isset($GLOBALS['path_files'][$dirname][$file])) {
+		if (!$GLOBALS['path_files'][$dirname][$file])
+			return false;
 		if ($include AND !isset($inc[$dirname][$file])) {
-			include_once _ROOT_CWD . $files[$dirname][$file];
+			include_once _ROOT_CWD . $GLOBALS['path_files'][$dirname][$file];
 			$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
 		}
-		return  $files[$dirname][$file];
+		return $GLOBALS['path_files'][$dirname][$file];
 	}
 
 	$a = strrpos($file,'/');
@@ -723,7 +726,9 @@ function find_in_path ($file, $dirname='', $include=false) {
 					include_once _ROOT_CWD . $a;
 					$inc[$dirname][$file] = $inc[''][$dirname . $file] = true;
 				}
-				return $files[$dirname][$file] = $files[''][$dirname . $file] = $a;
+				if (!defined('_SAUVER_CHEMIN'))
+					define('_SAUVER_CHEMIN',true);
+				return $GLOBALS['path_files'][$dirname][$file] = $GLOBALS['path_files'][''][$dirname . $file] = $a;
 			}
 		}
 	}
@@ -739,8 +744,35 @@ function find_in_path ($file, $dirname='', $include=false) {
 			die("Erreur interne: ne peut inclure $dirname$file");
 		}
 	}
+
+	if (!defined('_SAUVER_CHEMIN'))
+		define('_SAUVER_CHEMIN',true);
+	return $GLOBALS['path_files'][$dirname][$file] = $GLOBALS['path_files'][''][$dirname . $file] = false;
+}
+
+function load_path_cache(){
+	$GLOBALS['path_files'] = array();
+	// si le visiteur est admin,
+	// on ne recharge pas le cache pour forcer sa mise a jour
+	// le cache de chemin n'est utilise que dans le public
+	if (_DIR_RESTREINT
+		AND (!isset($GLOBALS['visiteur_statut']) OR $GLOBALS['visiteur_statut']!='0minirezo')){
+		lire_fichier(_CACHE_CHEMIN,$contenu);
+		if (!$GLOBALS['path_files']=unserialize($contenu))
+			$GLOBALS['path_files'] = array();
+	}
+	// pas de sauvegarde du chemin si on est pas dans le public
+	if (!_DIR_RESTREINT)
+		define('_SAUVER_CHEMIN',false);
+}
+
+function save_path_cache(){
+	if (defined('_SAUVER_CHEMIN')
+		AND _SAUVER_CHEMIN)
+		ecrire_fichier(_CACHE_CHEMIN,serialize($GLOBALS['path_files']));
 }
 
+
 /**
  * Trouve tous les fichiers du path correspondants a un pattern
  * pour un nom de fichier donne, ne retourne que le premier qui sera trouve
@@ -1135,6 +1167,7 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
 	define('_CACHE_PLUGINS_FCT', _DIR_CACHE . "charger_plugins_fonctions.php");
 	define('_CACHE_PLUGINS_VERIF', _DIR_CACHE . "verifier_plugins.txt");
 	define('_CACHE_PIPELINES',  _DIR_CACHE."charger_pipelines.php");
+	define('_CACHE_CHEMIN',  _DIR_CACHE."chemin.txt");
 
 	# attention .php obligatoire pour ecrire_fichier_securise
 	define('_FILE_META', $ti . 'meta_cache.php');
@@ -1197,6 +1230,9 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
 	// systematique du noyau ou une baisse de perfs => a etudier)
 	include_once _DIR_RESTREINT . 'inc/flock.php';
 
+	// charger tout de suite le cache path
+	load_path_cache();
+
 	// *********** traiter les variables ************
 
 	//
diff --git a/ecrire/public.php b/ecrire/public.php
index b569afcbcd7be7b244e0db25c2782ea6c5f0cbac..5f4fd50ba699bcf45e03cc7bb1011a8edf44bd1d 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -225,17 +225,20 @@ if (isset($GLOBALS['_INC_PUBLIC'])) {
 			calculer_prochain_postdate(true);
 		}
 
-	// Effectuer une tache de fond ?
-	// si #SPIP_CRON est present, on ne le tente que pour les navigateurs
-	// en mode texte (par exemple), et seulement sur les pages web
-	if (defined('_DIRECT_CRON_FORCE')
-		OR (
-	  !defined('_DIRECT_CRON_INHIBE')
-	  AND $html
-	  AND !strstr($page['texte'], '<!-- SPIP-CRON -->')
-	  AND !preg_match(',msie|mozilla|opera|konqueror,i', $_SERVER['HTTP_USER_AGENT']))
-	  )
-		cron();
+		// Effectuer une tache de fond ?
+		// si #SPIP_CRON est present, on ne le tente que pour les navigateurs
+		// en mode texte (par exemple), et seulement sur les pages web
+		if (defined('_DIRECT_CRON_FORCE')
+			OR (
+			!defined('_DIRECT_CRON_INHIBE')
+			AND $html
+			AND !strstr($page['texte'], '<!-- SPIP-CRON -->')
+			AND !preg_match(',msie|mozilla|opera|konqueror,i', $_SERVER['HTTP_USER_AGENT']))
+			)
+			cron();
+
+		// sauver le cache chemin si necessaire
+		save_path_cache();
 	}
 
 }