diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 4d36e320bbe7d5b22ced50131d097366d10ebaef..c8ac60ca90d2ef15a15ddf15148e3c128ac56522 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -146,9 +146,16 @@ function critere_pagination_dist($idb, &$boucles, $crit) {
 
 	$boucle = &$boucles[$idb];
 	$boucle->mode_partie = 'p+';
-	$boucle->partie = 'intval(isset($Pile[0][\'debut\'.'.$debut.']) ? $Pile[0][\'debut\'.'.$debut.'] : _request(\'debut\'.'.$debut.'))';
+	$boucle->partie = 'substr($partie=(isset($Pile[0][\'debut\'.'.$debut.']) ? $Pile[0][\'debut\'.'.$debut.'] : _request(\'debut\'.'.$debut.')),0,1)==\'@\'?
+($Pile[0][\'debut\'.'.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',substr($partie,1),'.intval($pas).',calculer_select($select, $from, $type, $where, $join, $groupby, $orderby, $limit, $having, $table, $id, $connect)))
+:intval($partie)';
 	$boucle->modificateur['debut_nom'] = $debut;
 	$boucle->total_parties = $pas;
+
+	// ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id
+	$t = $boucle->id_table . '.' . $boucle->primary;
+	if (!in_array($t, $boucles[$idb]->select))
+	  $boucle->select[]= $t;
 }
 
 // {recherche} ou {recherche susan}
diff --git a/ecrire/public/quete.php b/ecrire/public/quete.php
index 953e80ed93b389d4592b7d4886dfa63cbb10bc59..7efc45ac6c028b8d83c0229683edd58387dfd57a 100644
--- a/ecrire/public/quete.php
+++ b/ecrire/public/quete.php
@@ -236,4 +236,17 @@ function calcul_exposer ($id, $prim, $reference, $parent, $type, $connect='') {
 	return isset($exposer[$m][$prim]) ? isset($exposer[$m][$prim][$id]) : '';
 }
 
+function quete_debut_pagination($primary,$valeur,$pas,$res){
+	$pos = 0;
+	while ($row = sql_fetch($res) AND $row[$primary]!==$valeur)
+		$pos++;
+	sql_free($res);
+	// si on a pas trouve
+	if ($row[$primary]!==$valeur)
+		return 0;
+	
+	// sinon, calculer le bon numero de page
+	return floor($pos/$pas)*$pas;
+}
+
 ?>
\ No newline at end of file