diff --git a/ecrire/exec/admin_tech.php b/ecrire/exec/admin_tech.php
index 3464056b03c20e322efc039e59ad688b758e42e7..022fc5822e5ed11184e92a1d626e9a88a025743e 100644
--- a/ecrire/exec/admin_tech.php
+++ b/ecrire/exec/admin_tech.php
@@ -102,13 +102,21 @@ echo "</table>";
 //
 
  if ($connect_toutes_rubriques) {
- 	$liste_dump = preg_files(_DIR_DUMP,str_replace("@stamp@","(_[0-9]{6,8}_[0-9]{1,3})?",_SPIP_DUMP)."(.gz)?",50,false);
+ 	$liste_dump = preg_files(_DIR_DUMP,str_replace("@stamp@","(_[0-9]{6,8}_[0-9]{1,3})?",_SPIP_DUMP)."(.gz)?$",50,false);
  	$selected = end($liste_dump);
  	$liste_choix = "<p><ul>"; 
  	foreach($liste_dump as $key=>$fichier){
  		$affiche_fichier = substr($fichier,strlen(_DIR_DUMP));
- 		$liste_choix.="\n<li><input type='radio' name='archive' value='$affiche_fichier' id='dump_$key' ".
- 			(($fichier==$selected)?"checked='checked' ":"")."/>\n<label for='dump_$key'>$affiche_fichier</label></li>";
+ 		$liste_choix.="\n<li><input type='radio' name='archive' value='"
+		. $affiche_fichier
+		. "' id='dump_$key' "
+		.  (($fichier==$selected)?"checked='checked' ":"")
+		. "/>\n<label for='dump_$key'>"
+		. $affiche_fichier
+		. '&nbsp;&nbsp; ('
+		. _T('taille_octets',
+		     array('taille' => number_format(filesize($fichier), 0, ' ', ' ')))
+		. ')</label></li>';
  	}
  	
 	if ($flag_gz) {
diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php
index f25f03e6160a58a04be2c583b15c31d3875aea02..a06e0a97f4e1588556ed6910a8c054eeeff17824 100644
--- a/ecrire/inc/import.php
+++ b/ecrire/inc/import.php
@@ -39,40 +39,40 @@ $GLOBALS['flag_ob_flush'] = function_exists('ob_flush');
 // Si le 2e argument (passe par reference) est non vide
 // ce qui precede cette balise y est mis.
 // Les balises commencant par <! sont ignorees
+// $abs_pos est globale pour pouvoir etre reinitialisee a la meta
+// status_restauration en cas d'interruption sur TimeOut.
 
 // http://doc.spip.org/@xml_fetch_tag
-function xml_fetch_tag($f, &$before, $gz=false, $skip='!') {
-	global $buf, $abs_pos;
-	static $_fread,$_feof,$_ftell;
+function xml_fetch_tag($f, &$before, $_fread='fread', $skip='!') {
+	global $abs_pos;
+	static $buf='';
 	static $ent = array('&amp;','&lt;');
 	static $brut = array('&','<');
 
-	if (!$_fread){
-		$_fread = ($gz) ? 'gzread' : 'fread';
-		$_feof = ($gz) ? 'gzeof' : 'feof';
-		$_ftell = ($gz) ? 'gztell' : 'ftell';
+	while (($b=strpos($buf,'<'))===false) {
+		if (!($x = $_fread($f, 1024))) return '';
+		$buf .= $x;
 	}
-	
-	while (($b=strpos($buf,'<'))===false) 
-		$buf .= $_fread($f, 1024);
-
 	if ($before) $before = str_replace($ent,$brut,substr($buf,0,$b));
-
+#	else { spip_log("position: $abs_pos" . substr($buf,0,12));flush();}
 	// pour ignorer un > de raccourci Spip avant un < de balise XML
 
-	$buf = substr($buf,$b+1); 
-
-	while (($e=strpos($buf,'>'))===false)
-		$buf .= $_fread($f, 1024);
-
-	$tag = substr($buf, 0, $e);
-	$buf = substr($buf,$e+1);
+	$buf = substr($buf,++$b); 
 
-	$abs_pos = $_ftell($f) - strlen($buf);
-	
-	if ($tag[0]!=$skip) return $tag;
+	while (($e=strpos($buf,'>'))===false) {
+		if (!($x = $_fread($f, 1024))) return '';
+		$buf .= $x;
+	}
+	if ($buf[0]!=$skip) {
+		$tag = substr($buf, 0, $e);
+		$buf = substr($buf,++$e);
+		$abs_pos += $e + $b;
+		return $tag;
+	}
 
-	return xml_fetch_tag($f,$before,$gz,$skip_comment);
+	$buf = substr($buf,++$e);
+	$abs_pos += $e + $b;
+	return xml_fetch_tag($f,$before,$_fread,$skip);
 }
 
 // http://doc.spip.org/@xml_parse_tag
@@ -97,14 +97,14 @@ function xml_parse_tag($texte) {
 
 
 // http://doc.spip.org/@import_debut
-function import_debut($f, $gz=false) {
+function import_debut($f, $gz='fread') {
 
 //  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;
 	$b = false;
-	while ($t = xml_fetch_tag($f, $b, $gz, false)) {
+	while ($t = xml_fetch_tag($f, $b, $gz, '')) {
 		$r = xml_parse_tag($t);
 		if ($r[0] == '?xml' AND $r[1]['encoding'])
 			$charset = strtolower($r[1]['encoding']);
@@ -171,7 +171,7 @@ function detruit_restaurateur()
 function import_tables($request, $dir) {
 	global $import_ok, $abs_pos,  $affiche_progression_pourcent;
 
-	$my_pos = (!isset($GLOBALS['meta']["status_restauration"])) ? 0 :
+	$abs_pos = (!isset($GLOBALS['meta']["status_restauration"])) ? 0 :
 		$GLOBALS['meta']["status_restauration"];
 
 	// au premier appel destruction des tables a restaurer
@@ -180,12 +180,12 @@ function import_tables($request, $dir) {
 
 	if ($request['insertion']=='on') {
 		include_spip('inc/import_insere');
-		$request['init'] = (!$my_pos) ? 'insere_1_init' : 'insere_2_init';		$request['boucle'] = 'import_insere';
+		$request['init'] = (!$abs_pos) ? 'insere_1_init' : 'insere_2_init';		$request['boucle'] = 'import_insere';
 	} elseif ($request['insertion']=='passe2') {
 		$request['init'] = 'insere_2_init';
 		$request['boucle'] = 'import_translate';
 	} else {
-		$request['init'] = (!$my_pos) ? 'import_init_tables' : 'import_table_choix';
+		$request['init'] = (!$abs_pos) ? 'import_init_tables' : 'import_table_choix';
 		$request['boucle'] = 'import_replace';
 	}
 
@@ -193,17 +193,17 @@ function import_tables($request, $dir) {
 
 	if (ereg("\.gz$", $archive)) {
 			$size = false;
-			$taille = taille_en_octets($my_pos);
+			$taille = taille_en_octets($abs_pos);
 			$file = gzopen($archive, 'rb');
-			$gz = true;
+			$gz = 'gzread';
 	} else {
 			$size = @filesize($archive);
-			$taille = floor(100 * $my_pos / $size)." %";
+			$taille = floor(100 * $abs_pos / $size)." %";
 			$file = fopen($archive, 'rb');
-			$gz = false;
+			$gz = 'fread';
 	}
 
-	if ($my_pos==0) {
+	if ($abs_pos==0) {
 		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
@@ -214,12 +214,12 @@ function import_tables($request, $dir) {
 			ecrire_meta('charset_restauration', $charset);
 		else	ecrire_meta('charset_insertion', $charset);
 		ecrire_metas();
-		spip_log("Debut de l'importation (charset: $charset, archive: $version_archive)" . ($i ? " insertion $i" : ''));
+		spip_log("Debut de l'importation de $archive (charset: $charset, format: $version_archive)" . ($i ? " insertion $i" : ''));
 	} else {
-		spip_log("Reprise de l'importation interrompue en $my_pos");
-		$_fseek = ($gz) ? gzseek : fseek;
-		$_fseek($file, $my_pos);
 		$version_archive = $GLOBALS['meta']['version_archive_restauration'];
+		spip_log("Reprise de l'importation de $archive interrompue en $abs_pos");
+		$_fseek = ($gz=='gzread') ? 'gzseek' : 'fseek';
+		$_fseek($file, $abs_pos);
 	}
 
 	$fimport = import_charge_version($version_archive);
@@ -231,12 +231,11 @@ function import_tables($request, $dir) {
 
 	$oldtable ='';
 	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
+	  // memoriser pour pouvoir reprendre en cas d'interrupt,
+	  // mais pas d'ecriture sur fichier, ca ralentit trop
 		ecrire_meta("status_restauration", "$abs_pos");
 		if ($oldtable != $table) {
-			spip_log("Restauration de $table");
+			spip_log("Restauration de $table (commence en $abs_pos)");
 			affiche_progression_javascript($abs_pos,$size,$table);
 			$oldtable = $table;
 		}
diff --git a/ecrire/inc/import_0_0.php b/ecrire/inc/import_0_0.php
index 0a18bbdbdb9e913eef576ce3ae304941dfbd7667..14049d368e43f768a8d6bbdfaff354d6c20e1830 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) {
+function inc_import_0_0_dist($f, $request, $gz='fread') {
 	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 0bdaa59e0f23b27d523ff75d492c5035dd2c7862..35d3d93a552ce1641b8b148588c449b336f3970a 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) {
+function inc_import_1_2_dist($f, $request, $gz='fread') {
   global $import_ok;
 	static $field_desc = array ();
 
diff --git a/ecrire/inc/import_1_3.php b/ecrire/inc/import_1_3.php
index b9bfcc90d03bca10d73f46856e4265c7269642ca..b4a559dd6f7f7130ff3072429f2b3e3ad233a1cd 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) {
-  global $import_ok, $abs_pos, $tables_trans,  $trans;
+function inc_import_1_3_dist($lecteur, $request, $gz='fread') {
+  global $import_ok, $tables_trans,  $trans;
 	static $tables = '';
 	static $phpmyadmin, $fin;
 	static $field_desc = array ();
@@ -125,9 +125,11 @@ function import_lire_champs($f, $fields, $gz, $phpmyadmin, $table)
 	for (;;) {
 		if (!($col = xml_fetch_tag($f, $b, $gz))) return false;
 		if ($col[0] == '/') { 
-			if ($col != $table) 
+			if ($col != $table) {
 		    // autre tag fermant ici est une erreur de format
-				spip_log("restauration : table $table tag fermant $col innatendu");
+			  spip_log("restauration de la table $table, tag fermant inattendu:");
+			  spip_log($col);
+		  }
 			break;
 		}
 		$value = true;