diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index ff63624dfe35b5ca4e32c9df38d126f667495140..090b2539e467dff9248f2c29ef47eb586759e1f4 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1764,7 +1764,7 @@ function filtre_pagination_dist($total, $nom, $position, $pas, $liste = true, $m
 		return $bloc_ancre;
 
 	if ($modele) $modele = '_'.$modele;
-	return recuperer_fond("modeles/pagination$modele", $pagination, false, true, $connect);
+	return recuperer_fond("modeles/pagination$modele", $pagination, true, $connect);
 }
 
 // recuperere le chemin d'une css existante et :
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 6bf5e63f000698547f385d3c2b69c1706631818c..1292e6539d0b8c58d16d3df6b9d883d3e65796b1 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -1330,9 +1330,6 @@ function evaluer_fond ($fond, $contexte=array(), $options=array(), $connect=null
 	if (!isset($GLOBALS['_INC_PUBLIC'])) $GLOBALS['_INC_PUBLIC'] = 0;
 	$GLOBALS['_INC_PUBLIC']++;
 
-	// option[s] par defaut
-	$options = array_merge( array('protect_xml' => false), $options);
-
 	if (isset($contexte['fond'])
 	AND $fond === '')
 		$fond = $contexte['fond'];
@@ -1340,16 +1337,14 @@ function evaluer_fond ($fond, $contexte=array(), $options=array(), $connect=null
 	$page = inclure_page($fond, $contexte, $connect);
 	if ($GLOBALS['flag_ob'] AND ($page['process_ins'] != 'html')) {
 		ob_start();
+		xml_hack($page, true);
 		eval('?' . '>' . $page['texte']);
 		$page['texte'] = ob_get_contents();
+		xml_hack($page);
 		$page['process_ins'] = 'html';
 		ob_end_clean();
 	}
 
-	if (isset($page['entetes']['X-Xml-Hack'])
-	AND isset($options['protect_xml']) AND $options['protect_xml'])
-		$page['texte'] = str_replace("<\1?xml", '<'.'?xml', $page['texte']);
-
 	$GLOBALS['_INC_PUBLIC']--;
 
 	return $page;
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index 016c68619e83eaf6e177c1076538786a163217aa..f4fdb2b1e551b47c16a8d3f3cce81ee565681f98 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -305,7 +305,7 @@ $spip_sql_version = 1;
 // (ce qui marche pour yy ne marchera pas forcement sur une version plus ancienne)
 // type nouvelles fonctionnalites, deplacement de fonctions ...
 $spip_version_affichee = '1.9.3 dev';
-$spip_version_code = '1.9301';
+$spip_version_code = '1.9302';
 
 // ** Securite **
 $visiteur_session = $auteur_session = $connect_statut = $connect_toutes_rubriques =  $hash_recherche = $hash_recherche_strict = $ldap_present ='';
diff --git a/ecrire/public.php b/ecrire/public.php
index 426a6d2eb55fc3b6b7a4f777b3ddc0c85ddb27ba..665b15cb0b87093cac7885aeb51012d8d74d6c51 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -26,8 +26,11 @@ if ($GLOBALS['_INC_PUBLIC']>0) {
 		if ($subpage['process_ins'] == 'html'){
 			echo $subpage['texte'];
 		}
-		else
+		else {
+			xml_hack($subpage, true);
 			eval('?' . '>' . $subpage['texte']);
+			// xml_hack($subpage); # sera nettoye apres l'eval() final
+		}
 	
 		// est-ce possible ?
 		if (isset($subpage['lang_select'])
@@ -172,10 +175,6 @@ if ($GLOBALS['_INC_PUBLIC']>0) {
 		$spip_compter_visites = in_array($page['entetes']['X-Spip-Visites'],array('oui','non'))?$page['entetes']['X-Spip-Visites']:$spip_compter_visites;
 		unset($page['entetes']['X-Spip-Visites']);
 	}
-	
-	// 0. xml-hack
-	if ($xml_hack = isset($page['entetes']['X-Xml-Hack']))
-		unset($page['entetes']['X-Xml-Hack']);
 
 	// 1. Cas d'une page contenant uniquement du HTML :
 	if ($page['process_ins'] == 'html') {
@@ -191,18 +190,22 @@ if ($GLOBALS['_INC_PUBLIC']>0) {
 		// envoi des entetes
 		if (!$flag_ob) {
 			foreach($page['entetes'] as $k => $v) @header("$k: $v");
+			xml_hack($page, true);
 			eval('?' . '>' . $page['texte']);
 			$page['texte'] = '';
+			// xml_hack($page); # inutile :(
 		}
 
 		// sinon, inclure_balise_dynamique nous enverra peut-etre
 		// quelques en-tetes de plus (voire qq envoyes directement)
 		else {
 			ob_start(); 
+			xml_hack($page, true);
 			$res = eval('?' . '>' . $page['texte']);
 			$page['texte'] = ob_get_contents(); 
+			xml_hack($page);
 			ob_end_clean();
-			
+
 			foreach($page['entetes'] as $k => $v) @header("$k: $v");
 			// en cas d'erreur lors du eval,
 			// la memoriser dans le tableau des erreurs
@@ -212,6 +215,7 @@ if ($GLOBALS['_INC_PUBLIC']>0) {
 				erreur_squelette(_T('zbug_erreur_execution_page'));
 			}
 		}
+
 	}
 
 	if ($html) $page = analyse_js_ajoutee($page);
@@ -234,10 +238,6 @@ if ($GLOBALS['_INC_PUBLIC']>0) {
 	// Post-traitements et affichage final
 	//
 
-	// Report du hack pour <?xml (cf. public/compiler.php)
-	if ($xml_hack)
-		$page['texte'] = str_replace("<\1?xml", '<'.'?xml', $page['texte']);
-
 	// (c'est ici qu'on fait var_recherche, tidy, boutons d'admin,
 	// cf. public/assembler.php)
 	echo pipeline('affichage_final', $page['texte']);
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 9f46faf141ae1ee858d2ae3e993a889b032d525d..ccec409433d2add049dd5f396102ba3b026506eb 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -329,8 +329,10 @@ function inclure_balise_dynamique($texte, $echo=true, $ligne=0) {
 				$texte = $page['texte'];
 		} else {
 				ob_start();
+				xml_hack($page, true);
 				eval('?' . '>' . $page['texte']);
 				$texte = ob_get_contents();
+				xml_hack($page);
 				ob_end_clean();
 		}
 	}
@@ -550,11 +552,8 @@ function message_erreur_404 ($erreur= "") {
 // fonction permettant de recuperer le resultat du calcul d'un squelette
 // pour une inclusion dans un flux
 // http://doc.spip.org/@recuperer_fond
-function recuperer_fond($fond, $contexte=array(), $protect_xml=true, $trim=true, $connect='') {
-	$options = array(
-		'protect_xml' => $protect_xml,
-		'trim' => $trim
-	);
+function recuperer_fond($fond, $contexte=array(), $trim=true, $connect='') {
+	$options = array('trim' => $trim);
 
 	$texte = "";
 	foreach(is_array($fond) ? $fond : array($fond) as $f){
@@ -705,4 +704,12 @@ function inclure_modele($type, $id, $params, $lien, $connect='') {
 	return $retour;
 }
 
+// Appeler avant et apres chaque eval()
+function xml_hack(&$page, $echap = false) {
+	if ($echap)
+		$page['texte'] = str_replace('<'.'?xml', "<\1?xml", $page['texte']);
+	else
+		$page['texte'] = str_replace("<\1?xml", '<'.'?xml', $page['texte']);
+}
+
 ?>
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 0a31f175b3aefd8ec196d4c4f6637d09a8a143de..2c81790078bb27f092048e34cb9ca3dfdf283bb2 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -490,7 +490,7 @@ function balise_LESAUTEURS_dist ($p) {
 		$p->code = "recuperer_fond(
 			'modeles/lesauteurs',
 			array('id_article' => ".champ_sql('id_article', $p)
-			."), false, true, "
+			."), true, "
 			. sql_quote($connect)
 			.")";
 		$p->interdire_scripts = false; // securite apposee par recuperer_fond()
@@ -1014,7 +1014,7 @@ function balise_INCLURE_dist($p) {
 			$l = "array_merge(\$Pile[0],$l)";
 		}
 		$connect = $p->boucles[$p->id_boucle]->sql_serveur;
-		$p->code = "recuperer_fond('',".$l.",true, false, " . sql_quote($connect) .")";
+		$p->code = "recuperer_fond('',".$l.", false, " . sql_quote($connect) .")";
 	} else {
 		$n = interprete_argument_balise(1,$p);
 		$p->code = '(($c = find_in_path(' . $n . ')) ? spip_file_get_contents($c) : "")';
@@ -1069,7 +1069,7 @@ function balise_MODELE_dist($p) {
 	$connect = $p->boucles[$p->id_boucle]->sql_serveur;
 	$p->code = "( ((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))<5)?
 	recuperer_fond('modeles/".$nom."',
-		creer_contexte_de_modele(array(".join(',', $code_contexte).",'recurs='.(++\$recurs), \$GLOBALS['spip_lang'])),false,true," . sql_quote($connect) . "):'')";
+		creer_contexte_de_modele(array(".join(',', $code_contexte).",'recurs='.(++\$recurs), \$GLOBALS['spip_lang'])), true, " . sql_quote($connect) . "):'')";
 	$p->interdire_scripts = false; // securite assuree par le squelette
 
 	return $p;
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 557a8fc78358f33b2ab9d6bc6af0c1d6af34e9b4..01d8f0daed60e31d4bcb89bfb29d35f51594dbab 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -683,9 +683,6 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
 	include_spip('inc/charsets');
 	$squelette = transcoder_page($squelette);
 
-	// Hacke un eventuel tag xml "<?xml" pour qu'il ne soit pas traite comme php
-	$squelette = str_replace('<'.'?xml', "#HTTP_HEADER{X-Xml-Hack: ok}<\1?xml", $squelette);
-
 	// Phraser le squelette, selon sa grammaire
 	// pour le moment: "html" seul connu (HTML+balises BOUCLE)
 	$boucles = array();
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index e18d4b47f30b7f4429948591f2249bf573123def..3285c208bc154a4afb978a6d897e1ca83a04be50 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -75,9 +75,16 @@ function analyse_resultat_skel($nom, $cache, $corps) {
 		$headers[$j] = $r[3];
 	}
 
+	$process_ins = (
+		strpos($corps,'<'.'?') === false
+		OR strpos(str_replace('<'.'?xml', '', $corps),'<'.'?') === false
+	)
+		? 'html'
+		: 'php';
+
 	return array('texte' => $corps,
 		'squelette' => $nom,
-		'process_ins' => ((strpos($corps,'<'.'?')=== false)?'html':'php'),
+		'process_ins' => $process_ins,
 		'invalideurs' => $cache,
 		'entetes' => $headers,
 		'duree' => isset($headers['X-Spip-Cache']) ? intval($headers['X-Spip-Cache']) : 0