diff --git a/ecrire/articles.php3 b/ecrire/articles.php3
index ea6d8593b9375facbdbaf030465f6422d7189191..2fe0d69a9d6849864202a92c72c7a464c539dffd 100644
--- a/ecrire/articles.php3
+++ b/ecrire/articles.php3
@@ -10,169 +10,7 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-
 include ("inc.php3");
-
-$var_f = find_in_path("inc_articles.php");
-if ($var_f)
-  include($var_f);
- else
-   include_ecrire("inc_articles.php");
-
-if ($id_article==0) {
-	if ($new!='oui')  redirige_par_entete("./index.php3");
-	// Avec l'Ajax parfois id_rubrique vaut 0... ne pas l'accepter
-	if (!$id_rubrique = intval($id_parent)) {
-		list($id_rubrique) = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 ORDER by 0+titre,titre LIMIT 1"));
-	}
-	if ($titre=='') $titre = _T('info_sans_titre');
-
-	$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
-
-	$id_article = spip_abstract_insert("spip_articles",
-			"(id_rubrique, statut, date, accepter_forum, lang, langue_choisie)", 
-			"($id_rubrique, 'prepa', NOW(), '" .
-				substr($GLOBALS['meta']['forums_publics'],0,3)
-				. "', '"
-				. ($row["lang"] ? $row["lang"] : $GLOBALS['meta']['langue_site'])
-				. "', 'non')");
-}
-
-$clean_link = new Link("articles.php3?id_article=$id_article");
-
-
-//////////////////////////////////////////////////////
-// Determiner les droits d'edition de l'article
-//
-
-if ($row = spip_fetch_array(spip_query("SELECT statut, titre, id_rubrique FROM spip_articles WHERE id_article=$id_article"))) {
-	$statut_article = $row['statut'];
-	$titre_article = $row['titre'];
-	$id_rubrique = $row['id_rubrique'];
-	$statut_rubrique = acces_rubrique($id_rubrique);
-}
-else {
-	$statut_article = '';
-	$statut_rubrique = false;
-	$id_rubrique = '0';
-}
-
-$flag_auteur = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=$id_article AND id_auteur=$connect_id_auteur LIMIT 1"));
-
-$flag_editable = ($statut_rubrique
-		  OR ($flag_auteur
-		      AND ($statut_article == 'prepa'
-			   OR $statut_article == 'prop' 
-			   OR $statut_article == 'poubelle')));
-
-//
-// Appliquer les modifications
-//
-
-$ok_nouveau_statut = false;
-
-
-if ($statut_nouv) {
-	if ($statut_rubrique) $ok_nouveau_statut = true;
-	else if ($flag_auteur) {
-		if ($statut_nouv == 'prop' AND $statut_article == 'prepa')
-			$ok_nouveau_statut = true;
-		else if ($statut_nouv == 'prepa' AND $statut_article == 'poubelle')
-			$ok_nouveau_statut = true;
-	}
-	if ($ok_nouveau_statut) {
-		spip_query("UPDATE spip_articles SET statut='$statut_nouv' WHERE id_article=$id_article");
-
-		if ($statut_nouv == 'publie' AND $statut_nouv != $statut_article)
-			spip_query("UPDATE spip_articles SET date=NOW() WHERE id_article=$id_article");
-
-		$statut_ancien = $statut_article;	// message pour les traitements de fond (indexation ; envoi mail)
-		$statut_article = $statut_nouv;
-		$flag_editable = ($statut_rubrique
-			OR ($flag_auteur AND ($statut_article == 'prepa' OR $statut_article == 'prop')));
-	}
-}
-
-
-// 'depublie' => invalider les caches
-if ($ok_nouveau_statut AND $statut_ancien == 'publie' AND $statut_nouv != $statut_ancien AND $invalider_caches) {
-	include_ecrire ("inc_invalideur.php3");
-	suivre_invalideur("id='id_article/$id_article'");
-}
-
-if ($jour && $flag_editable) {
-	$date = format_mysql_date($annee, $mois, $jour, $heure, $minute);
-	spip_query("UPDATE spip_articles SET date='$date'
-		WHERE id_article=$id_article");
-	calculer_rubriques();
-}
-
-if ($jour_redac && $flag_editable) {
-	if ($annee_redac<>'' AND $annee_redac < 1001) $annee_redac += 9000;
-
-	if ($avec_redac == 'non')
-		$date_redac = format_mysql_date();
-	else
-		$date_redac = format_mysql_date(
-			$annee_redac, $mois_redac, $jour_redac,
-			$heure_redac, $minute_redac);
-
-	spip_query("UPDATE spip_articles SET date_redac='$date_redac'
-		WHERE id_article=$id_article");
-}
-
-
-if ($flag_editable) modif_langue_articles($id_article, $id_rubrique, $changer_lang);
-
-inclus_non_articles($id_article);
-
-# modifs de la description d'un des docs joints
-if ($flag_editable) maj_documents($id_article, 'article');
-
-// preparer le virtuel
-
-if ($changer_virtuel && $flag_editable) {
-	$virtuel = eregi_replace("^http://$", "", trim($virtuel));
-	if ($virtuel) $chapo = addslashes(corriger_caracteres("=$virtuel"));
-	else $chapo = "";
-	spip_query("UPDATE spip_articles SET chapo='$chapo' WHERE id_article=$id_article");
-}
-
-if (strval($titre)!=='' AND !$ajout_forum AND $flag_editable) {
-
-	$champs = array(
-			'surtitre' => corriger_caracteres($surtitre),
-			'titre' => ($titre_article=corriger_caracteres($titre)),
-			'soustitre' => corriger_caracteres($soustitre),
-			'descriptif' => corriger_caracteres($descriptif),
-			'nom_site' => corriger_caracteres($nom_site),
-			'url_site' => corriger_caracteres($url_site),
-			'chapo' => corriger_caracteres($chapo),
-			'texte' => corriger_caracteres(trop_longs_articles($texte_plus) . $texte),
-			'ps' => corriger_caracteres($ps))  ;
-
-	revisions_articles ($id_article, $champs_extra, $id_secteur, $id_parent, $flag_auteur, $new, $champs, $id_rubrique_old);
-	$id_article_bloque = $id_article;   // message pour inc_presentation
-
- }
-
-///////////////// Affichage
-
-if (function_exists('affiche_articles'))
-  $var_nom = 'affiche_articles';
- else
-  $var_nom = 'affiche_articles_dist';
-
-
-// on pourrait supprimer les arguments issus des meta
-// mais l'URL admet de fait une vingtaine de parametres differents
-
-$var_nom($id_article, $ajout_auteur, $change_accepter_forum, $change_petition, $changer_virtuel, $cherche_auteur, $cherche_mot, $debut, $email_unique, $flag_auteur, $flag_editable, $langue_article, $message, $nom_select, $nouv_auteur, $nouv_mot, $id_rubrique, $site_obli, $site_unique, $supp_auteur, $supp_mot, $texte_petition, $titre_article, $lier_trad);
-
-// Taches lentes
-
-if ($ok_nouveau_statut AND $statut_ancien != $statut_nouv) {
-  cron_articles($id_article, $statut_nouv, $statut_ancien);
-}
-
+$var_f = include_fonction(basename($SCRIPT_NAME, _EXTENSION_PHP));
+$var_f();
 ?>
diff --git a/ecrire/inc_articles.php b/ecrire/inc_articles.php
index 96f48b268f0c9f96b411abe59182f70626d1b7c7..68c27c2820757386937cf33aa935961287a56e82 100644
--- a/ecrire/inc_articles.php
+++ b/ecrire/inc_articles.php
@@ -217,7 +217,7 @@ fin_page();
 
 function boite_info_articles($id_article, $statut_article, $visites, $id_version)
 {
-	global $connect_statut, $options;
+  global $connect_statut, $options, $flag_revisions;
 
 	debut_boite_info();
  
@@ -480,6 +480,32 @@ meme_rubrique_articles($id_rubrique, $id_article, $options);
 
 }
 
+function   comparer_statut_articles($id_article, $statut_nouv, $statut_article, $statut_rubrique, $flag_auteur)
+{
+	if ($statut_rubrique) $ok_nouveau_statut = true;
+	else if ($flag_auteur) {
+		if ($statut_nouv == 'prop' AND $statut_article == 'prepa')
+			$ok_nouveau_statut = true;
+		else if ($statut_nouv == 'prepa' AND $statut_article == 'poubelle')
+			$ok_nouveau_statut = true;
+	}
+	if ($ok_nouveau_statut) {
+		spip_query("UPDATE spip_articles SET statut='$statut_nouv' WHERE id_article=$id_article");
+
+		if ($statut_nouv == 'publie' AND $statut_nouv != $statut_article)
+			spip_query("UPDATE spip_articles SET date=NOW() WHERE id_article=$id_article");
+
+		$ok_nouveau_statut =  ($statut_nouv != $statut_article);
+
+		// 'depublie' => invalider les caches
+		if ($ok_nouveau_statut AND $statut_article == 'publie' 
+		    AND $GLOBALS['invalider_caches']) {
+		  include_ecrire ("inc_invalideur.php3");
+		  suivre_invalideur("id='id_article/$id_article'");
+		}
+	}
+	return $ok_nouveau_statut ;
+}
 
 function changer_statut_articles($id_article, $statut)
 {
@@ -1439,23 +1465,9 @@ if (count($ze_doc)>0){
 
 }
 
-function revisions_articles ($id_article, $champs_extra, $id_secteur, $id_parent, $flag_auteur, $new, $champs, $id_rubrique_old) {
+function revisions_articles ($id_article, $id_secteur, $id_rubrique, $id_rubrique_old, $change_rubrique, $new, $champs, $champs_extra) {
 {
-  global $connect_id_auteur;
-	// recoller les champs du extra
-	if ($champs_extra) {
-		include_ecrire("inc_extra.php3");
-		$add_extra = ", extra = '".addslashes(extra_recup_saisie("articles", $id_secteur))."'";
-	} else
-		$add_extra = '';
-
-	// Verifier qu'on envoie bien dans une rubrique autorisee
-	if ($id_rubrique=intval($id_parent)
-	AND ($flag_auteur OR acces_rubrique($id_rubrique))) {
-		$change_rubrique = "id_rubrique=$id_rubrique,";
-	} else {
-		$change_rubrique = "";
-	}
+	global $connect_id_auteur, $flag_revisions;
 
 	// Stockage des versions : creer une premier version si non-existante
 	if (($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions) {
@@ -1478,28 +1490,32 @@ function revisions_articles ($id_article, $champs_extra, $id_secteur, $id_parent
 		}
 	}
 
-	$query = "UPDATE spip_articles SET surtitre='" .
-	  addslashes($champs['surtitre']) .
-	  "', titre='" .
-	  addslashes($champs['titre']) .
-	  "', soustitre='" .
-	  addslashes($champs['soustitre']) .
-	  "', $change_rubrique descriptif='" .
-	  addslashes($champs['descriptif']) .
-	  "', chapo='" .
-	  addslashes($champs['chapo']) .
-	  "', texte='" .
-	  addslashes($champs['texte']) .
-	  "', ps='" .
-	  addslashes($champs['ps']) .
-	  "', url_site='" .
-	  addslashes($champs['url_site']) .
-	  "', nom_site='" .
-	  addslashes($champs['nom_site']) .
-	  "' $add_extra WHERE id_article=$id_article";
-	$result = spip_query($query);
-	if ($change_rubrique) propager_les_secteurs();
-	calculer_rubriques();
+	if ($champs_extra) {
+		include_ecrire("inc_extra.php3");
+		$champs_extra = ", extra = '".addslashes(extra_recup_saisie("articles", $id_secteur))."'";
+	}
+
+	spip_query("UPDATE spip_articles SET surtitre='" .
+		   addslashes($champs['surtitre']) .
+		   "', titre='" .
+		   addslashes($champs['titre']) .
+		   "', soustitre='" .
+		   addslashes($champs['soustitre']) .
+		   "', " .
+		   (!$change_rubrique ? "" :  "id_rubrique=$id_rubrique,") .
+		   "descriptif='" .
+		   addslashes($champs['descriptif']) .
+		   "', chapo='" .
+		   addslashes($champs['chapo']) .
+		   "', texte='" .
+		   addslashes($champs['texte']) .
+		   "', ps='" .
+		   addslashes($champs['ps']) .
+		   "', url_site='" .
+		   addslashes($champs['url_site']) .
+		   "', nom_site='" .
+		   addslashes($champs['nom_site']) .
+		   "'$champs_extra WHERE id_article=$id_article");
 
 	// Stockage des versions
 	if (($GLOBALS['meta']["articles_versions"]=='oui') && $flag_revisions) {
@@ -1508,6 +1524,7 @@ function revisions_articles ($id_article, $champs_extra, $id_secteur, $id_parent
 
 	// Changer la langue heritee
 	if ($id_rubrique != $id_rubrique_old) {
+		propager_les_secteurs();
 		$row = spip_fetch_array(spip_query("SELECT lang, langue_choisie FROM spip_articles WHERE id_article=$id_article"));
 		$langue_old = $row['lang'];
 		$langue_choisie_old = $row['langue_choisie'];
@@ -1521,7 +1538,136 @@ function revisions_articles ($id_article, $champs_extra, $id_secteur, $id_parent
 
 	// marquer l'article (important pour les articles nouvellement crees)
 	spip_query("UPDATE spip_articles SET date_modif=NOW(), auteur_modif=$connect_id_auteur WHERE id_article=$id_article");
+	calculer_rubriques();
+ }
+}
+
+function insert_article($id_parent, $new)
+{
+	if ($new!='oui')  redirige_par_entete("./index.php3");
+	// Avec l'Ajax parfois id_rubrique vaut 0... ne pas l'accepter
+	if (!$id_rubrique = intval($id_parent)) {
+		list($id_rubrique) = spip_fetch_array(spip_query("SELECT id_rubrique FROM spip_rubriques WHERE id_parent=0 ORDER by 0+titre,titre LIMIT 1"));
+	}
+
+	$row = spip_fetch_array(spip_query("SELECT lang FROM spip_rubriques WHERE id_rubrique=$id_rubrique"));
+
+	$id_article = spip_abstract_insert("spip_articles",
+			"(id_rubrique, statut, date, accepter_forum, lang, langue_choisie)", 
+			"($id_rubrique, 'prepa', NOW(), '" .
+				substr($GLOBALS['meta']['forums_publics'],0,3)
+				. "', '"
+				. ($row["lang"] ? $row["lang"] : $GLOBALS['meta']['langue_site'])
+				. "', 'non')");
+	return $id_article;
+}
+
+// Y a-t-il vraiment 56 variables determinant l'edition d'un article ?
+
+function articles_dist()
+{
+global $ajout_auteur, $annee, $annee_redac, $avec_redac, $champs_extra, $change_accepter_forum, $change_petition, $changer_lang, $changer_virtuel, $chapo, $cherche_auteur, $cherche_mot, $clean_link, $connect_id_auteur, $date, $date_redac, $debut, $descriptif, $email_unique, $heure, $heure_redac, $id_article, $id_article_bloque, $id_parent, $id_rubrique_old, $id_secteur, $jour, $jour_redac, $langue_article, $lier_trad, $message, $minute, $minute_redac, $mois, $mois_redac, $new, $nom_select, $nom_site, $nouv_auteur, $nouv_mot, $ps, $row, $site_obli, $site_unique, $soustitre, $statut_nouv, $supp_auteur, $supp_mot, $surtitre, $texte, $texte_petition, $texte_plus, $titre, $titre_article, $url_site, $virtuel; 
+
+ if (!($id_article=intval($id_article)))
+   $id_article = insert_article($id_parent, $new);
+
+$clean_link = new Link("articles.php3?id_article=$id_article");
 
- }}
+// aucun doc implicitement inclus au départ.
 
+inclus_non_articles($id_article);
+
+
+if ($row = spip_fetch_array(spip_query("SELECT statut, titre, id_rubrique FROM spip_articles WHERE id_article=$id_article"))) {
+	$statut_article = $row['statut'];
+	$titre_article = $row['titre'];
+	$id_rubrique = $row['id_rubrique'];
+	$statut_rubrique = acces_rubrique($id_rubrique);
+	if ($titre_article=='') $titre_article = _T('info_sans_titre');
+}
+else {
+	$statut_article = '';
+	$statut_rubrique = false;
+	$id_rubrique = '0';
+	if ($titre=='') $titre = _T('info_sans_titre');
+}
+
+$flag_auteur = spip_num_rows(spip_query("SELECT id_auteur FROM spip_auteurs_articles WHERE id_article=$id_article AND id_auteur=$connect_id_auteur LIMIT 1"));
+
+if (!$statut_nouv) {
+	$ok_nouveau_statut = false;
+	$flag_editable = ($statut_rubrique
+		OR ($flag_auteur
+			AND ($statut_article == 'prepa'
+				OR $statut_article == 'prop' 
+				OR $statut_article == 'poubelle')));
+ } else {
+	$ok_nouveau_statut = comparer_statut_articles($id_article, $statut_nouv, $statut_article, $statut_rubrique, $flag_auteur);
+	$flag_editable = ($statut_rubrique OR ($flag_auteur AND ($statut_nouv == 'prepa' OR $statut_nouv == 'prop')));
+}
+
+if ($flag_editable) {
+
+if ($jour) {
+	$date = format_mysql_date($annee, $mois, $jour, $heure, $minute);
+	spip_query("UPDATE spip_articles SET date='$date'
+		WHERE id_article=$id_article");
+	calculer_rubriques();
+}
+
+if ($jour_redac) {
+	if ($annee_redac<>'' AND $annee_redac < 1001) $annee_redac += 9000;
+
+	if ($avec_redac == 'non')
+		$date_redac = format_mysql_date();
+	else
+		$date_redac = format_mysql_date(
+			$annee_redac, $mois_redac, $jour_redac,
+			$heure_redac, $minute_redac);
+
+	spip_query("UPDATE spip_articles SET date_redac='$date_redac'
+		WHERE id_article=$id_article");
+}
+
+
+modif_langue_articles($id_article, $id_rubrique, $changer_lang);
+
+maj_documents($id_article, 'article');
+
+if ($changer_virtuel) {
+	$virtuel = eregi_replace("^http://$", "", trim($virtuel));
+	if ($virtuel) $chapo = addslashes(corriger_caracteres("=$virtuel"));
+	else $chapo = "";
+	spip_query("UPDATE spip_articles SET chapo='$chapo' WHERE id_article=$id_article");
+}
+
+if ($titre) {
+
+	$champs = array(
+			'surtitre' => corriger_caracteres($surtitre),
+			'titre' => ($titre_article=corriger_caracteres($titre)),
+			'soustitre' => corriger_caracteres($soustitre),
+			'descriptif' => corriger_caracteres($descriptif),
+			'nom_site' => corriger_caracteres($nom_site),
+			'url_site' => corriger_caracteres($url_site),
+			'chapo' => corriger_caracteres($chapo),
+			'texte' => corriger_caracteres(trop_longs_articles($texte_plus) . $texte),
+			'ps' => corriger_caracteres($ps))  ;
+
+	revisions_articles ($id_article, $id_secteur, $id_rubrique, $id_rubrique_old,
+			    ($flag_auteur||$statut_rubrique),
+			    $new, $champs, $champs_extra);
+	$id_article_bloque = $id_article;   // message pour inc_presentation
+
+ }
+ }
+
+affiche_articles_dist($id_article, $ajout_auteur, $change_accepter_forum, $change_petition, $changer_virtuel, $cherche_auteur, $cherche_mot, $debut, $email_unique, $flag_auteur, $flag_editable, $langue_article, $message, $nom_select, $nouv_auteur, $nouv_mot, $id_rubrique, $site_obli, $site_unique, $supp_auteur, $supp_mot, $texte_petition, $titre_article, $lier_trad);
+
+// Taches lentes
+
+if ($ok_nouveau_statut) {
+  cron_articles($id_article, $statut_nouv, $statut_article);
+}
+    }    
 ?>