diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 5410e761e7fa009bf8d9383f64d07da4c36b4c93..8e163eb274fd3234e1234b55b25157eb33d67c07 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -202,12 +202,12 @@ function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $pr
 	AND !defined('_ECRIRE_INSTALL')) {
 		return;
 	}
-
 	if (!$prefixe) 
 		$prefixe = isset($GLOBALS['table_prefix'])
 		? $GLOBALS['table_prefix'] : $db;
 	$db_ok = charger_fonction('db_' . $type, 'base', true);
-	if ($db_ok AND $db_ok = $db_ok($host, $port, $login, $pass, $db, $prefixe)) 
+	if ($db_ok
+	AND $db_ok = $db_ok($host, $port, $login, $pass, $db, $prefixe)) 
 
 		return $db_ok;
 
@@ -229,7 +229,7 @@ function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $pr
 
 // http://doc.spip.org/@spip_connect
 function spip_connect($serveur='') {
-	global $connexions;
+	global $connexions, $type_des_serveurs;
 
 	$index = $serveur ? $serveur : 0;
 	if (isset($connexions[$index])) return $connexions[$index];
@@ -244,6 +244,7 @@ function spip_connect($serveur='') {
 	    : ($install ? (_FILE_CONNECT_INS .  '.php')
 	       : ''));
 
+	unset($GLOBALS['spip_connect_version']);
 	if ($f AND is_readable($f)) include($f);
 	if (!isset($GLOBALS['db_ok'])) {
 		if ($install) return 'spip_' . $serveur . '_query';
@@ -252,13 +253,14 @@ function spip_connect($serveur='') {
 	}
 
 	$connexions[$index] = $GLOBALS['db_ok'];
+	$type_des_serveurs[$index] = isset($GLOBALS['spip_connect_version'])
+	? 'spip' : 'inconnu';
+
+	if ($serveur) return $connexions[$index];
 
 	// Premiere connexion au serveur principal:
 	// verifier que la table principale est la
 	// et que le fichier de connexion n'est pas une version trop vieille
-
-	if (!$serveur) {
-
 	// Version courante = 0.6 (indication du prefixe comme 6e arg)
 	//
 	// La version 0.0 (non numerotee) doit etre refaite par un admin
@@ -266,19 +268,17 @@ function spip_connect($serveur='') {
 	// - la version 0.1 est moins performante que la 0.2
 	// - la 0.2 fait un include_ecrire('inc_db_mysql.php3')
 	// - la version 0.5 indique le serveur comme 5e arg
-	//  On ne force pas la mise a niveau pour les autres.
 
-		if ($GLOBALS['spip_connect_version']< 0.1 AND _DIR_RESTREINT){
-			include_spip('inc/headers');
-			redirige_par_entete(generer_url_ecrire('upgrade', 'reinstall=oui', true));
-		}
+	if ($GLOBALS['spip_connect_version']< 0.1 AND _DIR_RESTREINT){
+		include_spip('inc/headers');
+		redirige_par_entete(generer_url_ecrire('upgrade', 'reinstall=oui', true));
+	}
 
-		$f = str_replace('query', 'countsel', $GLOBALS['db_ok']['query']);
-		if (!$f('spip_meta', '', '', '', '', '', '', $index)) {
-			unset($connexions[$index]);
-			spip_log("spip_connect: table meta vide ($index)");
-			return false;
-		}
+	$f = $GLOBALS['db_ok']['countsel'];
+	if (!$f('spip_meta', '', '', '', '', '', '', $index)) {
+		unset($connexions[$index]);
+		spip_log("spip_connect: table meta vide ($index)");
+		return false;
 	}
 
 	return $connexions[$index];
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 29691cd3e0fb17357cddbf710c08d85a98a5834b..cc0a1b49c77f67521c733a8734e34d5535da4bba 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -38,6 +38,7 @@ include_spip('public/interfaces');
 
 # definition des tables
 include_spip('base/serial');
+include_spip('base/auxiliaires');
 
 // http://doc.spip.org/@argumenter_inclure
 function argumenter_inclure($struct, $descr, &$boucles, $id_boucle, $echap=true){
@@ -697,19 +698,17 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile) {
 
 	// Initialiser les champs necessaires a la compilation
 	// et signaler une boucle documents (les autres influent dessus)
+	$tables_des_serveurs_sql[0] = 
+	  array_merge($tables_principales,  $tables_auxiliaires);
 	foreach($boucles as $id => $boucle) {
 		$type = $boucle->type_requete;
 		if ($type != 'boucle') {
-			$table = isset($table_des_tables[$type])
-			? $table_des_tables[$type]
-			: $type;
-			$show = trouver_def_table($table, $boucles[$id]);
+			$show = trouver_table($type, $boucles[$id]);
 			if ($show) {
-				$nom_table = $show[0];
-				$show = $show[1]['key'];
+				$nom_table = $show['table'];
+				$boucles[$id]->id_table = $show['type'];
+				$boucles[$id]->primary = $show['key']["PRIMARY KEY"];
 				$boucles[$id]->descr = &$descr;
-				$boucles[$id]->id_table = $table;
-				$boucles[$id]->primary = $show["PRIMARY KEY"];
 				if ((!$boucles[$id]->jointures)
 				AND (is_array($x = $tables_jointures[$nom_table])))
 					$boucles[$id]->jointures = $x;
diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php
index 7a17f71ed11416b23f415509c6f91f193a767e03..fab22e77b33c5e88008b47f89b8136b684f7efa1 100644
--- a/ecrire/public/criteres.php
+++ b/ecrire/public/criteres.php
@@ -245,8 +245,7 @@ function critere_branche_dist($idb, &$boucles, $crit) {
 
 	//Trouver une jointure
 	$type = $boucle->type_requete;
-	$nom = $table_des_tables[$type];
-	list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
+	$desc = trouver_table($type, $boucle);
 	//Seulement si necessaire
 	if (!array_key_exists('id_rubrique', $desc['field'])) {
 		$cle = trouver_champ_exterieur('id_rubrique', $boucle->jointures, $boucle);
@@ -326,7 +325,7 @@ function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix='')
 	$arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent);
 	$r = $boucle->type_requete;
 	$s = $boucles[$idb]->sql_serveur;
-	if (!$s) $s = 'localhost';
+	if (!$s) $s = 0;
 	$t = $table_des_tables[$r];
 	// pour les tables non Spip
 	if (!$t) $t = $r; else $t = "spip_$t";
@@ -417,7 +416,7 @@ function critere_parinverse($idb, &$boucles, $crit, $sens) {
 		else {
 		  $r = $boucle->type_requete;
 		  $s = $boucles[$idb]->sql_serveur;
-		  if (!$s) $s = 'localhost';
+		  if (!$s) $s = 0;
 		  $t = $table_des_tables[$r];
 		  // pour les tables non Spip
 		  if (!$t) $t = $r; else $t = "spip_$t";
@@ -454,15 +453,14 @@ function critere_par_jointure(&$boucle, $join)
   list($table, $champ) = $join;
   $t = array_search($table, $boucle->from);
   if (!$t) {
-    $type = $boucle->type_requete;
-    $nom = $table_des_tables[$type];
-    list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
+	$type = $boucle->type_requete;
+	$desc = trouver_table($type, $boucle);
 
-    $cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle);
-    if ($cle)
-      $cle = calculer_jointure($boucle, array($boucle->id_table, $desc), $cle, false);
-    if ($cle) $t = "L$cle"; 
-    else  erreur_squelette(_T('zbug_info_erreur_squelette'),  "{par ?} BOUCLE$idb");
+	$cle = trouver_champ_exterieur($champ, $boucle->jointures, $boucle);
+	if ($cle)
+		$cle = calculer_jointure($boucle, array($desc['table'], $desc), $cle, false);
+	if ($cle) $t = "L$cle"; 
+	else  erreur_squelette(_T('zbug_info_erreur_squelette'),  "{par ?} BOUCLE$idb");
 
   }
   return "'" . $t . '.' . $champ . "'";
@@ -728,8 +726,7 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 	$boucle = &$boucles[$idb];
 	$type = $boucle->type_requete;
 	$table = $boucle->id_table;
-	$nom = $table_des_tables[$type];
-	list(, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
+	$desc = trouver_table($type, $boucle);
 
 	list($fct, $col, $op, $val, $args_sql) =
 	  calculer_critere_infixe_ops($idb, $boucles, $crit);
@@ -831,8 +828,8 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
 // http://doc.spip.org/@critere_secteur_forum
 function critere_secteur_forum($idb, &$boucles, $val, $crit)
 {
-	list($nom, $desc) = trouver_def_table('articles', $boucles[$idb]);
-	return calculer_critere_externe_init($boucles[$idb], array($nom), 'id_secteur', $desc, $crit->cond, true);
+	$desc = trouver_table('articles', $boucles[$idb]);
+	return calculer_critere_externe_init($boucles[$idb], array($desc['table']), 'id_secteur', $desc, $crit->cond, true);
 }
 
 // Champ hors table, ca ne peut etre qu'une jointure.
@@ -984,16 +981,15 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu=array(), $mi
 		$new = $vu;
 		foreach($boucle->jointures as $v) {
 			if ($v && (!in_array($v,$vu)) && 
-			    ($def = trouver_def_table($v, $boucle))) {
-				list($table,$join) = $def;
-				$milieu = array_intersect($ddesc['key'], trouver_cles_table($join['key']));
+			    ($def = trouver_table($v, $boucle))) {
+				$milieu = array_intersect($ddesc['key'], trouver_cles_table($def['key']));
 				$new[] = $v;
 				foreach ($milieu as $k)
 					if ($k!=$milieu_prec) // ne pas repasser par la meme cle car c'est un chemin inutilement long
 					{
-						$r = calculer_chaine_jointures($boucle, array($v, $join), $arrivee, $new, $k);
+					  $r = calculer_chaine_jointures($boucle, array($v, $def), $arrivee, $new, $k);
 						if ($r)	{
-							array_unshift($r, array($dnom, $def, $k));
+						  array_unshift($r, array($dnom, array($def['table'], $def), $k));
 							return $r;
 						}
 					}
@@ -1021,52 +1017,60 @@ function trouver_cles_table($keys)
   return array_keys($res);
 }
 
-// Trouve la description d'une table dans les globales de Spip
-// (le prefixe des tables y est toujours 'spip_', son chgt est ulterieur)
-// Si on ne la trouve pas, on demande au serveur SQL (marche pas toujours)
-
-// http://doc.spip.org/@trouver_def_table
-function trouver_def_table($nom, &$boucle)
+// Trouve la description d'une table, en particulier celle d'une boucle
+// Si on ne la trouve pas, on demande au serveur SQL
+// retourne False si lui non plus  ne la trouve pas.
+// Si on la trouve, le tableau resultat a les entrees:
+// field (comme dans serial.php)
+// key (comme dans serial.php)
+// serveur = serveur bd associe
+// table = nom complet de la table (avec le prefixe spip_ pour les stds)
+// type = nom court (i.e. type de boucle)
+
+function trouver_table($type, $boucle)
 {
-	global $tables_principales, $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql;
-
-	$nom_table = $nom;
-	$s = $boucle->sql_serveur;
-	if (!$s) {
-		$s = 'localhost';
-		if (in_array($nom, $table_des_tables))
-		   $nom_table = 'spip_' . $nom;
-	}
-
-	$desc = $tables_des_serveurs_sql[$s];
-
-	if (isset($desc[$nom_table]))
-		return array($nom_table, $desc[$nom_table]);
-
-	include_spip('base/auxiliaires');
-	$nom_table = 'spip_' . $nom;
-	if ($desc = $tables_auxiliaires[$nom_table])
-		return array($nom_table, $desc);
+	global $tables_auxiliaires, $table_des_tables, $tables_des_serveurs_sql, $type_des_serveurs;
+
+	$serveur = $boucle->sql_serveur;
+	$s = $serveur ? $serveur : 0;
+	if (!isset($type_des_serveurs[$s])) spip_connect($serveur);
+
+	$spip = ($type_des_serveurs[$s] == 'spip');
+
+	if ($spip AND isset($table_des_tables[$type])) {
+    	// indirection (pour les rares cas ou le nom de la table!=type)
+		$t = $table_des_tables[$type];
+		$nom_table = 'spip_' . $t;
+	} elseif ($spip AND isset($tables_auxiliaires['spip_' .$type])) {
+		$t = $type;
+		$nom_table = 'spip_' . $t;
+	} else	$nom_table = $t = $type;
+
+	if (!isset($tables_des_serveurs_sql[$s][$nom_table])) {
+		$desc = sql_showtable($nom_table, $serveur, ($nom_table != $type));
+		if (!$desc) {
+			erreur_squelette(_T('zbug_table_inconnue', array('table' => $type)),
+					 $boucle->id_boucle);
+			return null;
+		}
+		$tables_des_serveurs_sql[$s][$nom_table] = $desc;
+	} else $desc = $tables_des_serveurs_sql[$s][$nom_table];
+	
+	$desc['table']= $nom_table;
+	$desc['serveur']= $s;
+	$desc['type']= $t;
 
-	if ($desc = sql_showtable($nom, $boucle->sql_serveur))
-	  if (isset($desc['field'])) {
-      // faudrait aussi prevoir le cas du serveur externe
-	    $tables_principales[$nom] = $desc;
-	    return array($nom, $desc);
-	  }
-	erreur_squelette(_T('zbug_table_inconnue', array('table' => $nom)),
-			 $boucle->id_boucle);
-	return false;
+	return $desc;
 }
 
 // http://doc.spip.org/@trouver_champ_exterieur
 function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false)
 {
   foreach($joints as $k => $join) {
-    if ($join && $table = trouver_def_table($join, $boucle)) {
-      if (array_key_exists($cle, $table[1]['field'])
-      	&& ($checkarrivee==false || $checkarrivee==$table[0])) // si on sait ou on veut arriver, il faut que ca colle
-	return  $table;
+    if ($join && $table = trouver_table($join, $boucle)) {
+      if (array_key_exists($cle, $table['field'])
+      	&& ($checkarrivee==false || $checkarrivee==$table['table'])) // si on sait ou on veut arriver, il faut que ca colle
+	return  array($table['table'], $table);
     }
   }
   return "";
@@ -1189,7 +1193,7 @@ function calculer_critere_infixe_date($idb, &$boucles, $regs)
 	if ($suite) {
 	# Recherche de l'existence du champ date_xxxx,
 	# si oui choisir ce champ, sinon choisir xxxx
-		list(,$t)= trouver_def_table($boucle->type_requete, $boucle);
+		$t = trouver_table($boucle->type_requete, $boucle);
 		if ($t['field']["date$suite"])
 			$date_orig = 'date'.$suite;
 		else
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index 8ce6b22eaa9dafb0ea5ab98315a9d71ff43062ac..c6587ecc9a862c5120dc00df2e5130da91d7c08d 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -10,8 +10,6 @@
  *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
 \***************************************************************************/
 
-
-
 // fonctions de recherche et de reservation
 // dans l'arborescence des boucles
 
@@ -27,7 +25,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 // http://doc.spip.org/@index_pile
 function index_pile($idb, $nom_champ, &$boucles, $explicite='') {
-  global $exceptions_des_tables, $table_des_tables, $tables_des_serveurs_sql;
+	global $exceptions_des_tables, $table_des_tables;
 
 	$i = 0;
 	if (strlen($explicite)) {
@@ -61,57 +59,15 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite='') {
 	return('@$Pile[0][\''. strtolower($nom_champ) . '\']');
 }
 
-/**
- * retourne la description de la table associee a un type de boucle
- * retourne un tableau avec les entrees field et key (comme dans serial.php)
- * et type = type de boucle, serveur = serveur bdd associe et table = nom de
- * la table concernee
- * retourne null si on ne trouve pas la table
- */
-// http://doc.spip.org/@description_type_requete
-function description_type_requete($type, $serveur='') {
-	global $table_des_tables, $tables_des_serveurs_sql, $tables_auxiliaires;
-
-	if (!$serveur) {
-		$s = 'localhost';
-	} else $s = $serveur;
-	// pour les tables non Spip
-	if (isset($table_des_tables[$type])) {
-    	// indirection (pour les rares cas ou le nom de la table!=type)
-		$t = $table_des_tables[$type];
-		$nom_table = 'spip_' . $t;
-	} elseif (isset($tables_auxiliaires['spip_' .$type])) {
-		$t = $type;
-		$nom_table = 'spip_' . $t;
-	} else	$nom_table = $t = $type;
-
-	$desc = $tables_des_serveurs_sql[$s][$nom_table];
-	if (!isset($desc['field'])) {
-		$desc = sql_showtable($nom_table, $serveur, ($nom_table != $type));
-		if (!isset($desc['field']))
-			return null;
-		$tables_des_serveurs_sql[$s][$nom_table]= $desc;
-	}
-	$desc['serveur']= $s;
-	$desc['type']= $t;
-	$desc['table']= $nom_table;
-
-	return $desc;
-}
-
 // http://doc.spip.org/@index_tables_en_pile
 function index_tables_en_pile($idb, $nom_champ, &$boucles) {
 	global $exceptions_des_tables;
 
 	$r = $boucles[$idb]->type_requete;
-	$s = $boucles[$idb]->sql_serveur;
 
 	if ($r == 'boucle') return array();
-	$desc= description_type_requete($r, $s);
-
+	$desc = trouver_table($r, $boucle);
 	if(!$desc) {
-		erreur_squelette(_T('zbug_table_inconnue', array('table' => $r)),
-				   "'$idb'");
 		# continuer pour chercher l'erreur suivante
 		return  array("'#" . $r . ':' . $nom_champ . "'",'');
 	}
@@ -441,7 +397,7 @@ function applique_filtres($p) {
 
 	// S'il y a un lien avec la session, ajouter un code qui levera
 	// un drapeau dans la structure d'invalidation $Cache
-	if ($p->descr['session'])
+	if (isset($p->descr['session']))
 		$code = "$code . invalideur_session(\$Cache)";
 
 	// ramasser les images intermediaires inutiles et graver l'image finale