diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index ee2afd387ffda2223036d0ff1f659107a6a7bc50..b90c3f39bfe091cae53cb4a2bec894a70a5a3313 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -2648,6 +2648,51 @@ function form_hidden($action) {
 	return $hidden;
 }
 
+function pagination($total, $debut, $pas) {
+	global $pagination_item_avant, $pagination_item_apres, $pagination_separateur;
+	global $pagination_max, $pagination_max_texte;
+	tester_variable('pagination_separateur', ' | ');
+	tester_variable('pagination_max_texte', '...');
+
+	$pagination = array(
+		'lien_base' => self(),
+		'total' => $total,
+		'position' => intval(_request($debut)),
+		'pas' => $pas,
+		'nombre_pages' => floor(($total-1)/$pas)+1,
+		'page_courante' => floor(intval(_request($debut))/$pas)+1,
+		'lien_pagination' => '<a href="@url@">@item@</a>'
+	);
+
+	if($pagination_max == 0 OR $pagination_max>=$pagination['nombre_pages']) {
+		$premiere = 1;
+		$derniere = $pagination['nombre_pages'];
+		$texte_avant = '';
+		$texte_apres = '';
+	}
+	else {
+		$premiere = max(1, $pagination['page_courante']-floor($pagination_max/2));
+		$derniere = min($pagination['nombre_pages'], $premiere+$pagination_max-1);
+		$premiere = $derniere == $pagination['nombre_pages'] ? $derniere-$pagination_max+1 : $premiere;
+		$texte_avant = $premiere>1 ? $pagination_max_texte.' ' : '';
+		$texte_apres = $derniere<$pagination['nombre_pages'] ? ' '.$pagination_max_texte : '';
+	}
+
+	$texte = '';
+	if($pagination['nombre_pages']>1) {
+		for($i = $premiere;$i<=$derniere;$i++) {
+			$url = parametre_url($pagination['lien_base'], $debut, strval(($i-1)*$pas));
+			$_item = strval($i);
+			$item = ($i != $pagination['page_courante']) ?
+				preg_replace(array(',@url@,', ',@item@,'), array($url, $_item), $pagination['lien_pagination']) :
+				$_item;
+			$texte .= $pagination_item_avant.$item.$pagination_item_apres;
+			if($i<$pagination['nombre_pages']) $texte .= $pagination_separateur;
+		}
+		return $texte_avant.$texte.$texte_apres;
+	}
+	return '';
+}
 
 ### fonction depreciee, laissee ici pour compat ascendante 1.9
 function entites_unicode($texte) { return charset2unicode($texte); }
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 09f6d98489aba290cfa84e9c860e28b02ca2d9c2..b15a898519b1fc749be8e98ba2568f0004973620 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -556,6 +556,40 @@ function balise_POPULARITE_dist ($p) {
 	return $p;
 }
 
+// #PAGINATION
+// http://www.spip.net/fr_articleXXXX.html
+function balise_PAGINATION_dist($p) {
+	$b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere'];
+	if ($b === '') {
+		erreur_squelette(
+			_T('zbug_champ_hors_boucle',
+				array('champ' => "#$b" . 'PAGINATION')
+			), $p->id_boucle);
+		$p->code = "''";
+	}
+	elseif (!$p->param || $p->param[0][0]) {
+		erreur_squelette(
+			/*_T('zbug_champ_manquant',
+				array('champ' => '#PAGINATION')*/
+			_L('param&eacute;tre manquant pour #PAGINATION')
+			, $p->id_boucle);
+		$p->code = "''";
+	}
+	else {
+		$nom_boucle = calculer_liste($p->param[0][1],
+					$p->descr,
+					$p->boucles,
+					$p->id_boucle);
+  $nom_boucle = str_replace("'", '', $nom_boucle);
+  $pas = _PAS>0 ? _PAS : 10;
+  
+		$p->boucles[$b]->numrows = true;
+		$p->code = "pagination(\$Numrows['$b']['total'],'debut".$nom_boucle."',".$pas.")";
+	}
+
+	$p->interdire_scripts = true;
+	return $p;
+}
 
 //
 // Fonction commune aux balises #LOGO_XXXX
@@ -1011,4 +1045,4 @@ function balise_CACHE_dist($p) {
 	return $p;
 }
 
-?>
+?>
\ No newline at end of file
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 11d53199137055d616b063eedf45fa96e46b7a2e..b4081f861ca2b55a811e677ee72fff040e01704a 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -90,6 +90,15 @@ function critere_debut_dist($idb, &$boucles, $crit) {
 	  $crit->param[1][0]->texte .
 	  '"' ;
 }
+// {pagination}
+// http://www.spip.net/@pagination
+function critere_pagination_dist($idb, &$boucles, $crit) {
+ $pas = _PAS>0 ? _PAS : 10;
+	$boucle = &$boucles[$idb];
+	$boucle->limit = 'intval($GLOBALS["debut'.$idb.'"]) . ",'.$pas.'"';
+}
+
+
 
 // {recherche}
 // http://www.spip.net/@recherche