diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index c450452a49c5b57e0cd510152166ac48da91e481..981eb6d3649e8076a46b425fe5533da1c44a4f1f 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -489,8 +489,6 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
 				$newdescr, $boucles, $id_boucle);
 			$apres = calculer_liste($p->apres,
 				$newdescr, $boucles, $id_boucle);
-			if ($boucles[$nom]->mode_partie=='p+')
-				$ahah_out = array($nom,$descr['nom']);
 			$newdescr['niv']--;
 			$altern = calculer_liste($p->altern,
 				$newdescr, $boucles, $id_boucle);
@@ -544,11 +542,18 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) {
 				$code = "((strval($t = $code)!='')"
 					." ?\n\t$tab($res) :\n\t$tab($altern))";
 			}
-			if ($ahah_out!==false){
-				$code = "'<div id=\"$ahah_out[0]_$ahah_out[1]\" class=\"bloc_ahah_pagination\">'
-				.(\$ahah = $code).
-				((\$_GET['ahah_id']=='$ahah_out[0]_$ahah_out[1]')?die(\$ahah):'').'</div>'";
+
+			// gestion d'une boucle-fragment (ahah)
+			if (strlen($p->fragment)) {
+				$code = '(($fragment = '.$code.')?
+				\'<div id="'.$p->fragment.'" class="fragment">\'
+				.$fragment
+				."</div>":"").
+				(($_GET["fragment"]=="'.$p->fragment.'")?
+					die(charset2unicode($fragment)):""
+				)';
 			}
+
 		}
 		if ($code != "''")
 			$codes[]= (($mode == 'validation') ?
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index a88295231627af2038aa9ffaa240a946bbdd0a09..630ac425a2e7d09f4a3dce65b69371ca01952c26 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -105,8 +105,19 @@ function critere_pagination_dist($idb, &$boucles, $crit) {
 	$boucle->mode_partie = 'p+';
 	$boucle->partie = 'intval(_request("debut'.$idb.'"))';
 	$boucle->total_parties = $pas;
+	if (!isset($boucle->fragment)) $boucle->fragment = $idb;
 }
 
+// {fragment}
+// http://www.spip.net/@fragment
+function critere_fragment_dist($idb, &$boucles, $crit) {
+	if (!($param = $crit->param[0][0]->texte))
+		$param = 'fragment'.$idb;
+	if ($crit->not)
+		$param = false;
+	$boucle = &$boucles[$idb];
+	$boucle->fragment = $param;
+}
 
 
 // {recherche}
diff --git a/ecrire/public/interfaces.php b/ecrire/public/interfaces.php
index acc0f735def334247f3d7eda4aead6ade4f7f229..26f02dee1f115b1b0f6d77f5797bdc772da49cd1 100644
--- a/ecrire/public/interfaces.php
+++ b/ecrire/public/interfaces.php
@@ -49,6 +49,7 @@ class Boucle {
 	var $jointures_explicites = false;
 	var $doublons;
 	var $partie, $total_parties,$mode_partie;
+	var $fragment; # definir un fragment de page
 	var $externe = ''; # appel a partir d'une autre boucle (recursion)
 	// champs pour la construction de la requete SQL
 	var $tout = false;