diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 84497a4ee2b9ed36e752979cdca97ddb39b73ec0..79176d484c8d14a9da2b1fd44c3dcbdbdd52c52c 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -591,11 +591,11 @@ function balise_PAGINATION_dist($p, $liste='true') {
 	array_shift($p->param);
 	while(count($params))
 		array_unshift($p->param,array_pop($params));
-	
+
 	// a priori true
 	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
 	// si true, les arguments simples (sans truc=chose) vont degager
-	$code_contexte = argumenter_inclure(phraser_arguments_inclure($p->param, true), $p->descr, $p->boucles, $p->id_boucle, false);
+	$code_contexte = argumenter_inclure($p->param, true, $p->descr, $p->boucles, $p->id_boucle, false);
 
 	$p->boucles[$b]->numrows = true;
 	$connect = $p->boucles[$b]->sql_serveur;
@@ -965,7 +965,7 @@ function balise_INCLUDE_dist($p) {
 // http://doc.spip.org/@balise_INCLURE_dist
 function balise_INCLURE_dist($p) {
 	$id_boucle = $p->id_boucle;
-	$_contexte = argumenter_inclure(phraser_arguments_inclure($p->param, 'all'), $p->descr, $p->boucles, $id_boucle, false, false);
+	$_contexte = argumenter_inclure($p->param, 'all', $p->descr, $p->boucles, $id_boucle, false, false);
 
 	if (isset($_contexte['fond'])) {
 
@@ -1039,7 +1039,8 @@ function balise_MODELE_dist($p) {
 	// a priori true
 	// si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise
 	// si true, les arguments simples (sans truc=chose) vont degager
-	$_contexte = argumenter_inclure(phraser_arguments_inclure($p->param, true), $p->descr, $p->boucles, $p->id_boucle, false);
+
+	$_contexte = argumenter_inclure($p->param, true, $p->descr, $p->boucles, $p->id_boucle, false);
 
 	// Si le champ existe dans la pile, on le met dans le contexte
 	// (a priori c'est du code mort ; il servait pour #LESAUTEURS dans
@@ -1063,7 +1064,7 @@ function balise_MODELE_dist($p) {
 	. (isset($_contexte['ajax'])?", 'ajax'=>true":'')
 	. "), " . _q($connect) . ")";
 
-	$p->code = "(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' : $page)";
+	$p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n";
 
 	$p->interdire_scripts = false; // securite assuree par le squelette
 
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 417c7e6a00f2842349fae31cdb42506a99ca9821..ea27aba667784fbfc4bab2c92bc876ec5e74631d 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -40,20 +40,39 @@ include_spip('public/balises');
 include_spip('public/jointures');
 
 // http://doc.spip.org/@argumenter_inclure
-function argumenter_inclure($params, $descr, &$boucles, $id_boucle, $echap=true	, $lang = ''){
+function argumenter_inclure($params, $rejet_filtres, $descr, &$boucles, $id_boucle, $echap=true	, $lang = ''){
 	$l = array();
 
-	foreach($params as $couple) {
-		list($var, $val) = $couple;
-		if ($var == 'lang') {
-			$lang = $val;
-		} else {
-			$val = ($val[0]->type == 'texte' AND !$val[0]->texte) 
-			? index_pile($id_boucle, $var, $boucles)
-			: calculer_liste($val, $descr, $boucles, $id_boucle);
+	foreach($params as $k => $couple) {
+		$val = $couple[1];
+		$var = $val[0];
+		if ($couple[0]){
+			if ($rejet_filtres)
+				break; // on est arrive sur un filtre qui suit la balise
+		} elseif ($var->type != 'texte') {
+			if ($rejet_filtres)
+				break; // on est arrive sur un filtre sans argument qui suit la balise
+			else
+				erreur_squelette(_T('zbug_parametres_inclus_incorrects'),$var);
+		} else { preg_match(",^([^=]*)(=?)(.*)$,", $var->texte,$m);
+			$var = $m[1];
+			if ($m[2]) {
+			  $v = $m[3];
+			  if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) $v = $m[1];
+			  $val[0]->texte = $v;
+			} else $val[0]->type = 'vide';
+
+			if ($var == 'lang') {
+			  $lang = $val;
+			} else {
+
+			  $val = ($val[0]->type === 'vide')
+			    ? index_pile($id_boucle, $var, $boucles)
+			    : calculer_liste($val, $descr, $boucles, $id_boucle);
 
-			$l[$var] = ($echap?"\'$var\' => ' . argumenter_squelette(":"'$var' => ")
-			  . $val . ($echap? ") . '":" ");
+			  $l[$var] = ($echap?"\'$var\' => ' . argumenter_squelette(":"'$var' => ")
+			    . $val . ($echap? ") . '":" ");
+			}
 		}
 	}
 	// Cas particulier de la langue : si {lang=xx} est definie, on
@@ -62,10 +81,11 @@ function argumenter_inclure($params, $descr, &$boucles, $id_boucle, $echap=true
 	if ($lang === false) return $l;
 
 	$l['lang'] = ($echap?"\'lang\' => ' . argumenter_squelette(":"'lang' => ")  .
-		($lang
+	  (($lang[0]->type !== 'vide')
 			? calculer_liste($lang[0], $descr, $boucles, $id_boucle)
 			: '$GLOBALS["spip_lang"]'
 			) . ($echap?") . '":" ");
+
 	return $l;
 }
 
@@ -95,8 +115,7 @@ function calculer_inclure($p, $descr, &$boucles, $id_boucle) {
 			}
 		}
 	}
-
-	$_contexte = argumenter_inclure(phraser_arguments_inclure($p->param), $descr, $boucles, $id_boucle);
+	$_contexte = argumenter_inclure($p->param, false, $descr, $boucles, $id_boucle);
 
 	// Critere d'inclusion {env} (et {self} pour compatibilite ascendante)
 	if ($env = (isset($_contexte['env'])|| isset($_contexte['self']))) {
diff --git a/ecrire/public/phraser_html.php b/ecrire/public/phraser_html.php
index bfc4375c23955c17c4332b15e4691854ca701416..af5a55edd9fa75cb0f138cf6e815d330d17e4f90 100644
--- a/ecrire/public/phraser_html.php
+++ b/ecrire/public/phraser_html.php
@@ -38,29 +38,6 @@ define('BALISE_IDIOMES',',<:(([a-z0-9_]+):)?([a-z0-9_]+)({([^\|=>]*=[^\|>]*)})?(
 define('SQL_ARGS', '(\([^)]*\))');
 define('CHAMP_SQL_PLUS_FONC', '`?([A-Z_][A-Z_0-9.]*)' . SQL_ARGS . '?`?');
 
-// http://doc.spip.org/@phraser_arguments_inclure
-function phraser_arguments_inclure($param,$rejet_filtres = false){
-	// on assimile {var=val} a une liste de un argument sans fonction
-	foreach ($param as $k => $v) {
-		$var = $v[1][0];
-		if ($var==NULL){
-			if ($rejet_filtres)
-				break; // on est arrive sur un filtre sans argument qui suit la balise
-		} elseif ($var->type != 'texte') {
-			if ($rejet_filtres)
-				break; // on est arrive sur un filtre sans argument qui suit la balise
-			else
-				erreur_squelette(_T('zbug_parametres_inclus_incorrects'),$var);
-		} elseif (preg_match(",^([^=]*)=?(.*)$,", $var->texte,$m)) {
-			$param[$k][0] = $m[1];
-			$val = $m[2];
-			if (preg_match(',^[\'"](.*)[\'"]$,', $val, $m)) $val = $m[1];
-			$param[$k][1][0]->texte = $val;
-		}
-	}
-	return $param;
-}
-
 // http://doc.spip.org/@phraser_inclure
 function phraser_inclure($texte, $ligne, $result) {
 
@@ -604,8 +581,8 @@ function public_phraser_html($texte, $id_parent, &$boucles, $nom, $ligne=1) {
 		//
 		if (strncmp($soustype, TYPE_RECURSIF, strlen(TYPE_RECURSIF)) == 0) {
 			$result->type_requete = TYPE_RECURSIF;
-			$args = phraser_arguments_inclure($result->param);
-
+			phraser_criteres($result->param, $result);
+			$args = $result->param;
 			array_unshift($args,
 				      substr($type, strlen(TYPE_RECURSIF)));
 			$result->param = $args;