diff --git a/ecrire/exec/import_all.php b/ecrire/exec/import_all.php
index 5ecbd823336a7bff391658cc9cb3fcfe48dce1f5..9fbae317cf140d108f4a49f42f962c74fcd7578a 100644
--- a/ecrire/exec/import_all.php
+++ b/ecrire/exec/import_all.php
@@ -118,12 +118,13 @@ function exec_import_all_dist()
 
 	if ($my_date) {
 
+		global $trans;
 		if ($request['insertion'] == 'passe2') {
 			include_spip('inc/import_insere');
 			$trans = translate_init($request);
 		} else $trans = array();
 
-		$res = import_tables($request, $dir, $trans);
+		$res = import_tables($request, $dir);
 	}
 
 	echo $res, "</body></html>\n";
diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php
index 458336029a1a71a488a2666dee87d00fcc387e63..57e8f0b98e6db2d728b285d066a52a7edcbfb3c3 100644
--- a/ecrire/inc/import.php
+++ b/ecrire/inc/import.php
@@ -153,9 +153,8 @@ function detruit_restaurateur()
 }
 
 // http://doc.spip.org/@import_tables
-function import_tables($request, $dir, $trans=array()) {
+function import_tables($request, $dir) {
 	global $import_ok, $abs_pos,  $affiche_progression_pourcent;
-	static $time_javascript;
 
 	$my_pos = (!isset($GLOBALS['meta']["status_restauration"])) ? 0 :
 		$GLOBALS['meta']["status_restauration"];
@@ -216,7 +215,7 @@ function import_tables($request, $dir, $trans=array()) {
 	flush();
 
 	$oldtable ='';
-	while ($table = $fimport($file, $request, $gz, $trans)) {
+	while ($table = $fimport($file, $request, $gz)) {
 	// Pas d'ecriture SQL car sinon le temps double.
 	// Il faut juste faire attention a bien lire_metas()
 	// au debut de la restauration
@@ -224,11 +223,10 @@ function import_tables($request, $dir, $trans=array()) {
 		if ($oldtable != $table) {
 			spip_log("Restauration de $table");
 			affiche_progression_javascript($abs_pos,$size,$table);
-
-			$time_javascript = time();
 			$oldtable = $table;
 		}
 	}
+
 	if (!$import_ok) 
 		$res =  _T('avis_archive_invalide');
 	else {
diff --git a/ecrire/inc/import_0_0.php b/ecrire/inc/import_0_0.php
index 77b75b7493d70266d0f04c54804253933de3bb59..e6ced6b6cd3940688ab906ca6c164fca5dd952b9 100644
--- a/ecrire/inc/import_0_0.php
+++ b/ecrire/inc/import_0_0.php
@@ -15,7 +15,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // pour le support des vieux dump
 // pff ou vous l'avez trouve ce dump ?
 // http://doc.spip.org/@inc_import_0_0_dist
-function inc_import_0_0_dist($f, $request, $gz=false, $t='') {
+function inc_import_0_0_dist($f, $request, $gz=false) {
 	global $import_ok;
 
 	// detruire les tables a restaurer
diff --git a/ecrire/inc/import_1_2.php b/ecrire/inc/import_1_2.php
index 3fe20e206df877bf7e2e508fab8a9cf021f444ee..d6b516e46bafb31dab343a54e5fc13c14e6ac94b 100644
--- a/ecrire/inc/import_1_2.php
+++ b/ecrire/inc/import_1_2.php
@@ -38,7 +38,7 @@ function description_table($nom){
 
 // pour le support des vieux dump
 // http://doc.spip.org/@inc_import_1_2_dist
-function inc_import_1_2_dist($f, $request, $gz=false, $t='') {
+function inc_import_1_2_dist($f, $request, $gz=false) {
   global $import_ok;
 	static $field_desc = array ();
 
diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php
index 76a26af7ef8fda7df635e756af7315c12a842ab1..5aa3f07304cc4aab55a15a246374bf5ca1eba9b6 100644
--- a/ecrire/inc/import_1_3.php
+++ b/ecrire/inc/import_1_3.php
@@ -37,8 +37,8 @@ function description_table($nom){
 }
 
 // http://doc.spip.org/@inc_import_1_3_dist
-function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) {
-	global $import_ok, $abs_pos, $tables_trans;
+function inc_import_1_3_dist($lecteur, $request, $gz=false) {
+  global $import_ok, $abs_pos, $tables_trans,  $trans;
 	static $tables = '';
 	static $phpmyadmin, $fin;
 	static $field_desc = array ();
@@ -102,13 +102,13 @@ function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) {
 				     '/' . $table);
 
 	if ($values === false) return  ($import_ok = false);
-	if ($values) $boucle($values, $new, $desc, $request, $trans);
+	if ($values) $boucle($values, $new, $desc, $request);
 
 	return $import_ok = $new;
 }
 
 // http://doc.spip.org/@import_replace
-function import_replace($values, $table, $desc, $request, $trans) {
+function import_replace($values, $table, $desc, $request) {
 	if (!spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',array_map('_q', $values)) . ')')) {
 		$GLOBALS['erreur_restauration'] = spip_sql_error();
   }
diff --git a/ecrire/inc/import_insere.php b/ecrire/inc/import_insere.php
index d0d9e04a55cab54dbcf5ebe064581447be8c7a03..496644056d8b476778498320fdba02168a94cd83 100644
--- a/ecrire/inc/import_insere.php
+++ b/ecrire/inc/import_insere.php
@@ -55,12 +55,14 @@ function insere_1_init($request) {
 	return insere_2_init($request);
 }
 
+//   construire le tableau PHP de la table spip_translate
+// (mis en table pour pouvoir reprendre apres interruption)
+
 // http://doc.spip.org/@translate_init
 function translate_init($request) {
-  /* 
-   construire le tableau PHP de la table spip_translate
-   (mis en table pour pouvoir reprendre apres interruption)
-  */
+
+	include_spip('inc/texte.php'); // pour les Regexp des raccourcis
+
 	$q = spip_query("SELECT * FROM spip_translate");
 	$trans = array();
 	while ($r = spip_fetch_array($q)) {
@@ -71,13 +73,14 @@ function translate_init($request) {
 
 
 // http://doc.spip.org/@import_insere
-function import_insere($values, $table, $desc, $request, $trans) {
+function import_insere($values, $table, $desc, $request) {
+
 	$type_id = $desc['key']["PRIMARY KEY"];
 
 	// reserver une place dans les tables principales si nouveau
 	$ajout = 0;
 	if ((!function_exists($f = 'import_identifie_' . $type_id))
-	OR (!$n = $f($values, $table, $desc, $request, $trans))) {
+	OR (!$n = $f($values, $table, $desc, $request))) {
 		$n = spip_abstract_insert($table, '', '()');
 		if (!$n) {
 			$GLOBALS['erreur_restauration'] = spip_sql_error();
@@ -107,25 +110,19 @@ function import_insere($values, $table, $desc, $request, $trans) {
 // si une autre occurrence est rencontree a la reprise. Pas dramatique.
 
 // http://doc.spip.org/@import_translate
-function import_translate($values, $table, $desc, $request, &$trans) {
+function import_translate($values, $table, $desc, $request) {
+	global $trans;
 	$vals = '';
 
 	foreach ($values as $k => $v) {
 		if ($k=='id_parent' OR $k=='id_secteur') $k = 'id_rubrique';
 
-		if (isset($trans[$k]) AND isset($trans[$k][$v])) {
-			list($g, $titre, $ajout) = $trans[$k][$v];
-			if ($g < 0) {
-				$f = 'import_identifie_parent_' . $k;
-				$g = $f($g, $titre, $trans, $v);
-				if ($g > 0)
-				  // memoriser qu'on insere
-				  $trans[$k][$v][2]=1;
-				else $g = (0-$g);
-#				spip_log("MAJ $k $v = $g");
-				$trans[$k][$v][0] = $g;
+		$v = importe_translate_maj($k, $v);
+
+		if (preg_match_all(_RACCOURCI_LIEN, $v, $m, PREG_SET_ORDER)) {
+			foreach ($m as $regs) {
+				$v = importe_raccourci($regs, $k, $v);
 			}
-			$v = $g;
 		}
 
 		$vals .= "," . _q($v);
@@ -134,14 +131,47 @@ function import_translate($values, $table, $desc, $request, &$trans) {
 	$p = $desc['key']["PRIMARY KEY"];
 	$v = $values[$p];
 	if (!isset($trans[$p]) OR !isset($trans[$p][$v]) OR $trans[$p][$v][2])
-		spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')');
-#	else spip_log("evite $p $v $table");
+		spip_query($q = "REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')');
 }
 
+function importe_translate_maj($k, $v)
+{
+  global $trans;
+	if (!(isset($trans[$k]) AND isset($trans[$k][$v]))) return $v;
+
+	list($g, $titre, $ajout) = $trans[$k][$v];
+	if ($g < 0) {
+		$f = 'import_identifie_parent_' . $k;
+		$g = $f($g, $titre, $v);
+		if ($g > 0)
+			  // memoriser qu'on insere
+			$trans[$k][$v][2]=1;
+		else $g = (0-$g);
+		$trans[$k][$v][0] = $g;
+	}
+	return $g;
+}
+
+function importe_raccourci($regs, $k, $v)
+{
+	$lien = vider_url($regs[3]); # supprimer 'http://' ou 'mailto:'
+
+	if (!$match = typer_raccourci($lien)) return $v;
+
+	list($f,$objet,$id,$params,$ancre) = $match;
+
+	$k = 'id_' . $f;
+	$g = importe_translate_maj($k, $id);
+
+	if ($g == $id) return $v;
+
+	$rac = '[' . $regs[1] . '->' . $reg[2] . $objet . $g . $params . $ancre .']';
+	return str_replace($regs[0], $rac, $v);
+}
 
 // deux groupes de mots ne peuvent avoir le meme titre ==> identification
 // http://doc.spip.org/@import_identifie_id_groupe
-function import_identifie_id_groupe($values, $table, $desc, $request, $trans)  {
+function import_identifie_id_groupe($values, $table, $desc, $request)  {
 	$r = spip_fetch_array(spip_query($q = "SELECT id_groupe, titre FROM spip_groupes_mots WHERE titre=" . _q($values['titre'])), SPIP_NUM);
 	return $r;
 }
@@ -149,14 +179,15 @@ function import_identifie_id_groupe($values, $table, $desc, $request, $trans)  {
 // pour un mot le titre est insuffisant, il faut aussi l'identite du groupe.
 // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif
 // http://doc.spip.org/@import_identifie_id_mot
-function import_identifie_id_mot($values, $table, $desc, $request, $trans) {
+function import_identifie_id_mot($values, $table, $desc, $request) {
 	return array((0 - $values['id_groupe']), $values['titre']);
 }
 
 // mot de meme titre et de meme groupe ==> identification
 // http://doc.spip.org/@import_identifie_parent_id_mot
-function import_identifie_parent_id_mot($id_groupe, $titre, $trans, $v)
+function import_identifie_parent_id_mot($id_groupe, $titre, $v)
 {
+  global $trans;
 	$titre = _q($titre);
 	$id_groupe = 0-$id_groupe;
 	if (isset($trans['id_groupe'])
@@ -173,49 +204,51 @@ function import_identifie_parent_id_mot($id_groupe, $titre, $trans, $v)
 
 // pour une rubrique le titre est insuffisant, il faut l'identite du parent
 // Memoriser ces 2 infos et le signaler a import_translate grace a 1 negatif
-function import_identifie_id_rubrique($values, $table, $desc, $request, $trans) {
+function import_identifie_id_rubrique($values, $table, $desc, $request) {
 	return array((0 - $values['id_parent']), $values['titre']);
 }
 
 // renumerotation en cascade. 
 // rubrique de meme titre et de meme parent ==> identification
-function import_identifie_parent_id_rubrique($id_parent, $titre, &$trans, $v)
+function import_identifie_parent_id_rubrique($id_parent, $titre, $v)
 {
-#  spip_log("import_identifie_parent_id_rubrique($id_parent, $titre, $v ");
+	global $trans;
 	if (isset($trans['id_rubrique'])) {
 		if ($id_parent < 0) {
 			$id_parent = (0 - $id_parent);
-			$pitre = $trans['id_rubrique'][$id_parent][1];
 			$gparent = $trans['id_rubrique'][$id_parent][0];
-			$n = import_identifie_parent_id_rubrique($gparent, $pitre, $trans, $id_parent);
-#			spip_log("MAJ_rub $id_parent = $n");
-			$trans['id_rubrique'][$id_parent][0] = $n>0 ? $n: (0-$n);
-			if ($n > 0) {
-			  $trans['id_rubrique'][$id_parent][2]=1; // nouvelle rub.
-			  return import_alloue_id_rubrique($n, $titre, $trans, $v);
-			}
+			// parent deja renumerote depuis le debut la passe 2
+			if ($gparent > 0)
+			  $id_parent = $gparent;
 			else {
-			  $id_parent = (0 - $n);
+			  // premiere occurrence du parent
+				$pitre = $trans['id_rubrique'][$id_parent][1];
+				$n = import_identifie_parent_id_rubrique($gparent, $pitre, $id_parent);
+				$trans['id_rubrique'][$id_parent][0] = ($n>0) ? $n: (0-$n);
+				// parent tout neuf,
+				// pas la peine de chercher un titre homonyme
+				if ($n > 0) {
+					$trans['id_rubrique'][$id_parent][2]=1; // nouvelle rub.
+					return import_alloue_id_rubrique($n, $titre, $v);
+				} else $id_parent = (0 - $n);
 			}
 		}
 
 		$r = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE titre=" . _q($titre) . " AND id_parent=" . intval($id_parent)));
 		if ($r)  {
-#		  spip_log("identification $titre $v de nouveau part $id_parent a " . (0 - $r['id_rubrique']));
 		  return (0 - $r['id_rubrique']);
 		}
-		return import_alloue_id_rubrique($id_parent, $titre, $trans, $v);
+		return import_alloue_id_rubrique($id_parent, $titre, $v);
 	}
 }
 
 // reserver la place en mettant titre et parent tout de suite
 // pour que le SELECT ci-dessus fonctionne a la prochaine occurrence
 
-function import_alloue_id_rubrique($id_parent, $titre, &$trans, $v) {
+function import_alloue_id_rubrique($id_parent, $titre, $v) {
 	$titre = _q($titre);
 	$r = spip_abstract_insert('spip_rubriques', '(titre, id_parent)', "($titre,$id_parent)");
 	spip_query("REPLACE spip_translate (id_old, id_new, titre, type, ajout) VALUES ($v,$r,$titre,'id_rubrique',1)");
-#	spip_log("allocation rub $titre $r pour $v nouveau parent $id_parent");
 	return $r;
 }
 
diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index c900867b6eaeff8a16021c3e65d716d95e462266..2e98a9b00008eaf5394142b0ae8fc4a607f8e5ac 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -636,6 +636,30 @@ function extraire_lien ($regs) {
 }
 
 // traitement des raccourcis issus de [TITRE->RACCOURCInnn] et connexes
+
+define('_RACCOURCI_URL', ',^(\S*?)\s*(\d+)(\?.*?)?(#[^\s]*)?$,S');
+
+function typer_raccourci ($lien) {
+
+	if (!preg_match(_RACCOURCI_URL, trim($lien), $match)) return false;
+
+	$f = $match[1];
+
+	// valeur par defaut et alias historiques
+	if (!$f) $f = 'article';
+	else if ($f == 'art') $f = 'article';
+	else if ($f == 'br') $f = 'breve';
+	else if ($f == 'rub') $f = 'rubrique';
+	else if ($f == 'aut') $f = 'auteur';
+	else if ($f == 'doc' OR $f == 'im' OR $f == 'img' OR $f == 'image' OR $f == 'emb')
+		$f = 'document';
+	else if (preg_match(',^br..?ve$,S', $f)) $f = 'breve'; # accents :(
+	$match[0] = $f;
+	return $match;
+}
+
+// Cherche un lien du type [->raccourci 123]
+// associe a une fonction generer_url_raccourci()
 //
 // Valeur retournee selon le parametre $pour:
 // 'tout' : <a href="L">T</a>
@@ -646,23 +670,8 @@ function extraire_lien ($regs) {
 function calculer_url ($lien, $texte='', $pour='url') {
 	$lien = vider_url($lien); # supprimer 'http://' ou 'mailto:'
 
-	// Cherche un lien du type [->raccourci 123]
-	// associe a une fonction generer_url_raccourci()
-	if (preg_match(',^(\S*?)\s*(\d+)(\?.*?)?(#[^\s]*)?$,S', trim($lien), $match)) {
-		list(,$objet,$id,$params,$ancre) = $match;
-
-		// valeur par defaut
-		if (!$f = $objet) $f = 'article';
-
-		// aliases (historique)
-		if ($f == 'art') $f = 'article';
-		else if ($f == 'br') $f = 'breve';
-		else if ($f == 'rub') $f = 'rubrique';
-		else if ($f == 'aut') $f = 'auteur';
-		else if ($f == 'doc' OR $f == 'im' OR $f == 'img' OR $f == 'image' OR $f == 'emb')
-			$f = 'document';
-		else if (preg_match(',^br..?ve$,S', $f)) $f = 'breve'; # accents :(
-
+	if ($match = typer_raccourci ($lien)) {
+		list($f,$objet,$id,$params,$ancre) = $match;
 		// chercher la fonction nommee generer_url_$raccourci
 		// ou calculer_url_raccourci si on n'a besoin que du lien
 		$f=(($pour == 'url') ? 'generer' : 'calculer') . '_url_' . $f;
@@ -1188,6 +1197,8 @@ function traiter_raccourci_lien($regs) {
 		. "</a>");
 }
 
+// Regexp des raccouris, aussi utilisee pour la fusion de sauvegarde Spip
+define('_RACCOURCI_LIEN', ",\[([^][]*)->(>?)([^]]*)\],msS");
 
 // Nettoie un texte, traite les raccourcis spip, la typo, etc.
 // http://doc.spip.org/@traiter_raccourcis
@@ -1352,9 +1363,9 @@ function traiter_raccourcis($letexte) {
 	// Note : complique car c'est ici qu'on applique typo(),
 	// et en plus on veut pouvoir les passer en pipeline
 	//
-	$regexp = ",\[([^][]*)->(>?)([^]]*)\],msS";
+
 	$inserts = array();
-	if (preg_match_all($regexp, $letexte, $matches, PREG_SET_ORDER)) {
+	if (preg_match_all(_RACCOURCI_LIEN, $letexte, $matches, PREG_SET_ORDER)) {
 		$i = 0;
 		foreach ($matches as $regs) {
 			$inserts[++$i] = traiter_raccourci_lien($regs);