diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 55804ee69b163aa1b870db4e139cf8e67de12518..af35fe7d0d2685dd1f64e0695a6fc0d31b77086c 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1801,8 +1801,7 @@ function filtre_find($array, $val) {
 
 //
 // fonction standard de calcul de la balise #PAGINATION
-// on peut la surcharger en definissant dans mes_fonctions :
-// function pagination($total, $nom, $pas, $liste) {...}
+// on peut la surcharger en definissant filtre_pagination dans mes_fonctions
 //
 
 // http://doc.spip.org/@filtre_pagination_dist
@@ -1820,14 +1819,6 @@ function filtre_pagination_dist($total, $nom, $position, $pas, $liste = true, $m
 	if (!$liste)
 		return $ancres[$ancre];
 
-	// Si le contexte ne contient pas de debut_xx, on regarde les globales
-	// (de facon a permettre la pagination dans les modeles) ; c'est une
-	// legere entorse au schema de base (squelette+contexte => page), mais
-	// sinon il faut une usine a gaz pour passer debut_xx dans propre()...
-
-	if ($position === NULL)
-		$position = _request($debut);
-
 	$pagination = array(
 		'debut' => $debut,
 		'url' => parametre_url(self(),'fragment',''), // nettoyer l'id ahah eventuel
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 8cd31c23229c4aa46e0da395f3289dd846f63539..b6c73e54e3da9fb224f1a117f1aea33b18815b16 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -10,7 +10,6 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-//
 // Ce fichier regroupe la quasi totalite des definitions de #BALISES de spip
 // Pour chaque balise, il est possible de surcharger, dans mes_fonctions,
 // la fonction balise_TOTO_dist par une fonction balise_TOTO() respectant la
@@ -18,7 +17,6 @@
 // elle recoit en entree un objet de classe CHAMP, le modifie et le retourne.
 // Cette classe est definie dans public/interfaces
 
-
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 // http://doc.spip.org/@interprete_argument_balise
@@ -485,7 +483,17 @@ function balise_POPULARITE_dist ($p) {
 }
 
 // #PAGINATION
-// http://www.spip.net/fr_articleXXXX.html
+// Le code produit est trompeur, car les modeles ne fournissent pas Pile[0].
+// On produit un appel a _request si on ne l'a pas, mais c'est inexact:
+// l'absence peut etre due a une faute de frappe dans le contexte inclus.
+
+define('CODE_PAGINATION', 
+	'%s($Numrows["%s"]["grand_total"],
+ 		%s,
+		isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)),
+		%5$s, %6$s, %7$s, %8$s, array(%9$s))');
+
+// http://www.spip.net/fr_article3367.html
 // http://doc.spip.org/@balise_PAGINATION_dist
 function balise_PAGINATION_dist($p, $liste='true') {
 	$b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
@@ -522,32 +530,28 @@ function balise_PAGINATION_dist($p, $liste='true') {
 		$code_contexte = implode(',',$code_contexte);
 	} else $code_contexte = '';
 
-	$p->boucles[$b]->numrows = true;
 	$connect = $p->boucles[$b]->sql_serveur;
+	$pas = $p->boucles[$b]->total_parties;
 	$f_pagination = chercher_filtre('pagination');
 	$type = $p->boucles[$b]->modificateur['debut_nom'];
 	$modif = ($type[0]!=="'") ? "'debut'.$type" 
 	  : ("'debut" .substr($type,1));
 
-	$p->code = $f_pagination."(\$Numrows['$b']['grand_total'], $type,
-		isset(\$Pile[0][$modif])?\$Pile[0][$modif]:0,"
-	. $p->boucles[$b]->total_parties
-	. ", $liste, "
-	. ($__modele ? $__modele : "''")
-	. "," . _q($connect) 
-	. ", array($code_contexte)" 
-	. ")";
+	$p->code = sprintf(CODE_PAGINATION, $f_pagination,$b, $type, $modif, $pas, $liste, ($__modele ? $__modele : "''"), _q($connect), $code_contexte);
 
+	$p->boucles[$b]->numrows = true;
 	$p->interdire_scripts = false;
 	return $p;
 }
 
+
 // N'afficher que l'ancre de la pagination (au-dessus, par exemple, alors
 // qu'on mettra les liens en-dessous de la liste paginee)
 // http://doc.spip.org/@balise_ANCRE_PAGINATION_dist
 function balise_ANCRE_PAGINATION_dist($p) {
-	$p = balise_PAGINATION_dist($p, $liste='false');
-	return $p;
+	if ($f = charger_fonction('PAGINATION', 'balise', true))
+		return $f($p, $liste='false');
+	else return NULL; // ou une erreur ?
 }
 
 // equivalent a #TOTAL_BOUCLE sauf pour les boucles paginees, ou elle