diff --git a/inc-calcul-squel.php3 b/inc-calcul-squel.php3
index 14d2e8d06aee119540d28ea7250ec974e664a8cf..5d56dabca57bae96650c906f25935d0db82f40a3 100644
--- a/inc-calcul-squel.php3
+++ b/inc-calcul-squel.php3
@@ -124,9 +124,10 @@ function calculer_boucle($id_boucle, &$boucles)
 		 (($flag_parties) ? 
 		  calculer_parties($boucle->partie,
 				   $boucle->mode_partie,
-				   $boucle->total_parties) :
-		  ((!$boucle->numrows) ? '' : '
-	$PileNum[$SP] = @spip_num_rows($result);')) .
+				   $boucle->total_parties,
+				   $id_boucle) :
+		  ((!$boucle->numrows) ? '' : "
+	\$PileNum['$id_boucle'] = @spip_num_rows(\$result);")) .
 		 ((!$flag_cpt) ? '' : "\n\t\$compteur_boucle = 0;") .
 		 ((!$corps) ? "" :
 		  (
@@ -152,7 +153,7 @@ function calculer_boucle($id_boucle, &$boucles)
 
 // une grosse fonction pour un petit cas
 
-function calculer_parties($partie, $mode_partie, $total_parties)
+function calculer_parties($partie, $mode_partie, $total_parties, $id_boucle)
 {
      return ('
 	$fin_boucle = @spip_num_rows($result);' .
@@ -195,7 +196,7 @@ function calculer_parties($partie, $mode_partie, $total_parties)
 # ce qui doit re'duire la me'moire ne'cessaire au processus
 # En de'coule une combinatoire laborieuse mais sans difficulte'
 
-function calculer_liste($tableau, $prefix, $id_boucle, $niv, $rec, &$boucles, $id_mere)
+function calculer_liste($tableau, $prefix, $id_boucle, $niv, &$boucles, $id_mere)
 {
 	if ((!$tableau)) return array("''",'');
 	$texte = '';
@@ -226,11 +227,11 @@ function calculer_liste($tableau, $prefix, $id_boucle, $niv, $rec, &$boucles, $i
 	    if ($objet->type ==  'boucle') {
 		$nom = $objet->id_boucle;
 		list($bc,$bm) = calculer_liste($objet->cond_avant, $prefix,
-					       $objet->id_boucle, $niv+2,$rec, $boucles, $id_mere);
+					       $id_boucle, $niv+2, $boucles, $nom);
 		list($ac,$am) = calculer_liste($objet->cond_apres, $prefix,
-					       $objet->id_boucle, $niv+2,$rec, $boucles, $id_mere);
+					       $id_boucle, $niv+2, $boucles, $nom);
 		list($oc,$om) = calculer_liste($objet->cond_altern, $prefix,
-					       $objet->id_boucle, $niv+1,$rec, $boucles, $id_mere);
+					       $id_boucle, $niv+1,$boucles, $nom);
 
 	      
 	      $c = $prefix .
@@ -238,14 +239,14 @@ function calculer_liste($tableau, $prefix, $id_boucle, $niv, $rec, &$boucles, $i
 		'($Cache, $PileRow, $doublons, $PileNum, $SP)';
 	      $m = "";
 	    } else {
-		list($c,$m) = 
+	      list($c,$m) = 
 		  calculer_champ($objet->fonctions, 
 				 $objet->nom_champ,
 				 $id_boucle,
 				 $boucles,
 				 $id_mere);
-		list($bc,$bm) = calculer_liste($objet->cond_avant, $prefix, $id_boucle, $niv+2,false, $boucles, $id_mere); 
-	      	list($ac,$am) = calculer_liste($objet->cond_apres, $prefix, $id_boucle, $niv+2,false, $boucles, $id_mere);
+		list($bc,$bm) = calculer_liste($objet->cond_avant, $prefix, $id_boucle, $niv+2,$boucles, $id_mere); 
+	      	list($ac,$am) = calculer_liste($objet->cond_apres, $prefix, $id_boucle, $niv+2,$boucles, $id_mere);
 		$oc = "''";
 		$om = "";
 	    }
@@ -343,7 +344,6 @@ function calculer_squelette($squelette, $nom, $gram) {
 			       $nom,
 			       $boucle->param,
 			       1,
-			       true,
 			       $boucles,
 			       $id);
 	    }
@@ -352,15 +352,12 @@ function calculer_squelette($squelette, $nom, $gram) {
 	{ 
 	  if ($boucle->type_requete != 'boucle') 
 	    {
-#	  spip_log("calcul_liste $id de type" . $boucle->type_requete);
 	  calculer_params($boucle->type_requete, $boucle->param, $id, $boucles);
-
 	  $boucles[$id]->return =
 	    calculer_liste($boucle->milieu,
 			   $nom,
 			   $id,
 			   1,
-			   false,
 			   $boucles,
 			   $id);
 	    }
@@ -370,7 +367,7 @@ function calculer_squelette($squelette, $nom, $gram) {
   // idem pour la racine
 
   list($return,$corps) =
-    calculer_liste($racine, $nom, '',0, false, $boucles, '');
+    calculer_liste($racine, $nom, '',0, $boucles, '');
 
   // Corps de toutes les fonctions PHP,
   // en particulier les requetes SQL et TOTAL_BOUCLE
diff --git a/inc-vrac-squel.php3 b/inc-vrac-squel.php3
index bf6c301573429e72886986bf507123d6351f1615..63ef220dfb44b4b161f3c613e6d662ea09513696 100644
--- a/inc-vrac-squel.php3
+++ b/inc-vrac-squel.php3
@@ -123,21 +123,13 @@ function calculer_champ_divers($fonctions, $nom_champ, $id_boucle, &$boucles, $i
 		break;
 
   case 'TOTAL_BOUCLE':
-	  $n = 0;
-	  $b = $id_boucle;
-	  // si $id_boucle est vide, c'est la racine 
-	  // il faudrait dire a` l'auteur du squelette que ca n'a pas de sens
-	  while ($b != $id_mere)
+	if (!$id_mere)
 	    {
-	      $n++;
-	      $b = $boucles[$b]->id_parent;
-	      // c~a ne devrait pas arriver si id_mere != '',
-	      // mais je ne prends pas le risque
-	      if (!$b) break;
+	      include_local("inc-debug-squel.php3");
+	      erreur_squelette(_L("Champ #TOTAL_BOUCLE hors boucle"), '', $id_boucle);
 	    }
-	$code = '$PileNum[$SP' . (($n==0) ? "" : "+$n") . ']';
-	$boucles[$id_boucle]->numrows = true;
-#	spip_log("TOTAL_BOUCLE: $id_boucle dans $id_mere");
+	$code = "\$PileNum[$id_mere]";
+	$boucles[$id_mere]->numrows = true;
 		break;
 
   case 'POINTS':