diff --git a/ecrire/inc_config.php3 b/ecrire/inc_config.php3
index 0c80ed58c7db3ec80cf3b3022c912832c5ffe53a..74f40e4bbc3d577981286bde32329f6173831eb8 100644
--- a/ecrire/inc_config.php3
+++ b/ecrire/inc_config.php3
@@ -170,7 +170,7 @@ function appliquer_modifs_config() {
 	}
 
 	// Activer le moteur : dresser la liste des choses a indexer
-	if ($activer_moteur == 'oui') {
+	if ($activer_moteur == 'oui' AND ($activer_moteur != lire_meta("activer_moteur"))) {
 		include_ecrire('inc_index.php3');
 		creer_liste_indexation();
 	}
@@ -203,7 +203,7 @@ function appliquer_modifs_config() {
 		'creer_preview',
 		'taille_preview',
 		'articles_modif',
-		
+
 		'activer_sites',
 		'proposer_sites',
 		'activer_syndic',
@@ -270,7 +270,6 @@ function appliquer_modifs_config() {
 		fin_admin($admin);
 	}
 
-
 	if ($purger_skel) {
 		$hash = calculer_action_auteur("purger_squelettes");
 		@header ("Location:../spip_cache.php3?purger_squelettes=oui&id_auteur=$connect_id_auteur&hash=$hash&redirect=".urlencode($clean_link->getUrl()));
diff --git a/ecrire/inc_index.php3 b/ecrire/inc_index.php3
index 8fe7cda0076b2a9e0e2fc506289d96c6eec20255..ff97c09565d6b995d14f23d75aceeadf78ebe728 100644
--- a/ecrire/inc_index.php3
+++ b/ecrire/inc_index.php3
@@ -71,8 +71,8 @@ function indexer_chaine($texte, $val = 1, $min_long = 3) {
 function deja_indexe($type, $id_objet) {
 	$table_index = 'spip_index_'.$type.'s';
 	$col_id = 'id_'.$type;
-	$query = "SELECT COUNT(*) FROM $table_index WHERE $col_id=$id_objet";
-	list($n) = @spip_fetch_array(@spip_query($query));
+	$query = "SELECT $col_id FROM $table_index WHERE $col_id=$id_objet LIMIT 0,1";
+	$n = @spip_num_rows(@spip_query($query));
 	return ($n > 0);
 }
 
diff --git a/ecrire/inc_sites.php3 b/ecrire/inc_sites.php3
index 25a5f37d63b444fafdd66162e63bbee4e68b2f82..8620230ea126924c98efa292e67e5cb55bed5576 100644
--- a/ecrire/inc_sites.php3
+++ b/ecrire/inc_sites.php3
@@ -154,7 +154,7 @@ function syndic_a_jour($now_id_syndic, $statut = 'off') {
 		$moderation = 'publie';	// en ligne sans validation
 
 	// Section critique : n'autoriser qu'une seule syndication simultanee pour un site donne
-	if (!timeout("syndication $url_syndic")) return;
+	if (!spip_get_lock("syndication $url_syndic")) return;
 
 	include_ecrire("inc_filtres.php3");
 	spip_query("UPDATE spip_syndic SET syndication='$statut', date_syndic=NOW() WHERE id_syndic='$now_id_syndic'");
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index 7c23903220dfffa58f5e62b590b9e44a7125756a..a89b8cedd85d0fad7a66d0dfca76c0a800fc1426 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -809,7 +809,7 @@ function spip_log($message) {
 // Savoir si on peut lancer de gros calculs, et eventuellement poser un lock
 // Resultat : true=vas-y ; false=stop
 //
-function timeout ($lock=false, $action=true, $connect_mysql=true) {
+function timeout($lock=false, $action=true, $connect_mysql=true) {
 	static $ok = true;
 	global $db_ok, $dir_ecrire;
 
@@ -822,30 +822,28 @@ function timeout ($lock=false, $action=true, $connect_mysql=true) {
 	}
 
 	// Ne rien faire ?
-	if (!$action)
+	if (!$action || !$ok)
 		return $ok;
 
+	$ok = false;
+
 	// Base connectee ?
 	if ($connect_mysql) {
 		include_ecrire('inc_connect.php3');
 		if (!$db_ok)
-			return $ok = false;
+			return false;
 
-		// Lock SQL ?
+		// Verrou demande ?
 		if ($lock) {
-			if (spip_get_lock($lock)) {
-				// C'est bon
-				$ok = false;
-				return true;
-			} else {
+			spip_debug("test lock mysql $lock");
+			if (!spip_get_lock($lock)) {
 				spip_debug ("lock mysql $lock");
-				return $ok = false;
+				return false;
 			}
 		}
 	}
 
 	// C'est bon
-	$ok = false;
 	return true;
 }
 
diff --git a/ecrire/index.php3 b/ecrire/index.php3
index 4fb62f4ae4a048a689d6ea38abdfebe64b10502d..e059d4c1ae448732714abe758476b872bfa8c9e3 100644
--- a/ecrire/index.php3
+++ b/ecrire/index.php3
@@ -455,11 +455,13 @@ if (abs($t_jour - date('d')) > 2) {
 //
 // Optimisation periodique de la base de donnees
 //
-if (!$bonjour AND timeout('optimisation')) {
+if (!$bonjour) {
 	if ($optimiser == 'oui' || (time() - lire_meta('date_optimisation')) > 24 * 3600) {
-		ecrire_meta("date_optimisation", time());
-		ecrire_metas();
-		include ("optimiser.php3");
+		if (timeout('optimisation')) {
+			ecrire_meta("date_optimisation", time());
+			ecrire_metas();
+			include ("optimiser.php3");
+		}
 	}
 }
 
diff --git a/ecrire/spip_style.php3 b/ecrire/spip_style.php3
index 76df4787e1d592862c12eb8c43f3a737de612267..4a3d5021821263a243829e4b632df07fcbf5a52a 100644
--- a/ecrire/spip_style.php3
+++ b/ecrire/spip_style.php3
@@ -1,7 +1,8 @@
 <?php
-	@header ("Content-Type: text/css");
-	@Header ("Expires: ".gmdate("D, d M Y H:i:s", time() + 3600)." GMT");
 	include ("inc_version.php3");	// pour le register_globals
+	@Header ("Content-Type: text/css");
+	@Header ("Expires: ".gmdate("D, d M Y H:i:s", time() + 7 * 24 * 3600)." GMT");
+	@Header ("Last-Modified: ".gmdate("D, d M Y H:i:s", @filemtime("spip_style.php3"))." GMT");
 	if (!isset($couleur_claire))
 		$couleur_claire = "#EDF3FE";
 	if (!isset($couleur_foncee))
diff --git a/inc-cache.php3 b/inc-cache.php3
index 573346953ed26af2f04185a9dbbecf3eafa5d77c..decea6e3cffd417af41d9ec6e4dc0767eae6a24a 100644
--- a/inc-cache.php3
+++ b/inc-cache.php3
@@ -52,13 +52,10 @@ function utiliser_cache($chemin_cache, $delais) {
 		if (file_exists($chemin_cache.'.NEW')) {
 			// Deuxieme acces : le fichier est marque comme utilise
 			@rename($chemin_cache.'.NEW', $chemin_cache);
-			clearstatcache();
-		}
-		else {
-			// Double verification (cas renommage entre les deux file_exists)
-			clearstatcache();
-			$use_cache = file_exists($chemin_cache);
 		}
+		// Double verification (cas renommage/suppression entre les deux file_exists)
+		clearstatcache();
+		$use_cache = file_exists($chemin_cache);
 	}
 
 	// Date de creation du fichier
@@ -67,7 +64,7 @@ function utiliser_cache($chemin_cache, $delais) {
 		$age = time() - $t;
 		$age_ok = (($age < $delais) AND ($age >= 0));
 		if (!$age_ok) {		// fichier cache trop vieux
-			if (timeout())	// sauf lock hebergeur ou probleme base
+			if (timeout(false, false))	// sauf lock hebergeur ou probleme base
 				$use_cache = false;
 		}
 		// Inclusions multiples : derniere modification
diff --git a/inc-public-global.php3 b/inc-public-global.php3
index 476682edb09a6ab2f3a65c5d7929006fdbe6d0b6..3c95f672903efa9eebb7e084e3b44a6be28da22c 100644
--- a/inc-public-global.php3
+++ b/inc-public-global.php3
@@ -372,22 +372,21 @@ if (lire_meta('activer_moteur') == 'oui') {
 			}
 		}
 	}
-	if ($use_cache AND file_exists($fichier_index) AND filesize($fichier_index)) {
-		if (timeout()) {
-			include_ecrire("inc_texte.php3");
-			include_ecrire("inc_filtres.php3");
-			include_ecrire("inc_index.php3");
-			if ($s = sizeof($suite = file($fichier_index)))
-				$s = $suite[rand(0,$s)];
-			$pid = @getmypid();
-			$f = fopen($fichier_index.".tmp-$pid", 'w');
-			while (list(,$ligne) = each($suite))
-				if ($ligne <> $s)
-					fwrite($f, $ligne);
-			fclose($f);
-			@rename($fichier_index.".tmp-$pid",$fichier_index);
-			$s = explode(' ', trim($s));
-			indexer_objet($s[0], $s[1], $s[2]);
+	if ($use_cache AND file_exists($fichier_index)) {
+		if (timeout('indexation')) {
+			if ($s = sizeof($suite = file($fichier_index))) {
+				include_ecrire("inc_texte.php3");
+				include_ecrire("inc_filtres.php3");
+				include_ecrire("inc_index.php3");
+				$s = $suite[$n = rand(0, $s)];
+				unset($suite[$n]);
+				$f = fopen($fichier_index, 'wb');
+				fwrite($f, join("", $suite));
+				fclose($f);
+				$s = explode(' ', trim($s));
+				indexer_objet($s[0], $s[1], $s[2]);
+			}
+			else @unlink($fichier_index);
 		}
 	}
 }
@@ -398,14 +397,16 @@ if (lire_meta('activer_moteur') == 'oui') {
 //
 
 if ($db_ok AND lire_meta("activer_syndic") != "non") {
-	include_ecrire("inc_texte.php3");
-	include_ecrire("inc_filtres.php3");
-	include_ecrire("inc_sites.php3");
-	include_ecrire("inc_index.php3");
-
-	executer_une_syndication();
-	if (lire_meta('activer_moteur') == 'oui' AND timeout())
-		executer_une_indexation_syndic();
+	if (timeout()) {
+		include_ecrire("inc_texte.php3");
+		include_ecrire("inc_filtres.php3");
+		include_ecrire("inc_sites.php3");
+		include_ecrire("inc_index.php3");
+
+		executer_une_syndication();
+		if (lire_meta('activer_moteur') == 'oui' AND timeout())
+			executer_une_indexation_syndic();
+	}
 }