diff --git a/ecrire/base/convert_sql_utf8.php b/ecrire/base/convert_sql_utf8.php
index 86813cc728c87165f3145bd444c188e1a8da1929..af8baae0d543d150bed7120802bf1aa9cfec1ce1 100644
--- a/ecrire/base/convert_sql_utf8.php
+++ b/ecrire/base/convert_sql_utf8.php
@@ -16,12 +16,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@base_convert_sql_utf8_dist
 function base_convert_sql_utf8_dist($titre, $reprise=false)
 {
-	// poser un verrou (et abandonner si l'action est en cours)
-
-	if (!spip_get_lock('conversion_charset_sql')) {
-		echo minipres(_T('utf8_convert_attendez'));
-		exit;
-	}
 
 	include_spip('inc/meta');
 	ecrire_meta('convert_sql_utf8','oui','non');
@@ -135,6 +129,5 @@ function convert_sql_utf8(){
 	ecrire_meta('charset_sql_base',$sql_charset,'non');
 	ecrire_meta('charset_sql_connexion',$sql_charset,'non');
 	ecrire_metas();
-	spip_release_lock('conversion_charset_sql');
 }
 ?>
diff --git a/ecrire/base/convert_utf8.php b/ecrire/base/convert_utf8.php
index 3190e01390d5a28e9e7a86fccfe4972c22fe1b21..141d3ac26de7f8b270d2d9818b6302a572fdc930 100644
--- a/ecrire/base/convert_utf8.php
+++ b/ecrire/base/convert_utf8.php
@@ -38,12 +38,6 @@ function convert_utf8_init($tables_a_convertir)
 // http://doc.spip.org/@base_convert_utf8_dist
 function base_convert_utf8_dist($titre, $reprise=false)
 {
-	// poser un verrou (et abandonner si l'action est en cours)
-
-	if (!spip_get_lock('conversion_charset')) {
-		echo minipres(_T('utf8_convert_attendez'));
-		exit;
-	}
 	// une liste des tables a convertir, avec le champ dans lequel on
 	// indique '<CONVERT charset>' ; on commence par les rubriques sinon
 	// ca fait desordre dans l'interface privee
diff --git a/ecrire/base/import_all.php b/ecrire/base/import_all.php
index 397fa538bc94d766495ee4632541935dcafe9ff9..a2e7defce799ac451ed9258bdd3b46075ced24dd 100644
--- a/ecrire/base/import_all.php
+++ b/ecrire/base/import_all.php
@@ -115,7 +115,6 @@ function import_all_fin($request) {
 	effacer_meta("date_optimisation");
 	effacer_meta('version_archive_restauration');
 	effacer_meta('tag_archive_restauration');
-	effacer_meta('restauration_session_id');
 	effacer_meta('restauration_charset_sql_connexion');
 	ecrire_metas();
 	if ($request['insertion'] == 'passe2') 
diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php
index d3604ad7462e159fc8c45c6970968e01fb72ccb4..28fa7a1ebc5a966fc6f1b5446dd25daf47b8ecc6 100644
--- a/ecrire/inc/admin.php
+++ b/ecrire/inc/admin.php
@@ -29,17 +29,39 @@ function inc_admin_dist($script, $titre, $comment='', $retour='')
 		spip_log("meta: $script " . join(',', $_POST));
 		ecrire_meta($script, serialize($_POST));
 		ecrire_metas();
-	} else spip_log("reprise de $script");
+	} else 	admin_verifie_session($script);
+
 	$base = charger_fonction($script, 'base');
 	$base($titre,$reprise);
-	effacer_meta($script);
-	ecrire_metas();
-	spip_unlink(_FILE_META);
 	fin_admin($script);
-	spip_log("efface meta: $script " . ($retour ? $retour : ''));
+	spip_log("efface les meta admin et $script " . ($retour ? $retour : ''));
 	if ($retour) redirige_par_entete($retour);
 }
 
+// Gestion dans la meta "admin" du script d'administation demande,
+// pour eviter des executions en parallele, notamment apres Time-Out.
+// Cette meta contient le nom du script et, a un codage pres, du demandeur.
+// Le code de ecrire/index.php devie toute demande d'execution d'un script
+// vers le script d'administration indique par cette meta si elle est lа.
+// Au niveau de la fonction inc_admin, on controle la meta 'admin'.
+// Si la meta n'est pas la, c'est le debut on la cree 
+// Sinon, on verifie que le connecte est bien celui ayant entame 
+// l'operation d'administration, 
+// Si le connecte n'est pas le bon, on refuse la connexion.
+
+// http://doc.spip.org/@import_verifie_session
+function admin_verifie_session($script) {
+
+	$signal = $script . ' ' . fichier_admin($action);
+	$row = sql_fetsel('valeur', 'spip_meta', "nom='admin'");
+	if (!$row) {
+		ecrire_meta('admin', $signal,'non');
+		ecrire_metas();
+	} elseif ($row['valeur'] != $signal)
+		die(_T('info_travaux_texte'));
+	else spip_log("reprise de $script");
+}
+
 // http://doc.spip.org/@dir_admin
 function dir_admin()
 {
@@ -123,8 +145,12 @@ function debut_admin($script, $action='', $commentaire='') {
 // http://doc.spip.org/@fin_admin
 function fin_admin($action) {
 	$signal = dir_admin() . fichier_admin($action);
+	@rmdir($signal); // par precaution
 	spip_unlink($signal);
-	@rmdir($signal);
+	spip_unlink(_FILE_META);
+	effacer_meta($action);
+	effacer_meta('admin');
+	ecrire_metas();
 }
 
 // http://doc.spip.org/@copy_request
diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php
index f6d2c4e6136ee2632ed79203015b0f18ffc66549..c69ee4e5ff0338e154e3ee2d47cefef715cc9d3b 100644
--- a/ecrire/inc/import.php
+++ b/ecrire/inc/import.php
@@ -180,17 +180,6 @@ function detruit_restaurateur()
 	}
 }
 
-// verifier que l'id de session restauration place dans une meta correspond toujours a la session en cours
-// sinon cela signifie que la page a ete rechargee, et qu'une autre session a repris depuis le dernier abs_pos
-// il faut absolument ne plus rien faire et mourir ...
-
-// http://doc.spip.org/@import_verifie_session
-function import_verifie_session() {
-	$row = sql_fetsel(array('valeur'),array('spip_meta'),array("nom='restauration_session_id'"));
-	if ($row['valeur']!=_RESTAURATION_SESSION_ID)
-		die('la place est prise');
-}
-
 // http://doc.spip.org/@import_tables
 function import_tables($request, $dir) {
 	global $import_ok, $abs_pos,  $affiche_progression_pourcent;
@@ -228,12 +217,6 @@ function import_tables($request, $dir) {
 			$gz = 'fread';
 	}
 
-	// creer un id de la session d'import qui sera utilise pour verifier qu'on a toujours la main
-	// avant chaque insert/update
-	// permet d'eviter les process concourants qui realisent le meme insert/update
-	include_spip('inc/acces');
-	@define('_RESTAURATION_SESSION_ID',creer_uniqid());
-	ecrire_meta('restauration_session_id',_RESTAURATION_SESSION_ID,'non');
 	
 	if ($abs_pos==0) {
 		list($tag, $atts, $charset) = import_debut($file, $gz);
diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php
index 63188a2279cd9b0922fb7c88ad8395ab06457ea6..bf16247d07a03f587e23619bb9411a2e2d90f4bc 100644
--- a/ecrire/inc/import_1_3.php
+++ b/ecrire/inc/import_1_3.php
@@ -69,7 +69,6 @@ function inc_import_1_3_dist($lecteur, $request, $gz='fread', $atts=array()) {
 
 	if ($values === false) return  ($import_ok = false);
 
-	import_verifie_session(); // verifier qu'on a toujours la main pour faire des insertions en base
 	if ($values) $boucle($values, $new, $desc, $request, $atts);
 
 	return $import_ok = $new;
diff --git a/ecrire/index.php b/ecrire/index.php
index d3c6ce3fb5a73be69eeba8a4ce8b5b6e23e71b7f..cb8b9fda64015aa1c28f9b6b82411b62d897b0a7 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -128,13 +128,18 @@ AND (!isset($var_ajaxcharset))
 AND ($GLOBALS['spip_version'] != (str_replace(',','.',$GLOBALS['meta']['version_installee']))))
 	$exec = 'demande_mise_a_jour';
 
-// Si interruption d'une longue restauration
-// detourner le script demande pour qu'il reprenne le boulot, et
-// refuser Ajax et non-admin pour eviter des restaurations paralleles
-elseif (isset($GLOBALS['meta']["import_all"])) {
+// Quand une action d'administration est en cours (meta "admin"),
+// refuser les connexions non-admin ou Ajax pour laisser la base intacte.
+// Si c'est une admin, detourner le script demande vers cette action:
+// si l'action est vraiment en cours, inc_admin refusera cette 2e demande,
+// sinon c'est qu'elle a ete interrompue et il faut la reprendre
+
+elseif (isset($GLOBALS['meta']["admin"])) {
 	if (isset($var_ajaxcharset) OR !isset($_COOKIE['spip_admin']))
-		die('Importation en cours, revenez plus tard.');
-	$exec = 'import_all';
+		die(_T('info_travaux_texte'));
+	$l = $GLOBALS['meta']["admin"];
+	spip_log("Le script $l, en cours, se substitue a $exec");
+	$exec = substr($l, 0, strpos($l, ' '));
 }
 // si nom pas plausible, prendre le script par defaut
 elseif (!preg_match(',^[a-z_][0-9a-z_]*$,i', $exec)) $exec = "accueil";
diff --git a/ecrire/install/etape_3.php b/ecrire/install/etape_3.php
index ad718a04e9d0c5df3812850be221aef4165ce32a..ad605cb11a03e2af58cb128976259882b89c4006 100644
--- a/ecrire/install/etape_3.php
+++ b/ecrire/install/etape_3.php
@@ -97,7 +97,9 @@ function install_bases(){
 		$finsert('spip_meta', '(nom, valeur,impt)', "('version_installee', '$spip_version','non')");
 	} else {
 
-	  creer_base($server_db); // pour recrer les tables disparues au besoin
+	  // pour recreer les tables disparues au besoin
+	  creer_base($server_db); 
+
 	  $r = $fquery ("SELECT valeur FROM spip_meta WHERE nom='version_installee'");
 	  if ($r) $r = $ffetch($r);
 	  if ($r) $version_installee = (double) $r['valeur'];
@@ -138,8 +140,9 @@ function install_bases(){
 		
 		$result_ok = $finsert("spip_meta", "(nom, valeur)", "('nouvelle_install', '1')");
 	} else {
-	  // en cas de reinstall sur mise a jour mal passee
-		@$fquery("DELETE FROM spip_meta WHERE nom='import_all'");
+	  // eliminer la derniere operation d'admin mal terminee
+	  // notamment la mise a jour 
+		@$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR  nom='admin'");
 		$result_ok = @$fquery("SELECT COUNT(*) FROM spip_meta");
 	}