diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index e00bbca96b0b406499014f454d3e5ec720afdfe1..8302ebd72c3a94ba850445adeb4149fe22ac1a36 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -246,6 +246,41 @@ function critere_logo_dist($idb, &$boucles, $crit) {
 		$boucle->where[]= $c;
 }
 
+
+// http://doc.spip.org/@critere_groupby_dist
+function critere_fusion_dist($idb,&$boucles, $crit) {
+	if (isset($crit->param[0])) {
+		$x = $crit->param[0];
+		if ($x[0]->type == 'texte')
+			$boucles[$idb]->group[] = $x[0]->texte;
+		else 	$boucles[$idb]->group[] = '".' . calculer_critere_arg_dynamique($idb, $boucles, $x) . '."';
+	} else 
+		erreur_squelette(_T('zbug_info_erreur_squelette'),
+			"{groupby ?} BOUCLE$idb");
+}
+
+function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix='')
+{
+	global $table_des_tables, $tables_des_serveurs_sql;
+
+	$boucle = $boucles[$idb];
+
+	$arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent);
+	$r = $boucle->type_requete;
+	$s = $boucles[$idb]->sql_serveur;
+	if (!$s) $s = 'localhost';
+	$t = $table_des_tables[$r];
+	// pour les tables non Spip
+	if (!$t) $t = $r; else $t = "spip_$t";
+	$desc = $tables_des_serveurs_sql[$s][$t];
+
+	if (is_array($desc['field'])){
+		$liste_field = implode(',',array_map('_q',array_keys($desc['field'])));
+		return	"((\$x = preg_replace(\"/\\W/\",'',$arg)) ? ( in_array(\$x,array($liste_field))  ? ('$boucle->id_table.' . \$x$suffix):(\$x$suffix) ) : '')";
+	} else {
+		return "((\$x = preg_replace(\"/\\W/\",'',$arg)) ? ('$boucle->id_table.' . \$x$suffix) : '')";
+	}
+}
 // Tri : {par xxxx}
 // http://www.spip.net/@par
 // http://doc.spip.org/@critere_par_dist
@@ -264,24 +299,7 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
 	  $fct = ""; // en cas de fonction SQL
 	// tris specifies dynamiquement
 	  if ($tri[0]->type != 'texte') {
-	      $order = 
-		calculer_liste($tri, array(), $boucles, $boucles[$idb]->id_parent);
-				$r = $boucle->type_requete;
-				$s = $boucles[$idb]->sql_serveur;
-				if (!$s) $s = 'localhost';
-				$t = $table_des_tables[$r];
-				// pour les tables non Spip
-				if (!$t) $t = $r; else $t = "spip_$t";
-				$desc = $tables_des_serveurs_sql[$s][$t];
-				if (is_array($desc['field'])){
-					$liste_field = implode(',',array_map('_q',array_keys($desc['field'])));
-		      $order =
-			"((\$x = preg_replace(\"/\\W/\",'',$order)) ? ( in_array(\$x,array($liste_field))  ? ('$boucle->id_table.' . \$x$sens):(\$x$sens) ) : '')";
-				}
-				else{
-		      $order =
-			"((\$x = preg_replace(\"/\\W/\",'',$order)) ? ('$boucle->id_table.' . \$x$sens) : '')";
-				}
+	    $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens);
 	  } else {
 	      $par = array_shift($tri);
 	      $par = $par->texte;
@@ -488,15 +506,6 @@ function critere_agenda_dist($idb, &$boucles, $crit)
 	// sinon on prend tout
 }
 
-// http://doc.spip.org/@critere_groupby_dist
-function critere_groupby_dist($idb,&$boucles, $crit) {
-	if (isset($crit->param[0]))
-		$boucles[$idb]->group[] = $crit->param[0][0]->texte;
-	else
-		erreur_squelette(_T('zbug_info_erreur_squelette'),
-			"{groupby ?} BOUCLE$idb");
-}
-
 // http://doc.spip.org/@calculer_critere_parties
 function calculer_critere_parties($idb, &$boucles, $crit) {
 	$boucle = &$boucles[$idb];