diff --git a/.gitattributes b/.gitattributes
index 367490a7ffbb7dbf9f2cc1bb51da54e2eb90f533..650869feacdfd11e4966492f848178c58d8b082b 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -333,6 +333,7 @@ ecrire/action/editer_mot.php -text
 ecrire/action/editer_rubrique.php -text
 ecrire/action/editer_signatures.php -text
 ecrire/action/editer_site.php -text
+ecrire/action/export_all.php -text
 ecrire/action/ical.php -text
 ecrire/action/iconifier.php -text
 ecrire/action/instituer_article.php -text
diff --git a/ecrire/action/export_all.php b/ecrire/action/export_all.php
new file mode 100644
index 0000000000000000000000000000000000000000..b7e0ffba8bac563b2a87a266e94963710cf89b3d
--- /dev/null
+++ b/ecrire/action/export_all.php
@@ -0,0 +1,66 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2007                                                *
+ *  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;
+
+include_spip('inc/export');
+include_spip('inc/actions');
+include_spip('inc/minipres');
+
+function action_export_all_dist()
+{
+	global $gz, $connect_toutes_rubriques ;
+	
+        $securiser_action = charger_fonction('securiser_action', 'inc');
+        $arg = $securiser_action();
+
+	// determine upload va aussi initialiser connect_toutes_rubrique
+	$dir = determine_upload();
+	if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
+		$dir = _DIR_DUMP;
+
+	$file =  $dir . $arg;
+	spip_log("actionexp $file");
+	$f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab");
+	$_fputs = ($gz) ? gzputs : fputs;
+	$_fputs($f, export_entete());
+
+	if ($GLOBALS['flag_ob_flush']) ob_flush();
+	flush();
+
+	$files = ramasse_parties($file, $gz, $file . ".part");
+
+	$_fputs ($f, build_end_tag("SPIP")."\n");
+	if ($gz) gzclose($f); else fclose($f);
+		
+	effacer_meta("status_dump");
+	ecrire_metas();
+
+	$n = _T('taille_octets',
+		array('taille' => number_format(filesize($file), 0, ' ', ' ')));
+	$n = _T('info_sauvegarde_reussi_02',
+		array('archive' => ':<br /><b>'.joli_repertoire($file)."</b> ($n)"));
+
+	echo install_debut_html(_T('info_sauvegarde'));
+	// ne pas effrayer inutilement: il peut y avoir moins de fichiers
+	// qu'annonce' si certains etaient vides
+#	echo "<ul><li>", join('</li><li>', $files), '</li></ul>';
+	echo "<p style='text-align: left'>".
+	  $n,
+	" <a href='" . _DIR_RESTREINT . "'>".
+	_T('info_sauvegarde_reussi_03')
+	. "</a> "
+	._T('info_sauvegarde_reussi_04')
+	. "</p>\n";
+	echo install_fin_html();
+}
+?>
\ No newline at end of file
diff --git a/ecrire/exec/export_all.php b/ecrire/exec/export_all.php
index 04239c7fa8e6ef03516bb85808f97f84380231e2..f09ff902689b8aa5a15b2681c846dce412871be5 100644
--- a/ecrire/exec/export_all.php
+++ b/ecrire/exec/export_all.php
@@ -13,8 +13,6 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 @ini_set("zlib.output_compression","0"); // pour permettre l'affichage au fur et a mesure
 
-$GLOBALS['version_archive'] = '1.3';
-
 include_spip('base/serial');
 include_spip('base/auxiliaires');
 include_spip('inc/indexation'); // pour la fonction primary_index_table 
@@ -60,7 +58,7 @@ $GLOBALS['flag_ob_flush'] = function_exists('ob_flush');
 // http://doc.spip.org/@exec_export_all_dist
 function exec_export_all_dist()
 {
-  global $archive, $debut_limit, $etape, $gz, $spip_version, $spip_version_affichee, $version_archive, $connect_login, $connect_toutes_rubriques;
+	global $archive, $etape, $gz, $connect_toutes_rubriques;
 
 	if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
 		$dir = _DIR_DUMP;
@@ -71,19 +69,18 @@ function exec_export_all_dist()
 		$dir = preg_replace(",^" . _DIR_RACINE .",", '', $dir);
 		redirige_par_entete(generer_url_action("test_dirs", "test_dir=$dir", true));
 	}
-	if (!$archive)
-		$archive = export_nom_fichier_dump($dir,$gz);
+	if (!$archive) $archive = export_nom_fichier_dump($dir,$gz);
 	
+	$file = $dir . $archive;
+	$partfile = $file . ".part";
   
 	// utiliser une version fraiche des metas (ie pas le cache)
 	include_spip('inc/meta');
 	lire_metas();
 
-	$action = _T('info_exportation_base', array('archive' => $archive));
 	if (!isset($GLOBALS['meta']["status_dump"])){
-	  $start = true;
-	}
-	else{
+		$start = true;
+	} else{
 		$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
 		if (($status_dump[0]!=$gz)||($status_dump[1]!=$archive))
 			$start = true;
@@ -91,54 +88,88 @@ function exec_export_all_dist()
 			$start = ($status_dump[2]==0)&&($status_dump[3]==0);
 	}
 
-	echo install_debut_html(_T('info_sauvegarde'));
-
-	$file = $dir . $archive;
-	$partfile = $file . ".part";
-
-	//if (!$etape) echo "<p><blockquote><font size=2>"._T('info_sauvegarde_echouee')." <a href='" . generer_url_ecrire("export_all","reinstall=non&etape=1&gz=$gz") . "'>"._T('info_procedez_par_etape')."</a></font></blockquote><p>";
-
-	$_fputs = ($gz) ? gzputs : fputs;
-
 	if ($start){
 		$status_dump = "$gz::$archive::0::0";
 		ecrire_meta("status_dump", "$status_dump",'non');
 		$status_dump = explode("::",$status_dump);
 		ecrire_metas();
-		// un ramassage preventif au cas ou le dernier dump n'aurait pas ete acheve correctement
-		#ramasse_parties(_DIR_DUMP . $archive, $gz, _DIR_DUMP . $partfile);
-		// et au cas ou (le rammase_parties s'arrete si un fichier de la serie est absent)
-		// on ratisse large avec un preg_files
-		$liste = preg_files($file .  ".part\.[0-9]*");
-		foreach($liste as $dummy)
+
+// Au cas ou le dernier dump n'aurait pas ete acheve correctement
+
+		foreach(preg_files($file .  ".part\.[0-9]*") as $dummy)
 			@unlink($dummy);
 
-		echo "<p>"._T("info_sauvegarde")."</p>\n";
-		$f = ($gz) ? gzopen($file, "wb") : fopen($file, "wb");
-		if (!$f) {
-			echo "<p>"._T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'))."</p>\n";
-			exit;
-		}
+		$reprise = '';
+	} else	$reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")";
 
-		$_fputs($f, "<"."?xml version=\"1.0\" encoding=\"".$GLOBALS['meta']['charset']."\"?".">\n<SPIP version=\"$spip_version_affichee\" version_base=\"$spip_version\" version_archive=\"$version_archive\">\n\n");
-		if ($gz) gzclose($f);
-		else fclose($f);
+	echo install_debut_html(_T('info_sauvegarde'));
+	echo "<p>",_T("info_sauvegarde"), $reprise, "</p>\n";
+	$f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab");
+	if (!$f) {
+		echo "<p>",
+		  _T('avis_erreur_sauvegarde', 
+		     array('type'=>'.', 'id_objet'=>'. .')),
+		  "</p>\n";
+	  exit;
 	}
-	else{ // reprise
-		echo "<p>"._T("info_sauvegarde"). " (" . $status_dump[2] . ", " . $status_dump[3] . ")</p>\n";
-		$f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab");
-		if (!$f) {
-			echo "<p>"._T('avis_erreur_sauvegarde', array('type'=>'.', 'id_objet'=>'. .'))."</p>\n";
-			exit;
+
+	$_fputs = ($gz) ? gzputs : fputs;
+	if ($gz) gzclose($f); else fclose($f);
+
+	list($tables_for_dump, $tables_for_link) = export_all_list_tables();
+
+	if ($GLOBALS['flag_ob_flush']) ob_flush();
+	flush();
+
+	$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
+	$etape = $status_dump[2];
+
+	if ($etape < count($tables_for_dump)){
+
+		if (!($timeout = ini_get('max_execution_time')*1000));
+			$timeout = 30000; // parions sur une valeur tellement courante ...
+		if ($start) $timeout = round($timeout/2);
+		// script de rechargement auto sur timeout
+		echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".generer_url_ecrire("export_all","archive=$archive&gz=$gz",true)."\";',$timeout);</script>\n");
+		$cpt = 0;
+		$paquets = 400; // nombre d'enregistrements dans chaque paquet
+		echo "<div style='text-align: left'>\n";
+		foreach($tables_for_dump as $i=>$table){
+			// par paquets
+			list($string,$status_dump)=export_objets($table, primary_index_table($table), $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets);
+			while ($string!=''){
+
+				// on ecrit dans un fichier generique
+				ecrire_fichier ($partfile, $string);
+				// on le renomme avec un numero -> operation atomique en linux
+				rename($partfile,$partfile.".$cpt");
+				$cpt ++;
+				ecrire_meta("status_dump", implode("::",$status_dump),'non');
+				#lire_metas();
+				list($string,$status_dump)=export_objets($table, primary_index_table($table), $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets);
+			}
+			ecrire_meta("status_dump", implode("::",$status_dump),'non');
+			#lire_metas();
 		}
-		if ($gz) gzclose($f);
-		else fclose($f);
+		echo "</div>\n";
 	}
+		
+	// Reunir les fichiers en un seul, mais dans l'espace public
+	// pour avoir les valeurs de _DIR_IMG etc relatif a lui
+	$href = generer_action_auteur("export_all",$archive,'',true);
+
+	echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"$href\";',0);</script>\n");
+	echo install_fin_html();
+
+}
+
+// construction de la liste des tables pour le dump :
+// toutes les tables principales
+// + toutes les tables auxiliaires hors relations
+// + les tables relations dont les deux tables liees sont dans la liste
 
-	// construction de la liste des tables pour le dump :
-	// toutes les tables principales
-	// + toutes les tables auxiliaires hors relations
-	// + les tables relations dont les deux tables liees sont dans la liste
+function export_all_list_tables()
+{
 	$tables_for_dump = array();
 	$tables_pointees = array();
 	global $EXPORT_tables_noexport;
@@ -147,10 +178,10 @@ function exec_export_all_dist()
 	global $table_des_tables;
 	global $tables_jointures;
 
-	// on construit un index des tables de liens
-	// pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees
+// on construit un index des tables de liens
+// pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees
 	$tables_for_link = array();
-	foreach($tables_jointures as $table=>$liste_relations)
+	foreach($tables_jointures as $table => $liste_relations)
 		if (is_array($liste_relations))
 		{
 			$nom = $table;
@@ -170,7 +201,7 @@ function exec_export_all_dist()
 	
 	$liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires));
 	foreach($liste_tables as $table){
-		$name = preg_replace("{^spip_}","",$table);
+	  //		$name = preg_replace("{^spip_}","",$table);
 	  if (		!isset($tables_pointees[$table]) 
 	  		&&	!in_array($table,$EXPORT_tables_noexport) 
 	  		&&	!isset($tables_for_link[$table])){
@@ -189,68 +220,8 @@ function exec_export_all_dist()
 			# que des liens
 			array_unshift($tables_for_dump,$link_table);
 	}
+	return array($tables_for_dump, $tables_for_link);
+}
 
-	if ($GLOBALS['flag_ob_flush']) ob_flush();
-	flush();
-
-	$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
-	$etape = $status_dump[2];
-
-	if ($etape >= count($tables_for_dump)){
-		echo "<ul>\n";
-		foreach($tables_for_dump as $i=>$table){
-			// appel simplement pour l'affichage. Rien n'est fait puisqu'on a fini 
-			export_objets($table, primary_index_table($table), $tables_for_link[$table], 0, false, $i, _T("info_sauvegarde").", $table");
-		}
-		echo "</ul>\n";
-
-		if ($GLOBALS['flag_ob_flush']) ob_flush();
-		flush();
-		ramasse_parties($file, $gz, $partfile);
-
-		$f = ($gz) ? gzopen($file, "ab") : fopen($file, "ab");
-		$_fputs ($f, build_end_tag("SPIP")."\n");
-		if ($gz) gzclose($f);
-		else fclose($f);
-		
-		effacer_meta("status_dump");
-		ecrire_metas();
-		echo "<p><b>"._T('info_sauvegarde_reussi_01')."</b></p><p>"._T('info_sauvegarde_reussi_02', array('archive' => '<b>'.joli_repertoire($file).'</b>'))." <a href='./'>"._T('info_sauvegarde_reussi_03')."</a> "._T('info_sauvegarde_reussi_04')."</p>\n";
-	}
-	else{
-		if (!($timeout = ini_get('max_execution_time')*1000));
-			$timeout = 30000; // parions sur une valeur tellement courante ...
-		if ($start) $timeout = round($timeout/2);
-		// script de rechargement auto sur timeout
-		echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".generer_url_ecrire("export_all","archive=$archive&gz=$gz",true)."\";',$timeout);</script>\n");
-		$cpt = 0;
-		$paquets = 400; // nombre d'enregistrements dans chaque paquet
-		echo "<ul>\n";
-		foreach($tables_for_dump as $i=>$table){
-			// par paquets
-			list($string,$status_dump)=export_objets($table, primary_index_table($table), $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets);
-		  while ($string!=''){
-				if ($cpt == 0)
-					ramasse_parties($file, $gz, $partfile);
-
-				// on ecrit dans un fichier generique
-				ecrire_fichier ($partfile, $string);
-				// on le renomme avec un numero -> operation atomique en linux
-				rename($partfile,$partfile.".$cpt");
-				$cpt ++;
-				ecrire_meta("status_dump", implode("::",$status_dump),'non');
-				#lire_metas();
-				list($string,$status_dump)=export_objets($table, primary_index_table($table), $tables_for_link[$table],0, false, $i, _T("info_sauvegarde").", $table",$paquets);
-			}
-			ecrire_meta("status_dump", implode("::",$status_dump),'non');
-			#lire_metas();
-		}
-		echo "</ul>\n";
-		// pour recharger la page tout de suite en finir le ramassage
-		echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".str_replace("&amp;","&",generer_url_ecrire("export_all","archive=$archive&gz=$gz"))."\";',0);</script>\n");
-	}
-
-	echo install_fin_html();
 
-}
 ?>
diff --git a/ecrire/inc/export.php b/ecrire/inc/export.php
index e2a185c7a2fad0341a62a2bafc7a9de7acd9a5ea..cb6571564f4b5d3b558711f00c95875dc3f14a25 100644
--- a/ecrire/inc/export.php
+++ b/ecrire/inc/export.php
@@ -12,6 +12,8 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
+$GLOBALS['version_archive'] = '1.3';
+
 // http://doc.spip.org/@export_nom_fichier_dump
 function export_nom_fichier_dump($dir,$gz=true){
 	$archive = _SPIP_DUMP;
@@ -29,6 +31,7 @@ function ramasse_parties($archive, $gz, $partfile){
 	// a ameliorer par un preg_file
 	// si le rammassage est interrompu par un timeout, on perd des morceaux
 	$cpt=0;
+	$files = array();
 	while(file_exists($f = $partfile.".$cpt")){
 		$contenu = "";
 		if (lire_fichier ($f, $contenu))
@@ -38,8 +41,10 @@ function ramasse_parties($archive, $gz, $partfile){
 				exit;
 			}
 		unlink($f);
+		$files[]=$f;
 		$cpt++;
 	}
+	return $files;
 }
 
 //
@@ -61,13 +66,12 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_
 		$row = spip_fetch_array($result,SPIP_NUM);
 		$total = $row[0];
 		$debut = $pos_in_table;
-		if (!isset($etape_affichee[$etape_actuelle])){
-			echo "<li><strong>$etape_actuelle-$nom_etape</strong>";
+		if (!isset($etape_affichee[$etape_actuelle]) AND $total){
+			echo "<br /><strong>$etape_actuelle-$nom_etape</strong>";
 			echo " : $total";
 			$etape_affichee[$etape_actuelle] = 1;
-			if ($limit<$total) echo "</li>";
 		}
-		if ($pos_in_table!=0)
+		if ($pos_in_table!=0 AND $total)
 			echo "| ", $pos_in_table;
 		if ($GLOBALS['flag_ob_flush']) ob_flush();
 		flush();
@@ -88,7 +92,7 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_
 
 		if ($pos_in_table>=$total){
 			// etape suivante : 
-			echo " ok";
+			if ($total) echo " ok";
 			$status_dump[2] = $status_dump[2]+1;
 			$status_dump[3] = 0;
 		}
@@ -101,8 +105,8 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_
 		}
 		spip_free_result($result);
 		return array($string,$status_dump);
-	}
-	else if ($etape_actuelle < $etape_en_cours) {
+	} else {
+	if ($etape_actuelle < $etape_en_cours) {
 		if (!isset($etape_affichee[$etape_actuelle]))
 			echo "<li>", $etape_actuelle,'-',$nom_etape,"</li>";
 		if ($GLOBALS['flag_ob_flush']) ob_flush();
@@ -113,6 +117,7 @@ function export_objets($table, $primary, $liens, $file = 0, $gz = false, $etape_
 		if ($GLOBALS['flag_ob_flush']) ob_flush();
 		flush();
 	}
+	}
 	return array($string,$status_dump);
 }
 
@@ -166,4 +171,21 @@ function text_to_xml($string) {
 	return str_replace('<', '&lt;', str_replace('&', '&amp;', $string));
 }
 
+// production de l'entete du fichier d'archive
+
+function export_entete()
+{
+	return
+"<" . "?xml version=\"1.0\" encoding=\"".
+$GLOBALS['meta']['charset']."\"?".">\n" .
+"<SPIP 
+	version=\"" . $GLOBALS['spip_version_affichee'] . "\" 
+	version_base=\"" . $GLOBALS['spip_version'] . "\" 
+	version_archive=\"" . $GLOBALS['version_archive'] . "\"
+	adresse_site=\"" .  $GLOBALS['meta']["adresse_site"] . "\"
+	dir_img=\"" . _DIR_IMG . "\"
+	dir_logos=\"" . _DIR_LOGOS . "\"
+>\n";
+}
+
 ?>