diff --git a/.gitattributes b/.gitattributes
index d94bb602f1301dfed408dd630e9e27d2d5818489..6e20957dadf1e454d50a8e055903732e184d9a7e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -392,6 +392,10 @@ ecrire/action/tester_taille.php -text
 ecrire/action/tourner.php -text
 ecrire/action/virtualiser.php -text
 ecrire/balise/index.php -text
+ecrire/base/admin_repair.php -text
+ecrire/base/convert_utf8.php -text
+ecrire/base/delete_all.php -text
+ecrire/base/import_all.php -text
 ecrire/base/index.php -text
 ecrire/charsets/cp1250.php -text
 ecrire/charsets/cp1251.php -text
diff --git a/ecrire/action/purger.php b/ecrire/action/purger.php
index eae598423e6bed41480cbf8321538151feed417e..2a8360f7864b33d76e5f80bc974c226209eba88f 100644
--- a/ecrire/action/purger.php
+++ b/ecrire/action/purger.php
@@ -20,17 +20,19 @@ function action_purger_dist()
 
 	include_spip('inc/invalideur');
 
+	spip_log('purger $arg');
+
 	switch ($arg) {
 
 	case 'index': 
 		include_spip('inc/indexation');
-		spip_log("purger_indx");
 		purger_index();
 		creer_liste_indexation();
 		break;
 
 	case 'cache': 
 		supprime_invalideurs();
+		@unlink(_CACHE_RUBRIQUES);
 		purger_repertoire(_DIR_CACHE);
 		break;
 
@@ -39,7 +41,6 @@ function action_purger_dist()
 		break;
 
 	case 'vignettes':
-		spip_log('vider le cache');
 		purger_repertoire(_DIR_VAR);
 		supprime_invalideurs();
 		purger_repertoire(_DIR_CACHE);
diff --git a/ecrire/base/admin_repair.php b/ecrire/base/admin_repair.php
new file mode 100644
index 0000000000000000000000000000000000000000..c036307ff9e5cec477c8e8fa361f6054ec2ea065
--- /dev/null
+++ b/ecrire/base/admin_repair.php
@@ -0,0 +1,52 @@
+<?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;
+
+// http://doc.spip.org/@verifier_base
+function base_admin_repair_dist() {
+	$res1= spip_query("SHOW TABLES");
+
+	$res = "";
+	if ($res1) { while ($tab = spip_fetch_array($res1,SPIP_NUM)) {
+		$res .= "<p><b>".$tab[0]."</b> ";
+
+		$result_repair = spip_query("REPAIR TABLE ".$tab[0]);
+		if (!$result_repair) return false;
+
+		$result = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM ".$tab[0]));
+		if (!$result) return false;
+
+		$count = $result['n'];
+		if ($count>1)
+			$res .= "("._T('texte_compte_elements', array('count' => $count)).")\n";
+		else if ($count==1)
+			$res .= "("._T('texte_compte_element', array('count' => $count)).")\n";
+		else
+			$res .= "("._T('texte_vide').")\n";
+
+		$row = spip_fetch_array($result_repair,SPIP_NUM);
+		$ok = ($row[3] == 'OK');
+
+		if (!$ok)
+			$res .= "<pre><span style='color: red; font-weight: bold;'>".htmlentities(join("\n", $row))."</span></pre>\n";
+		else
+			$res .= " "._T('texte_table_ok')."<br />\n";
+	  }
+	}
+
+	if (!$res) {
+		$res = "<br /><br /><span style='color: red; font-weight: bold;'><tt>"._T('avis_erreur_mysql').' '.spip_sql_errno().': '.spip_sql_error() ."</tt></span><br /><br /><br />\n";
+	}
+	echo minipres(_T('texte_tentative_recuperation'), $res);
+}
+?>
diff --git a/ecrire/base/convert_utf8.php b/ecrire/base/convert_utf8.php
new file mode 100644
index 0000000000000000000000000000000000000000..cbe9f67e9afc30ceebb684d79ef528cc339382a8
--- /dev/null
+++ b/ecrire/base/convert_utf8.php
@@ -0,0 +1,162 @@
+<?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;
+
+function convert_utf8_init($tables_a_convertir)
+{
+	// noter dans les meta qu'on veut convertir, et quoi
+	$charset_source = $GLOBALS['meta']['charset'];
+	ecrire_meta('charset', 'utf-8');
+	ecrire_metas();
+	foreach ($tables_a_convertir as $table => $champ) {
+		spip_log("demande update charset table $table ($champ)");
+		spip_query("UPDATE $table SET $champ = CONCAT('<CONVERT ".$charset_source.">', $champ)	WHERE $champ NOT LIKE '<CONVERT %'");
+	}
+
+	@unlink(_DIR_TMP.'convert_utf8_backup.sql');
+
+	// convertir spip_meta
+
+	foreach ($GLOBALS['meta'] as $c => $v) {
+		$v2 = unicode_to_utf_8(charset2unicode($v, $charset_source));
+		if ($v2 != $v) ecrire_meta($c, $v2);
+	}
+	ecrire_metas();
+}
+
+function base_convert_utf8_dist($titre, $reprise=false)
+{
+	// poser un verrou (et abandonner si l'action est en cours)
+
+	if (!spip_get_lock('conversion_charset')) {
+		echo minipres(_T('utf8_convert_attendez'));
+		exit;
+	}
+	// une liste des tables a convertir, avec le champ dans lequel on
+	// indique '<CONVERT charset>' ; on commence par les rubriques sinon
+	// ca fait desordre dans l'interface privee
+	$tables_a_convertir = array(
+		'spip_rubriques' => 'titre',
+		'spip_auteurs' => 'nom',
+		'spip_articles' => 'titre',
+		'spip_breves' => 'titre',
+		'spip_documents' => 'titre',
+		'spip_forum' => 'titre',
+		'spip_mots' => 'titre',
+		'spip_groupes_mots' => 'titre',
+		'spip_petitions' => 'texte',
+		'spip_signatures' => 'nom_email',
+		'spip_syndic' => 'nom_site',
+		'spip_syndic_articles' => 'titre',
+		'spip_messages' => 'titre'
+	);
+
+	if (!$reprise) convert_utf8_init($tables_a_convertir);
+
+	echo install_debut_html($titre);
+	
+	echo "<p>", _T('utf8_convert_timeout'), "</p><hr />\n";
+
+	// preparer un fichier de sauvegarde au cas ou
+	// on met 'a' car ca peut demander plusieurs rechargements
+	$f = @fopen(_DIR_TMP.'convert_utf8_backup.sql', 'a');
+
+	foreach ($tables_a_convertir as $table => $champ) {
+		convert_table_utf8($f, $table, $champ);
+	}
+
+	if ($f) fclose($f);
+
+	echo "<p><b>"._T('utf8_convert_termine')."</b></p>";
+	echo "<p>,"._T('utf8_convert_verifier', array('rep' => joli_repertoire(_DIR_TMP))), '</p>';
+
+	// bouton "retour au site" + redirige_par_entete
+	echo "<p style='text-align: right'>",
+	  "<a href='", generer_url_ecrire("config_lang"), "'> &gt;&gt; ",
+	  _T('icone_retour'),"</a></p>",
+	  install_fin_html();
+}
+
+
+function convert_table_utf8($f, $table, $champ)
+{
+	echo "<br /><b>$table</b> &nbsp; ";
+	$s = spip_query("SELECT * FROM $table WHERE $champ LIKE '<CONVERT %'");
+
+	// recuperer 'id_article' (encore un truc a faire dans table_objet)
+	preg_match(',^spip_(.*?)s?$,', $table, $r);
+	$id_champ = 'id_'.$r[1];
+	if ($table == 'spip_petitions') $id_champ = 'id_article';
+	if ($table == 'spip_groupes_mots') $id_champ = 'id_groupe';
+
+	// lire les donnees dans un array
+	while ($t = spip_fetch_array($s, SPIP_ASSOC)) {
+		$query = array();
+		$query_no_convert = '';
+		$query_extra = '';
+		foreach ($t as $c => $v) {
+			if ($c == $champ) {
+				preg_match(',^<CONVERT (.*?)>,', $v, $reg);
+				$v = substr($v, strlen($reg[0]));
+				$charset_source = $reg[1];
+				$query[] = "$c=" . _q($v);
+			} else {
+				if (!is_numeric($v)
+				AND !is_ascii($v)) {
+					// traitement special car donnees serializees
+					if ($c == 'extra') {
+						$query_no_convert .= ", $c="._q($v);
+						$query_extra = convert_extra($v);
+					} else
+						$query[] = "$c=" . _q($v);
+				} else
+					# pour le backup
+					$query_no_convert .= ", $c="._q($v);
+			}
+		}
+
+		$set = join(', ', $query);
+		$where = "$id_champ = ".$t[$id_champ];
+
+		// On l'enregistre telle quelle sur le fichier de sauvegarde
+		if ($f) fwrite($f,
+				"UPDATE $table SET $set$query_no_convert"
+				." WHERE $where;\n"
+			       );
+
+		// Mais on la transcode
+		// en evitant une double conversion
+		if ($charset_source != 'utf-8') {
+			$query = "UPDATE $table SET "
+			. unicode_to_utf_8(charset2unicode($set, $charset_source))
+			. $query_extra
+			. " WHERE $where AND $champ LIKE '<CONVERT %'";
+			#echo $query;
+			spip_query($query);
+			echo '.           '; flush();
+			}
+	}
+	spip_free_result($s);
+}
+
+// stocker le nouvel extra
+// http://doc.spip.org/@convert_extra
+function convert_extra($v) {
+	if ($extra = @unserialize($v)) {
+		foreach ($extra as $key=>$val)
+			$extra[$key] = unicode_to_utf_8(
+			charset2unicode($val, $charset_source));
+			return ", extra="._q(serialize($extra));
+	}
+}
+?>
diff --git a/ecrire/base/delete_all.php b/ecrire/base/delete_all.php
new file mode 100644
index 0000000000000000000000000000000000000000..3c27b78f1c8ca3db4bc8fea7818adfe4a526a461
--- /dev/null
+++ b/ecrire/base/delete_all.php
@@ -0,0 +1,74 @@
+<?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; // securiser
+
+// faudrait plutot recuperer dans inc_serialbase et inc_auxbase
+// mais il faudra prevenir ceux qui affectent les globales qui s'y trouvent
+// Afficher la liste de ce qu'on va detruire et demander confirmation 
+// ca vaudrait mieux
+
+function base_delete_all_dist($titre)
+{
+	spip_query("DROP TABLE spip_articles");
+	spip_query("DROP TABLE spip_auteurs");
+	spip_query("DROP TABLE spip_auteurs_articles");
+	spip_query("DROP TABLE spip_auteurs_messages");
+	spip_query("DROP TABLE spip_auteurs_rubriques");
+	spip_query("DROP TABLE spip_breves");
+	spip_query("DROP TABLE spip_documents");
+	spip_query("DROP TABLE spip_documents_articles");
+	spip_query("DROP TABLE spip_documents_breves");
+	spip_query("DROP TABLE spip_documents_rubriques");
+	spip_query("DROP TABLE spip_forum");
+	spip_query("DROP TABLE spip_groupes_mots");
+	spip_query("DROP TABLE spip_index");
+	spip_query("DROP TABLE spip_index_dico");
+	spip_query("DROP TABLE spip_messages");
+	spip_query("DROP TABLE spip_meta");
+	spip_query("DROP TABLE spip_mots");
+	spip_query("DROP TABLE spip_mots_articles");
+	spip_query("DROP TABLE spip_mots_breves");
+	spip_query("DROP TABLE spip_mots_forum");
+	spip_query("DROP TABLE spip_mots_rubriques");
+	spip_query("DROP TABLE spip_mots_syndic");
+	spip_query("DROP TABLE spip_petitions");
+	spip_query("DROP TABLE spip_referers");
+	spip_query("DROP TABLE spip_referers_articles");
+	spip_query("DROP TABLE spip_rubriques");
+	spip_query("DROP TABLE spip_signatures");
+	spip_query("DROP TABLE spip_syndic");
+	spip_query("DROP TABLE spip_syndic_articles");
+	spip_query("DROP TABLE spip_types_documents");
+	spip_query("DROP TABLE spip_visites");
+	spip_query("DROP TABLE spip_visites_articles");
+	spip_query("DROP TABLE spip_caches");
+	spip_query("DROP TABLE spip_mots_documents");
+	spip_query("DROP TABLE spip_ortho_cache");
+	spip_query("DROP TABLE spip_ortho_dico");
+	spip_query("DROP TABLE spip_versions");
+	spip_query("DROP TABLE spip_versions_fragments");
+
+	// Trois tables pas necessairement la: pas de faux messages d'erreur
+	spip_log("tes index_table et forum_cache");
+	@spip_query("DROP TABLE spip_test");
+	@spip_query("DROP TABLE spip_index_table");
+	@spip_query("DROP TABLE spip_forum_cache");
+
+// un pipeline pour detruire les tables installees par les plugins
+	pipeline('delete_tables', '');
+
+	@unlink(_ACCESS_FILE_NAME);
+	@unlink(_FILE_CONNECT);
+	spip_log("destruction operee redirige vers " . _request('redirect'));
+}
+?>
diff --git a/ecrire/base/import_all.php b/ecrire/base/import_all.php
new file mode 100644
index 0000000000000000000000000000000000000000..78750de2527eda7a6774d543f41b1f30b4ada1eb
--- /dev/null
+++ b/ecrire/base/import_all.php
@@ -0,0 +1,129 @@
+<?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('base/serial');
+include_spip('base/auxiliaires');
+
+// par defaut tout est importe sauf les tables ci-dessous
+// possibiliter de definir cela tables via la meta
+global $IMPORT_tables_noimport;
+if (isset($GLOBALS['meta']['IMPORT_tables_noimport']))
+	$IMPORT_tables_noimport = unserialize($GLOBALS['meta']['IMPORT_tables_noimport']);
+else{
+	include_spip('inc/meta');
+	$IMPORT_tables_noimport[]='spip_caches';
+	ecrire_meta('IMPORT_tables_noimport',serialize($IMPORT_tables_noimport),'non');
+	ecrire_metas();
+}
+
+// NB: Ce fichier peut ajouter des tables (old-style)
+// donc il faut l'inclure "en globals"
+if ($f = include_spip('mes_fonctions', false)) {
+	global $dossier_squelettes;
+	@include_once ($f); 
+}
+
+// http://doc.spip.org/@import_charge_version
+function import_charge_version($version_archive)
+{
+	if (preg_match("{^phpmyadmin::}is",$version_archive)){
+		$fimport = 'import_1_3'; 
+	} else 	$fimport = 'import_' . str_replace('.','_',$version_archive);
+
+	return  charger_fonction($fimport, 'inc', true);
+}
+
+function base_import_all_dist($titre, $reprise=false)
+{
+	if (!$reprise) import_all_debut();
+
+	$request = unserialize($GLOBALS['meta']['import_all']);
+	// au rappel, on commence (voire on continue)
+	@ini_set("zlib.output_compression","0"); // pour permettre l'affichage au fur et a mesure
+	// utiliser une version fraiche des metas (ie pas le cache)
+	include_spip('inc/meta');
+	lire_metas();
+	include_spip('inc/import');
+	@ignore_user_abort(1);
+
+	$commencer_page = charger_fonction('commencer_page', 'inc');
+	echo $commencer_page($titre, "accueil", "accueil");
+
+	debut_gauche();
+
+	debut_droite();
+	
+	// precaution inutile I think (esj)
+	list($my_date) = spip_fetch_array(spip_query("SELECT UNIX_TIMESTAMP(maj) AS d FROM spip_meta WHERE nom='import_all'"), SPIP_NUM);
+
+	$res = $my_date ? import_all_milieu($request) : '';
+
+	echo $res, "</body></html>\n";
+
+	if ($request['insertion'] == 'on' AND !$res) {
+			$request['insertion'] = 'passe2';
+			if ($request['url_site']
+			AND substr($request['url_site'],-1) != '/')
+				$request['url_site'] .= '/';
+			ecrire_meta("import_all", serialize($request),'non');
+			import_all_debut();
+			$res = import_all_milieu($request);
+	}
+ 
+	if ($charset = $GLOBALS['meta']['charset_restauration']) {
+			ecrire_meta('charset', $charset);
+			ecrire_metas();
+	}
+
+	detruit_restaurateur();
+	import_all_fin($request);
+	include_spip('inc/rubriques');
+	calculer_rubriques();
+
+	if (!$res) ecrire_acces();	// Mise a jour du fichier htpasswd
+}
+
+// http://doc.spip.org/@import_all_milieu
+function import_all_milieu($request)
+{
+	global $trans;
+	if ($request['insertion'] == 'passe2') {
+		include_spip('inc/import_insere');
+		$trans = translate_init($request);
+	} else $trans = array();
+
+	return import_tables($request, $request['dir']);
+}
+
+// http://doc.spip.org/@import_all_debut
+function import_all_debut() {
+	ecrire_meta("status_restauration", "0",'non');
+	ecrire_metas();
+}
+
+// http://doc.spip.org/@import_all_fin
+function import_all_fin($request) {
+
+	effacer_meta("charset_restauration");
+	effacer_meta("charset_insertion");
+	effacer_meta("status_restauration");
+	effacer_meta("date_optimisation");
+	effacer_meta('version_archive_restauration');
+	effacer_meta('tag_archive_restauration');
+	ecrire_metas();
+	if ($request['insertion'] == 'passe2') 
+		spip_query("DROP TABLE spip_translate");
+	 
+}
+?>
diff --git a/ecrire/base/upgrade.php b/ecrire/base/upgrade.php
index c143aafce991157b1ddd502e650a17da166cb783..1a73e8ba15b979263ceca96ef9544ca786ce1996 100644
--- a/ecrire/base/upgrade.php
+++ b/ecrire/base/upgrade.php
@@ -13,6 +13,19 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
+function base_upgrade_dist($titre)
+{
+	include_spip('base/create');
+	creer_base();
+	maj_base();
+
+	include_spip('inc/acces');
+	include_spip('inc/config');
+	include_spip('inc/lang');
+	ecrire_acces();
+	init_config();
+}
+
 // http://doc.spip.org/@maj_version
 function maj_version ($version, $test = true) {
 	if ($test) {
diff --git a/ecrire/exec/admin_repair.php b/ecrire/exec/admin_repair.php
index a7d3e8f941113959823c2fe9f05d66960d9fcd55..d2986b4b12b1365758399228453f031ae292f846 100644
--- a/ecrire/exec/admin_repair.php
+++ b/ecrire/exec/admin_repair.php
@@ -21,48 +21,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
  */
 
 $GLOBALS['connect_statut'] = '0minirezo';
-
-include_spip('inc/admin');
-include_spip('inc/texte');
-
+$GLOBALS['connect_toutes_rubriques']= true;
 include_spip('base/db_mysql');
 
-// http://doc.spip.org/@verifier_base
-function verifier_base() {
-	$res1= spip_query("SHOW TABLES");
-	if (!$res1) return false;
-
-	$res = "";
-	while ($tab = spip_fetch_array($res1,SPIP_NUM)) {
-		$res .= "<p><b>".$tab[0]."</b> ";
-
-		$result_repair = spip_query("REPAIR TABLE ".$tab[0]);
-		if (!$result_repair) return false;
-
-		$result = spip_fetch_array(spip_query("SELECT COUNT(*) AS n FROM ".$tab[0]));
-		if (!$result) return false;
-
-		$count = $result['n'];
-		if ($count>1)
-			$res .= "("._T('texte_compte_elements', array('count' => $count)).")\n";
-		else if ($count==1)
-			$res .= "("._T('texte_compte_element', array('count' => $count)).")\n";
-		else
-			$res .= "("._T('texte_vide').")\n";
-
-		$row = spip_fetch_array($result_repair,SPIP_NUM);
-		$ok = ($row[3] == 'OK');
-
-		if (!$ok)
-			$res .= "<pre><span style='color: red; font-weight: bold;'>".htmlentities(join("\n", $row))."</span></pre>\n";
-		else
-			$res .= " "._T('texte_table_ok')."<br />\n";
-
-	}
-
-	return $res;
-}
-
 // http://doc.spip.org/@exec_admin_repair_dist
 function exec_admin_repair_dist()
 {
@@ -82,15 +43,12 @@ function exec_admin_repair_dist()
 	$action = _T('texte_tenter_reparation');
 
 	if ($ok) {
-		debut_admin("admin_repair", $action, $message);
-
-		if (! $res = verifier_base())
-			$res = "<br /><br /><span style='color: red; font-weight: bold;'><tt>"._T('avis_erreur_mysql').' '.spip_sql_errno().': '.spip_sql_error() ."</tt></span><br /><br /><br />\n";
-		fin_admin($action);
-		echo minipres(_T('texte_tentative_recuperation'), $res);
+		$admin = charger_fonction('admin', 'inc');
+		$admin('admin_repair', $action, $message);
 	}
 	else {
 	  echo minipres(_T('titre_reparation'), "<p>$message</p>");
+	  exit;
 	}
 }
 ?>
diff --git a/ecrire/exec/convert_utf8.php b/ecrire/exec/convert_utf8.php
index ab84478837db54793b796edb272626e12e0f7eba..421f8f6fa579e54d2f4dbff99b9fbc3ed0292182 100644
--- a/ecrire/exec/convert_utf8.php
+++ b/ecrire/exec/convert_utf8.php
@@ -12,207 +12,51 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
+// En cas d'erreur, une page admin normale avec bouton de retour
 
-include_spip('inc/admin');
+function convert_utf8_non($action, $message) {
 
-
-// http://doc.spip.org/@demander_conversion
-function demander_conversion($tables_a_convertir, $action) {
-	global $spip_lang_right;
-
-	$charset_orig = $GLOBALS['meta']['charset'];
-
-	// tester si le charset d'origine est connu de spip
-	if (!load_charset($charset_orig))
-		$message = _T('utf8_convert_erreur_orig', array('charset' => "<b>".$charset_orig."</b>"));
-
-	// ne pas convertir si deja utf8
-	else if ($charset_orig == 'utf-8')
-		$message = _T('utf8_convert_erreur_deja',
-			array('charset' => $charset_orig)
-		);
-
-	else {
-		$commentaire = _T('utf8_convert_avertissement',
-			array('orig' => $charset_orig,
-				'charset' => 'utf-8')
-		);
-		$commentaire .=  "<p><small>"
-		. http_img_pack('warning.gif', _T('info_avertissement'), "style='width: 48px; height: 48px; float: right;margin: 10px;'");
-		$commentaire .= _T('utf8_convert_backup', array('charset' => 'utf-8'))
-		."</small>";
-		$commentaire .= '<p>'._T('utf8_convert_timeout');
-		$commentaire .= "<hr />\n";
-
-		debut_admin("convert_utf8", $action, $commentaire);
-
-		// noter dans les meta qu'on veut convertir
-		ecrire_meta('conversion_charset', $charset_orig);
-		ecrire_meta('charset', 'utf-8');
-		ecrire_metas();
-		foreach ($tables_a_convertir as $table => $champ) {
-			spip_log("demande update charset table $table ($champ)");
-			spip_query("UPDATE $table SET $champ = CONCAT('<CONVERT ".$charset_orig.">', $champ)	WHERE $champ NOT LIKE '<CONVERT %'");
-		}
-		return;
-	}
-
-	// Ici en cas d'erreur, une page admin normale avec bouton de retour
-	echo minipres($action, ('<p>'.$message. "</p><p align='right'> <a href='" . generer_url_ecrire("config_lang"). "'> &gt;&gt; "._T('icone_retour')."</a>"));
+	echo minipres($action, ('<p>'.$message. "</p>\n<p style='text-align: right'><a href='" . generer_url_ecrire("config_lang"). "'> &gt;&gt; "._T('icone_retour')."</a>"));
 	exit;
 }
 
-// stocker le nouvel extra
-// http://doc.spip.org/@convert_extra
-function convert_extra($v) {
-	if ($extra = @unserialize($v)) {
-		foreach ($extra as $key=>$val)
-			$extra[$key] = unicode_to_utf_8(
-			charset2unicode($val, $charset_source));
-			return ", extra="._q(serialize($extra));
-	}
-}
-
-
 // http://doc.spip.org/@exec_convert_utf8_dist
 function exec_convert_utf8_dist() {
 	include_spip('inc/meta');
 	include_spip('inc/charsets');
 	lire_metas();
 
-	// une liste des tables a convertir, avec le champ dans lequel on
-	// indique '<CONVERT charset>' ; on commence par les rubriques sinon
-	// ca fait desordre dans l'interface privee
-	$tables_a_convertir = array(
-		'spip_rubriques' => 'titre',
-		'spip_auteurs' => 'nom',
-		'spip_articles' => 'titre',
-		'spip_breves' => 'titre',
-		'spip_documents' => 'titre',
-		'spip_forum' => 'titre',
-		'spip_mots' => 'titre',
-		'spip_groupes_mots' => 'titre',
-		'spip_petitions' => 'texte',
-		'spip_signatures' => 'nom_email',
-		'spip_syndic' => 'nom_site',
-		'spip_syndic_articles' => 'titre',
-		'spip_messages' => 'titre'
-	);
-
 	// Definir le titre de la page (et le nom du fichier admin)
 	$action = _T('utf8_convertir_votre_site');
 
-	// si l'appel est explicite, passer par l'authentification ftp
-	if (!$GLOBALS['meta']['conversion_charset']) {
-		demander_conversion($tables_a_convertir, $action);
-
-		// si on est la c'est que l'autorisation ftp vient d'etre donnee
-		@unlink(_DIR_TMP.'convert_utf8_backup.sql');
-
-		// convertir spip_meta
-		$charset_source = $GLOBALS['meta']['conversion_charset'];
-		foreach ($GLOBALS['meta'] as $c => $v) {
-			$v2 = unicode_to_utf_8(charset2unicode($v, $charset_source));
-			if ($v2 != $v)
-				ecrire_meta($c, $v2);
-		}
-		ecrire_metas();
-	}
-
-	// commencer (ou continuer apres un timeout et reload)
-
-	echo install_debut_html($action);
-	
-	echo "<p>" . _T('utf8_convert_timeout') . "<hr />\n";
-
-	if (!spip_get_lock('conversion_charset')) {
-		echo minipres(_T('utf8_convert_attendez'));
-		exit;
-	}
-
-	// preparer un fichier de sauvegarde au cas ou
-	// on met 'a' car ca peut demander plusieurs rechargements
-	$f = @fopen(_DIR_TMP.'convert_utf8_backup.sql', 'a');
-
+	// si meta deja la, c'est une reprise apres timeout.
+	if ($GLOBALS['meta']['convert_utf8']) {
+		$base = charger_fonction('convert_utf8', 'base');
+		$base($action, true);
+	} else {
+		$charset_orig =	$GLOBALS['meta']['charset'];
+		// tester si le charset d'origine est connu de spip
+		if (!load_charset($charset_orig))
+			convert_utf8_non($action,
+					  _T('utf8_convert_erreur_orig', array('charset' => "<b>".$charset_orig."</b>")));
+
+		// ne pas convertir si deja utf8
+		else if ($charset_orig == 'utf-8')
+			convert_utf8_non($action,
+					  _T('utf8_convert_erreur_deja',
+					     array('charset' => $charset_orig)));
 
-	foreach ($tables_a_convertir as $table => $champ) {
-		echo "<br /><b>$table</b> &nbsp; ";
-		$s = spip_query("SELECT * FROM $table WHERE $champ LIKE '<CONVERT %'");
-
-		// recuperer 'id_article' (encore un truc a faire dans table_objet)
-		preg_match(',^spip_(.*?)s?$,', $table, $r);
-		$id_champ = 'id_'.$r[1];
-		if ($table == 'spip_petitions') $id_champ = 'id_article';
-		if ($table == 'spip_groupes_mots') $id_champ = 'id_groupe';
-
-		// lire les donnees dans un array
-		while ($t = spip_fetch_array($s, SPIP_ASSOC)) {
-			$query = array();
-			$query_no_convert = '';
-			$query_extra = '';
-			foreach ($t as $c => $v) {
-				if ($c == $champ) {
-					preg_match(',^<CONVERT (.*?)>,', $v, $reg);
-					$v = substr($v, strlen($reg[0]));
-					$charset_source = $reg[1];
-					$query[] = "$c=" . _q($v);
-				} else {
-					if (!is_numeric($v)
-					AND !is_ascii($v)) {
-						// traitement special car donnees serializees
-						if ($c == 'extra') {
-							$query_no_convert .= ", $c="._q($v);
-							$query_extra = convert_extra($v);
-						} else
-							$query[] = "$c=" . _q($v);
-					} else
-						# pour le backup
-						$query_no_convert .= ", $c="._q($v);
-				}
-			}
-
-			$set = join(', ', $query);
-			$where = "$id_champ = ".$t[$id_champ];
-
-			// On l'enregistre telle quelle sur le fichier de sauvegarde
-			if ($f) fwrite($f,
-				"UPDATE $table SET $set$query_no_convert"
-				." WHERE $where;\n"
-			);
-
-			// Mais on la transcode
-			// en evitant une double conversion
-			if ($charset_source != 'utf-8') {
-				$query = "UPDATE $table SET "
-				. unicode_to_utf_8(charset2unicode($set, $charset_source))
-				. $query_extra
-				. " WHERE $where AND $champ LIKE '<CONVERT %'";
-				#echo $query;
-				spip_query($query);
-				echo '.           '; flush();
+		$commentaire = _T('utf8_convert_avertissement',
+			array('orig' => $charset_orig,'charset' => 'utf-8'));
+		$commentaire .=  "<p><small>"
+		. http_img_pack('warning.gif', _T('info_avertissement'), "style='width: 48px; height: 48px; float: right;margin: 10px;'");
+		$commentaire .= _T('utf8_convert_backup', array('charset' => 'utf-8'))
+		."</small>";
+		$commentaire .= '<p>'._T('utf8_convert_timeout');
+		$commentaire .= "<hr />\n";
 
-			}
-		}
-		spip_free_result($s);
+		$admin = charger_fonction('admin', 'inc');
+		$admin('convert_utf8', $action, $commentaire);
 	}
-
-	if ($f) fclose($f);
-
-	echo "<p><b>"._T('utf8_convert_termine')."</b>";
-	echo "<p> "._T('utf8_convert_verifier', array('rep' => joli_repertoire(_DIR_TMP)));
-	effacer_meta('conversion_charset');
-	ecrire_metas();
-
-	// C'est fini, supprimer le fichier autorisant les modifs
-	fin_admin($action);
-	
-	include_spip('inc/headers');
-	// bouton "retour au site" + redirige_par_entete
-	echo "<p align='right'> <a href='" . generer_url_ecrire("config_lang")
-	. "'> &gt;&gt; "._T('icone_retour')."</a>";
-
-	echo install_fin_html();
 }
-
-
 ?>
diff --git a/ecrire/exec/delete_all.php b/ecrire/exec/delete_all.php
index 9ef900635d61b5a466a13b92e68e478f1443e5e4..0f2cb84dc91e973c56183818128e5d2d5763d6a0 100644
--- a/ecrire/exec/delete_all.php
+++ b/ecrire/exec/delete_all.php
@@ -12,72 +12,11 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/admin');
-
 // http://doc.spip.org/@exec_delete_all_dist
 function exec_delete_all_dist()
 {
-$action = _T('titre_page_delete_all');
-
- debut_admin("delete_all", $action);
-
-// faudrait plutot recuperer dans inc_serialbase et inc_auxbase
-// mais il faudra prevenir ceux qui affectent les globales qui s'y trouvent
-// Afficher la liste de ce qu'on va detruire et demander confirmation 
-// ca vaudrait mieux
-
-spip_query("DROP TABLE spip_articles");
-spip_query("DROP TABLE spip_auteurs");
-spip_query("DROP TABLE spip_auteurs_articles");
-spip_query("DROP TABLE spip_auteurs_messages");
-spip_query("DROP TABLE spip_auteurs_rubriques");
-spip_query("DROP TABLE spip_breves");
-spip_query("DROP TABLE spip_documents");
-spip_query("DROP TABLE spip_documents_articles");
-spip_query("DROP TABLE spip_documents_breves");
-spip_query("DROP TABLE spip_documents_rubriques");
-spip_query("DROP TABLE spip_forum");
-spip_query("DROP TABLE spip_forum_cache");
-spip_query("DROP TABLE spip_groupes_mots");
-spip_query("DROP TABLE spip_index");
-spip_query("DROP TABLE spip_index_table");
-spip_query("DROP TABLE spip_index_dico");
-spip_query("DROP TABLE spip_messages");
-spip_query("DROP TABLE spip_meta");
-spip_query("DROP TABLE spip_mots");
-spip_query("DROP TABLE spip_mots_articles");
-spip_query("DROP TABLE spip_mots_breves");
-spip_query("DROP TABLE spip_mots_forum");
-spip_query("DROP TABLE spip_mots_rubriques");
-spip_query("DROP TABLE spip_mots_syndic");
-spip_query("DROP TABLE spip_petitions");
-spip_query("DROP TABLE spip_referers");
-spip_query("DROP TABLE spip_referers_articles");
-spip_query("DROP TABLE spip_rubriques");
-spip_query("DROP TABLE spip_signatures");
-spip_query("DROP TABLE spip_syndic");
-spip_query("DROP TABLE spip_syndic_articles");
-spip_query("DROP TABLE spip_types_documents");
-spip_query("DROP TABLE spip_visites");
-spip_query("DROP TABLE spip_visites_articles");
-spip_query("DROP TABLE spip_test");
-spip_query("DROP TABLE spip_caches");
-spip_query("DROP TABLE spip_mots_documents");
-spip_query("DROP TABLE spip_ortho_cache");
-spip_query("DROP TABLE spip_ortho_dico");
-spip_query("DROP TABLE spip_versions");
-spip_query("DROP TABLE spip_versions_fragments");
-
-
-// un pipeline pour DROP les tables installees par les plugins
-pipeline('delete_tables', '');
-
-@unlink(_ACCESS_FILE_NAME);
-@unlink(_FILE_CONNECT);
-
-@header("Location: ./");
-
-fin_admin($action);
+	$r = generer_url_ecrire('install','',true);
+	$admin = charger_fonction('admin', 'inc');
+	$admin('delete_all', _T('titre_page_delete_all'), '', $r);
 }
-
 ?>
diff --git a/ecrire/exec/import_all.php b/ecrire/exec/import_all.php
index f6392f5dd74dc81edb1dc58ef6e2d3695f08a876..5abdb3b6ee41d9cab0f897d528cbea11cf4b7405 100644
--- a/ecrire/exec/import_all.php
+++ b/ecrire/exec/import_all.php
@@ -12,173 +12,37 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-include_spip('inc/admin');
-include_spip('base/serial');
-include_spip('base/auxiliaires');
+include_spip('inc/headers');
 
-// par defaut tout est importe sauf les tables ci-dessous
-// possibiliter de definir cela tables via la meta
-global $IMPORT_tables_noimport;
-if (isset($GLOBALS['meta']['IMPORT_tables_noimport']))
-	$IMPORT_tables_noimport = unserialize($GLOBALS['meta']['IMPORT_tables_noimport']);
-else{
-	include_spip('inc/meta');
-	$IMPORT_tables_noimport[]='spip_caches';
-	ecrire_meta('IMPORT_tables_noimport',serialize($IMPORT_tables_noimport),'non');
-	ecrire_metas();
-}
-
-// NB: Ce fichier peut ajouter des tables (old-style)
-// donc il faut l'inclure "en globals"
-if ($f = include_spip('mes_fonctions', false)) {
-	global $dossier_squelettes;
-	@include_once ($f); 
-}
-
-// http://doc.spip.org/@verifier_sauvegarde
-function verifier_sauvegarde ($archive, $dir) {
-	global $spip_version;
-
-	$g = preg_match(",\.gz$,", $archive);
-	$_fopen = ($g) ? gzopen : fopen;
-	$_fread = ($g) ? gzread : fread;
-	$buf_len = 1024; // la version doit etre dans le premier ko
-	$g = $dir . $archive;
-
-	if (!(@file_exists($g) AND $f = $_fopen($g, "rb")))
-		return _T('avis_probleme_archive', array('archive' => $g));
-
-	$buf = $_fread($f, $buf_len);
-
-	if (preg_match('/<SPIP\s+[^>]*version_base="([0-9.]+)"[^>]*version_archive="([^"]+)"/', $buf, $regs)
-	AND $regs[1] == $spip_version
-	AND import_charge_version($regs[2], 'inc', true))
-		return false; // c'est bon
-
-	return _T('avis_erreur_version_archive', array('archive' => $archive));
-}
-
-// http://doc.spip.org/@import_charge_version
-function import_charge_version($version_archive)
-{
-	if (preg_match("{^phpmyadmin::}is",$version_archive)){
-		$fimport = 'import_1_3'; 
-	} else 	$fimport = 'import_' . str_replace('.','_',$version_archive);
-
-	return  charger_fonction($fimport, 'inc', true);
-}
+// Restauration d'une base. Comme ca peut etre interrompu pour cause
+// de Timeout, un javascript relance automatiquement (cf inc/import.php)
+// Comme il peut relancer une action qui vient de se terminer,
+// il faut ignorer son appel si la meta indiquant l'action en cours 
+// est absente.
 
 // http://doc.spip.org/@exec_import_all_dist
 function exec_import_all_dist()
 {
-	$dir = import_queldir();
-
-	// si l'appel est explicite, 
-	// passer par l'authentification ftp et attendre d'etre rappele
-	if (!$GLOBALS['meta']["debut_restauration"]) {
-		$archive=_request('archive');
-		$insertion=_request('insertion');
-		if (!strlen($archive)) $archive=_request('archive_perso');
-		if ($archive) {
-			$action = _T('info_restauration_sauvegarde', array('archive' => $archive));
-			$commentaire = verifier_sauvegarde($archive, $dir);
-		}
-
-		// au tout premier appel, on ne revient pas de debut_admin
-
-		debut_admin("import_all", $action, $commentaire);
-
-		// si on est revenu c'est que l'authentification ftp est ok
-		// sinon il reste le meta request_restau; a ameliorer.
-		fin_admin($action);
-		import_all_debut($_REQUEST);
-		$request = $_REQUEST;
-	} else $request = unserialize($GLOBALS['meta']['request_restauration']);
-	// au rappel, on commence (voire on continue)
-	@ini_set("zlib.output_compression","0"); // pour permettre l'affichage au fur et a mesure
-	// utiliser une version fraiche des metas (ie pas le cache)
-	include_spip('inc/meta');
-	lire_metas();
-	include_spip('inc/import');
-	@ignore_user_abort(1);
-
-	$commencer_page = charger_fonction('commencer_page', 'inc');
-	echo $commencer_page(_T('titre_page_index'), "accueil", "accueil");
-
-	debut_gauche();
-
-	debut_droite();
-	
-	// precaution inutile I think (esj)
-	list($my_date) = spip_fetch_array(spip_query("SELECT UNIX_TIMESTAMP(maj) AS d FROM spip_meta WHERE nom='debut_restauration'"), SPIP_NUM);
-
-	$res = $my_date ? import_all_milieu($request, $dir) : '';
-
-	echo $res, "</body></html>\n";
-
-	if ($request['insertion'] == 'on' AND !$res) {
-			$request['insertion'] = 'passe2';
-			if ($request['url_site']
-			AND substr($request['url_site'],-1) != '/')
-				$request['url_site'] .= '/';
-			import_all_debut($request);
-			$res = import_all_milieu($request, $dir);
-	}
- 
-	if ($charset = $GLOBALS['meta']['charset_restauration']) {
-			ecrire_meta('charset', $charset);
-			ecrire_metas();
-	}
-
-	detruit_restaurateur();
-	import_all_fin($request);
-	include_spip('inc/rubriques');
-	calculer_rubriques();
-
-	if (!$res) ecrire_acces();	// Mise a jour du fichier htpasswd
-}
-
-// http://doc.spip.org/@import_all_milieu
-function import_all_milieu($request, $dir)
-{
-	global $trans;
-	if ($request['insertion'] == 'passe2') {
-		include_spip('inc/import_insere');
-		$trans = translate_init($request);
-	} else $trans = array();
-
-	return import_tables($request, $dir);
-}
-
-// http://doc.spip.org/@import_all_debut
-function import_all_debut($request) {
-	ecrire_meta("request_restauration", serialize($request),'non');
-	ecrire_meta("debut_restauration", "debut",'non');
-	ecrire_meta("status_restauration", "0",'non');
-	ecrire_metas();
+	$archive=_request('archive');
+	if (!strlen($archive)) $archive=_request('archive_perso');
+	if ($archive) {
+			$dir = import_queldir();
+			$_POST['dir'] = $dir;
+			$commentaire = verifier_sauvegarde($dir . $archive);
+	} elseif (!isset($GLOBALS['meta']['import_all']))
+			redirige_par_entete(generer_url_ecrire('accueil'));
+	else $commentaire ='';
+	$action = _T('info_restauration_sauvegarde', 
+		     array('archive' => $archive));
+	$admin = charger_fonction('admin', 'inc');
+	$admin('import_all', $action, $commentaire);
 }
 
-// http://doc.spip.org/@import_all_fin
-function import_all_fin($request) {
-
-	effacer_meta("charset_restauration");
-	effacer_meta("charset_insertion");
-	effacer_meta("status_restauration");
-	effacer_meta("debut_restauration");
-	effacer_meta("date_optimisation");
-	effacer_meta('request_restauration');
-	effacer_meta('version_archive_restauration');
-	effacer_meta('tag_archive_restauration');
-	ecrire_metas();
-	if ($request['insertion'] == 'passe2') 
-		spip_query("DROP TABLE spip_translate");
-	 
-}
 
 // http://doc.spip.org/@import_queldir
 function import_queldir()
 {
-  global $connect_toutes_rubriques, $connect_login;
+	global $connect_toutes_rubriques, $connect_login;
 
 	if ($connect_toutes_rubriques) {
 		$repertoire = _DIR_DUMP;
@@ -196,4 +60,28 @@ function import_queldir()
 		return sous_repertoire($repertoire, $connect_login);
 	}
 }
+
+
+// http://doc.spip.org/@verifier_sauvegarde
+function verifier_sauvegarde ($archive) {
+	global $spip_version;
+
+	$g = preg_match(",\.gz$,", $archive);
+	$_fopen = ($g) ? gzopen : fopen;
+	$_fread = ($g) ? gzread : fread;
+	$buf_len = 1024; // la version doit etre dans le premier ko
+
+	if (!(@file_exists($archive) AND $f = $_fopen($archive, "rb")))
+		return _T('avis_probleme_archive', array('archive' => $archive));
+
+	$buf = $_fread($f, $buf_len);
+
+	if (preg_match('/<SPIP\s+[^>]*version_base="([0-9.]+)"[^>]*version_archive="([^"]+)"/', $buf, $regs)
+	AND $regs[1] == $spip_version
+	AND import_charge_version($regs[2], 'inc', true))
+		return ''; // c'est bon
+
+	return _T('avis_erreur_version_archive', 
+		  array('archive' => str_replace('/', ' / ', $archive)));
+}
 ?>
diff --git a/ecrire/exec/menu_rubriques.php b/ecrire/exec/menu_rubriques.php
index 783a3558a39cdd30d847c29d8dbe5565e1573a22..ff6147568f950d39efe8faf92fafd349529c81f1 100644
--- a/ecrire/exec/menu_rubriques.php
+++ b/ecrire/exec/menu_rubriques.php
@@ -147,7 +147,7 @@ function extraire_article($id_p) {
 function gen_liste_rubriques() {
 
 	// ici, un petit fichier cache ne fait pas de mal
-	if (lire_fichier(_DIR_TMP.'cache-menu-rubriques.txt', $cache)
+	if (lire_fichier(_CACHE_RUBRIQUES, $cache)
 	AND list($date,$GLOBALS['db_art_cache']) = @unserialize($cache)
 	AND $date == $GLOBALS['meta']["date_calcul_rubriques"])
 		return; // c'etait en cache :-)
@@ -172,7 +172,7 @@ function gen_liste_rubriques() {
 	}
 
 	// ecrire dans le cache
-	ecrire_fichier(_DIR_TMP.'cache-menu-rubriques.txt',
+	ecrire_fichier(_CACHE_RUBRIQUES,
 		serialize(array(
 			$GLOBALS['meta']["date_calcul_rubriques"],
 			$GLOBALS['db_art_cache']
diff --git a/ecrire/exec/upgrade.php b/ecrire/exec/upgrade.php
index 9b712fc91367122cd1f7bae1fbb67c5c93f9fd72..9a60684436b47bf8fb3d4d8813860273860aa07f 100644
--- a/ecrire/exec/upgrade.php
+++ b/ecrire/exec/upgrade.php
@@ -18,13 +18,13 @@ include_spip('inc/headers');
 // http://doc.spip.org/@exec_upgrade_dist
 function exec_upgrade_dist() {
 
-	global $connect_id_auteur, $spip_version, $reinstall;
+	global $spip_version;
 
 	if (!_FILE_CONNECT)
 		redirige_par_entete(generer_url_ecrire("install"));
 
 	// Si reinstallation necessaire, message ad hoc
-	if ($reinstall == 'oui') {
+	if (_request('reinstall') == 'oui') {
 
 		@copy(_FILE_CONNECT, _FILE_CONNECT_INS);
 
@@ -38,46 +38,26 @@ function exec_upgrade_dist() {
 		exit;
 	}
 
-	// eviter les actions vides pour cause de fichier de langue inaccessible.
-	$upgrade_titre = _T('info_mise_a_niveau_base') ;
-	if (!$upgrade_titre) $upgrade_titre = 'info_mise_a_niveau_base';
-
-	// Commentaire standard upgrade
-	$commentaire = _T('texte_mise_a_niveau_base_1');
-
 	// Verifier la version
 	$version_installee = (double) str_replace(',','.',$GLOBALS['meta']['version_installee']);
 # NB: str_replace car, sur club-internet, il semble que version_installe soit
 # enregistree au format '1,812' et non '1.812'
 
-	// Erreur downgrade
-	// (cas de double installation de fichiers SPIP sur une meme base)
-	if ($spip_version < $version_installee)
-		$commentaire = _T('info_mise_a_niveau_base_2');
-
 	// Qu'est-ce que tu fais ici?
 	if ($spip_version == $version_installee)
 		redirige_par_entete(generer_url_ecrire());
 
-	// On passe a l'upgrade
-	include_spip('inc/admin');
-
-	$_POST['reinstall'] = 'non';
-	debut_admin("upgrade", $upgrade_titre, $commentaire);
-
-	include_spip('base/create');
-	creer_base();
-	include_spip('base/upgrade');
-	maj_base();
-
-	include_spip('inc/acces');
-	include_spip('inc/config');
-	ecrire_acces();
-	init_config();
+	// Erreur downgrade
+	// (cas de double installation de fichiers SPIP sur une meme base)
+	if ($spip_version < $version_installee)
+		$commentaire = _T('info_mise_a_niveau_base_2');
+	// Commentaire standard upgrade
+	else $commentaire = _T('texte_mise_a_niveau_base_1');
 
-	fin_admin($upgrade_titre);
+	$_POST['reinstall'] = 'non'; // pour copy_request dans admin
 
-	redirige_par_entete(generer_action_auteur('purger', 'cache', _DIR_RESTREINT_ABS, true));
+	$r = generer_action_auteur('purger', 'cache', _DIR_RESTREINT_ABS, true);
+	$admin = charger_fonction('admin', 'inc');
+	$admin('upgrade', _T('info_mise_a_niveau_base'), $commentaire, $r);
 }
-
 ?>
diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php
index ef5850fe48cc30598a8208ffadde59c2d189a422..ae15cfddf8d6af41223a30484fc27a9caae54228 100644
--- a/ecrire/inc/admin.php
+++ b/ecrire/inc/admin.php
@@ -12,19 +12,48 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
+include_spip('inc/headers');
+
+// demande/verifie le droit de creation de repertoire par le demandeur;
+// memorise dans les meta que ce script est en cours d'execution
+// si elle y est deja c'est qu'il y a eu suspension du script, on reprend.
+
+function inc_admin_dist($script, $titre, $comment='', $retour='')
+{
+	if (!isset($GLOBALS['meta'][$script])) {
+		debut_admin($script, $titre, $comment); 
+		spip_log("meta: $script " . join(',', $_POST));
+		ecrire_meta($script, serialize($_POST));
+		ecrire_metas();
+	} else spip_log("reprise de $script");
+	$base = charger_fonction($script, 'base');
+	$base($titre);
+	effacer_meta($script);
+	ecrire_metas();
+	@unlink(_FILE_META);
+	fin_admin($script);
+	spip_log("efface meta: $script " . ($retour ? $retour : ''));
+	if ($retour) redirige_par_entete($retour);
+}
+
+
 // http://doc.spip.org/@fichier_admin
 function fichier_admin($action) {
 	global $connect_login;
 	return "admin_".substr(md5($action.(time() & ~2047).$connect_login), 0, 10);
 }
 
+// demande la creation d'un repertoire et sort
+// ou retourne sans rien faire si repertoire deja la.
+
 // http://doc.spip.org/@debut_admin
-function debut_admin($script, $action, $commentaire='') {
+function debut_admin($script, $action='', $commentaire='') {
 	global $connect_login, $connect_statut, $connect_toutes_rubriques;
 
 	if ((!$action) || ($connect_statut != "0minirezo")) {
 		include_spip('inc/minipres');
-		echo minipres(_T('info_acces_refuse'));
+		echo minipres(_T('info_acces_refuse') .
+			      ($action ? " ($action)" : ''));
 		exit;
 	}
 	if ($connect_toutes_rubriques) {
@@ -33,7 +62,7 @@ function debut_admin($script, $action, $commentaire='') {
 		$dir = _DIR_TRANSFERT . $connect_login . '/';
 	}
 
-	$signal = fichier_admin($action);
+	$signal = fichier_admin($script);
 	if (@file_exists($dir . $signal)) {
 		spip_log ("Action admin: $action");
 		return true;
@@ -45,26 +74,19 @@ function debut_admin($script, $action, $commentaire='') {
 
 	include_spip('inc/minipres');
 
-
 	// Si on est un super-admin, un bouton de validation suffit
 	// nom de l'autorisation a revoir... 'webmestre' veut tout et rien dire...
 	if (autoriser('webmestre')) {
 		if (_request('validation_admin') == $signal) {
 			spip_log ("Action super-admin: $action");
-			return true;
+			return;
 		}
-		$form = $commentaire
-		  . copy_request($script,
-				 ('<input type="hidden" name="validation_admin" value="'.$signal.'" />'
-				  . bouton_suivant(_T('bouton_valider'))));
+		$form = ('<input type="hidden" name="validation_admin" value="'.$signal.'" />'
+			 . bouton_suivant(_T('bouton_valider')));
 
 		$js = '';
-	}
-
-	else {
-		$form =  $commentaire
-		  . copy_request($script,
-				 (fieldset(_T('info_authentification_ftp').aide("ftp_auth"),
+	} else {
+		$form = fieldset(_T('info_authentification_ftp').aide("ftp_auth"),
 					   array(
 						 'fichier' => array(
 								    'label' => _T('info_creer_repertoire'),
@@ -72,7 +94,7 @@ function debut_admin($script, $action, $commentaire='') {
 								    )),
 					   ('<br />'
 					    . _T('info_creer_repertoire_2', array('repertoire' => joli_repertoire($dir)))
-					    . bouton_suivant(_T('bouton_recharger_page'))))));
+					    . bouton_suivant(_T('bouton_recharger_page'))));
 
 	// code volontairement tordu:
 	// provoquer la copie dans le presse papier du nom du repertoire
@@ -82,6 +104,7 @@ function debut_admin($script, $action, $commentaire='') {
 		$js = " onload='document.forms[0].fichier.value=\"\";barre_inserer(\"$signal\", document.forms[0].fichier)'";
 	}
 
+	$form = $commentaire . copy_request($script, $form);
 	echo minipres(_T('info_action', array('action' => $action)), $form, $js);
 	exit;
 }
@@ -103,17 +126,13 @@ function fin_admin($action) {
 // http://doc.spip.org/@copy_request
 function copy_request($script, $suite)
 {
-	$hidden = ""; 
-	$args = $_POST;
-	$args['exec'] = $script;
-	unset($args['fichier']);
         include_spip('inc/filtres');
-	foreach($args as $n => $c) {
-		$hidden .= "\n<input type='hidden' name='$n' value='" .
+	foreach($_POST as $n => $c) {
+	  if ($n != 'fichier')
+		$suite .= "\n<input type='hidden' name='$n' value='" .
 		  entites_html($c) .
 		  "'  />";
 	}
-	return "<form action='" . generer_url_ecrire() .
-	  "' method='post'><div>$hidden$suite</div></form>";
+	return  generer_post_ecrire($script, $suite);
 }
 ?>
diff --git a/ecrire/inc/import.php b/ecrire/inc/import.php
index 9887fa7533e16b6d9f30ab8bd2a557bdd7f21c65..6121c675e8fb800b683ca0bc8e5eaeec4b23ebb3 100644
--- a/ecrire/inc/import.php
+++ b/ecrire/inc/import.php
@@ -199,7 +199,7 @@ function import_tables($request, $dir) {
 			$gz = 'gzread';
 	} else {
 			$size = @filesize($archive);
-			$taille = floor(100 * $abs_pos / $size)." %";
+			$taille = @floor(100 * $abs_pos / $size)." %";
 			$file = fopen($archive, 'rb');
 			$gz = 'fread';
 	}
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 51ea1e1545e602524531d47519380280772f8065..63e0d65f1b6e057f73d25e8da5a2488640f4fcd8 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -20,7 +20,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // son evolution. Si vous n'en utilisez pas, neutraliser cette ligne pour
 // gagner du temps au chargement.
 
-include(_DIR_RESTREINT . 'inc/vieilles_defs.php');
+if (is_readable($f =_DIR_RESTREINT . 'inc/vieilles_defs.php')) include $f;
 
 // charge un fichier perso ou, a defaut, standard
 // et retourne si elle existe le nom de la fonction homonyme (exec_$nom),
@@ -943,7 +943,7 @@ function generer_url_prive($script, $args="", $no_entities=false) {
 }
 
 // Pour les formulaires en methode POST,
-// mettre les arguments a la fois en input-hidden et dans le champ action:
+// mettre le nom du script a la fois en input-hidden et dans le champ action:
 // 1) on peut ainsi memoriser le signet comme si c'etait un GET
 // 2) ca suit http://en.wikipedia.org/wiki/Representational_State_Transfer
 
@@ -1040,7 +1040,7 @@ function spip_register_globals() {
 }
 
 
-// Fonction d'initialisation, appelle dans inc_version ou mes_options
+// Fonction d'initialisation, appellee dans inc_version ou mes_options
 // Elle definit les repertoires et fichiers non partageables
 // et indique dans $test_dirs ceux devant etre accessibles en ecriture
 // mais ne touche pas a cette variable si elle est deja definie
@@ -1083,7 +1083,7 @@ function spip_initialisation($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
 	:	(@is_readable($f = _DIR_RESTREINT . 'inc_connect.php3') ? $f
 	:	false))));
 
-	// Le fichier de connexion a la base de donnees
+	// Le fichier de reglages des droits
 	define('_FILE_CHMOD_INS', _DIR_ETC . 'chmod');
 	define('_FILE_CHMOD',
 		(@is_readable($f = _FILE_CHMOD_INS . '.php') ? $f
@@ -1113,6 +1113,7 @@ function spip_initialisation($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
 	define('_ACCESS_FILE_NAME', '.htaccess');
 	define('_AUTH_USER_FILE', '.htpasswd');
 	define('_SPIP_DUMP', 'dump@nom_site@@stamp@.xml');
+	define('_CACHE_RUBRIQUES', _DIR_TMP.'cache-menu-rubriques.txt');
 
 	define('_DOCTYPE_ECRIRE', 
 		// "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n");
diff --git a/ecrire/index.php b/ecrire/index.php
index 7a1e93966561ffa84e1f884ec4077e8f803c5397..9a287d50bcda24ae9409371e33383b819465a4dd 100644
--- a/ecrire/index.php
+++ b/ecrire/index.php
@@ -119,7 +119,7 @@ AND ($GLOBALS['spip_version'] != (str_replace(',','.',$GLOBALS['meta']['version_
 // detourner le script demande pour qu'il reprenne le boulot
 // mais virer les Ajax pour eviter plusieurs restaurations en parallele
 elseif ($_COOKIE['spip_admin']
-AND isset($GLOBALS['meta']["debut_restauration"])) {
+AND isset($GLOBALS['meta']["import_all"])) {
 	if (isset($var_ajaxcharset)) exit;
 	$exec = 'import_all';
 }
@@ -161,5 +161,4 @@ if (!strncmp($exec,"accueil",7)==0
 // Feu !
 
 $var_f();
-
 ?>
diff --git a/ecrire/install/etape_3.php b/ecrire/install/etape_3.php
index 358b3953831adf17106e34d12675058d7f928795..09c33c304b0a35640a3d45c949789f3a2436d9e1 100644
--- a/ecrire/install/etape_3.php
+++ b/ecrire/install/etape_3.php
@@ -68,7 +68,7 @@ function install_bases(){
 		$result_ok = !spip_sql_errno();
 	} else {
 	  // en cas de reinstall sur mise a jour mal passee
-	  spip_query("DELETE FROM spip_meta WHERE nom='debut_restauration'");
+	  spip_query("DELETE FROM spip_meta WHERE nom='import_all'");
 		$result = spip_query("SELECT COUNT(*) FROM spip_articles");
 		$result_ok = (spip_num_rows($result) > 0);
 	}