diff --git a/.gitattributes b/.gitattributes
index 3122cc334358cc64c6f859b51233dcd48680158f..e74b6b09fa9404e7673bd47acf468ae5c560f73e 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -244,6 +244,7 @@ dist/modeles/article_mots.html -text
 dist/modeles/article_traductions.html -text
 dist/modeles/doc.html -text
 dist/modeles/emb.html -text
+dist/modeles/foreach.html -text
 dist/modeles/img.html -text
 dist/modeles/lesauteurs.html -text
 dist/modeles/pagination.html -text
diff --git a/dist/modeles/foreach.html b/dist/modeles/foreach.html
new file mode 100644
index 0000000000000000000000000000000000000000..b984d3738cc0d5a06d18ec514452ee644429fb34
--- /dev/null
+++ b/dist/modeles/foreach.html
@@ -0,0 +1 @@
+#PUCE #ENV{cle} => #ENV{valeur}<br />
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 2db7ee30c81e4ed6b06906171c181f79620d1859..b2c2d41391ff16da52eebdf49d14f8d507d331df 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -2106,4 +2106,16 @@ function http_style_background($img, $att='')
   return " style='background: url(\"".http_wrapper($img)."\")" .
 	    ($att ? (' ' . $att) : '') . ";'";
 }
-?>
+
+//[(#ENV*|unserialize|foreach)]
+function filtre_foreach_dist($balise_deserializee, $modele = 'foreach') {
+	$texte = '';
+	foreach($balise_deserializee as $k => $v)
+		$texte .= recuperer_fond(
+			'modeles/'.$modele,
+			array('cle' => $k, 'valeur' => $v)
+		);
+	return $texte;
+}
+
+?>
\ No newline at end of file
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 8c6c1dd760e7e9a18ba57a7c3e249db808734001..44170585bc3b6681c058f718afc60c30643b3648 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -1346,6 +1346,33 @@ function balise_ARRAY_dist($p) {
 	return $p;
 }
 
+//#FOREACH
+//
+function balise_FOREACH_dist($p) {
+        $_tableau = interprete_argument_balise(1,$p);
+        if($_tableau == "''" OR $_tableau == NULL) $_tableau = "'ENV'";
+        $_code = interprete_argument_balise(2,$p);
+        if($_code == "''" OR $_code == NULL) $_code = "'foreach'";
+       
+        $_tableau = str_replace("'", "", strtoupper($_tableau));
+        $balise = function_exists($f ='balise_'.$_tableau) ? $f :
+                function_exists($g = $f.'_dist') ? $g : '';
+
+
+        if($balise) {
+                $p->param = @array_shift(@array_shift($p->param));
+                $p = $balise($p);
+                //retirer le serialize
+                $p->code = preg_replace(',^serialize\((.*)\)$,', '\1', $p->code);
+                $filtre = chercher_filtre('foreach');
+                $p->code = $filtre . "(" . $p->code . ", " . $_code . ")";
+        }
+        //On a pas trouve la balise correspondant au tableau a traiter
+        else {
+                $p->code = "''";
+        }
+        return $p;
+}
 
 // Appelle la fonction autoriser et renvoie ' ' si OK, '' si niet
 // A noter : la priorite des operateurs exige && plutot que AND