diff --git a/.gitattributes b/.gitattributes
index e33465a790ba27aecd512928b7d84c1d01f6abf5..62f3aa4726421ff5045990b7c8aaf6efa3d8326f 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -360,7 +360,6 @@ ecrire/lang/public_ru.php -text
 ecrire/lang/spip_br.php -text
 ecrire/lang/spip_cs.php -text
 ecrire/lang/spip_ru.php -text
-ecrire/page.php -text
 ecrire/polices/dustismo-license.txt -text svneol=unset#application/octet-stream
 ecrire/polices/dustismo.ttf -text
 ecrire/polices/dustismo_bold.ttf -text
diff --git a/ecrire/action/autoriser.php b/ecrire/action/autoriser.php
index 0fd05488bf1fb41088742c99d6f87ff4c8846ced..b5e64011c91d05d739490455bebb14ef7bdb2b0a 100644
--- a/ecrire/action/autoriser.php
+++ b/ecrire/action/autoriser.php
@@ -14,7 +14,7 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/charsets');	# pour le nom de fichier
-include_ecrire("inc_abstract_sql");# spip_insert / spip_fetch...
+include_spip('base/abstract_sql');
 
 //  acces aux documents joints securise
 //  est appelee avec arg comme parametre CGI
@@ -89,7 +89,7 @@ breves.statut = 'publie' AND rel_breves.id_document ='".
     spip_log("Acces refuse ($refus) au document " . $arg . ': ' . $file);
     global $fond;
     $fond = 404;
-    include_ecrire('public');
+    include _DIR_INCLUDE.'public.php';
   }
   else
     {
diff --git a/ecrire/action/joindre.php b/ecrire/action/joindre.php
index f4aeda080a9290a192036d9012e3524e92e24eb5..78f8a7fa0073adcbd697d762eb97b7fcd7e0e0bd 100644
--- a/ecrire/action/joindre.php
+++ b/ecrire/action/joindre.php
@@ -13,8 +13,8 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/charsets');	# pour le nom de fichier
-include_ecrire("inc_abstract_sql");# spip_insert / spip_fetch...
 include_spip('inc/getdocument');
+include_spip('base/abstract_sql');
 
 function action_joindre_dist()
 {
diff --git a/ecrire/action/supprimer.php b/ecrire/action/supprimer.php
index fbefc393682cfddd5200dc25ae381c7f1d955acb..2e04e7cb3c0bdd0944ed4c709dcac70354ac5dd0 100644
--- a/ecrire/action/supprimer.php
+++ b/ecrire/action/supprimer.php
@@ -13,7 +13,7 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/charsets');	# pour le nom de fichier
-include_ecrire("inc_abstract_sql");# spip_insert / spip_fetch...
+include_spip('base/abstract_sql');
 
 // Effacer un doc (et sa vignette)
 function action_supprimer_dist() {
diff --git a/ecrire/action/tourner.php b/ecrire/action/tourner.php
index 7afd31b2ee6096f9ca82e78e98208fef0eefa5c4..794fcdbd6aa4f608adce808b5890740b42f36ce9 100644
--- a/ecrire/action/tourner.php
+++ b/ecrire/action/tourner.php
@@ -13,7 +13,7 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/charsets');	# pour le nom de fichier
-include_ecrire("inc_abstract_sql");# spip_insert / spip_fetch...
+include_spip('base/abstract_sql');
 
 function action_tourner_dist() {
 	
diff --git a/ecrire/inc_abstract_sql.php b/ecrire/base/abstract_sql.php
similarity index 100%
rename from ecrire/inc_abstract_sql.php
rename to ecrire/base/abstract_sql.php
diff --git a/ecrire/inc_db_mysql.php b/ecrire/base/db_mysql.php
similarity index 99%
rename from ecrire/inc_db_mysql.php
rename to ecrire/base/db_mysql.php
index ec23b5ceabc55666b426149479eba3e3055c5e4c..29fcb08cb98f518c1238a6cfa50dd513de4ab715 100644
--- a/ecrire/inc_db_mysql.php
+++ b/ecrire/base/db_mysql.php
@@ -102,7 +102,7 @@ function spip_mysql_select($select, $from, $where,
 	}
 
 	if (!($res = @spip_query($q))) {
-		include_ecrire('inc_debug_sql');
+		include_spip('inc/debug');
 		erreur_requete_boucle($q, $id, $table,
 				      spip_sql_errno(),
 				      spip_sql_error());
diff --git a/ecrire/exec/articles.php b/ecrire/exec/articles.php
index d1af96929414dd3e62ccaf1f3cb2b7131260c98b..4217e5ebbbe834222844ff54ec4bb1e03c248869 100644
--- a/ecrire/exec/articles.php
+++ b/ecrire/exec/articles.php
@@ -21,7 +21,7 @@ include_spip('inc/mots');
 include_spip('inc/date');
 include_spip('inc/documents');
 include_spip('inc/forum');
-include_ecrire ("inc_abstract_sql");
+include_spip('base/abstract_sql');
 
   // 28 paremetres, qui dit mieux ?
   // moi ! elle en avait 61 en premiere approche
@@ -1638,7 +1638,7 @@ if ($titre) {
 	revisions_articles ($id_article, $id_secteur, $id_rubrique, $id_rubrique_old,
 			    ($flag_auteur||$statut_rubrique),
 			    $new, $champs);
-	$id_article_bloque = $id_article;   // message pour inc_presentation
+	$id_article_bloque = $id_article;   // message pour inc/presentation
 
  }
  }
diff --git a/ecrire/exec/auteur_infos.php b/ecrire/exec/auteur_infos.php
index c7cc40188d91f47f77035195ed1289b5dff9111e..460dbee057008225d67a8319fa81cf77639c056f 100644
--- a/ecrire/exec/auteur_infos.php
+++ b/ecrire/exec/auteur_infos.php
@@ -14,7 +14,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 include_spip('inc/presentation');
 include_spip('inc/auteur_voir');
 include_spip('inc/acces');
-include_ecrire ("inc_abstract_sql");
+include_spip('base/abstract_sql');
 
 function exec_auteur_infos_dist()
 {
@@ -372,7 +372,7 @@ echo "<p />";
 
  if ($apparait) apparait_auteur_infos($id_auteur, $auteur);
 
-// Afficher le formulaire de changement de statut (cf. inc_acces)
+// Afficher le formulaire de changement de statut (cf. inc/acces)
 afficher_formulaire_statut_auteur ($id_auteur, $auteur['statut']);
 
 
diff --git a/ecrire/exec/breves_voir.php b/ecrire/exec/breves_voir.php
index 1f02e45876803485a98c9743118663e682cc1512..992f49afb8d781d5b37667ae8c01b05fa66c4405 100644
--- a/ecrire/exec/breves_voir.php
+++ b/ecrire/exec/breves_voir.php
@@ -17,7 +17,7 @@ include_spip('inc/rubriques');
 include_spip('inc/logos');
 include_spip('inc/mots');
 include_spip('inc/date');
-include_ecrire ("inc_abstract_sql");
+include_spip('base/abstract_sql');
 include_spip("inc/indexation");
 
 function afficher_breves_voir($id_breve, $changer_lang, $cherche_mot, $supp_mot, $nouv_mot )
diff --git a/ecrire/exec/install.php b/ecrire/exec/install.php
index 04a344059daa5369cb75eeee54643182f769e85d..08a17c8ecd0e04b619a546c2bf9e07cbba0c48f4 100644
--- a/ecrire/exec/install.php
+++ b/ecrire/exec/install.php
@@ -15,8 +15,8 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 define("_ECRIRE_INSTALL", "1");
 define('_FILE_TMP', '_install');
 include_spip('inc/minipres');
-include_spip ('base/create');
-include_ecrire("inc_db_mysql");
+include_spip('base/create');
+include_spip('base/db_mysql');
 
 function exec_install_dist()
 {
@@ -125,7 +125,7 @@ function install_6()
 		redirige_par_entete(generer_url_ecrire('install'));
 
 	# maintenant on connait le vrai charset du site s'il est deja configure
-	# sinon par defaut inc_meta reglera _DEFAULT_CHARSET
+	# sinon par defaut inc/meta reglera _DEFAULT_CHARSET
 	# (les donnees arrivent de toute facon postees en _DEFAULT_CHARSET)
 	include_spip('inc/meta');
 	lire_metas();
@@ -246,7 +246,7 @@ function install_4()
 	install_debut_html();
 
 	// Necessaire pour appeler les fonctions SQL wrappees
-	include_ecrire("inc_db_mysql");
+	include_spip('base/db_mysql');
 
 	echo "<BR />\n<FONT FACE='Verdana,Arial,Sans,sans-serif' SIZE=3>"._T('info_creation_tables')."</FONT>";
 	echo "<P>\n";
@@ -305,10 +305,11 @@ function install_4()
 
 
 	if ($result_ok && $maj_ok) {
+		###### format a changer, a terme...
 		$conn = "<"."?php\n";
 		$conn .= "if (!defined(\"_ECRIRE_INC_VERSION\")) return;\n";
 		$conn .= "\$GLOBALS['spip_connect_version'] = 0.2;\n";
-		$conn .= "include_ecrire('inc_db_mysql');\n";
+		$conn .= "include_spip('base/db_mysql');\n";
 		$conn .= $ligne_rappel;
 		$conn .= "spip_connect_db('$adresse_db','','$login_db','$pass_db','$sel_db');\n";
 #		$conn .= "\$GLOBALS['db_ok'] = !!@spip_num_rows(@spip_query_db('SELECT COUNT(*) FROM spip_meta'));\n";
@@ -786,6 +787,7 @@ function install_unpack()
 
   fin_admin($action);
 
+	## ??????? a verifier
   if (@file_exists(_DIR_RACINE . "spip_loader" . _EXTENSION_PHP))
     redirige_par_entete(generer_url_public("spip_loader"), "?hash=$hash&id_auteur=$connect_id_auteur");
   else if (@file_exists(_DIR_RACINE . "spip_unpack" . _EXTENSION_PHP))
diff --git a/ecrire/exec/message_edit.php b/ecrire/exec/message_edit.php
index 81f3ef2a12f25b17864cb8c69ad5e81a3d63762c..b79464efa32271ffcf9308fb71673c4d5674ee5b 100644
--- a/ecrire/exec/message_edit.php
+++ b/ecrire/exec/message_edit.php
@@ -14,7 +14,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
 include_spip('inc/date');
-include_ecrire ("inc_abstract_sql");
+include_spip('base/abstract_sql');
 
 function exec_message_edit_dist()
 {
diff --git a/ecrire/exec/mots_edit.php b/ecrire/exec/mots_edit.php
index 3106f9621b925ca7ae15ded51a5ffb676e356fbf..8f3051aa0a939f43beebaca3f80def548cd45689 100644
--- a/ecrire/exec/mots_edit.php
+++ b/ecrire/exec/mots_edit.php
@@ -14,7 +14,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
 include_spip('inc/logos');
-include_ecrire ("inc_abstract_sql");
+include_spip('base/abstract_sql');
 
 function exec_mots_edit_dist()
 {
diff --git a/ecrire/exec/naviguer.php b/ecrire/exec/naviguer.php
index f6d76ec443e61e586e60cb9e48f1c6d2f893ddb5..8a7bd553bda01ce779fc6e2af7bad49f15ee4ef5 100644
--- a/ecrire/exec/naviguer.php
+++ b/ecrire/exec/naviguer.php
@@ -14,13 +14,13 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
 include_spip('inc/texte');
-charger_generer_url();
 include_spip('inc/rubriques');
 include_spip('inc/forum');
 include_spip('inc/logos');
 include_spip('inc/mots');
 include_spip('inc/documents');
-include_ecrire("inc_abstract_sql");
+include_spip('base/abstract_sql');
+charger_generer_url();
 
 function exec_naviguer_dist()
 {
diff --git a/ecrire/exec/sites.php b/ecrire/exec/sites.php
index c7524e52606615da9d37ecd386d0adb2ccdbb78c..db359a0d664920d7d3ff852fd6f2c18c46eba5d6 100644
--- a/ecrire/exec/sites.php
+++ b/ecrire/exec/sites.php
@@ -18,8 +18,8 @@ include_spip('inc/rubriques');
 include_spip('inc/logos');
 include_spip('inc/mots');
 include_spip('inc/date');
-include_ecrire ("inc_abstract_sql");
 include_spip('inc/config');
+include_spip('base/abstract_sql');
 
 function exec_sites_dist()
 {
diff --git a/ecrire/inc/indexation.php b/ecrire/inc/indexation.php
index 5dc450bbf98b3dbd84dff983650f385c9de0844f..cdb66e6c7412e7b311eee7a28272e55f8cac8bbe 100644
--- a/ecrire/inc/indexation.php
+++ b/ecrire/inc/indexation.php
@@ -14,7 +14,7 @@
 //
 if (!defined("_ECRIRE_INC_VERSION")) return;
 include_spip('base/create');
-include_ecrire('inc_abstract_sql');
+include_spip('base/abstract_sql');
 
 // Quels formats sait-on extraire ?
 $GLOBALS['extracteur'] = array (
@@ -68,7 +68,7 @@ $INDEX_critere_indexation['spip_syndic']="statut='publie'";
 $INDEX_critere_indexation['spip_forum']="statut='publie'";
 $INDEX_critere_indexation['spip_signatures']="statut='publie'";
 
-// Criteres de des-indexation (optimisation dans inc_optimiser)
+// Criteres de des-indexation (optimisation dans base/optimiser)
 global $INDEX_critere_optimisation;
 $INDEX_critere_optimisation['spip_articles']="statut<>'publie'";
 $INDEX_critere_optimisation['spip_breves']="statut<>'publie'";
diff --git a/ecrire/inc/invalideur.php b/ecrire/inc/invalideur.php
index 89816076655ac98abb6696d8bbecd8eaa6879c14..4a162d93a73c194aa50cc5b926a909fdafdf9e21 100644
--- a/ecrire/inc/invalideur.php
+++ b/ecrire/inc/invalideur.php
@@ -57,6 +57,7 @@ function maj_invalideurs ($fichier, &$page, $duree) {
 // pour les petitions et autres, l'invalideur est par exemple :
 // 'varia/pet60'
 function insere_invalideur($inval, $fichier) {
+	if ($inval)
 	foreach ($inval as $type => $a) {
 		if (is_array($a)) {
 			$values = array();
diff --git a/ecrire/inc/mots.php b/ecrire/inc/mots.php
index 3655adc0f1ccc1cca0d57c3a3e32fb7954ee4c08..f09e00d7b13288658c1689f04731a77626692953 100644
--- a/ecrire/inc/mots.php
+++ b/ecrire/inc/mots.php
@@ -618,7 +618,7 @@ function afficher_groupe_mots($id_groupe) {
 		if ($row = spip_fetch_array($res_proch)) {
 			$id_ajax_fonc = $row["id_ajax_fonc"];
 		} else  {
-			include_ecrire ("inc_abstract_sql");
+			include_spip('base/abstract_sql');
 			$id_ajax_fonc = spip_abstract_insert("spip_ajax_fonc", "(id_auteur, variables, hash, date)", "($connect_id_auteur, '$jjscript', $hash, NOW())");
 		}
 		$tranches = ereg_replace("\:\:id\_ajax\_fonc\:\:", $id_ajax_fonc, $tranches);
diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php
index 8d849b5a0565c524740a84398a65aedaeee91e8c..4bf74ff7afd20903025034c97de1c98c24e7ecbb 100644
--- a/ecrire/inc/presentation.php
+++ b/ecrire/inc/presentation.php
@@ -714,7 +714,7 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 		if ($row = spip_fetch_array($res_proch)) {
 			$id_ajax_trad = $row["id_ajax_fonc"];
 		} else  {
-			include_ecrire ("inc_abstract_sql");
+			include_spip ('base/abstract_sql');
 			$id_ajax_trad = spip_abstract_insert("spip_ajax_fonc", "(id_auteur, variables, hash, date)", "($connect_id_auteur, '$jjscript_trad', $hash, NOW())");
 		}
 	}
@@ -766,7 +766,7 @@ function afficher_articles($titre_table, $requete, $afficher_visites = false, $a
 		if ($row = spip_fetch_array($res_proch)) {
 			$id_ajax_fonc = $row["id_ajax_fonc"];
 		} else  {
-			include_ecrire ("inc_abstract_sql");
+			include_spip('base/abstract_sql');
 			$id_ajax_fonc = spip_abstract_insert("spip_ajax_fonc", "(id_auteur, variables, hash, date)", "($connect_id_auteur, '$jjscript', $hash, NOW())");
 		}
 
@@ -943,7 +943,7 @@ function afficher_articles_trad($titre_table, $requete, $afficher_visites = fals
 		if ($row = spip_fetch_array($res_proch)) {
 			$id_ajax_trad = $row["id_ajax_fonc"];
 		} else  {
-			include_ecrire ("inc_abstract_sql");
+			include_spip('base/abstract_sql');
 			$id_ajax_trad = spip_abstract_insert("spip_ajax_fonc", "(id_auteur, variables, hash, date)", "($connect_id_auteur, '$jjscript_trad', $hash, NOW())");
 		}
 
@@ -981,7 +981,7 @@ function afficher_articles_trad($titre_table, $requete, $afficher_visites = fals
 		if ($row = spip_fetch_array($res_proch)) {
 			$id_ajax_fonc = $row["id_ajax_fonc"];
 		} else  {
-			include_ecrire ("inc_abstract_sql");
+			include_spip('base/abstract_sql');
 			$id_ajax_fonc = spip_abstract_insert("spip_ajax_fonc", "(id_auteur, variables, hash, date)", "($connect_id_auteur, '$jjscript', $hash, NOW())");
 		}
 
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index dd9b9d3b650ab2ae89aedd01a9c8480ce8cf7f28..a724dc86c80337201589a6b07d42603343b96905 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -21,14 +21,16 @@ function include_ecrire($file, $silence=false) {
 	define('_DIR_INCLUDE', _DIR_RESTREINT);
 	preg_match('/^((inc_)?([^.]*))(\.php[3]?)?$/', $file, $r);
 
-	# cas special inc/index => indexation
+	// Version new style, surchargeable
+	# cas speciaux inc/index => indexation ; inc_db_mysql => base/db_mysql
 	if ($r[3] == 'index') return include_spip('inc/indexation');
+	if ($r[3] == 'db_mysql') return include_spip('base/db_mysql');
 
-	# new style, surchargeable
+	# cas general
 	if ($f=include_spip('inc/'.$r[3]))
 		return $f;
 
-	# fichiers old-style, ecrire/inc_truc.php
+	// fichiers old-style, ecrire/inc_truc.php
 	if (file_exists($f = _DIR_INCLUDE . $r[1] . '.php'))
 		return include_once($f);
 }
@@ -67,7 +69,7 @@ function include_fonction($nom, $dossier='exec') {
 }
 
 //
-// une fonction destinee a remplacer include_ecrire, pour les surcharges
+// une fonction remplacant include_ecrire, et autorisant les surcharges
 //
 function include_spip($f, $include = true) {
 	static $included_files = array();
@@ -858,9 +860,9 @@ function spip_initialisation() {
 	// Le fichier de connexion a la base de donnees
 	define('_FILE_CONNECT_INS', (_DIR_RESTREINT . "inc_connect"));
 	define('_FILE_CONNECT',
-		(@is_readable(_FILE_CONNECT_INS . _EXTENSION_PHP) ?
-			(_FILE_CONNECT_INS . _EXTENSION_PHP)
-		 : false));
+		(@is_readable($f = _FILE_CONNECT_INS . '.php') ? $f
+	:	(@is_readable($f = _FILE_CONNECT_INS . '.php3') ? $f
+	:	false)));
 
 	// les repertoires annexes
 	define('_DIR_IMG', _DIR_RACINE ."IMG/");
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index 635fbaad2a17d7be8d21511ce77b6bb6d39b14b0..78b88e1c0d1ba73115f169f6202584ab26a8903b 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -14,7 +14,7 @@
 if (defined("_ECRIRE_INC_VERSION")) return;
 define("_ECRIRE_INC_VERSION", "1");
 
-@define('_EXTENSION_PHP', '.php3');
+@define('_EXTENSION_PHP', '.php');
 
 # le nom du repertoire ecrire/
 @define('_DIR_RESTREINT_ABS', 'ecrire/');
@@ -24,6 +24,7 @@ define("_ECRIRE_INC_VERSION", "1");
 # ou inversement ?
 @define('_DIR_RACINE', _DIR_RESTREINT ? '' : '../');
 
+
 //
 // *** Parametrage par defaut de SPIP ***
 //
diff --git a/ecrire/page.php b/ecrire/page.php
deleted file mode 100644
index 7457bc0bdd66acbfdcf5c2d9572b43c04072d921..0000000000000000000000000000000000000000
--- a/ecrire/page.php
+++ /dev/null
@@ -1,63 +0,0 @@
-<?php
-
-// Appel spip direct ?
-if (!function_exists('find_in_path')) {
-	if (defined('_DIR_RESTREINT_ABS') AND
-	@file_exists(_DIR_RESTREINT_ABS.'inc_version.php')) {
-		include _DIR_RESTREINT_ABS.'inc_version.php';
-	}
-
-	## note: ce passage permet d'appeler ecrire/page.php?page=plan
-	## ce qui invoque compilateur, cache etc... pas encore
-	## totalement fonctionnel
-	else if (file_exists('./inc_version.php')) {
-		define('_DIR_RESTREINT_ABS', basename(dirname(__FILE__)).'/');
-		chdir('..');
-		include _DIR_RESTREINT_ABS.'inc_version.php';
-	}
-
-	else
-		die('stupid death...');
-}
-
-// Est-ce une action ?
-if ($action = _request('action')) {
-	$var_f = include_fonction($action, 'action');
-	$var_f();
-	if ($redirect) redirige_par_entete(urldecode($redirect));
-	exit;
-}
-
-// Sinon, reglage du $fond
-
-# passe par INCLURE(){fond=...}
-if (isset($contexte_inclus['fond']))
-	$fond = $contexte_inclus['fond'];
-
-# cas normal (securise anti injection par inc_utils)
-else if (isset($fond)) { }
-
-# passe par l'url
-else if (isset($_GET['page'])) {
-	$fond = $_GET['page'];
-	// Securite
-	if (strstr($fond, '/'))
-		die (_L("Faut pas se gener"));
-
-# par defaut, la globale
-} else
-	tester_variable('fond', 'sommaire');
-
-// Particularites de certains squelettes
-if ($fond == 'login')
-	$forcer_lang = true;
-
-// Chercher le fond et erreur s'il est absent
-if (!find_in_path($fond.'.html')) {
-	spip_log("page: find_in_path ne trouve pas le squelette $fond");
-	$fond = '404';
-}
-
-include (_DIR_INCLUDE . 'public.php');
-
-?>
diff --git a/ecrire/public.php b/ecrire/public.php
index 6009b3a9b5c81600ff8916b79d9cc50b32866746..06f678bfd6ca3cb38c84e35973db0b28819a869d 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -12,7 +12,11 @@
 
 
 // Distinguer une inclusion d'un appel initial
-if (defined("_INC_PUBLIC")) {
+if (defined('_INC_PUBLIC')) {
+	// $fond passe par INCLURE(){fond=...}
+	if (isset($contexte_inclus['fond']))
+		$fond = $contexte_inclus['fond'];
+
 	$page = inclure_page($fond, $contexte_inclus);
 	if ($page['process_ins'] == 'html')
 		echo $page['texte'];
@@ -23,22 +27,64 @@ if (defined("_INC_PUBLIC")) {
 		lang_dselect();
 
 } else {
-	define ("_INC_PUBLIC", 1);
-	if (!function_exists('find_in_path')) { # cas du script page
-		include ("ecrire/inc_version.php");
+	define ('_INC_PUBLIC', 1);
+
+	//
+	// Dispatcher les appels
+	//
+
+	// Faut-il initialiser SPIP ? (oui dans le cas general)
+	if (defined('_DIR_RESTREINT_ABS') AND
+	@file_exists(_DIR_RESTREINT_ABS.'inc_version.php')) {
+		include _DIR_RESTREINT_ABS.'inc_version.php';
+	}
+	else
+		die('stupid death...');
+
+
+	// Est-ce une action ?
+	if ($action = _request('action')) {
+		$var_f = include_fonction($action, 'action');
+		$var_f();
+		if ($redirect) redirige_par_entete(urldecode($redirect));
+		exit;
 	}
-	include_spip('public/global');
 
+	// cas normal, $fond defini dans le fichier d'appel
+	// note : securise anti-injection par inc/utils.php
+	else if (isset($fond)) { }
+
+	// page=xxxx demandee par l'url
+	else if (isset($_GET['page'])) {
+		$fond = $_GET['page'];
+		// Securite
+		if (strstr($fond, '/'))
+			die (_L("Faut pas se gener"));
+
+	# par defaut, la globale
+	} else
+		tester_variable('fond', 'sommaire');
+
+	// Particularites de certains squelettes
+	if ($fond == 'login')
+		$forcer_lang = true;
+
+
+	//
+	// Aller chercher la page
+	//
+
+	include_spip('public/global');
 	$tableau_des_erreurs = array();
-	$page = calcule_header_et_page ($fond);
+	$page = calcule_header_et_page($fond);
 
 	if ($page['status']) {
-			include_spip('inc/headers');
-			http_status($page['status']);
+		include_spip('inc/headers');
+		http_status($page['status']);
 	}
 
 	foreach($page['entetes'] as $k => $v)
-		  { header("$k: $v");}
+		@header("$k: $v");
 
 	$html= preg_match(',^\s*text/html,',$page['entetes']['Content-Type']);
 
@@ -49,8 +95,8 @@ if (defined("_INC_PUBLIC")) {
 
 	// est-on admin ?
 	if ($affiche_boutons_admin = (
-	$_COOKIE['spip_admin'] 
-	AND ($html OR ($var_mode == 'debug'))
+	$_COOKIE['spip_admin']
+	AND ($html OR ($var_mode == 'debug') OR count($tableau_des_erreurs))
 	))
 		include_spip('inc-formulaire_admin');
 
@@ -88,7 +134,7 @@ if (defined("_INC_PUBLIC")) {
 			// On ne revient pas ici si le nb d'erreurs > 4
 			if ($res === false AND $affiche_boutons_admin
 			AND $auteur_session['statut'] == '0minirezo') {
-				include_ecrire('inc_debug_sql');
+				include_spip('inc/debug');
 				erreur_squelette(_T('zbug_erreur_execution_page'));
 			}
 		}
@@ -96,11 +142,12 @@ if (defined("_INC_PUBLIC")) {
 
 	// Passer la main au debuggueur le cas echeant 
 	if ($var_mode == 'debug') {
-		include_ecrire("inc_debug_sql");
+		include_spip('inc/debug');
 		debug_dumpfile($var_mode_affiche== 'validation' ? $page :"",
 			       $var_mode_objet,$var_mode_affiche);
 	} 
-	if (count($tableau_des_erreurs) > 0 AND $affiche_boutons_admin)
+
+	if (count($tableau_des_erreurs) AND $affiche_boutons_admin)
 		$page = affiche_erreurs_page($tableau_des_erreurs) . $page;
 
 	// Traiter var_recherche pour surligner les mots
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 82b2b0442c37c1f7b52693f3f1185166cffc22ca..f2b233ce872f8c71a64f923f2c8d1d75a4d4301b 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -246,7 +246,7 @@ function balise_COMPTEUR_BOUCLE_dist($p) {
 
 function balise_TOTAL_BOUCLE_dist($p) {
 	$b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
-	spip_log("tb '$b'");
+#	spip_log("tb '$b'");
 	if ($b === '' || !isset($p->boucles[$b])) {
 		erreur_squelette(
 			_T('zbug_champ_hors_boucle',
diff --git a/ecrire/public/calcul-outils.php b/ecrire/public/calcul-outils.php
index 235dfcb830319066e75a65a3d1c70f64fe31bbb4..102c233e85c0d481a73cc0f212770d24d8d68be5 100644
--- a/ecrire/public/calcul-outils.php
+++ b/ecrire/public/calcul-outils.php
@@ -146,7 +146,7 @@ function calcul_introduction ($type, $texte, $chapo='', $descriptif='') {
 function synthetiser_balise_dynamique($nom, $args, $file, $lang, $ligne) {
 	return
 		('<'.'?php 
-include_ecrire(\'inc_lang\');
+include_spip(\'inc/lang\');
 lang_select("'.$lang.'");
 include_once("'
 		. $file
diff --git a/ecrire/public/calcul.php b/ecrire/public/calcul.php
index c1ace6a101236676f375f08a25b8eb787bf37927..1c60a68c871d74e440f79a2e13a53c70447d56d4 100644
--- a/ecrire/public/calcul.php
+++ b/ecrire/public/calcul.php
@@ -23,9 +23,9 @@ include_spip("inc/indexation");
 include_spip('inc/texte');
 include_spip('inc/lang');
 include_spip('inc/documents');
-include_ecrire("inc_abstract_sql");
+include_spip('base/abstract_sql');
 include_spip('inc/forum');
-include_ecrire("inc_debug_sql");
+include_spip('public/debug');
 include_spip('inc/distant');
 include_spip('public/calcul-outils');
 
@@ -106,7 +106,6 @@ function charger_squelette ($squelette) {
 	else {
 
 		if ($GLOBALS['var_mode'] == 'debug') {
-			include_ecrire("inc_debug_sql");
 			debug_dumpfile ($skel_code, $nom, 'code');
 		}
 		eval('?'.'>'.$skel_code);
@@ -150,31 +149,28 @@ function cherche_page ($cache, $contexte, $fond)  {
 		lang_select($lang);
 
 	$skel = chercher_squelette($fond,
-			$id_rubrique_fond,
-			$GLOBALS['spip_lang']);
+		$id_rubrique_fond,
+		$GLOBALS['spip_lang']);
 
 	// Charger le squelette et recuperer sa fonction principale
 	// (compilation automatique au besoin) et calculer
 
 	$page = array();
 
-	if ($skel) {
-		if ($fonc = charger_squelette($skel)) {
-			spip_timer('calcul page');
-			$page = $fonc(array('cache' => $cache), array($contexte));
-			spip_log("calcul ("
-				.spip_timer('calcul page')
-				.") [$skel] ".
-				($cache ? $cache.cache_gz($page).' ' : '')
-				.'- '.strlen($page['texte']).' octets'
-			);
-		}
+	if ($fonc = charger_squelette($skel)) {
+		spip_timer('calcul page');
+		$page = $fonc(array('cache' => $cache), array($contexte));
+		spip_log("calcul ("
+			.spip_timer('calcul page')
+			.") [$skel] ".
+			($cache ? $cache.cache_gz($page).' ' : '')
+			.'- '.strlen($page['texte']).' octets'
+		);
+	}
 
-		// Passer la main au debuggueur)
-		if ($GLOBALS['var_mode'] == 'debug') {
-			include_ecrire("inc_debug_sql");
-			debug_dumpfile ($page['texte'], $fonc, 'resultat');
-		}
+	// Passer la main au debuggueur)
+	if ($GLOBALS['var_mode'] == 'debug') {
+		debug_dumpfile ($page['texte'], $fonc, 'resultat');
 	}
 #	spip_log("page " . strlen($page['texte']) . " $skel .  $fonc");
 	// Retourner la structure de la page
diff --git a/ecrire/public/chercher-squelette.php b/ecrire/public/chercher-squelette.php
index d07aab11f792388088d4ad062d1018548a689f20..1de14d0da11e4d2810b5e2f5116be1ccae20c27a 100644
--- a/ecrire/public/chercher-squelette.php
+++ b/ecrire/public/chercher-squelette.php
@@ -19,13 +19,13 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 function chercher_squelette($fond, $id_rubrique, $lang) {
 	$ext = $GLOBALS['extension_squelette'];
 
-	// Accrocher un squelette de base dans le chemin
+	// Accrocher un squelette de base dans le chemin, sinon erreur
 	if (!$base = find_in_path("$fond.$ext")) {
-		// erreur webmaster : $fond ne correspond a rien
+		include_spip('public/debug');
 		erreur_squelette(_T('info_erreur_squelette2',
-			 array('fichier'=>$fond)),
-			 $GLOBALS['dossier_squelettes']);
-		return '';
+			array('fichier'=>$fond)),
+			$GLOBALS['dossier_squelettes']);
+		return substr(find_in_path('404.html'), 0, -strlen(".$ext"));
 	}
 
 	// supprimer le ".html" pour pouvoir affiner par id_rubrique ou par langue
diff --git a/ecrire/public/compilo.php b/ecrire/public/compilo.php
index d91293e5d72b84f9479f7a223d4a53c18e66363c..93f4500d6b95162f373c1369bcc34d5763bf2812 100644
--- a/ecrire/public/compilo.php
+++ b/ecrire/public/compilo.php
@@ -47,7 +47,7 @@ function calculer_inclure($struct, $descr, &$boucles, $id_boucle) {
 
 	# raccourci <INCLURE{fond=xxx}> sans fichier .php
 	if (!strlen($fichier))
-		$path = _DIR_RESTREINT.'page.php';
+		$path = _DIR_RESTREINT.'public.php';
 
 	# sinon chercher le fichier, eventuellement en changeant.php3 => .php
 	else if (!($path = find_in_path($fichier))
diff --git a/ecrire/inc_debug_sql.php b/ecrire/public/debug.php
similarity index 100%
rename from ecrire/inc_debug_sql.php
rename to ecrire/public/debug.php
diff --git a/ecrire/public/messforum.php b/ecrire/public/messforum.php
index 036ef3aabdd305528aa766ee109d3d73adf9146d..e6d68b9bfd1271f1b0ffef2c4773013d6af06cf9 100644
--- a/ecrire/public/messforum.php
+++ b/ecrire/public/messforum.php
@@ -14,7 +14,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 include_spip('inc/meta');
 include_spip('inc/forum');
 include_spip('inc/filtres');
-include_ecrire("inc_abstract_sql");
+include_spip('base/abstract_sql');
 spip_connect();
 
 // Ce fichier est inclus lorsqu'on appelle un script de l'espace public
diff --git a/formulaires/inc-formulaire_forum.php b/formulaires/inc-formulaire_forum.php
index 392cdf93bb333eca0763ad88f0061857880ad024..dd80611bafdf5f47d5def12d545a4bf9d81a82a9 100644
--- a/formulaires/inc-formulaire_forum.php
+++ b/formulaires/inc-formulaire_forum.php
@@ -19,7 +19,7 @@ include_spip('inc/texte');
 include_spip('inc/lang');
 include_spip('inc/mail');
 include_spip('inc/forum');
-include_ecrire("inc_abstract_sql");
+include_spip('base/abstract_sql');
 spip_connect();
 
 charger_generer_url();
diff --git a/formulaires/inc-formulaire_inscription.php b/formulaires/inc-formulaire_inscription.php
index fcfd56e9d9fbb43d80866c23738c055498f3601c..8e5460d6d86d13da13d51a70c116f60e3adb9d2b 100644
--- a/formulaires/inc-formulaire_inscription.php
+++ b/formulaires/inc-formulaire_inscription.php
@@ -12,7 +12,7 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
 
-include_ecrire('inc_abstract_sql');
+include_spip('base/abstract_sql');
 
 // Balise independante du contexte
 global $balise_FORMULAIRE_INSCRIPTION_collecte ;
diff --git a/oo/index.php b/oo/index.php
index 8887fe212b91717c2cc2e53ec4751a69c6c30453..d87a45cac0c963c61fa806432a245bd2b873d6b7 100644
--- a/oo/index.php
+++ b/oo/index.php
@@ -4,6 +4,6 @@
 // la page /oo offre une lecture en mode "texte seul"
 // des 3 articles les plus recents...
 
-@header("Location: ../page.php3?fond=sommaire_texte");
+@header("Location: ../spip.php?page=sommaire_texte");
 
 ?>
diff --git a/spip.php b/spip.php
index 803629aece26de00c76cfdb957b3ed6044644f2c..14c77d82f9646f833df4fb038b7c857e72d117d8 100644
--- a/spip.php
+++ b/spip.php
@@ -13,6 +13,6 @@
 # ou est l'espace prive ?
 @define('_DIR_RESTREINT_ABS', 'ecrire/');
 # au travail...
-include _DIR_RESTREINT_ABS.'page.php';
+include _DIR_RESTREINT_ABS.'public.php';
 
 ?>