diff --git a/ecrire/balise/logo_.php b/ecrire/balise/logo_.php
index 3dfc267bd12d3d7558972244a1fde88340f787a9..5b36ca3f15c467310f6108f54c86f509ebc9acd8 100644
--- a/ecrire/balise/logo_.php
+++ b/ecrire/balise/logo_.php
@@ -116,20 +116,19 @@ function balise_LOGO__dist ($p) {
 			$code_lien = "''";
 		$code_lien .= ", '". $align . "'";
 	}
-
-	if ($p->id_boucle AND $p->boucles[$p->id_boucle]->sql_serveur) {
-		$p->code = "''";
-		spip_log("Logo distant indisponible");
-	// cas des documents
-	} elseif ($type_objet == 'DOCUMENT') {
+	$connect = $p->id_boucle ?$p->boucles[$p->id_boucle]->sql_serveur :'';
+	if ($type_objet == 'DOCUMENT') {
 		$p->code = "calcule_logo_document($_id_objet, '" .
 			$p->descr['documents'] .
 			'\', $doublons, '. intval($flag_fichier).", $code_lien, '".
 			// #LOGO_DOCUMENT{x,y} donne la taille maxi
 			texte_script($params)
-			."')";
+			."'," . _q($connect) .")";
 	}
-	else {
+	elseif ($connect) {
+		$p->code = "''";
+		spip_log("Les logos distants ne sont pas prevus");
+	} else {
 		$p->code = "affiche_logos(calcule_logo('$id_objet', '" .
 			(($suite_logo == '_SURVOL') ? 'off' : 
 			(($suite_logo == '_NORMAL') ? 'on' : 'ON')) .
diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index e3f77ee944c87f7670f152054514f3f198268507..abdb9540069e27d6f0f85352bacdcf3bd92b9b4b 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -289,6 +289,24 @@ function echappe_retour($letexte, $source='', $filtre = "") {
 	return $letexte;
 }
 
+// Reinserer le javascript de confiance (venant des modeles)
+
+function echappe_retour_modeles($letexte)
+{
+	$letexte = echappe_retour($letexte);
+
+	// Dans l'espace prive, securiser ici
+	if (!_DIR_RESTREINT)
+		$letexte = interdire_scripts($letexte);
+
+	// Reinserer les echappements des modeles 
+
+	if (defined('_PROTEGE_JS_MODELES'))
+		$letexte = echappe_retour($letexte,"javascript"._PROTEGE_JS_MODELES);
+
+	return trim($letexte);
+}
+
 // http://doc.spip.org/@nettoyer_raccourcis_typo
 function nettoyer_raccourcis_typo($texte){
 	$texte = pipeline('nettoyer_raccourcis_typo',$texte);
@@ -297,7 +315,7 @@ function nettoyer_raccourcis_typo($texte){
 		foreach ($regs as $reg) {
 			list ($titre,,)= traiter_raccourci_lien_atts($reg[1]);
 			$titre = calculer_url($reg[3], $titre, 'titre');
-			$titre = typo(supprimer_tags($titre));
+			$titre = corriger_typo(supprimer_tags($titre));
 			$texte = str_replace($reg[0], $titre, $texte);
 		}
 
@@ -500,7 +518,7 @@ function safehtml($t) {
 // avec protection prealable des balises HTML et SPIP
 
 // http://doc.spip.org/@typo
-function typo($letexte, $echapper=true) {
+function typo($letexte, $echapper=true, $connect='') {
 
 	// Plus vite !
 	if (!$letexte) return $letexte;
@@ -512,9 +530,10 @@ function typo($letexte, $echapper=true) {
 	//
 	// Installer les modeles, notamment images et documents ;
 	//
-	// NOTE : dans propre() ceci s'execute avant les tableaux a cause du "|",
-	// et apres les liens a cause du traitement de [<imgXX|right>->URL]
-	$letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '');
+	// NOTE : propre() l'a deja fait
+	// sauf pour les textes renvoyes par calculer_url()
+
+	$letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '', $connect);
 	if ($letexte != $mem) $echapper = true;
 	unset($mem);
 
@@ -524,8 +543,9 @@ function typo($letexte, $echapper=true) {
 	if ($echapper)
 		$letexte = echappe_retour($letexte, 'TYPO');
 
-	// l'espace prive securise ici
-	$letexte = interdire_scripts($letexte);
+	// Dans l'espace prive, securiser ici
+	if (!_DIR_RESTREINT)
+		$letexte = interdire_scripts($letexte);
 
 	return $letexte;
 }
@@ -1025,7 +1045,7 @@ function traiter_modeles($texte, $doublons=false, $echap='', $connect='') {
 				$texte .= preg_replace(',[|][^|=]*,s',' ',$regs[4]);
 			# version normale
 			else {
-			  $modele = inclure_modele($regs[2], $regs[3], $regs[4], $lien, $connect);
+				$modele = inclure_modele($regs[2], $regs[3], $regs[4], $lien, $connect);
 
 				// le remplacer dans le texte
 				if ($modele !== false) {
@@ -1167,21 +1187,19 @@ function traiter_raccourci_glossaire($letexte)
 // Regexp des raccouris, aussi utilisee pour la fusion de sauvegarde Spip
 define('_RACCOURCI_LIEN', ",\[([^][]*)->(>?)([^]]*)\],msS");
 
-// http://doc.spip.org/@traiter_raccourcis_propre
-function traiter_raccourcis_propre($letexte)
+function expanser_liens($letexte, $connect='')
 {
 	$inserts = array();
 	if (preg_match_all(_RACCOURCI_LIEN, $letexte, $matches, PREG_SET_ORDER)) {
 		$i = 0;
 		foreach ($matches as $regs) {
-			$inserts[++$i] = traiter_raccourci_lien($regs);
+			$inserts[++$i] = traiter_raccourci_lien($regs, $connect);
 			$letexte = str_replace($regs[0], "@@SPIP_ECHAPPE_LIEN_$i@@",
 				$letexte);
 		}
 	}
 
-	$letexte = typo($letexte, /* echap deja fait, accelerer */ false);
-
+	$letexte = corriger_typo(traiter_modeles($letexte, false, false, $connect));
 	foreach ($inserts as $i => $insert) {
 		$letexte = str_replace("@@SPIP_ECHAPPE_LIEN_$i@@", $insert, $letexte);
 	}
@@ -1195,9 +1213,9 @@ function traiter_raccourcis_propre($letexte)
 // 1=>texte (ou texte|hreflang ou texte|bulle ou texte|bulle{hreflang})
 // 2=>double fleche (historiquement, liens ouvrants)
 // 3=>url
-//
+// A terme, il faudrait tenir compte de $connect
 // http://doc.spip.org/@traiter_raccourci_lien
-function traiter_raccourci_lien($regs) {
+function traiter_raccourci_lien($regs, $connect='') {
 
 	list(,$texte, ,$url) = $regs;
 	list($texte, $bulle, $hlang) = traiter_raccourci_lien_atts($texte);
@@ -1209,8 +1227,14 @@ function traiter_raccourci_lien($regs) {
 		$hlang = $lang;
 	$lang = ($hlang ? ' hreflang="'.$hlang.'"' : '') . $bulle;
 
-	# ici bien passer le lien pour traiter [<doc3>->url]
-	return typo("<a href=\"$lien\" class=\"$class\"$lang>$texte</a>");
+	# Penser au cas [<imgXX|right>->URL]
+	# ceci s'execute heureusement avant les tableaux et leur "|".
+	# Attention, le texte initial est deja echappe mais pas forcement
+	# celui retourne par calculer_url.
+
+	$texte = typo($texte, true, $connect);
+
+	return "<a href=\"$lien\" class=\"$class\"$lang>$texte</a>";
 }
 
 // Repere dans la partie texte d'un raccourci [texte->...]
@@ -1288,7 +1312,7 @@ function traiter_poesie($letexte)
 	return $letexte;
 }
 
-// Nettoie un texte, traite les raccourcis spip, la typo, etc.
+// Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc.
 // http://doc.spip.org/@traiter_raccourcis
 function traiter_raccourcis($letexte) {
 
@@ -1296,24 +1320,19 @@ function traiter_raccourcis($letexte) {
 
 	// Appeler les fonctions de pre_traitement
 	$letexte = pipeline('pre_propre', $letexte);
-	// old style
-	if (function_exists('avant_propre'))
-		$letexte = avant_propre($letexte);
 
-	$letexte = traiter_raccourcis_propre($letexte);
 	$letexte = traiter_poesie($letexte);
 
 	// Harmoniser les retours chariot
 	$letexte = preg_replace(",\r\n?,S", "\n", $letexte);
 
 	// Recuperer les paragraphes HTML
-	$letexte = preg_replace(",<p[>[:space:]],iS", "\n\n\\0", $letexte);
-	$letexte = preg_replace(",</p[>[:space:]],iS", "\\0\n\n", $letexte);
+	$letexte = preg_replace(',<p[>]\s,iS', "\n\n\\0", $letexte);
+	$letexte = preg_replace(',</p[>]\s,iS', "\\0\n\n", $letexte);
 
 	$letexte = traiter_raccourci_glossaire($letexte);
 	$letexte = traiter_raccourci_ancre($letexte);
 
-
 	list($letexte, $mes_notes) = traite_raccourci_notes($letexte);
 
 	// A present on introduit des attributs class_spip*
@@ -1372,9 +1391,6 @@ function traiter_raccourcis($letexte) {
 
 	// Appeler les fonctions de post-traitement
 	$letexte = pipeline('post_propre', $letexte);
-	// old style
-	if (function_exists('apres_propre'))
-		$letexte = apres_propre($letexte);
 
 	if ($mes_notes) traiter_les_notes($mes_notes);
 
@@ -1411,7 +1427,7 @@ function traite_raccourci_notes($letexte)
 		$num_note = false;
 
 		// note auto ou pas ?
-		if (preg_match(",^ *<([^>]*)>,", $note_texte, $regs)){
+		if (preg_match(",^<([^>]*)>,", $note_texte, $regs)){
 			$num_note = $regs[1];
 			$note_texte = str_replace($regs[0], "", $note_texte);
 		} else {
@@ -1481,30 +1497,11 @@ function traiter_les_notes($mes_notes) {
 
 // Filtre a appliquer aux champs du type #TEXTE*
 // http://doc.spip.org/@propre
-function propre($letexte) {
-	if (!$letexte) return $letexte;
-
-	// Echapper les <a href>, <html>...< /html>, <code>...< /code>
-	$letexte = echappe_html($letexte);
-
-	// Traiter le texte
-	$letexte = traiter_raccourcis($letexte);
-
-	// Reinserer les echappements
-	$letexte = echappe_retour($letexte);
-
-	// Vider les espaces superflus
-	$letexte = trim($letexte);
+function propre($t, $connect='') {
 
-	// Dans l'espace prive, securiser ici
-	if (!_DIR_RESTREINT)
-		$letexte = interdire_scripts($letexte);
-
-	// Reinserer le javascript de confiance (venant des modeles)
-	if (defined('_PROTEGE_JS_MODELES'))
-		$letexte = echappe_retour($letexte,"javascript"._PROTEGE_JS_MODELES);
-
-	return $letexte;
+	return !$t ? '' :
+		echappe_retour_modeles(
+			traiter_raccourcis(
+				expanser_liens(echappe_html($t),$connect)));
 }
-
 ?>
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index f8046fb2f1b68a040caa48bcab74833df1ee4870..17f642b5c738e8d46ba3ea93eed346667623eecc 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -422,7 +422,15 @@ function balise_LANG_dist ($p) {
 	return $p;
 }
 
-
+function balise_CHAPO_dist ($p) {
+	$_chapo = champ_sql('chapo', $p);
+	if ((!$p->etoile) OR (strpos($_chapo, '$Pile[$SP') === false))
+		$p->code = $_chapo;
+	else
+		$p->code = "nettoyer_chapo($_chapo)";
+	$p->interdire_scripts = false;
+	return $p;
+}
 // #LESAUTEURS
 // les auteurs d'un article (ou d'un article syndique)
 // http://www.spip.net/fr_article902.html
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 9d6f13dd9afc18af899a2e55c4b3200a493fba92..6b179b3c5e0728d3ccc02f0238c6d0d9d6060287 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -250,6 +250,8 @@ function calculer_boucle_nonrec($id_boucle, &$boucles) {
 	} else {
 
 		$corps = $init . '
+	$connect = ' .
+	_q($boucle->sql_serveur) . ';
 
 	// RESULTATS
 	while ($Pile[$SP] = @sql_fetch($result,"' .
diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php
index 0ac1523c5e93950d46169f7c75a8677e08c8310e..556e5b068686971df6aeba36e0575d3cb1189613 100644
--- a/ecrire/public/composer.php
+++ b/ecrire/public/composer.php
@@ -352,31 +352,31 @@ function lister_objets_avec_logos ($type) {
 
 // fonction appelee par la balise #LOGO_DOCUMENT
 // http://doc.spip.org/@calcule_logo_document
-function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params) {
+function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier, $lien, $align, $params, $connect='') {
 	include_spip('inc/documents');
 
 	if (!$id_document) return '';
 	if ($doubdoc) $doublons["documents"] .= ','.$id_document;
 
-	if (!($row = sql_select(array('extension', 'id_vignette', 'fichier', 'mode'), array('spip_documents'), array("id_document = $id_document"))))
+	if (!($row = sql_fetsel(array('extension', 'id_vignette', 'fichier', 'mode'), array('spip_documents'), array("id_document = $id_document"), '','','','','','','',$connect))) {
 		// pas de document. Ne devrait pas arriver
+		spip_log("Erreur du compilateur doc $id_document inconnu");
 		return ''; 
+	}
 
-	$row = sql_fetch($row);
 	$extension = $row['extension'];
 	$id_vignette = $row['id_vignette'];
 	$fichier = get_spip_doc($row['fichier']);
 	$mode = $row['mode'];
 
 	// Y a t il une vignette personnalisee ?
+	// Ca va echouer si c'est en mode distant. A revoir.
 	if ($id_vignette) {
-		if ($res = sql_select(array('fichier'),
-				array('spip_documents'),
-				array("id_document = $id_vignette"))) {
-			$vignette = sql_fetch($res);
-			if (@file_exists(get_spip_doc($vignette['fichier'])))
-				$logo = generer_url_document($id_vignette);
-		}
+		$vignette = sql_fetsel(array('fichier'),
+			   array('spip_documents'),
+			   array("id_document = $id_vignette"), '','','','','','','',$connect);
+		if (@file_exists(get_spip_doc($vignette['fichier'])))
+			$logo = generer_url_document($id_vignette);
 	} else if ($mode == 'vignette') {
 		$logo = generer_url_document($id_document);
 		if (!@file_exists($logo))
diff --git a/ecrire/public/interfaces.php b/ecrire/public/interfaces.php
index ce958f729b6e7ef02bd97a46215c9ee462d05100..c59a23839e1b705ffcdc9f1e64eed28360228226 100644
--- a/ecrire/public/interfaces.php
+++ b/ecrire/public/interfaces.php
@@ -272,36 +272,40 @@ $exceptions_des_jointures['petition'] = array('spip_petitions', 'texte');
 $exceptions_des_jointures['id_signature']= array('spip_signatures', 'id_signature');
 
 global  $table_des_traitements;
-$table_des_traitements['BIO'][]= 'propre(%s)';
-$table_des_traitements['CHAPO'][]= 'propre(nettoyer_chapo(%s))';
+
+define('_TRAITEMENT_TYPO', 'typo(%s, "TYPO", $connect)');
+define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect)');
+
+$table_des_traitements['BIO'][]= _TRAITEMENT_RACCOURCIS;
+$table_des_traitements['CHAPO'][]= _TRAITEMENT_RACCOURCIS;
 $table_des_traitements['DATE'][]= 'vider_date(%s)';
 $table_des_traitements['DATE_MODIF'][]= 'vider_date(%s)';
 $table_des_traitements['DATE_NOUVEAUTES'][]= 'vider_date(%s)';
 $table_des_traitements['DATE_REDAC'][]= 'vider_date(%s)';
-$table_des_traitements['DESCRIPTIF'][]= 'propre(%s)';
+$table_des_traitements['DESCRIPTIF'][]= _TRAITEMENT_RACCOURCIS;
 $table_des_traitements['FICHIER']['documents']= 'get_spip_doc(%s)';
-$table_des_traitements['LIEN_TITRE'][]= 'typo(%s)';
+$table_des_traitements['LIEN_TITRE'][]= _TRAITEMENT_TYPO;
 $table_des_traitements['LIEN_URL'][]= 'vider_url(%s)';
-$table_des_traitements['MESSAGE'][]= 'propre(%s)';
-$table_des_traitements['NOM_SITE_SPIP'][]= 'typo(%s)';
+$table_des_traitements['MESSAGE'][]= _TRAITEMENT_RACCOURCIS;
+$table_des_traitements['NOM_SITE_SPIP'][]= _TRAITEMENT_TYPO;
 $table_des_traitements['NOM_SITE'][]= '%s'; # construire_titre_lien -> typo
-$table_des_traitements['NOM'][]= 'typo(%s)';
+$table_des_traitements['NOM'][]= _TRAITEMENT_TYPO;
 $table_des_traitements['PARAMETRES_FORUM'][]= 'htmlspecialchars(%s)';
-$table_des_traitements['PS'][]= 'propre(%s)';
-$table_des_traitements['SOURCE'][]= 'typo(%s)';
-$table_des_traitements['SOUSTITRE'][]= 'typo(%s)';
-$table_des_traitements['SURTITRE'][]= 'typo(%s)';
+$table_des_traitements['PS'][]= _TRAITEMENT_RACCOURCIS;
+$table_des_traitements['SOURCE'][]= _TRAITEMENT_TYPO;
+$table_des_traitements['SOUSTITRE'][]= _TRAITEMENT_TYPO;
+$table_des_traitements['SURTITRE'][]= _TRAITEMENT_TYPO;
 $table_des_traitements['TAGS'][]= '%s';
-$table_des_traitements['TEXTE'][]= 'propre(%s)';
-$table_des_traitements['TITRE'][]= 'typo(%s)';
-$table_des_traitements['TYPE'][]= 'typo(%s)';
+$table_des_traitements['TEXTE'][]= _TRAITEMENT_RACCOURCIS;
+$table_des_traitements['TITRE'][]= _TRAITEMENT_TYPO;
+$table_des_traitements['TYPE'][]= _TRAITEMENT_TYPO;
 $table_des_traitements['URL_ARTICLE'][]= 'vider_url(%s)';
 $table_des_traitements['URL_BREVE'][]= 'vider_url(%s)';
 $table_des_traitements['URL_DOCUMENT'][]= 'vider_url(%s)';
 $table_des_traitements['URL_FORUM'][]= 'vider_url(%s)';
 $table_des_traitements['URL_MOT'][]= 'vider_url(%s)';
 $table_des_traitements['URL_RUBRIQUE'][]= 'vider_url(%s)';
-$table_des_traitements['DESCRIPTIF_SITE_SPIP'][]= 'propre(%s)';
+$table_des_traitements['DESCRIPTIF_SITE_SPIP'][]= _TRAITEMENT_RACCOURCIS;
 $table_des_traitements['URL_SITE'][]= 'calculer_url(%s)';
 $table_des_traitements['URL_SOURCE'][]= 'vider_url(%s)';
 $table_des_traitements['URL_SYNDIC'][]= 'vider_url(%s)';
@@ -309,7 +313,7 @@ $table_des_traitements['ENV'][]= 'entites_html(%s,true)';
 
 
 // Articles syndiques : passage des donnees telles quelles, sans traitement typo
-// A noter, dans applique_filtres la securite et compliance XHTML de ces champs
+// A noter, dans applique_filtres la securite et conformite XHTML de ces champs
 // est assuree par safehtml()
 foreach(array('TITRE','DESCRIPTIF','SOURCE') as $balise)
 	if (!isset($table_des_traitements[$balise]['syndic_articles']))
diff --git a/ecrire/public/references.php b/ecrire/public/references.php
index 1074042841382ece3f11235092f9f8efdc91dc97..490d7c9bb188eaa5e43a9141fdc6cffb94673a6c 100644
--- a/ecrire/public/references.php
+++ b/ecrire/public/references.php
@@ -314,7 +314,7 @@ function balise_distante_interdite($p) {
 
 //
 // Traitements standard de divers champs
-// definis par $table_des_traitements, cf. inc-compilo-api.php3
+// definis par $table_des_traitements, cf. ecrire/public/interfaces
 //
 // http://doc.spip.org/@champs_traitements
 function champs_traitements ($p) {
@@ -335,21 +335,15 @@ function champs_traitements ($p) {
 
 	if (!$ps) return $p->code;
 
-	// Si une boucle sous-jacente (?) traite les documents, on insere ici
-	// une fonction de remplissage du tableau des doublons -- mais seulement
-	// si on rencontre le filtre propre (qui traite les
-	// raccourcis <docXX> qui nous interessent)
+	// Si une boucle documents est presente dans le squelette, 
+	// on insere une fonction de remplissage du tableau des doublons 
+	// dans les filtres propre() ou typo()
+	// (qui traitent les raccourcis <docXX> referencant les docs)
 	if (isset($p->descr['documents'])
-	AND preg_match(',propre,', $ps))
+	AND ((strpos($ps,'propre') !== false)
+		OR (strpos($ps,'typo') !== false)))
 		$ps = 'traiter_doublons_documents($doublons, '.$ps.')';
 
-	// De meme, en cas de sql_serveur, on supprime les < IMGnnn > tant
-	// qu'on ne rapatrie pas les documents distants joints..
-	// il faudrait aussi corriger les raccourcis d'URL locales
-	if ($p->id_boucle  AND $p->boucles[$p->id_boucle]->sql_serveur)
-		$p->code = 'supprime_img(' . $p->code . ')';
-
-
 	// Passer |safehtml sur les boucles "sensibles"
 	// sauf sur les champs dont on est surs
 	switch ($p->type_requete) {