diff --git a/ecrire/base/admin_repair.php b/ecrire/base/admin_repair.php
index 10497da29e64de58faabb27f8d125599931d238f..0cf4b1c5fbc55b6fc857003280fb2faef287dfe0 100644
--- a/ecrire/base/admin_repair.php
+++ b/ecrire/base/admin_repair.php
@@ -45,6 +45,9 @@ function base_admin_repair_dist() {
 	  }
 	}
 
+	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";
 	}
diff --git a/ecrire/inc/rubriques.php b/ecrire/inc/rubriques.php
index 24a60d01360116520bb301f59560a6b16607b151..8a36d3c6a5f048538a8318a59f53a4058769bd4e 100644
--- a/ecrire/inc/rubriques.php
+++ b/ecrire/inc/rubriques.php
@@ -15,17 +15,19 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 include_spip('inc/meta');
 
 // Fonction a appeler lorsque le statut d'un objet change dans une rubrique
+// ou que la rubrique est déplacee.
+// Le 2e arg est un tableau ayant un index "statut" (indiquant le nouveau)
+// et eventuellement un index "id_rubrique" (indiquant le deplacement)
 
-// Si l'objet passe a "publie"
-// consequence sur ses parentes et les langues
-// Idem s'il est depublie'
-// s'il est deplace' alors qu'il etait publieé, double consequence.
-// (a refaire a terme par une Cascade SQL)
+// Si le statut passe a "publie", la rubrique et ses parents y passent aussi
+// et les langues utilisées sont recalculées. 
+// Conséquences symétriques s'il est depublie'.
+// S'il est deplace' alors qu'il etait publieé, double consequence.
+// Tout cela devrait passer en SQL, sous forme de Cascade SQL.
 
 // http://doc.spip.org/@calculer_rubriques_if
 function calculer_rubriques_if ($id_rubrique, $modifs, $statut_ancien='')
 {
-
 	$neuf = false;
 	if ($statut_ancien == 'publie') {
 		if (isset($modifs['statut']) OR isset($modifs['id_rubrique']))
@@ -102,12 +104,12 @@ function depublier_branche_rubrique_if($id_rubrique)
 }
 
 //
-// Fonction appelee lorsqu'on (de)publie dans une rubrique.
-// Restreindre ses appels le plus possible
-//
+// Fonction appelee apres importation:
+// calculer les meta-donnes resultantes,
+// remettre de la cohérence au cas où la base importee en manquait
+// Cette fonction doit etre invoque sans processus concurrent potentiel.
 // http://doc.spip.org/@calculer_rubriques
 function calculer_rubriques() {
-	if (!spip_get_lock($t="calcul_rubriques")) return;
 
 	calculer_rubriques_publiees();
 
@@ -121,8 +123,6 @@ function calculer_rubriques() {
 
 	// on calcule la date du prochain article post-date
 	calculer_prochain_postdate(); // fera le ecrire_metas();
-
-	spip_release_lock($t);
 }
 
 // Recalcule l'ensemble des donnees associees a l'arborescence des rubriques
diff --git a/ecrire/index.php b/ecrire/index.php
index e3d52fee4c74324bd38b7be8a33626e0ef140a4d..d3c6ce3fb5a73be69eeba8a4ce8b5b6e23e71b7f 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -129,11 +129,11 @@ AND ($GLOBALS['spip_version'] != (str_replace(',','.',$GLOBALS['meta']['version_
 	$exec = 'demande_mise_a_jour';
 
 // Si interruption d'une longue restauration
-// detourner le script demande pour qu'il reprenne le boulot
-// mais virer les Ajax pour eviter plusieurs restaurations en parallele
-elseif (isset($_COOKIE['spip_admin'])
-AND isset($GLOBALS['meta']["import_all"])) {
-	if (isset($var_ajaxcharset)) exit;
+// 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"])) {
+	if (isset($var_ajaxcharset) OR !isset($_COOKIE['spip_admin']))
+		die('Importation en cours, revenez plus tard.');
 	$exec = 'import_all';
 }
 // si nom pas plausible, prendre le script par defaut