diff --git a/.gitattributes b/.gitattributes
index 35a7577c52b291807c38e417f91ecc71ebbd398b..35d03b01d527cade34020cb3149ac0dde53c6798 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -419,6 +419,7 @@ ecrire/balise/index.php -text
 ecrire/balise/logo_.php -text
 ecrire/balise/url_.php -text
 ecrire/base/admin_repair.php -text
+ecrire/base/connect_sql.php -text
 ecrire/base/convert_sql_utf8.php -text
 ecrire/base/convert_utf8.php -text
 ecrire/base/delete_all.php -text
diff --git a/ecrire/base/connect_sql.php b/ecrire/base/connect_sql.php
new file mode 100644
index 0000000000000000000000000000000000000000..82a1e4ecd704dd65b52ef424c9d162c9481f0c38
--- /dev/null
+++ b/ecrire/base/connect_sql.php
@@ -0,0 +1,271 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2007                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+//
+// Utilitaires indispensables autour des serveurs SQL
+//
+
+// API d'appel aux bases de donnees:
+// on charge le fichier config/$serveur ($serveur='connect' pour le principal)
+// qui est cense initaliser la connexion en appelant spip_connect_db
+// laquelle met dans la globale db_ok la description de la connexion
+// On la memorise dans un tableau pour permettre plusieurs serveurs.
+// A l'installation, il faut simuler l'existence de ce fichier
+
+// http://doc.spip.org/@spip_connect
+function spip_connect($serveur='', $version='') {
+	global $connexions, $spip_sql_version;
+
+	$index = $serveur ? $serveur : 0;
+	if (!$version) $version = $spip_sql_version;
+	if (isset($connexions[$index][$version])) return $connexions[$index];
+
+	include_spip('base/abstract_sql');
+	if (isset($_GET['var_profile'])) include_spip('public/debug');
+	$install = (_request('exec') == 'install');
+
+	// Premiere connexion ? 
+	if (!($old = isset($connexions[$index]))) {
+		$f = (!preg_match('/^\w*$/', $serveur))	? ''
+		: (($serveur AND !$install) ?
+			( _DIR_CONNECT. $serveur . '.php')
+			: (_FILE_CONNECT ? _FILE_CONNECT
+			   : ($install ? _FILE_CONNECT_TMP : '')));
+
+		unset($GLOBALS['db_ok']);
+		unset($GLOBALS['spip_connect_version']);
+		if ($f AND is_readable($f)) include($f);
+		if (!isset($GLOBALS['db_ok'])) {
+		  // fera mieux la prochaine fois
+			if ($install) return false; 
+			spip_log("spip_connect: serveur $index mal defini dans '$f'.");
+			// ne plus reessayer si ce n'est pas l'install
+			return $connexions[$index]=false;
+		}
+		$connexions[$index] = $GLOBALS['db_ok'];
+	}
+	// la connexion a reussi ou etait deja faite.
+	// chargement de la version du jeu de fonctions
+	// si pas dans le fichier par defaut
+	$type = $GLOBALS['db_ok']['type'];
+	$jeu = 'spip_' . $type .'_functions_' . $version;
+	if (!isset($GLOBALS[$jeu])) {
+		if (!include_spip($type . '_' . $version, 'req'))
+			spip_log("spip_connect: serveur $index version '$version' non defini par $jeu.");
+		// ne plus reessayer 
+		return $connexions[$index][$version] = array();
+	}
+	$connexions[$index][$version] = $GLOBALS[$jeu];
+	if ($old) return $connexions[$index];
+
+	$connexions[$index]['spip_connect_version'] = isset($GLOBALS['spip_connect_version']) ? $GLOBALS['spip_connect_version'] : 0;
+
+	// initialisation de l'alphabet utilise dans les connexions SQL
+	// si l'installation l'a determine.
+	// Celui du serveur principal l'impose aux serveurs secondaires
+	// s'ils le connaissent
+
+	if (!$serveur) {
+		$charset = spip_connect_main($GLOBALS[$jeu]);
+		if (!$charset) {
+			unset($connexions[$index]);
+			spip_log("spip_connect: absence de charset");
+			return false;
+		}
+	} else {
+		$charset = isset($GLOBALS['meta']['charset_sql_connexion']) ?
+		  $GLOBALS['meta']['charset_sql_connexion'] : 'utf8';
+	}
+	if ($charset != -1) {
+		$f = $GLOBALS[$jeu]['set_charset'];
+		if (function_exists($f))
+			$f($charset, $serveur);
+	}
+	return $connexions[$index];
+}
+
+// Cette fonction ne doit etre appelee qu'a travers la fonction sql_serveur
+// definie dans base/abstract_sql
+// Elle existe en tant que gestionnaire de versions,
+// connue seulement des convertisseurs automatiques
+
+// http://doc.spip.org/@spip_connect_sql
+function spip_connect_sql($version, $ins='', $serveur='', $cont=false) {
+	$desc = spip_connect($serveur, $version);
+	if (function_exists($f = @$desc[$version][$ins])) return $f;
+	if ($ins)
+		spip_log("Le serveur '$serveur' version $version n'a pas '$ins'");
+	if ($cont) return $desc;
+	include_spip('inc/minipres');
+	echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
+	exit;
+}
+
+// Fonction appelee par le fichier cree dans config/ a l'instal'.
+// Il contient un appel direct a cette fonction avec comme arguments
+// les identifants de connexion.
+// Si la connexion reussit, la globale db_ok memorise sa description.
+// C'est un tableau egalement retourne en valeur, pour les appels a l'install'
+
+// http://doc.spip.org/@spip_connect_db
+function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $prefixe='', $ldap='') {
+	global $db_ok;
+
+	## TODO : mieux differencier les serveurs
+	$f = _DIR_TMP . $type . 'out';
+
+	if (@file_exists($f)
+	AND (time() - @filemtime($f) < 30)
+	AND !defined('_ECRIRE_INSTALL')) {
+		return;
+	}
+	if (!$prefixe) 
+		$prefixe = isset($GLOBALS['table_prefix'])
+		? $GLOBALS['table_prefix'] : $db;
+	$h = charger_fonction($type, 'req', true);
+	if (!$h) {
+		spip_log("les reqûetes $type ne sont pas fournies");
+		return;
+	}
+	  
+	if ($g = $h($host, $port, $login, $pass, $db, $prefixe, $ldap)) {
+
+		$g['type'] = $type;
+		return $db_ok = $g;
+	}
+	// En cas d'indisponibilite du serveur, eviter de le bombarder
+	if (!defined('_ECRIRE_INSTALL')) {
+		@touch($f);
+		$err = "Echec connexion $host $port $login $db";
+		spip_log($err);
+		spip_log($err, $type);
+	}
+}
+
+// Premiere connexion au serveur principal: 
+// retourner le charset donnee par la table principale
+// mais verifier que le fichier de connexion n'est pas trop vieux
+// Version courante = 0.7 (indication d'un LDAP comme 7e arg)
+// La version 0.6 indique le prefixe comme 6e arg
+// La version 0.5 indique le serveur comme 5e arg
+//
+// La version 0.0 (non numerotee) doit etre refaite par un admin
+// les autres fonctionnent toujours, meme si :
+// - la version 0.1 est moins performante que la 0.2
+// - la 0.2 fait un include_ecrire('inc_db_mysql.php3').
+
+// http://doc.spip.org/@spip_connect_main
+function spip_connect_main($connexion)
+{
+	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 (!($f = $connexion['select'])) return false;
+	if (!$r = $f('valeur','spip_meta', "nom='charset_sql_connexion'"))
+		return false;
+	if (!($f = $connexion['fetch'])) return false;
+	$r = $f($r);
+	return ($r['valeur'] ? $r['valeur'] : -1);
+}
+
+// http://doc.spip.org/@spip_connect_ldap
+function spip_connect_ldap($serveur='') {
+	$connexion = spip_connect($serveur);
+	if ($connexion['ldap'] AND is_string($connexion['ldap'])) {
+		include_once( _DIR_CONNECT . $connexion['ldap']);
+		if ($GLOBALS['ldap_link'])
+		  $connexion['ldap'] = array('link' => $GLOBALS['ldap_link'],
+					'base' => $GLOBALS['ldap_base']);
+	}
+	return $connexion['ldap'];
+}
+
+// 1 interface de abstract_sql a demenager dans base/abstract_sql a terme
+
+// http://doc.spip.org/@_q
+function _q($a) {
+	return (is_int($a)) ? strval($a) : 
+		(!is_array($a) ? ("'" . addslashes($a) . "'")
+		 : join(",", array_map('_q', $a)));
+}
+
+// Nommage bizarre des tables d'objets
+// http://doc.spip.org/@table_objet
+function table_objet($type) {
+	static $surnoms = array(
+		'article' => 'articles',
+		'auteur' => 'auteurs',
+		'breve' => 'breves',
+		'document' => 'documents',
+		'doc' => 'documents', # pour les modeles
+		'img' => 'documents',
+		'emb' => 'documents',
+		'forum' => 'forum', # hum
+		'groupe_mots' => 'groupes_mots', # hum
+		'groupe' => 'groupes_mots', # hum (EXPOSE)
+		'message' => 'messages',
+		'mot' => 'mots',
+		'petition' => 'petitions',
+		'rubrique' => 'rubriques',
+		'signature' => 'signatures',
+		'syndic' => 'syndic',
+		'site' => 'syndic', # hum hum
+		'syndic_article' => 'syndic_articles',
+		'type_document' => 'types_documents', # hum
+		'extension' => 'types_documents' # hum
+	);
+	return isset($surnoms[$type]) ? $surnoms[$type] : $type."s";
+}
+
+// http://doc.spip.org/@table_objet_sql
+function table_objet_sql($type) {
+	return 'spip_' . table_objet($type);
+}
+
+// http://doc.spip.org/@id_table_objet
+function id_table_objet($type) {
+	$type = preg_replace(',^spip_|s$,', '', $type);
+	if ($type == 'forum')
+		return 'id_forum';
+	else if ($type == 'type')
+		return 'extension';
+	else {
+		if (!$type) return;
+		$t = table_objet($type);
+		$trouver_table = charger_fonction('trouver_table', 'base');
+		$desc = $trouver_table($t);
+		return @$desc['key']["PRIMARY KEY"];
+	}
+}
+
+// Recuperer le nom de la table de jointure xxxx sur l'objet yyyy
+// http://doc.spip.org/@table_jointure
+function table_jointure($x, $y) {
+	include_spip('public/interfaces');
+	if ($table = $GLOBALS['tables_jointures'][table_objet_sql($y)][id_table_objet($x)]
+	OR $table = $GLOBALS['tables_jointures'][table_objet_sql($x)][id_table_objet($y)])
+		return $table;
+}
+
+// Pour compatibilite. Ne plus utiliser.
+// http://doc.spip.org/@spip_query
+function spip_query($query, $serveur='') {
+	global $spip_sql_version;
+	$f = spip_connect_sql($spip_sql_version, 'query', $serveur, true);
+	return function_exists($f) ? $f($query, $serveur) : false;
+}
+
+?>
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 5dd21b5c6262444ab38eed968425e10e3f1a152c..dd8531e7055f97f98ed89d5e9a1cb29eda37316a 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -13,7 +13,7 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 //
-// Gestion des inclusions et infos repertoires
+// Utilitaires indispensables autour du serveur Http.
 //
 
 // charge un fichier perso ou, a defaut, standard
@@ -187,200 +187,6 @@ function spip_log($message, $logname=NULL, $logdir=NULL, $logsuf=NULL) {
 		spip_log($logname=='maj' ? 'cf maj.log' : $message);
 }
 
-// Fonction appelee par le fichier cree dans config/ a l'instal'.
-// Il contient un appel direct a cette fonction avec comme arguments
-// les identifants de connexion.
-// Si la connexion reussit, la globale db_ok memorise sa description.
-// C'est un tableau egalement retourne en valeur, pour les appels a l'install'
-
-// http://doc.spip.org/@spip_connect_db
-function spip_connect_db($host, $port, $login, $pass, $db='', $type='mysql', $prefixe='', $ldap='') {
-	global $db_ok;
-
-	## TODO : mieux differencier les serveurs
-	$f = _DIR_TMP . $type . 'out';
-
-	if (@file_exists($f)
-	AND (time() - @filemtime($f) < 30)
-	AND !defined('_ECRIRE_INSTALL')) {
-		return;
-	}
-	if (!$prefixe) 
-		$prefixe = isset($GLOBALS['table_prefix'])
-		? $GLOBALS['table_prefix'] : $db;
-	$h = charger_fonction($type, 'req', true);
-	if (!$h) {
-		spip_log("les reqûetes $type ne sont pas fournies");
-		return;
-	}
-	  
-	if ($g = $h($host, $port, $login, $pass, $db, $prefixe, $ldap)) {
-
-		$g['type'] = $type;
-		return $db_ok = $g;
-	}
-	// En cas d'indisponibilite du serveur, eviter de le bombarder
-	if (!defined('_ECRIRE_INSTALL')) {
-		@touch($f);
-		$err = "Echec connexion $host $port $login $db";
-		spip_log($err);
-		spip_log($err, $type);
-	}
-}
-
-// API d'appel aux bases de donnees:
-// on charge le fichier config/$serveur ($serveur='connect' pour le principal)
-// qui est cense initaliser la connexion en appelant spip_connect_db
-// laquelle met dans la globale db_ok la description de la connexion
-// On la memorise dans un tableau pour permettre plusieurs serveurs.
-// A l'installation, il faut simuler l'existence de ce fichier
-
-// http://doc.spip.org/@spip_connect
-function spip_connect($serveur='', $version='') {
-	global $connexions, $spip_sql_version;
-
-	$index = $serveur ? $serveur : 0;
-	if (!$version) $version = $spip_sql_version;
-	if (isset($connexions[$index][$version])) return $connexions[$index];
-
-	include_spip('base/abstract_sql');
-	if (isset($_GET['var_profile'])) include_spip('public/debug');
-	$install = (_request('exec') == 'install');
-
-	// Premiere connexion ? 
-	if (!($old = isset($connexions[$index]))) {
-		$f = (!preg_match('/^\w*$/', $serveur))	? ''
-		: (($serveur AND !$install) ?
-			( _DIR_CONNECT. $serveur . '.php')
-			: (_FILE_CONNECT ? _FILE_CONNECT
-			   : ($install ? _FILE_CONNECT_TMP : '')));
-
-		unset($GLOBALS['db_ok']);
-		unset($GLOBALS['spip_connect_version']);
-		if ($f AND is_readable($f)) include($f);
-		if (!isset($GLOBALS['db_ok'])) {
-		  // fera mieux la prochaine fois
-			if ($install) return false; 
-			spip_log("spip_connect: serveur $index mal defini dans '$f'.");
-			// ne plus reessayer si ce n'est pas l'install
-			return $connexions[$index]=false;
-		}
-		$connexions[$index] = $GLOBALS['db_ok'];
-	}
-	// la connexion a reussi ou etait deja faite.
-	// chargement de la version du jeu de fonctions
-	// si pas dans le fichier par defaut
-	$type = $GLOBALS['db_ok']['type'];
-	$jeu = 'spip_' . $type .'_functions_' . $version;
-	if (!isset($GLOBALS[$jeu])) {
-		if (!include_spip($type . '_' . $version, 'req'))
-			spip_log("spip_connect: serveur $index version '$version' non defini par $jeu.");
-		// ne plus reessayer 
-		return $connexions[$index][$version] = array();
-	}
-	$connexions[$index][$version] = $GLOBALS[$jeu];
-	if ($old) return $connexions[$index];
-
-	$connexions[$index]['spip_connect_version'] = isset($GLOBALS['spip_connect_version']) ? $GLOBALS['spip_connect_version'] : 0;
-
-	// initialisation de l'alphabet utilise dans les connexions SQL
-	// si l'installation l'a determine.
-	// Celui du serveur principal l'impose aux serveurs secondaires
-	// s'ils le connaissent
-
-	if (!$serveur) {
-		$charset = spip_connect_main($GLOBALS[$jeu]);
-		if (!$charset) {
-			unset($connexions[$index]);
-			spip_log("spip_connect: absence de charset");
-			return false;
-		}
-	} else {
-		$charset = isset($GLOBALS['meta']['charset_sql_connexion']) ?
-		  $GLOBALS['meta']['charset_sql_connexion'] : 'utf8';
-	}
-	if ($charset != -1) {
-		$f = $GLOBALS[$jeu]['set_charset'];
-		if (function_exists($f))
-			$f($charset, $serveur);
-	}
-	return $connexions[$index];
-}
-
-// Cette fonction ne doit etre appelee qu'a travers la fonction sql_serveur
-// definie dans base/abstract_sql
-// Elle existe en tant que gestionnaire de versions,
-// connue seulement des convertisseurs automatiques
-
-// http://doc.spip.org/@spip_connect_sql
-function spip_connect_sql($version, $ins='', $serveur='', $cont=false) {
-	$desc = spip_connect($serveur, $version);
-	if (function_exists($f = @$desc[$version][$ins])) return $f;
-	if ($ins)
-		spip_log("Le serveur '$serveur' version $version n'a pas '$ins'");
-	if ($cont) return $desc;
-	include_spip('inc/minipres');
-	echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'));
-	exit;
-}
-
-// Ici pour compatibilite. Ne plus utiliser.
-// http://doc.spip.org/@spip_query
-function spip_query($query, $serveur='') {
-	global $spip_sql_version;
-	$f = spip_connect_sql($spip_sql_version, 'query', $serveur, true);
-	return function_exists($f) ? $f($query, $serveur) : false;
-}
-
-// Premiere connexion au serveur principal: 
-// retourner le charset donnee par la table principale
-// mais verifier que le fichier de connexion n'est pas trop vieux
-// Version courante = 0.7 (indication d'un LDAP comme 7e arg)
-// La version 0.6 indique le prefixe comme 6e arg
-// La version 0.5 indique le serveur comme 5e arg
-//
-// La version 0.0 (non numerotee) doit etre refaite par un admin
-// les autres fonctionnent toujours, meme si :
-// - la version 0.1 est moins performante que la 0.2
-// - la 0.2 fait un include_ecrire('inc_db_mysql.php3').
-
-// http://doc.spip.org/@spip_connect_main
-function spip_connect_main($connexion)
-{
-	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 (!($f = $connexion['select'])) return false;
-	if (!$r = $f('valeur','spip_meta', "nom='charset_sql_connexion'"))
-		return false;
-	if (!($f = $connexion['fetch'])) return false;
-	$r = $f($r);
-	return ($r['valeur'] ? $r['valeur'] : -1);
-}
-
-// http://doc.spip.org/@spip_connect_ldap
-function spip_connect_ldap($serveur='') {
-	$connexion = spip_connect($serveur);
-	if ($connexion['ldap'] AND is_string($connexion['ldap'])) {
-		include_once( _DIR_CONNECT . $connexion['ldap']);
-		if ($GLOBALS['ldap_link'])
-		  $connexion['ldap'] = array('link' => $GLOBALS['ldap_link'],
-					'base' => $GLOBALS['ldap_base']);
-	}
-	return $connexion['ldap'];
-}
-
-// 1 interface de abstract_sql a demenager dans base/abstract_sql a terme
-
-// http://doc.spip.org/@_q
-function _q($a) {
-	return (is_int($a)) ? strval($a) : 
-		(!is_array($a) ? ("'" . addslashes($a) . "'")
-		 : join(",", array_map('_q', $a)));
-}
-
 // Renvoie le _GET ou le _POST emis par l'utilisateur
 // ou pioche dans $c si c'est un array()
 // http://doc.spip.org/@_request
@@ -608,63 +414,6 @@ function joli_repertoire($rep) {
 	return $rep;
 }
 
-// Nommage bizarre des tables d'objets
-// http://doc.spip.org/@table_objet
-function table_objet($type) {
-	static $surnoms = array(
-		'article' => 'articles',
-		'auteur' => 'auteurs',
-		'breve' => 'breves',
-		'document' => 'documents',
-		'doc' => 'documents', # pour les modeles
-		'img' => 'documents',
-		'emb' => 'documents',
-		'forum' => 'forum', # hum
-		'groupe_mots' => 'groupes_mots', # hum
-		'groupe' => 'groupes_mots', # hum (EXPOSE)
-		'message' => 'messages',
-		'mot' => 'mots',
-		'petition' => 'petitions',
-		'rubrique' => 'rubriques',
-		'signature' => 'signatures',
-		'syndic' => 'syndic',
-		'site' => 'syndic', # hum hum
-		'syndic_article' => 'syndic_articles',
-		'type_document' => 'types_documents', # hum
-		'extension' => 'types_documents' # hum
-	);
-	return isset($surnoms[$type]) ? $surnoms[$type] : $type."s";
-}
-
-// http://doc.spip.org/@table_objet_sql
-function table_objet_sql($type) {
-	return 'spip_' . table_objet($type);
-}
-
-// http://doc.spip.org/@id_table_objet
-function id_table_objet($type) {
-	$type = preg_replace(',^spip_|s$,', '', $type);
-	if ($type == 'forum')
-		return 'id_forum';
-	else if ($type == 'type')
-		return 'extension';
-	else {
-		if (!$type) return;
-		$t = table_objet($type);
-		$trouver_table = charger_fonction('trouver_table', 'base');
-		$desc = $trouver_table($t);
-		return @$desc['key']["PRIMARY KEY"];
-	}
-}
-
-// Recuperer le nom de la table de jointure xxxx sur l'objet yyyy
-// http://doc.spip.org/@table_jointure
-function table_jointure($x, $y) {
-	include_spip('public/interfaces');
-	if ($table = $GLOBALS['tables_jointures'][table_objet_sql($y)][id_table_objet($x)]
-	OR $table = $GLOBALS['tables_jointures'][table_objet_sql($x)][id_table_objet($y)])
-		return $table;
-}
 
 //
 // spip_timer : on l'appelle deux fois et on a la difference, affichable
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index 70c13e5257b6d31bec6d92a2bfa2842f0e218742..63cedb5038cbe62a1390e8aebcac23ea08eca2f8 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -306,9 +306,10 @@ $meta = $connect_id_rubrique = array();
 // *** Fin des globales *** //
 
 //
-// Definitions des fonctions (charge aussi inc/flock)
+// Charger les fonctions liees aux serveurs Http et Sql.
 //
 require_once _DIR_RESTREINT . 'inc/utils.php';
+require_once _DIR_RESTREINT . 'base/connect_sql.php';
 
 // Definition personnelles eventuelles
 
@@ -321,6 +322,7 @@ error_reporting(SPIP_ERREUR_REPORT);
 
 //
 // INITIALISER LES REPERTOIRES NON PARTAGEABLES ET LES CONSTANTES
+// (charge aussi inc/flock)
 //
 // mais l'inclusion precedente a peut-etre deja appele cette fonction
 // ou a defini certaines des constantes que cette fonction doit definir