diff --git a/ecrire/balise/formulaire_ecrire_auteur.php b/ecrire/balise/formulaire_ecrire_auteur.php
index 6619ee4a024842776a6089727d9e0a22d2e40948..d53690b30b644d8db5b0605dd446fcb1a243f7d2 100644
--- a/ecrire/balise/formulaire_ecrire_auteur.php
+++ b/ecrire/balise/formulaire_ecrire_auteur.php
@@ -24,17 +24,23 @@ function balise_FORMULAIRE_ECRIRE_AUTEUR ($p) {
 }
 
 // http://doc.spip.org/@balise_FORMULAIRE_ECRIRE_AUTEUR_stat
-function balise_FORMULAIRE_ECRIRE_AUTEUR_stat($args, $filtres) {
+function balise_FORMULAIRE_ECRIRE_AUTEUR_stat($args, $context_compil) {
 	include_spip('inc/filtres');
-
 	// Pas d'id_auteur ni d'id_article ? Erreur de squelette
 	$id = intval($args[1]);
-	if (!$args[0] AND !$id)
-		return erreur_squelette(
-			_T('zbug_champ_hors_motif',
-				array ('champ' => '#FORMULAIRE_ECRIRE_AUTEUR',
-					'motif' => 'AUTEURS/ARTICLES')), '');
-
+	if (!$args[0] AND !$id) {
+		include_spip('public/interfaces');
+		$p = new Contexte;
+		$p->descr = array('sourcefile' => $context_compil[0],
+				  'nom' => $context_compil[1]);
+		$p->id_boucle = $context_compil[2];
+		$p->ligne = $context_compil[3];
+		$p->lang = $context_compil[4];
+		$msg = array('zbug_champ_hors_motif',
+				array ('champ' => 'FORMULAIRE_ECRIRE_AUTEUR',
+					'motif' => 'AUTEURS/ARTICLES'));
+		return erreur_squelette($msg, $p);
+	}
 	// Si on est dans un contexte article, 
 	// sortir tous les mails des auteurs de l'article
 	if (!$args[0] AND $id) {
diff --git a/ecrire/balise/formulaire_signature.php b/ecrire/balise/formulaire_signature.php
index 83f6b18972de221e4e1d2ab3a9e2a2a843b8bb19..7c728e410a4ecb9261957db91b262811ce02b0a3 100644
--- a/ecrire/balise/formulaire_signature.php
+++ b/ecrire/balise/formulaire_signature.php
@@ -31,15 +31,22 @@ function balise_FORMULAIRE_SIGNATURE ($p) {
 
 // Verification des arguments (contexte + filtres)
 // http://doc.spip.org/@balise_FORMULAIRE_SIGNATURE_stat
-function balise_FORMULAIRE_SIGNATURE_stat($args, $filtres) {
+function balise_FORMULAIRE_SIGNATURE_stat($args, $context_compil) {
 
 	// pas d'id_article => erreur de squelette
-	if (!$args[0])
-		return erreur_squelette(
-			_T('zbug_champ_hors_motif',
-				array ('champ' => '#FORMULAIRE_SIGNATURE',
-					'motif' => 'ARTICLES')), '');
-
+	if (!$args[0]) {
+		include_spip('public/interfaces');
+		$p = new Contexte;
+		$p->descr = array('sourcefile' => $context_compil[0],
+				  'nom' => $context_compil[1]);
+		$p->id_boucle = $context_compil[2];
+		$p->ligne = $context_compil[3];
+		$p->lang = $context_compil[4];
+		$msg = array('zbug_champ_hors_motif',
+				array ('champ' => 'FORMULAIRE_SIGNATURE',
+				       'motif' => 'ARTICLES'));
+		return erreur_squelette($msg, $p);
+	}
 	// article sans petition => pas de balise
 	else if (!$args[1])
 		return '';
diff --git a/ecrire/balise/formulaire_site.php b/ecrire/balise/formulaire_site.php
index 58ddc38d0a0a9b320366ed268c2900085d71a720..bea717ca477476229052979e0aa3098fd5c57937 100644
--- a/ecrire/balise/formulaire_site.php
+++ b/ecrire/balise/formulaire_site.php
@@ -21,15 +21,22 @@ function balise_FORMULAIRE_SITE ($p) {
 }
 
 // http://doc.spip.org/@balise_FORMULAIRE_SITE_stat
-function balise_FORMULAIRE_SITE_stat($args, $filtres) {
+function balise_FORMULAIRE_SITE_stat($args, $context_compil) {
 
 	// Pas d'id_rubrique ? Erreur de squelette
-	if (!$args[0])
-		return erreur_squelette(
-			_T('zbug_champ_hors_motif',
-				array ('champ' => '#FORMULAIRE_SITE',
-					'motif' => 'RUBRIQUES')), '');
-
+	if (!$args[0]) {
+		include_spip('public/interfaces');
+		$p = new Contexte;
+		$p->descr = array('sourcefile' => $context_compil[0],
+				  'nom' => $context_compil[1]);
+		$p->id_boucle = $context_compil[2];
+		$p->ligne = $context_compil[3];
+		$p->lang = $context_compil[4];
+		$msg = array('zbug_champ_hors_motif',
+				array ('champ' => 'FORMULAIRE_SITE',
+					'motif' => 'RUBRIQUES'));
+		return erreur_squelette($msg, $p);
+	}
 	// Verifier que les visisteurs sont autorises a proposer un site
 
 	return (($GLOBALS['meta']["proposer_sites"] != 2) ? '' : $args);
diff --git a/ecrire/lang/spip_fr.php b/ecrire/lang/spip_fr.php
index 73ba324ad7730f0f2372f1096dbb45e77972e005..bdcb40aaf4ee3f690de55bf9f3333c5b422ff2fb 100644
--- a/ecrire/lang/spip_fr.php
+++ b/ecrire/lang/spip_fr.php
@@ -750,7 +750,7 @@ et vous reconnecter au site.
 'zbug_boucle_recursive_undef' => 'Boucle récursive non définie : @nom@',
 'zbug_calcul' => 'calcul',
 'zbug_champ_hors_boucle' => 'Champ @champ@ hors boucle',
-'zbug_champ_hors_motif' => 'Champ @champ@ hors d\'une boucle de motif @motif@',
+'zbug_champ_hors_motif' => 'Champ @champ@ hors d\'un contexte @motif@',
 'zbug_code' => 'code',
 'zbug_critere_inconnu' => 'Critère inconnu @critere@',
 'zbug_distant_interdit' => 'Externe interdit', # Contexte : une base de données "externe", pas gérée par SPIP, mais que SPIP 1.8 sait utiliser dans ses boucles -- seul problèmes certaines manipulations sont interdites sur ces bases-là.
diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php
index 124d7a469ffdd7baa2a7dcb2bd70e7c8d5160f69..8682b02cce91b28d48d305484a749ad86d601464 100644
--- a/ecrire/public/composer.php
+++ b/ecrire/public/composer.php
@@ -272,8 +272,16 @@ if ($lang_select) lang_select();
 ?'
        .'>');
 
-function synthetiser_balise_dynamique($nom, $args, $file, $lang, $ligne) {
-	$r = sprintf(CODE_INCLURE_BALISE, $lang, $file, $nom, join(", ", array_map('argumenter_squelette', $args)), $ligne);
+// Cette fonction fabrique l'appel d'une balise dynamique a l'aide du contexte
+// de compilation prepare par calculer_balise_dynamique dans references.php:
+// 0: sourcefile
+// 1: codefile
+// 2: id_boucle
+// 3: ligne
+// 4: langue
+
+function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) {
+	$r = sprintf(CODE_INCLURE_BALISE, $context_compil[4], $file, $nom, join(", ", array_map('argumenter_squelette', $args)), $context_compil[3]);
 	return $r;
 }
 
@@ -292,7 +300,7 @@ function argumenter_squelette($v) {
 
 // verifier leurs arguments et filtres, et calculer le code a inclure
 // http://doc.spip.org/@executer_balise_dynamique
-function executer_balise_dynamique($nom, $args, $autres, $lang, $ligne) {
+function executer_balise_dynamique($nom, $args, $context_compil) {
 	if (!$file = find_in_path(strtolower($nom) .'.php', 'balise/', true)) {
 		// regarder si une fonction generique n'existe pas
 		if (($p = strpos($nom,"_"))
@@ -307,7 +315,7 @@ function executer_balise_dynamique($nom, $args, $autres, $lang, $ligne) {
 	// Y a-t-il une fonction de traitement des arguments ?
 	$f = 'balise_' . $nom . '_stat';
 	if (function_exists($f))
-		$r = $f($args, $autres); 
+		$r = $f($args, $context_compil); 
 	else
 		$r = $args;
 	if (!is_array($r))
@@ -327,12 +335,10 @@ function executer_balise_dynamique($nom, $args, $autres, $lang, $ligne) {
 		}
 		if (!_DIR_RESTREINT) 
 			$file = _DIR_RESTREINT_ABS . $file;
-		return synthetiser_balise_dynamique($nom, $r, $file, $lang, $ligne);
+		return synthetiser_balise_dynamique($nom, $r, $file, $context_compil);
 	}
 }
 
-
-
 // http://doc.spip.org/@lister_objets_avec_logos
 function lister_objets_avec_logos ($type) {
 	global $formats_logos;
diff --git a/ecrire/public/interfaces.php b/ecrire/public/interfaces.php
index 8f27b59d009899753e5723198282de6bf8bfe2d8..6fe1b0cdd68c9326d476516882e55e02d26aecb3 100644
--- a/ecrire/public/interfaces.php
+++ b/ecrire/public/interfaces.php
@@ -155,6 +155,13 @@ class Polyglotte {
 	var $ligne = 0;
 }
 
+class Contexte {
+	var $descr = array();
+	var $id_boucle = '';
+	var $ligne = 0;
+	var $lang = '';
+}
+
 global $table_criteres_infixes;
 $table_criteres_infixes = array('<', '>', '<=', '>=', '==', '===', '!=', '!==', '<>',  '?');
 
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index 49b4dc4fa77311f4a5e701a241697b07dc06ee60..6f4b0c08d2ebef3c6b4e2756f8757dc7a072afc0 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -164,9 +164,10 @@ function calculer_champ($p) {
 // Pour une balise nommmee NOM, elle demande a charger_fonction de chercher
 // s'il existe une fonction balise_NOM ou balise_NOM_dist
 // eventuellement en chargeant le fichier balise/NOM.php.
-// Si ce n'est pas le cas, hormis le cas historique des balise LOGO_*,
-// elle estime que c'est une reference a une colonne de table connue.
-// Les surcharges via charger_fonction sont donc possibles.
+// Si la balise est de la forme PREFIXE_SUFFIXE (cf LOGO_* et URL_*)
+// elle fait de meme avec juste le PREFIXE.
+// Si pas de fonction, c'est une reference a une colonne de table SQL connue.
+// Les surcharges des colonnes SQL via charger_fonction sont donc possibles.
 
 // http://doc.spip.org/@calculer_balise
 function calculer_balise($nom, $p) {
@@ -231,13 +232,11 @@ function calculer_balise_DEFAUT_dist($nom, $p) {
 // On leur adjoint les arguments explicites de la balise (cf #LOGIN{url})
 // et d'eventuelles valeurs transmises d'autorite par la balise.
 // (cf http://trac.rezo.net/trac/spip/ticket/1728)
-// La fonction nomme ci-dessous recevra a l'execution la valeur de tout ca.
+// La fonction nommee ci-dessous recevra a l'execution la valeur de tout ca.
 
 define('CODE_EXECUTER_BALISE', "executer_balise_dynamique('%s',
 	array(%s%s),
-	array(%s),
-	\$GLOBALS['spip_lang'],
-	%s)");
+	array(%s))");
 
 // http://doc.spip.org/@calculer_balise_dynamique
 function calculer_balise_dynamique($p, $nom, $l, $supp=array()) {
@@ -254,11 +253,18 @@ function calculer_balise_dynamique($p, $nom, $l, $supp=array()) {
 		$param = compose_filtres_args($p, $c, ',');
 	} else	$param = "";
 	$collecte = join(',', collecter_balise_dynamique($l, $p, $nom));
+	$supp = array_merge(array(
+				  _q($p->descr['sourcefile']),
+				  _q($p->descr['nom']),
+				  _q($p->id_boucle),
+				  intval($p->ligne),
+				  _q($GLOBALS['spip_lang'])),
+			    $supp);
+
 	$p->code = sprintf(CODE_EXECUTER_BALISE, $nom,
 		$collecte,
 		($collecte ? $param : substr($param,1)), # virer la virgule
-		join(',', $supp),
-		$p->ligne);
+			   join(',', $supp));
 
 	$p->interdire_scripts = false;
 	return $p;