diff --git a/ecrire/action/export_all.php b/ecrire/action/export_all.php
index 25cbcbb6d95d4ca22f7e47d5bdb6008aa1bd5ee0..4a4af12a980953f68ce04aeb057ea28a07be242c 100644
--- a/ecrire/action/export_all.php
+++ b/ecrire/action/export_all.php
@@ -20,7 +20,7 @@ include_spip('inc/minipres');
 function action_export_all_dist()
 {
 	global $connect_toutes_rubriques ;
-	
+
 	$securiser_action = charger_fonction('securiser_action', 'inc');
 	$arg = $securiser_action();
 
@@ -29,31 +29,28 @@ function action_export_all_dist()
 	if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
 		$dir = _DIR_DUMP;
 
-	list($archive, $action) = split('/', $arg);
+	list($quoi, $gz, $archive) = split(',', $arg);
 	
-#	var_dump($file);
-#	var_dump($action);
 	$file =  $dir . $archive;
-#	var_dump($file);
-#die();		
+	spip_log("action $arg $file");
 	include_spip('inc/meta');
-	if ($action=='start'){
-		// ecrire le debut du fichier
+	if ($quoi =='start'){
+		// creer l'en tete du fichier et retourner dans l'espace prive
 		include_spip('inc/export');
-		ecrire_fichier($file, export_entete(),false);
-		
-		lire_metas();
-		$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
-		$gz = $statut_dump[0];
-		// ca demarre
-		ecrire_meta("status_dump", "$gz::$archive::1::0",'non');
-		ecrire_metas();
+		if (ecrire_fichier($file, export_entete(),false)) {
 		
-		// retour a la case depart pour vraiment faire le dump
-		include_spip('inc/headers');
-		redirige_par_entete(_request('redirect'));
-	}
-	elseif($action=='end'){
+		  ecrire_meta("status_dump", "$gz::$archive::1::0",'non');
+		  ecrire_metas();
+		  include_spip('inc/headers');
+		  redirige_par_entete(generer_url_ecrire('export_all'));
+		} else {
+		  echo "<p>",
+		    _T('avis_erreur_sauvegarde', 
+		       array('type'=>'.', 'id_objet'=>'. .')),
+		    "</p>\n";
+		  exit;
+		}
+	}elseif ($quoi=='end'){
 
 		effacer_meta("status_dump");
 		ecrire_metas();
diff --git a/ecrire/exec/export_all.php b/ecrire/exec/export_all.php
index 73bba2faff39f860693f6b99622674958807b272..09e63cca5f0bf8d218064cb5e2d15d2092d79a84 100644
--- a/ecrire/exec/export_all.php
+++ b/ecrire/exec/export_all.php
@@ -59,8 +59,6 @@ $GLOBALS['flag_ob_flush'] = function_exists('ob_flush');
 function exec_export_all_dist()
 {
 	global $connect_toutes_rubriques;
-	$gz = _request('gz');
-	$redirect = generer_url_ecrire("export_all","gz=$gz",true);
 
 	if ($connect_toutes_rubriques AND file_exists(_DIR_DUMP))
 		$dir = _DIR_DUMP;
@@ -71,74 +69,49 @@ function exec_export_all_dist()
 		$dir = preg_replace(",^" . _DIR_RACINE .",", '', $dir);
 		redirige_par_entete(generer_url_action("test_dirs", "test_dir=$dir", true));
 	}
-	
+
 	// utiliser une version fraiche des metas (ie pas le cache)
 	include_spip('inc/meta');
 	lire_metas();
 
-	if (!isset($GLOBALS['meta']["status_dump"])){
-		$start = true;
-	} else{
-		$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
-		$start = ($status_dump[2]==0)&&($status_dump[3]==0);
-		$gz = $status_dump[0];
-		$archive = $status_dump[1];
-	}
-	$file = $dir . $archive;
-
-	if ($start){
+	if (!isset($GLOBALS['meta']["status_dump"])) {
+		$gz = _request('gz');
 		$archive = export_nom_fichier_dump($dir,$gz);
-		$status_dump = "$gz::$archive::0::0";
-		ecrire_meta("status_dump", "$status_dump",'non');
-		$status_dump = explode("::",$status_dump);
-		ecrire_metas();
-
-		// Au cas ou le dernier dump n'aurait pas ete acheve correctement
-		foreach(preg_files($file .  ".part_[0-9]+_[0-9]+") as $dummy)
-			@unlink($dummy);
 
-		$reprise = '';
-		// (provisoire) creer l'en tete du fichier
+		//  creer l'en tete du fichier a partir de l'espace public
 		include_spip('inc/headers');
-		redirige_par_entete(generer_action_auteur("export_all","$archive/start",$redirect,true));
-		//ecrire_fichier($dir.$archive, export_entete(),false,false);
+		redirige_par_entete(generer_action_auteur("export_all", "start,$gz,$archive", '', true));
 	} 
-	else	
-		$reprise = " (" . $status_dump[2] . ", " . $status_dump[3] . ")";
+
+	list($gz, $archive, $etape_actuelle, $sous_etape) = 
+	  explode("::",$GLOBALS['meta']["status_dump"]);
+
+	$file = $dir . $archive;
+	$redirect = generer_url_ecrire("export_all");
+
+	if (!$etape_actuelle AND !$sous_etape) {
+		$l = preg_files($file .  ".part_[0-9]+_[0-9]+");
+		if ($l) {
+			spip_log("menage d'une sauvegarde inachevee: " . join(',', $l));
+			foreach($l as $dummy)@unlink($dummy);
+		}
+	}
 
 	list($tables_for_dump, $tables_for_link) = export_all_list_tables();
 
-	$status_dump = explode("::",$GLOBALS['meta']["status_dump"]);
-	$etape_actuelle = $status_dump[2];
-	$sous_etape = $status_dump[3];
 	$all = count($tables_for_dump);
 
-	// Pour avoir les valeurs de _DIR_IMG etc relatives a l'espace public
-	// la phase finale de reunion des fichiers en un seul est faite la-bas
-	
-	ramasse_parties($dir.$archive, $dir.$archive);
+	// concatenation des fichiers crees a l'appel precedent
+	ramasse_parties($file, $file);
 
-	if ($etape_actuelle > $all){ // au timeout
-		ecrire_fichier($dir.$archive, export_enpied(),false,false);
+	if ($etape_actuelle > $all){ 
+	  // l'appel precedent avait fini le boulot. mettre l'en-pied.
+		ecrire_fichier($file, export_enpied(),false,false);
 		include_spip('inc/headers');
-		redirige_par_entete(generer_action_auteur("export_all","$archive/end",'',true));
+		redirige_par_entete(generer_action_auteur("export_all","end,$gz,$archive",'',true));
 	}
 
 	echo install_debut_html(_T('info_sauvegarde') . " ($all)");
-	$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);
-
-	if ($GLOBALS['flag_ob_flush']) ob_flush();
-	flush();
 
 	if (!($timeout = ini_get('max_execution_time')*1000));
 	$timeout = 30000; // parions sur une valeur tellement courante ...
@@ -146,14 +119,17 @@ function exec_export_all_dist()
 	// script de rechargement auto sur timeout
 	echo ("<script language=\"JavaScript\" type=\"text/javascript\">window.setTimeout('location.href=\"".$redirect."\";',$timeout);</script>\n");
 
+	if ($GLOBALS['flag_ob_flush']) ob_flush();
+	flush();
+
 	echo "<div style='text-align: left'>\n";
 	$etape = 1;
 
 	// Instancier une fois pour toutes, car on va boucler un max.
 	if (isset($GLOBALS['EXPORT_logos']) && $GLOBALS['EXPORT_logos']==true)
 		$GLOBALS['chercher_logo'] = charger_fonction('chercher_logo', 'inc',true);
-	else
-		$GLOBALS['chercher_logo'] = false;
+	else	$GLOBALS['chercher_logo'] = false;
+
 	foreach($tables_for_dump as $table){
 		if ($etape_actuelle <= $etape) {
 		  $r = spip_query("SELECT COUNT(*) FROM $table");
@@ -167,7 +143,11 @@ function exec_export_all_dist()
 		  flush();
 		  $sous_etape = 0;
 		}
-	  $etape++;
+		$etape++;
+		$status_dump = "$gz::$archive::" . $etape . "::0";
+	// on se contente d'une ecriture en base pour aller plus vite
+	// a la relecture on en profitera pour mettre le cache a jour
+		ecrire_meta("status_dump", $status_dump,'non');
 	}
 	echo "</div>\n";
 	// si Javascript est dispo, anticiper le Time-out
diff --git a/ecrire/inc/export.php b/ecrire/inc/export.php
index 67311df955c2c32c7ac8019901fe7f7ce40c3c70..2a7ef7473268e57a4bf37a127ddb06e38ac2ad9b 100644
--- a/ecrire/inc/export.php
+++ b/ecrire/inc/export.php
@@ -74,6 +74,10 @@ function export_objets($table, $etape, $cpt, $dir, $archive, $gz, $total) {
 	while (1){ // on ne connait pas le nb de paquets d'avance
 
 		$string = build_while($debut, $table, $prim);
+		$cpt++;
+		$debut +=  _EXPORT_TRANCHES_LIMITE;
+		$status_dump = "$gz::$archive::$etape::$cpt";
+
 		// attention $string vide ne suffit pas a sortir
 		// car les admins restreints peuvent parcourir
 		// une portion de table vide pour eux.
@@ -81,33 +85,23 @@ function export_objets($table, $etape, $cpt, $dir, $archive, $gz, $total) {
 			// on ecrit dans un fichier generique
 			// puis on le renomme pour avoir une operation atomique 
 			ecrire_fichier ($temp = $filetable . '.temp' . _EXTENSION_PARTIES, $string);
-			// le fichier destination peut deja exister si on sort d'un timeout entre le rename et le ecrire_meta
+	// le fichier destination peut deja exister
+	// si on sort d'un timeout entre le rename et le ecrire_meta
 			if (file_exists($f = $filetable . sprintf('_%04d',$cpt) . _EXTENSION_PARTIES)) @unlink($f);
 			rename($temp, $f);
 		}
-		$cpt++;
-		$status_dump = "$gz::$archive::$etape::$cpt";
 		// on se contente d'une ecriture en base pour aller plus vite
 		// a la relecture on en profitera pour mettre le cache a jour
 		ecrire_meta("status_dump", $status_dump,'non');
-
-		$debut = $cpt * _EXPORT_TRANCHES_LIMITE;
 		if ($debut >= $total) {break;}
 		echo " $debut";
-
 	}
 	echo " $total."; 
 	
 	# on prefere ne pas faire le ramassage ici de peur d'etre interrompu par le timeout au mauvais moment
 	# le ramassage aura lieu en debut de hit suivant, et ne sera normalement pas interrompu car le temps pour ramasser
 	# est plus court que le temps pour creer les parties
-	# ramasse_parties($dir.$archive, $dir.$archive);
-	
-	$status_dump = "$gz::$archive::" . ($etape+1) . "::0";
-	// on se contente d'une ecriture en base pour aller plus vite
-	// a la relecture on en profitera pour mettre le cache a jour
-	ecrire_meta("status_dump", $status_dump,'non');
-
+	// ramasse_parties($dir.$archive, $dir.$archive);
 }
 
 // Construit la version xml  des champs d'une table