diff --git a/ecrire/base/admin_repair.php b/ecrire/base/admin_repair.php
index 0cf4b1c5fbc55b6fc857003280fb2faef287dfe0..bbf22c17e1809e39519a2ebac1ab2a0d9cde0b3f 100644
--- a/ecrire/base/admin_repair.php
+++ b/ecrire/base/admin_repair.php
@@ -14,14 +14,16 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 // http://doc.spip.org/@base_admin_repair_dist
 function base_admin_repair_dist() {
-	$res1= spip_query("SHOW TABLES");
 
+  $connexion = $GLOBALS['connexions'][0];
+  $prefixe = $connexion['prefixe'];
+  $res1= spip_query("SHOW TABLES LIKE " . _q("$prefixe%"));
 	$res = "";
 	if ($res1) { while ($r = sql_fetch($res1)) {
 		$tab = array_shift($r);
 
 		$res .= "<p><b>$tab</b> ";
-
+		spip_log("Repare $tab");
 		$result_repair = spip_query("REPAIR TABLE ".$tab);
 		if (!$result_repair) return false;
 
@@ -44,14 +46,14 @@ function base_admin_repair_dist() {
 			$res .= " "._T('texte_table_ok')."<br />\n";
 	  }
 	}
-
-	include_spip('inc/rubriques');
-	calculer_rubriques();
-
 	if (!$res) {
 		$res = "<br /><br /><span style='color: red; font-weight: bold;'><tt>"._T('avis_erreur_mysql').' '.sql_errno().': '.sql_error() ."</tt></span><br /><br /><br />\n";
+	} else {
+		include_spip('inc/rubriques');
+		calculer_rubriques();
 	}
 	include_spip('inc/minipres');
-	echo minipres(_T('texte_tentative_recuperation'), $res);
+	echo minipres(_T('texte_tentative_recuperation'),
+			$res . generer_form_ecrire('accueil', '','',_T('public:accueil_site')));
 }
 ?>
diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php
index 5515494dedbb1e3f8a07caba22d06eee43baed43..f633fa889c1815dc9aee13d7fefebf660c6978d9 100644
--- a/ecrire/inc/admin.php
+++ b/ecrire/inc/admin.php
@@ -29,7 +29,8 @@ function inc_admin_dist($script, $titre, $comment='', $retour='')
 		spip_log("meta: $script " . join(',', $_POST));
 		ecrire_meta($script, serialize($_POST));
 		ecrire_metas();
-	} else 	admin_verifie_session($script);
+	} elseif  ($script !== 'admin_repair')
+		admin_verifie_session($script);
 
 	$base = charger_fonction($script, 'base');
 	$base($titre,$reprise);
@@ -40,27 +41,40 @@ function inc_admin_dist($script, $titre, $comment='', $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.
+// Cette meta contient le nom du script et, a un hachage 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.
+// Si la meta n'est pas la, 
+//	c'est le debut on la cree.
+// Sinon, si le hachage actuel est le meme que celui en base, 
+//	c'est une reprise, on continue
+// Sinon, si le hachage differe a cause du connecte,
+// 	c'est une arrivee inoppotune, on refuse sa connexion.
+// Enfin, si hachage differe pour une autre raison
+// 	c'est que l'operation se passe mal, on la stoppe
 
 // http://doc.spip.org/@admin_verifie_session
 function admin_verifie_session($script) {
 
 	include_spip('base/abstract_sql');
-	$signal = $script . ' ' . fichier_admin($action);
+	$pref = sprintf("_%d_",$GLOBALS['auteur_session']['id_auteur']) .
+	$signal = fichier_admin($script, "$script$pref");
 	$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");
+	} else {
+		if (($s = $row['valeur']) != $signal) {
+			if (intval(susbtr($s, strpos($s,'_')+1))<>
+			    $GLOBALS['auteur_session']['id_auteur']) {
+			  include_spip('inc/minipres');
+			  echo minipres(_T('info_travaux_texte'));
+			  exit;
+			}
+		}
+	}
+	spip_log("admin $pref" . ($row ? " (reprise)" : ''));
 }
 
 // http://doc.spip.org/@dir_admin
@@ -74,9 +88,10 @@ function dir_admin()
 }
 
 // http://doc.spip.org/@fichier_admin
-function fichier_admin($action) {
+function fichier_admin($action, $pref='admin_') {
 
-	return "admin_".substr(md5($action.(time() & ~2047).$GLOBALS['auteur_session']['login']), 0, 10);
+	return $pref . 
+	  substr(md5($action.(time() & ~2047).$GLOBALS['auteur_session']['login']), 0, 10);
 }
 
 // demande la creation d'un repertoire et sort