diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 7bda63ff65d4b371bec6fbca8981ec2ae3e8c14c..c1749735fe08b144ae525cb773933dcd31ae46f4 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1699,6 +1699,14 @@ function filtre_end($array) {
 	return filtre_valeur_tableau($array,@count($array)-1);
 }
 
+function filtre_push($array, $val) {
+	if($array == '' OR !array_push($array, $val)) return '';
+	return $array;
+}
+
+function filtre_find($array, $val) {
+	return ($array != '' AND in_array($val, $array));
+}
 
 //
 // fonction standard de calcul de la balise #PAGINATION
@@ -2150,11 +2158,12 @@ function http_style_background($img, $att='')
 // http://doc.spip.org/@filtre_foreach_dist
 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)
-		);
+	if(is_array($balise_deserializee))
+		foreach($balise_deserializee as $k => $v)
+			$texte .= recuperer_fond(
+				'modeles/'.$modele,
+				array_merge(array('cle' => $k), (is_array($v) ? $v : array('valeur' => $v)))
+			);
 	return $texte;
 }
 
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 36098d0fa49cb0adf9c72ed3b4b438d07d4e1e53..02ac2f4e2a13ccd5549240d59f504f1bee55bc0c 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -997,7 +997,7 @@ function balise_ENV_dist($p, $src = NULL) {
 	if (!$_nom) {
 		// cas de #ENV sans argument : on retourne le serialize() du tableau
 		// une belle fonction [(#ENV|affiche_env)] serait pratique
-		$p->code = '($a = ('.$src.') ? serialize($a) : "")';
+		$p->code = '(is_array($a = ('.$src.')) ? serialize($a) : "")';
 	} else {
 		// admet deux arguments : nom de variable, valeur par defaut si vide
 		$p->code = 'is_array($a = ('.$src.')) ? $a['.$_nom.'] : ""';
@@ -1383,14 +1383,14 @@ function balise_FOREACH_dist($p) {
 		$_modele = interprete_argument_balise(2,$p);
 		$_modele = str_replace("'", "", strtolower($_modele));
 		$__modele = 'foreach_'.strtolower($_tableau);
-		$_modele = (!$_modele AND ($f = find_in_path('modeles/'.$__modele.'.html'))) ? $__modele : ($_modele ? $_modele : 'foreach');
+		$_modele = (!$_modele AND find_in_path('modeles/'.$__modele.'.html')) ?
+			$__modele : 
+			($_modele ? $_modele : 'foreach');
 
 		$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 . ", '" . $_modele . "')";
+		$p->code = $filtre . "(unserialize(" . $p->code . "), '" . $_modele . "')";
 	}
 	//On a pas trouve la balise correspondant au tableau a traiter
 	else {