diff --git a/inc-bcl-squel.php3 b/inc-bcl-squel.php3
index e66ef586aba85aedc232f24493cb8f52f31f24c3..034d02822a55ba592925624ede6e2e2a07a13eca 100644
--- a/inc-bcl-squel.php3
+++ b/inc-bcl-squel.php3
@@ -60,7 +60,7 @@ class ParamChamp {
 	var $id_boucle;
 	var $boucles;
 	var $id_mere;
-	var $entete;		// code php a installer avant le calcul
+	var $type_requete;
 	var $code;			// code du calcul
 	var $process;		// processeurs standards, exemple 'propre(%s)'
 	var $etoile;		// le champ a ete appele avec une etoile (booleen)
@@ -71,7 +71,7 @@ class ParamChamp {
 		// Annuler les traitements si le champ est etoile
 		if ($this->etoile) unset($this->process);
 
-		list ($code_filtre, $entete_filtre) = applique_filtres(
+		$code_filtre = applique_filtres(
 			$this->fonctions,
 			$this->code,
 			$this->id_boucle,
@@ -80,7 +80,7 @@ class ParamChamp {
 			$this->type,
 			$this->process
 		);
-		return array($code_filtre, $this->entete.$entete_filtre);
+		return $code_filtre;
 	}
 }
 
diff --git a/inc-calcul-squel.php3 b/inc-calcul-squel.php3
index faf7a1e27a2e7a7f96ce7f603d2d5a5450889359..8261dca43501e6898a4a808e1265a3b99db56f5f 100644
--- a/inc-calcul-squel.php3
+++ b/inc-calcul-squel.php3
@@ -319,7 +319,7 @@ function calculer_liste($tableau, $prefix, $id_boucle, $niv, &$boucles, $id_mere
 
 		// balise SPIP
 		default: 
-			$rendu[0] = calculer_champ($objet->fonctions, 
+			$rendu[0][0] = calculer_champ($objet->fonctions, 
 				$objet->nom_champ,
 				$id_boucle,
 				$boucles,
diff --git a/inc-form-squel.php3 b/inc-form-squel.php3
index 6c6cbe1edd711749ac3ffa9d0b2a4d0ce4d44af9..1eaddb45755155880ceb68de649a617b4da68ad4 100644
--- a/inc-form-squel.php3
+++ b/inc-form-squel.php3
@@ -6,122 +6,135 @@
 
 
 // Formulaire de recherche
-function calculer_champ_FORMULAIRE_RECHERCHE($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
-	if ($fonctions) {
-		list(, $lien) = each($fonctions);	// le premier est un url
-		while (list(, $filtre) = each($fonctions))
+function balise_FORMULAIRE_RECHERCHE_dist($p) {
+	if ($p->fonctions) {
+		list(, $lien) = each($p->fonctions);	// le premier est un url
+		while (list(, $filtre) = each($p->fonctions))
 			$filtres[] = $filtre;	// les suivants sont des filtres
-		$fonctions = $filtres;
+		$p->fonctions = $filtres;
 	}
 	if (!$lien) $lien = 'recherche.php3';
-	$code = "((lire_meta('activer_moteur') != 'oui') ? '' : calcul_form_rech('$lien'))";
-	return applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere, 'php');
+
+	$p->code = "((lire_meta('activer_moteur') != 'oui') ? '' : calcul_form_rech('$lien'))";
+
+	$p->type = 'html';
+	return $p;
 }
 
 
 // Formulaire d'inscription comme redacteur (dans inc-formulaires.php3)
-function calculer_champ_FORMULAIRE_INSCRIPTION($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
-	$code = '(lire_meta("accepter_inscriptions") != "oui") ? "" :
+function balise_FORMULAIRE_INSCRIPTION_dist($p) {
+
+	$p->code = '(lire_meta("accepter_inscriptions") != "oui") ? "" :
 		("<"."?php include(\'inc-formulaires.php3\'); lang_select(\"$spip_lang\"); formulaire_inscription(\"redac\"); lang_dselect(); ?".">")';
-	list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere, 'php');
-	return array($c,$m);
+
+	$p->type = 'php';
+	return $p;
 }
 
-// Formulaire ecrire auteur (OK)
-function calculer_champ_FORMULAIRE_ECRIRE_AUTEUR($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
-	$_id_auteur = index_pile($id_boucle, 'id_auteur', $boucles);
-	$_mail_auteur = index_pile($id_boucle, 'email', $boucles);
-	$code = '!email_valide('.$_mail_auteur.') ? "" :
+// Formulaire ecrire auteur
+function balise_FORMULAIRE_ECRIRE_AUTEUR_dist($p) {
+	$_id_auteur = champ_sql('id_auteur', $p);
+	$_mail_auteur = champ_sql('email', $p);
+
+	$p->code = '!email_valide('.$_mail_auteur.') ? "" :
 		("<'.'?php include(\'inc-formulaires.php3\');
 		lang_select(\'$spip_lang\');
 		formulaire_ecrire_auteur(".'.$_id_auteur.'.", \'".texte_script('.$_mail_auteur.')."\');
 		lang_dselect(); ?'.'>")';
-	list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere, 'php');
-	return array($c,$m);  
+
+	$p->type = 'php';
+	return $p;
 }
 
 // Formulaire signature de petition
-function calculer_champ_FORMULAIRE_SIGNATURE($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
-	$_id_article = index_pile($id_boucle, 'id_article', $boucles);
-	$code = '!($petition = sql_petitions('.$_id_article.')) ? "" :
+function balise_FORMULAIRE_SIGNATURE_dist($p) {
+	$_id_article = champ_sql('id_article', $p);
+
+	$p->code = '!($petition = sql_petitions('.$_id_article.')) ? "" :
 		("<"."?php include(\'inc-formulaires.php3\');
 		lang_select(\'$spip_lang\');
 		echo formulaire_signature(".'.$_id_article.'.",
 			\'".texte_script(serialize($petition))."\');
 		lang_dselect(); ?".">")';
-	list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere, 'php');
-	return array($c,$m);
+
+	$p->type = 'php';
+	return $p;
 }
 
 // Formulaire d'inscription de site dans l'annuaire
-function calculer_champ_FORMULAIRE_SITE($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
-	$code = '(lire_meta("proposer_sites") != 2) ? "":
+function balise_FORMULAIRE_SITE_dist($p) {
+	$_id_rubrique = champ_sql('id_rubrique', $p);
+
+	$p->code = '(lire_meta("proposer_sites") != 2) ? "":
 		"<"."?php include(\'inc-formulaires.php3\');
 		lang_select(\'".$GLOBALS[\'spip_lang\']."\');
-		formulaire_site(".'.index_pile($id_boucle, 'id_rubrique', $boucles).'.");
+		formulaire_site(".'.$_id_rubrique.'.");
 		lang_dselect(); ?".">"';
-	list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere, 'php');
-	return array($c,$m);
+
+	$p->type = 'php';
+	return $p;
 }
 
 
 // Formulaire de reponse a un forum
-function calculer_champ_FORMULAIRE_FORUM($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
-	$type = $boucles[$id_boucle]->type_requete;
+function balise_FORMULAIRE_FORUM_dist($p) {
+	$type = $p->type_requete;
 	switch ($type) {
 		case 'breves':
-			$code = "boutons_de_forum('', '', ''," .
-				index_pile($id_boucle,  'id_breve', $boucles) .
+			$p->code = "boutons_de_forum('', '', ''," .
+				champ_sql('id_breve', $p) .
 				", '', " .
-				index_pile($id_boucle,  'titre', $boucles) .
+				champ_sql('titre', $p) .
 				", '$type', substr(lire_meta('forums_publics'),0,3)), \$Cache)";
 		break;
 
 		case 'rubriques':
-			$code = 'boutons_de_forum(' .
-			index_pile($id_boucle,  'id_rubrique', $boucles) .
+			$p->code = 'boutons_de_forum(' .
+			champ_sql('id_rubrique', $p) .
 			", '', '', '', ''," .
-			index_pile($id_boucle,  'titre', $boucles) .
+			champ_sql('titre', $p) .
 			", '$type', substr(lire_meta('forums_publics'),0,3)), \$Cache)";
 			break;
 
 		case 'syndication':
-			$code = "boutons_de_forum('', '', '','', " .
-			index_pile($id_boucle, 'id_rubrique', $boucles) . ", " .
-			index_pile($id_boucle,  'nom_site', $boucles) .
+			$p->code = "boutons_de_forum('', '', '','', " .
+			champ_sql('id_rubrique', $p) . ", " .
+			champ_sql('nom_site', $p) .
 			", '$type', substr(lire_meta('forums_publics'),0,3)), \$Cache)";
 			break;
     
-	case 'articles': 
-		$code = "boutons_de_forum('', '', " .
-		index_pile($id_boucle, 'id_article', $boucles) .
-		", '','', " .
-		index_pile($id_boucle,  'nom_site', $boucles) .
-		"'$type', " .
-		index_pile($id_boucle,  'accepter_forum', $boucles) .
-		', $Cache)';
-		break;
+		case 'articles': 
+			$p->code = "boutons_de_forum('', '', " .
+			champ_sql('id_article', $p) .
+			", '','', " .
+			champ_sql('nom_site', $p) .
+			"'$type', " .
+			champ_sql('accepter_forum', $p) .
+			', $Cache)';
+			break;
 
-	case 'forums':
-	default:
-		$code = "boutons_de_forum(" .
-		index_pile($id_boucle, 'id_rubrique', $boucles) . ', ' .
-		index_pile($id_boucle, 'id_forum', $boucles) . ', ' .
-		index_pile($id_boucle, 'id_article', $boucles) . ', ' .
-		index_pile($id_boucle, 'id_breve', $boucles) . ', ' .
-		index_pile($id_boucle, 'id_syndic', $boucles) . ', ' .
-		index_pile($id_boucle, 'titre', $boucles) .
-		", '$type', '', \$Cache)";
-		break;
+		case 'forums':
+		default:
+			$p->code = "boutons_de_forum(" .
+			champ_sql('id_rubrique', $p) . ', ' .
+			champ_sql('id_forum', $p) . ', ' .
+			champ_sql('id_article', $p) . ', ' .
+			champ_sql('id_breve', $p) . ', ' .
+			champ_sql('id_syndic', $p) . ', ' .
+			champ_sql('titre', $p) .
+			", '$type', '', \$Cache)";
+			break;
 	}
-	list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere, 'php');
-	return array($c,$m);
+
+	$p->type = 'php';
+	return $p;
 }
 
 // Parametres de reponse a un forum
-function calculer_champ_PARAMETRES_FORUM($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
-	$_accepter_forum = index_pile($id_boucle,  "accepter_forum", $boucles);
-	$code = '
+function balise_PARAMETRES_FORUM_dist($p) {
+	$_accepter_forum = champ_sql('accepter_forum', $p);
+	$p->code = '
 	// refus des forums ?
 	('.$_accepter_forum.'=="non" OR
 	(lire_meta("forums_publics") == "non" AND '.$_accepter_forum.'!="oui"))
@@ -129,24 +142,24 @@ function calculer_champ_PARAMETRES_FORUM($fonctions, $nom_champ, $id_boucle, &$b
 	';
 
 
-	switch ($boucles[$id_boucle]->type_requete) {
+	switch ($p->type_requete) {
 		case 'articles':
-			$c = '"id_article=".' . index_pile($id_boucle, 'id_article', $boucles);
+			$c = '"id_article=".' . champ_sql('id_article', $p);
 			break;
 		case 'breves':
-			$c = '"id_breve=".' . index_pile($id_boucle, 'id_breve', $boucles);
+			$c = '"id_breve=".' . champ_sql('id_breve', $p);
 			break;
 		case 'rubriques':
-			$c = '"id_rubrique=".' . index_pile($id_boucle, 'id_rubrique', $boucles);
+			$c = '"id_rubrique=".' . champ_sql('id_rubrique', $p);
 			break;
 		case 'syndication':
-			$c = '"id_syndic=".' . index_pile($id_boucle, 'id_syndic', $boucles);
+			$c = '"id_syndic=".' . champ_sql('id_syndic', $p);
 			break;
 		case 'forums':
 		default:
 			$liste_champs = array ("id_article","id_breve","id_rubrique","id_syndic","id_forum");
 			foreach ($liste_champs as $champ) {
-				$x = index_pile($id_boucle,  $champ, $boucles);
+				$x = champ_sql( $champ, $p);
 				$c .= (($c) ? ".\n" : "") . "((!$x) ? '' : ('&$champ='.$x))";
 			}
 			$c = "substr($c,1)";
@@ -163,21 +176,23 @@ function calculer_champ_PARAMETRES_FORUM($fonctions, $nom_champ, $id_boucle, &$b
 	// invalideur forums
 	(!($Cache[\'id_forum\'][calcul_index_forum(' . 
 				// Retournera 4 [$SP] mais force la demande du champ a MySQL
-				index_pile($id_boucle, 'id_article', $boucles) . ',' .
-				index_pile($id_boucle, 'id_breve', $boucles) .  ',' .
-				index_pile($id_boucle, 'id_rubrique', $boucles) .',' .
-				index_pile($id_boucle, 'id_syndic', $boucles) .  ")]=1)?'':\n";
-	$code .= $invalide."(".$c."))";
-
-	list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere);
-	return array($c,$m);
+				champ_sql('id_article', $p) . ',' .
+				champ_sql('id_breve', $p) .  ',' .
+				champ_sql('id_rubrique', $p) .',' .
+				champ_sql('id_syndic', $p) .  ")]=1)?'':\n";
+	$p->code .= $invalide."(".$c."))";
+
+	$p->type = 'html';
+	return $p;
 }
 
 /*
 # Boutons d'administration: 
 */
-function calculer_champ_FORMULAIRE_ADMIN($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere) {
-  return array("'<!-- @@formulaire_admin@@45609871@@ -->'",'');
+function balise_FORMULAIRE_ADMIN_dist($p) {
+	$p->code = "'<!-- @@formulaire_admin@@45609871@@ -->'";
+	$p->type = "php";
+	return $p;
 }
 
 ?>
diff --git a/inc-index-squel.php3 b/inc-index-squel.php3
index 7147298a3f8eb06e34ecb5ad80e11ee4072b0052..79b41367ea67a432d8d070ad7344ba2c3605c286 100644
--- a/inc-index-squel.php3
+++ b/inc-index-squel.php3
@@ -79,21 +79,13 @@ function index_pile($idb, $nom_champ, &$boucles) {
 	return('$Pile[0][\''.$nom_champ.'\']');
 }
 
-# calculer_champ genere le code PHP correspondant a la balise Spip $nom_champ
-# Retourne un tableau dont le premier element est une EXPRESSION php 
-# et le deuxieme une suite d'INSTRUCTIONS a executer AVANT de calculer
-# l'expression (typiquement: un include ou une affectation d'auxiliaires)
-# Ce tableau est egalement retourne par la fonction applique_filtres
-# qui s'occupe de construire l'application 
-# s'il existe une fonction nommee "calculer_champ_" suivi du nom du champ,
-# on lui passe la main et elle est cense retourner le tableau ci-dessus
-# (Essayer de renvoyer une suite vide, ca diminue les allocations a l'exec)
-
 // cette fonction sert d'API pour demander le champ '$champ' dans la pile
 function champ_sql($champ, $p) {
 	return index_pile($p->id_boucle, $champ, $p->boucles);
 }
 
+# calculer_champ genere le code PHP correspondant a la balise Spip $nom_champ
+# Retourne une EXPRESSION php 
 function calculer_champ($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere, $etoile = false) {
 	// Preparer les parametres
 	$p = new ParamChamp;
@@ -104,8 +96,7 @@ function calculer_champ($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere,
 	$p->id_mere = $id_mere;
 	$p->type = 'html';
 	$p->process = '';
-
-	# $p->type_requete = $boucles[$id_boucle]->type_requete; # A AJOUTER
+	$p->type_requete = $boucles[$id_boucle]->type_requete;
 
 	// regarder s'il existe une fonction personnalisee balise_NOM()
 	$f = 'balise_' . $nom_champ;
@@ -117,15 +108,8 @@ function calculer_champ($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere,
 	if (function_exists($f) AND $p = $f($p))
 		return $p->retour();
 
-	# A SUPPRIMER, cf. inc-form-squel.php3
-	// regarder s'il existe une fonction old style calculer_champ_NOM()
-	$f = 'calculer_champ_' . $nom_champ;
-	if (function_exists($f)) {
-		return $f($fonctions, $nom_champ, $id_boucle, $boucles, $id_mere);
-	}
-
 	// S'agit-il d'un logo ? Une fonction speciale les traite tous
-	if (ereg('^LOGO_', $nom_champ) AND $p = calculer_champ_LOGO($p))
+	if (ereg('^LOGO_', $nom_champ) AND $p = calcul_balise_logo($p))
 		return $p->retour();
 
 	// On regarde ensuite s'il y a un champ SQL homonyme,
@@ -155,7 +139,6 @@ function calculer_champ($fonctions, $nom_champ, $id_boucle, &$boucles, $id_mere,
 
 // Genere l'application d'une liste de filtres
 function applique_filtres ($fonctions, $code, $id_boucle, $boucles, $id_mere, $type ='html', $process='') {
-	$milieu = '';
 
 	// pretraitements standards
 	switch ($type) {
@@ -186,14 +169,11 @@ function applique_filtres ($fonctions, $code, $id_boucle, $boucles, $id_mere, $t
 						$args = $regs[2];
 						$arg = trim($regs[1]);
 						if ($arg) {
-							if ($arg[0] =='#') {
-								list($arg,$m) = calculer_champ(array(),substr($arg,1),$id_boucle, $boucles, $id_mere);
-								$milieu .= $m;
-							}
-							else {
-								if ($arg[0] =='$')
-									$arg = '$Pile[0][\'' . substr($arg,1) . "']";
-							}
+							if ($arg[0] =='#')
+								$arg = calculer_champ(array(), substr($arg,1),
+									$id_boucle, $boucles, $id_mere);
+							else if ($arg[0] =='$')
+								$arg = '$Pile[0][\'' . substr($arg,1) . "']";
 							$arglist .= ','.$arg;
 						}
 					}
@@ -201,7 +181,9 @@ function applique_filtres ($fonctions, $code, $id_boucle, $boucles, $id_mere, $t
 				if (function_exists($fonc))
 					$code = "$fonc($code$arglist)";
 				else
-					$code = "'"._T('erreur_filtre', array('filtre' => $fonc))."'";
+					$code = "'".texte_script(
+						_T('erreur_filtre', array('filtre' => $fonc))
+					)."'";
 			}
 		}
 	}
@@ -210,7 +192,7 @@ function applique_filtres ($fonctions, $code, $id_boucle, $boucles, $id_mere, $t
 	if ($type == 'html')
 		$code = "interdire_scripts($code)";
 
-	return array($code, $milieu);
+	return $code;
 }
 
 ?>
diff --git a/inc-logo-squel.php3 b/inc-logo-squel.php3
index d9b9b462f052ef16851c8509f022960d9304ffc8..a86c239d50416df8297945c33461de3db97a4f7e 100644
--- a/inc-logo-squel.php3
+++ b/inc-logo-squel.php3
@@ -16,7 +16,7 @@ function balise_EXTRA_dist ($p) {
 	if ($p->fonctions) {
 		include_ecrire("inc_extra.php3");
 		list ($key, $champ_extra) = each($p->fonctions);	// le premier filtre
-		$type_extra = $p->boucles[$p->id_boucle]->type_requete;
+		$type_extra = $p->type_requete;
 			// ci-dessus est sans doute un peu buggue : si on invoque #EXTRA
 			// depuis un sous-objet sans champ extra d'un objet a champ extra,
 			// on aura le type_extra du sous-objet (!)
@@ -93,8 +93,7 @@ function balise_POPULARITE_dist ($p) {
 
 
 # Fonction commune aux logos (rubriques, articles...)
-
-function calculer_champ_LOGO($p) {
+function calcul_balise_logo ($p) {
 
 	// analyser la balise LOGO_xxx
 	eregi("^LOGO_(([A-Z]+)(_.*)?)", $p->nom_champ, $regs);
diff --git a/inc-text-squel.php3 b/inc-text-squel.php3
index e4788841e6d7f9aaf97735db5480695796a8db01..6d99fe2d291ecc8b35622314a22b4ab48b8ebebe 100644
--- a/inc-text-squel.php3
+++ b/inc-text-squel.php3
@@ -66,22 +66,18 @@ function calculer_texte($texte, $id_boucle, &$boucles, $id_mere) {
 		//
 		$chaine = strtolower($match[3]);
 		if (!($module = $match[2]))
-		  // ordre des modules a explorer
-		  $module = 'local/public/spip';
-		// il faudrait traiter un $m non vide
-		list ($c,$m) = applique_filtres(explode('|',
-							substr($match[4],1)),
-						"_T('$module:$chaine')",
-						$id_boucle, 
-						$boucles,
-						$id_mere);
-		$code = str_replace($match[0], 
-				    "'$ferme_multi.$c.$ouvre_multi'",
-				    $code);
+			// ordre standard des modules a explorer
+			$module = 'local/public/spip';
+		$c = applique_filtres(explode('|',
+			substr($match[4],1)),
+			"_T('$module:$chaine')",
+			$id_boucle, 
+			$boucles,
+			$id_mere);
+		$code = str_replace($match[0], "'$ferme_multi.$c.$ouvre_multi'", $code);
 	}
 
-	$code = "$ouvre_multi$code$ferme_multi";
-	return ($code);
+	return $ouvre_multi . $code . $ferme_multi;
 }
 
 ?>
diff --git a/inc-vrac-squel.php3 b/inc-vrac-squel.php3
index 19dd78c120020c0b82bce2e957c6e0c49c00e73f..9c265104306d641d2a24a9c8909c2848d810eb45 100644
--- a/inc-vrac-squel.php3
+++ b/inc-vrac-squel.php3
@@ -97,7 +97,7 @@ function balise_URL_SITE_SPIP_dist($p) {
 
 
 function balise_URL_ARTICLE_dist($p) {
-	$_type = $p->boucles[$p->id_boucle]->type_requete;
+	$_type = $p->type_requete;
 
 	// Cas particulier des boucles (SYNDIC_ARTICLES)
 	if ($_type == 'syndic_articles') {
@@ -274,7 +274,7 @@ function balise_EXPOSER_dist($p) {
 	$p->fonctions = $filtres;
 	}
 
-	$type_boucle = $p->boucles[$p->id_boucle]->type_requete;
+	$type_boucle = $p->type_requete;
 	$primary_key = $table_primary[$type_boucle];
 
 	$p->code = '(calcul_exposer('
@@ -369,7 +369,7 @@ function balise_URL_LOGOUT_dist($p) {
 }
 
 function balise_INTRODUCTION_dist ($p) {
-	$_type = $p->boucles[$p->id_boucle]->type_requete;
+	$_type = $p->type_requete;
 	$_texte = champ_sql('texte', $p);
 	$_chapo = champ_sql('chapo', $p);
 	$_descriptif = champ_sql('descriptif', $p);