diff --git a/.gitattributes b/.gitattributes
index bc9657be545134586500ed04097515bfc6098320..91a9c5a2bb78e7c610b8ba9067cb3a31653310e3 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -475,6 +475,7 @@ ecrire/inc/iconifier.php -text
 ecrire/inc/import_0_0.php -text
 ecrire/inc/import_1_2.php -text
 ecrire/inc/import_1_3.php -text
+ecrire/inc/import_insere.php -text
 ecrire/inc/informer.php -text
 ecrire/inc/informer_auteur.php -text
 ecrire/inc/instituer_article.php -text
diff --git a/ecrire/exec/import_all.php b/ecrire/exec/import_all.php
index c8bf9d6b83c5a83cdb96bfab7ec24a3ae7d413af..677c9129611f202b7c24a3ea9db6a6031d029695 100644
--- a/ecrire/exec/import_all.php
+++ b/ecrire/exec/import_all.php
@@ -133,6 +133,7 @@ function import_all_debut($request) {
 function import_all_fin() {
 
 	effacer_meta("charset_restauration");
+	effacer_meta("charset_insertion");
 	effacer_meta("status_restauration");
 	effacer_meta("debut_restauration");
 	effacer_meta("date_optimisation");
diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php
index d706d13f1e3b55967cf9b39379e8dacc0a7cacdf..61f013fd6f37cee61bd877dfab39d95c54beb2ed 100644
--- a/ecrire/inc/import.php
+++ b/ecrire/inc/import.php
@@ -84,12 +84,15 @@ function xml_parse_tag($texte) {
 // http://doc.spip.org/@import_debut
 function import_debut($f, $gz=false) {
 	$b = "";
+//  Pour les anciennes archives, indiquer le charset par defaut:
+	$charset = 'iso-8859-1'; 
+//  les + recentes l'ont en debut de ce fichier 
 	$flag_phpmyadmin = false;
 	while ($t = xml_fetch_tag($f, $b, $gz, false)) {
 		$r = xml_parse_tag($t);
 		if ($r[0] == '?xml' AND $r[1]['encoding'])
-			ecrire_meta('charset_restauration', strtolower($r[1]['encoding']));
-		if ($r[0] == "SPIP") return $r;
+			$charset = strtolower($r[1]['encoding']);
+		elseif ($r[0] == "SPIP") {$r[2] = $charset; return $r;}
 		if (($r[0] == "!--") && (preg_match(",phpmyadmin\sxml\sdump,is",$r[1]))){
 			// c'est un dump xml phpmyadmin
 			// on interprete le commentaire pour recuperer la version de phpmydadmin
@@ -97,12 +100,13 @@ function import_debut($f, $gz=false) {
 			$flag_phpmyadmin = true;
 		}
 		if (($r[0] != "!--") && ($flag_phpmyadmin == true)){
-		  $r[1] = array('version_archive'=>"phpmyadmin::$version");
+			$r[1] = array('version_archive'=>"phpmyadmin::$version");
+			$r[2] = $charset;
 			return $r;
 		}
 		$b = "";
 	}
-	// improbable: fichier correct avant le debut_admin et plus apres
+	// improbable: fichier correct avant debut_admin et plus apres
 	import_all_fin();
 	die(_T('info_erreur_restauration'));
 }
@@ -118,7 +122,7 @@ function import_init_tables($request)
   global $IMPORT_tables_noerase, $connect_id_auteur;
 	// grand menage
 	// on vide toutes les tables dont la restauration est demandee
-	$tables = import_table_choix($request);
+	$tables = import_table_choix($request);
 	foreach($tables as $table){
 
 		if (($table!='spip_auteurs')&&(!in_array($table,$IMPORT_tables_noerase)))
@@ -126,7 +130,6 @@ function import_init_tables($request)
 	}
 
 	// Bidouille pour garder l'acces admin actuel pendant toute la restauration
-	spip_log("la bidouille");
 	spip_query("UPDATE spip_auteurs SET id_auteur=0, extra=$connect_id_auteur WHERE id_auteur=$connect_id_auteur");
 	spip_query("DELETE FROM spip_auteurs WHERE id_auteur!=0");
 
@@ -161,6 +164,7 @@ function import_tables($request, $dir, $trans=array()) {
 	// ou initialisation de la table des translations,
 	// mais pas lors d'une reprise.
 
+	include_spip('inc/import_insere');
 	if ($request['insertion']=='on') {
 		$request['init'] = (!$my_pos) ? 'insere_1_init' : 'insere_2_init';		$request['boucle'] = 'import_insere';
 	} elseif ($request['insertion']=='passe2') {
@@ -186,15 +190,15 @@ function import_tables($request, $dir, $trans=array()) {
 	}
 
 	if ($my_pos==0) {
-//  Pour les anciennes archives, indiquer le charset par defaut:
-		ecrire_meta('charset_restauration', 'iso-8859-1'); 
-//  les + recentes l'ont en debut de fichier et import_debut fera ecrire_meta
-		list($tag, $r) = import_debut($file, $gz);
+		list($tag, $r, $charset) = import_debut($file, $gz);
 // tag ouvrant du Dump:
 // 'SPIP' si fait par spip, nom de la base source si fait par  phpmyadmin
 		$version_archive = $r['version_archive'];
 		ecrire_meta('version_archive_restauration', $version_archive);
 		ecrire_meta('tag_archive_restauration', $tag);
+		if ($request['insertion']=='off')
+			ecrire_meta('charset_restauration', $charset);
+		else	ecrire_meta('charset_insertion', $charset);
 		ecrire_metas();
 	} else {
 		// Reprise de l'importation
diff --git a/ecrire/inc/import_1_2.php b/ecrire/inc/import_1_2.php
index b023e94768bd3954236e4aaf1d3da20d28eb2af7..7b9ef90a73a60b76dd9c16ae118afc874de2a6db 100644
--- a/ecrire/inc/import_1_2.php
+++ b/ecrire/inc/import_1_2.php
@@ -45,7 +45,7 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') {
 	static $tables;
 	if (!$tables) {
 		$init = $request['init'];
-		$init($request);
+		$a_importer = $init($request);
 		$tables = array(
 		'article' => 'spip_articles',
 		'auteur' => 'spip_auteurs',
@@ -72,7 +72,7 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') {
 	$id_objet = 0;
 
 	$table = isset($tables[$type]) ? $tables[$type] : $type;
-	if (!isset($field_desc[$table])){
+	if (in_array($table, $a_importer) AND !isset($field_desc[$table])) {
 		// recuperer la description de la table pour connaitre ses champs valides
 		list($nom,$desc) = description_table($table);
 
@@ -83,6 +83,10 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') {
 	}
 	$fields = $field_desc[$table];
 
+	$char = $GLOBALS['meta']['charset_insertion'];
+	if ($char == $GLOBALS['meta']['charset_restauration']) $char = '';
+
+	$values = array();
 	// Lire les champs de l'objet
 	for (;;) {
 		$b = '';
@@ -107,12 +111,14 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') {
 				}
 			}
 			else if ($fields==NULL or isset($fields[$col])) {
+				if ($char) 
+					$value = importer_charset($value, $charset);
 				$values[$col] = _q($value);
 				if ($col == $id) $id_objet = $value;
 			}
 		}
 	}
-
+   if ($values) {
 	if (!spip_query("REPLACE $table (" . join(',', array_keys($values)) . ') VALUES (' . join(',', $values) . ')')) {
 		echo "--><br><font color='red'><b>"._T('avis_erreur_mysql')."</b></font>\n<font color='black'><tt>".spip_sql_error()."</tt></font>\n<!--";
 		$GLOBALS['erreur_restauration'] = true;
@@ -153,8 +159,8 @@ function inc_import_1_2_dist($f, $request, $gz=false, $t='') {
 			spip_abstract_insert($table_lien, "($id, id_$type_lien)", join(',', $t));
 		}
 	}
-
-	return $import_ok = "    ";
+   }
+   return $import_ok = "    ";
 }
 
 ?>
diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php
index 2a0cf42bd52c8780cbf2e09bb72189e27ceaccc8..90bd47ee1faff2e92dfc8fc1eea43276107b5087 100644
--- a/ecrire/inc/import_1_3.php
+++ b/ecrire/inc/import_1_3.php
@@ -36,63 +36,6 @@ function description_table($nom){
 	return array($nom,array());
 }
 
-
-// http://doc.spip.org/@insere_2_init
-function insere_2_init($request) {
-
-	// l'insertion porte sur les tables principales ...
-	$t = array_keys($GLOBALS['tables_principales']);
-	// ... mais pas cette table car elle n'est pas extensible ..
-	// (si on essaye ==> duplication sur la cle secondaire)
-	unset($t[array_search('spip_types_documents', $t)]);
-	// .. ni celle-ci a cause de la duplication des login 
-	unset($t[array_search('spip_auteurs', $t)]);
-	// et les tables auxiliaires sur les mots car on sait les identifier
-	$t[]= 'spip_mots_articles';
-	$t[]= 'spip_mots_breves';
-	$t[]= 'spip_mots_rubriques';
-	$t[]= 'spip_mots_syndic';
-	$t[]= 'spip_mots_forum';
-	$t[]= 'spip_mots_documents';
-
-	return $t;
-}
-
-// http://doc.spip.org/@insere_1_init
-function insere_1_init($request) {
-
-  //  preparation de la table des translations
-	$spip_translate = array(
-		"type" 	     =>  "VARCHAR(16) NOT NULL",
-		"titre"	     =>  "text NOT NULL",
-                "id_old"     => "BIGINT (21) DEFAULT '0' NOT NULL",
-                "id_new"    => "BIGINT (21) DEFAULT '0' NOT NULL");
-
-	$spip_translate_key = array(
-                "PRIMARY KEY"   => "id_old, id_new, type",
-                "KEY id_old"        => "id_old");
-
-	include_spip('base/create');
-	spip_create_table('spip_translate', $spip_translate, $spip_translate_key, true);
-	// au cas ou la derniere fois ce serait terminee anormalement
-	spip_query("DELETE FROM spip_translate");
-	return insere_2_init($request);
-}
-
-// 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)
-  */
-	$q = spip_query("SELECT * FROM spip_translate");
-	$trans = array();
-	while ($r = spip_fetch_array($q)) {
-		$trans[$r['type']][$r['id_old']] = array($r['id_new'], $r['titre']);
-	}
-	return $trans;
-}
-
 // 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;
@@ -136,7 +79,7 @@ function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) {
 			if ($request['insertion']=='on') {
 // Ne memoriser que la cle primaire pour le premier tour de l'insertion.
 // car les autres cles rentreraient en conflit avec les presentes
-// Prendre le champ titre pour pouvoir identifier
+// Prendre le strict necessaire pour pouvoir identifier avec l'existant
 				$b = array();
 				if (isset($desc['field'][$p='titre']))
 					$b[$p]= $desc['field'][$p];
@@ -162,100 +105,20 @@ function inc_import_1_3_dist($lecteur, $request, $gz=false, $trans=array()) {
 	return $import_ok = $new;
 }
 
-/* --------- les 3 fonctions possibles pour l'index "boucle" -- */
-
 // http://doc.spip.org/@import_replace
 function import_replace($values, $table, $desc, $request, $trans) {
 	if (!spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',',$values) . ')'))
 		$GLOBALS['erreur_restauration'] = spip_sql_error();
 }
 
-// http://doc.spip.org/@import_insere
-function import_insere($values, $table, $desc, $request, $trans) {
-	$type_id = $desc['key']["PRIMARY KEY"];
-
-	// reserver une place dans les tables principales si nouveau
-	if ((!function_exists($f = 'import_identifie_' . $type_id))
-	OR (!$n = $f($values, $table, $desc, $request, $trans))) {
-		$n = spip_abstract_insert($table, '', '()');
-		if (!$n)
-			$GLOBALS['erreur_restauration'] = spip_sql_error();
-	}
-
-	// et memoriser la correspondance dans la table auxilaire
-	// si different et pas de recherche dessus plus tard
-	if ($n AND (($n != $values[$type_id]) OR $table != 'id_groupe')) {
-		if (is_array($n))
-		  list($id, $titre) = $n; // _q() deja applique sur $titre
-		else {$id = $n; $titre = "''";}
-		spip_abstract_insert('spip_translate',
-				"(id_old, id_new, titre, type)",
-				"(". $values[$type_id] .",$id, $titre, '$type_id')");
-	}
-}
-
-// http://doc.spip.org/@import_translate
-function import_translate($values, $table, $desc, $request, $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) = $trans[$k][$v];
-			if ($g < 0) {
-			  // cas du  parent a verifier en plus du titre
-				if (!($g = import_identifie_mot_si_groupe(0-$g, $titre, $trans)))
-					$g = spip_abstract_insert($table, '', '()');
-			// On connait enfin le nouveau numero.
-			// Mise a jour de spip_translate pas indispensable,
-			// on evite: si vraiment une interrupt a lieu et
-			// retombe dessus, elle recalculera, et alors ?
-				$trans[$k][$v] = array($g, $titre);
-
-			}
-			$v = $g;
-		}
-
-		$vals .= ",$v";
-	}
-	return spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')');
-}
-
-/* --------- Fin des 3 fonctions possibles pour l'index "boucle" -- */
-
-// deux groupes de mots ne peuvent avoir le meme titre ==> identification
-function import_identifie_id_groupe($values, $table, $desc, $request, $trans) {
-  // _q() deja appliquee
-	$n = spip_fetch_array(spip_query("SELECT id_groupe FROM spip_groupes_mots WHERE titre=" . $values['titre']));
-	return $n ? $n['id_groupe'] : false;
-}
-
-// 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
-function import_identifie_id_mot($values, $table, $desc, $request, $trans) {
-	return array((0 - $values['id_groupe']), $values['titre']);
-}
-
-// mot de meme et de meme groupe ==> identification
-function import_identifie_mot_si_groupe($id_groupe, $titre, $trans)
-{
-	if (!(isset($trans['id_groupe'])
-	AND isset($trans['id_groupe'][$id_groupe])))
-		return false;
-
-	$new = $trans['id_groupe'][$id_groupe][0];
-
-	$r = spip_fetch_array(spip_query($q = "SELECT id_mot, id_groupe FROM spip_mots WHERE titre=" . _q($titre) . " AND id_groupe=$new" ));
-
-	return !$r ? false  : $r['id_mot'];
-}
-
 // http://doc.spip.org/@import_lire_champs
 function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table)
 {
 	$values = array();
+	
+	$char = $GLOBALS['meta']['charset_insertion'];
+	if ($char == $GLOBALS['meta']['charset_restauration']) $char = '';
+
 	for (;;) {
 		$b = '';
 		if (!($col = xml_fetch_tag($f, $b, $gz))) return false;
@@ -271,6 +134,8 @@ function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table)
 		if ( ($col != 'maj') AND (isset($fields[$col])) ) {
 			if ($phpmyadmin)
 				$value = str_replace($phpmyadmin[0],$phpmyadmin[1],$value);
+			if ($char) 
+				$value = importer_charset($value, $charset);
 			$values[$col]= _q($value);
 		}
 	}
diff --git a/ecrire/inc/import_insere.php b/ecrire/inc/import_insere.php
new file mode 100644
index 0000000000000000000000000000000000000000..2c5d18fc135d71e3f50b89f0420af1541364b5e5
--- /dev/null
+++ b/ecrire/inc/import_insere.php
@@ -0,0 +1,152 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2006                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// http://doc.spip.org/@insere_2_init
+function insere_2_init($request) {
+
+	// l'insertion porte sur les tables principales ...
+	$t = array_keys($GLOBALS['tables_principales']);
+	// ... mais pas cette table car elle n'est pas extensible ..
+	// (si on essaye ==> duplication sur la cle secondaire)
+	unset($t[array_search('spip_types_documents', $t)]);
+	// .. ni celle-ci a cause de la duplication des login 
+	unset($t[array_search('spip_auteurs', $t)]);
+	// et les tables auxiliaires sur les mots car on sait les identifier
+	$t[]= 'spip_mots_articles';
+	$t[]= 'spip_mots_breves';
+	$t[]= 'spip_mots_rubriques';
+	$t[]= 'spip_mots_syndic';
+	$t[]= 'spip_mots_forum';
+	$t[]= 'spip_mots_documents';
+
+	return $t;
+}
+
+// http://doc.spip.org/@insere_1_init
+function insere_1_init($request) {
+
+  //  preparation de la table des translations
+	$spip_translate = array(
+		"type" 	     =>  "VARCHAR(16) NOT NULL",
+		"titre"	     =>  "text NOT NULL",
+                "id_old"     => "BIGINT (21) DEFAULT '0' NOT NULL",
+                "id_new"    => "BIGINT (21) DEFAULT '0' NOT NULL");
+
+	$spip_translate_key = array(
+                "PRIMARY KEY"   => "id_old, id_new, type",
+                "KEY id_old"        => "id_old");
+
+	include_spip('base/create');
+	spip_create_table('spip_translate', $spip_translate, $spip_translate_key, true);
+	// au cas ou la derniere fois ce serait terminee anormalement
+	spip_query("DELETE FROM spip_translate");
+	return insere_2_init($request);
+}
+
+// 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)
+  */
+	$q = spip_query("SELECT * FROM spip_translate");
+	$trans = array();
+	while ($r = spip_fetch_array($q)) {
+		$trans[$r['type']][$r['id_old']] = array($r['id_new'], $r['titre']);
+	}
+	return $trans;
+}
+
+
+// http://doc.spip.org/@import_insere
+function import_insere($values, $table, $desc, $request, $trans) {
+	$type_id = $desc['key']["PRIMARY KEY"];
+
+	// reserver une place dans les tables principales si nouveau
+	if ((!function_exists($f = 'import_identifie_' . $type_id))
+	OR (!$n = $f($values, $table, $desc, $request, $trans))) {
+		$n = spip_abstract_insert($table, '', '()');
+		if (!$n)
+			$GLOBALS['erreur_restauration'] = spip_sql_error();
+	}
+
+	// et memoriser la correspondance dans la table auxilaire
+	// si different et pas de recherche dessus plus tard
+	if ($n AND (($n != $values[$type_id]) OR $table != 'id_groupe')) {
+		if (is_array($n))
+		  list($id, $titre) = $n; // _q() deja applique sur $titre
+		else {$id = $n; $titre = "''";}
+		spip_abstract_insert('spip_translate',
+				"(id_old, id_new, titre, type)",
+				"(". $values[$type_id] .",$id, $titre, '$type_id')");
+	}
+}
+
+// http://doc.spip.org/@import_translate
+function import_translate($values, $table, $desc, $request, $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) = $trans[$k][$v];
+			if ($g < 0) {
+			  // cas du  parent a verifier en plus du titre
+				if (!($g = import_identifie_mot_si_groupe(0-$g, $titre, $trans)))
+					$g = spip_abstract_insert($table, '', '()');
+			// Memoriser le nouveau numero pour ne pas recalculer
+			// Mise a jour de spip_translate pas indispensable,
+			// on evite: si vraiment une interrupt a lieu et
+			// retombe dessus, elle recalculera, pas dramatique
+				$trans[$k][$v] = array($g, $titre);
+			}
+			$v = $g;
+		}
+
+		$vals .= ",$v";
+	}
+	return spip_query("REPLACE $table (" . join(',',array_keys($values)) . ') VALUES (' .substr($vals,1) . ')');
+}
+
+
+// deux groupes de mots ne peuvent avoir le meme titre ==> identification
+function import_identifie_id_groupe($values, $table, $desc, $request, $trans) {
+  // _q() deja appliquee
+	$n = spip_fetch_array(spip_query("SELECT id_groupe FROM spip_groupes_mots WHERE titre=" . $values['titre']));
+	return $n ? $n['id_groupe'] : false;
+}
+
+// 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
+function import_identifie_id_mot($values, $table, $desc, $request, $trans) {
+	return array((0 - $values['id_groupe']), $values['titre']);
+}
+
+// mot de meme et de meme groupe ==> identification
+function import_identifie_mot_si_groupe($id_groupe, $titre, $trans)
+{
+	if (!(isset($trans['id_groupe'])
+	AND isset($trans['id_groupe'][$id_groupe])))
+		return false;
+
+	$new = $trans['id_groupe'][$id_groupe][0];
+
+	$r = spip_fetch_array(spip_query($q = "SELECT id_mot, id_groupe FROM spip_mots WHERE titre=" . _q($titre) . " AND id_groupe=$new" ));
+
+	return !$r ? false  : $r['id_mot'];
+}
+?>
+