diff --git a/dist/backend.html b/dist/backend.html
index 8af2239c667630a2182a5b773df02469474d4472..ffba0bfd13d408cc6e7043db99c0e906d91e5695 100644
--- a/dist/backend.html
+++ b/dist/backend.html
@@ -24,14 +24,26 @@
 		<date>#DATE</date>
 		
 
+
+	[<description>(#INTRODUCTION|texte_backend)</description>]
+
+	<B_mots>
+	<dc:subject><BOUCLE_mots(MOTS){id_article}{" "}>[(#TITRE|former_tag)]</BOUCLE_mots></dc:subject>
+	</B_mots>
+
 [(#REM)
-	Il est possible de mettre le texte integral de l'article dans le backend
-	en remplacant *INTRODUCTION par *CHAPO et *TEXTE etc., a filtrer avec
-	"liens_absolus".
+	Lorsque ce fichier backend est appele avec un parametre ?full=1,
+	il diffuse aussi le texte integral de l'article, ce qui permet une
+	syndication plus riche.
+]
+[(#ENV{full}|?{' ',''})
+	<content:encoded>[(#LOGO_ARTICLE|right||html_backend)
+	][&lt;div class='rss_chapo'>(#CHAPO|html_backend)&lt;/div>
+	][&lt;div class='rss_texte'>(#TEXTE|html_backend)&lt;/div>
+	][&lt;hr />
+	&lt;div class='rss_notes'>(#NOTES|html_backend)&lt;/div>
+	]</content:encoded>
 ]
-
-<description>[(#LOGO_ARTICLE|right||liens_absolus|texte_backend)
-][(#INTRODUCTION|texte_backend)]</description>
 		<author><BOUCLE_auteurs(AUTEURS){id_article}{", "}>[(#NOM|texte_backend)]</BOUCLE_auteurs></author>
 		<dc:date>[(#DATE|date_iso)]</dc:date>
 		<dc:format>text/html</dc:format>
diff --git a/dist/site.html b/dist/site.html
index a6f3fc84d99523db1be0e52cf5617fe504fd3bb2..d69439dbd6db79ed3ac0187b3d9d9263d6b36f47 100644
--- a/dist/site.html
+++ b/dist/site.html
@@ -70,9 +70,10 @@
 <div class="liste-articles">
 
 <BOUCLE_articles(SYNDIC_ARTICLES) {id_syndic} {par date}{inverse}{0,10}>
-	<h2><a href="#URL_ARTICLE" [title="(#DESCRIPTIF|couper{400}|textebrut|entites_html)"]>#TITRE</a></h2>
+	<h2><a href="#URL_ARTICLE">#TITRE</a></h2>
 	<div class="detail">
 	[(#DATE|nom_jour)] [(#DATE|affdate)]
+	[: (#DESCRIPTIF)] [&mdash; <em>(#TAGS)</em>]
 	</div>
 	<br />
 </BOUCLE_articles>
diff --git a/ecrire/inc_controle_forum.php b/ecrire/inc_controle_forum.php
index c98d530dbfc32145c0c1987d2ddac03e7949b28b..e7e5f37dd6353fd8227a2a8e31cc8a21f9b49fb8 100644
--- a/ecrire/inc_controle_forum.php
+++ b/ecrire/inc_controle_forum.php
@@ -114,7 +114,7 @@ function controle_un_forum($row, $rappel) {
 	$forum_id_breve = $row['id_breve'];
 	$forum_date_heure = $row['date_heure'];
 	$forum_titre = echapper_tags($row['titre']);
-	$forum_texte = echapper_tags($row['texte']);
+	$forum_texte = $row['texte'];
 	$forum_auteur = echapper_tags($row['auteur']);
 	$forum_email_auteur = echapper_tags($row['email_auteur']);
 	$forum_nom_site = echapper_tags($row['nom_site']);
@@ -152,17 +152,22 @@ function controle_un_forum($row, $rappel) {
 	  "</span>";
 	if ($forum_auteur) {
 		if ($forum_email_auteur)
-			$forum_auteur="<a href='mailto:$forum_email_auteur?SUBJECT=".rawurlencode($forum_titre)."'>$forum_auteur</A>";
-		$controle .= "<span class='arial2'> / <B>$forum_auteur</B></span>";
+			$forum_auteur="<a href='mailto:"
+			.htmlspecialchars($forum_email_auteur)
+			."?subject=".rawurlencode($forum_titre)."'>".$forum_auteur
+			."</A>";
+		$controle .= safehtml("<span class='arial2'> / <b>$forum_auteur</b></span>");
 	}
 
 	$controle .= boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur, "$type=$valeur", $forum_ip);
 
-	$controle .= "\n<br />$avant<B>$pref <A HREF='$url'>$titre</A></B>" .
-	  "<P align='justify'>".propre($forum_texte);
+	$suite = "\n<br />$avant<b>$pref
+	<a href='$url'>$titre</a></b>" . justifier(propre($forum_texte));
 
 	if (strlen($forum_url_site) > 10 AND strlen($forum_nom_site) > 3)
-		$controle .= "\n<div align='left' class='serif'><B><A HREF='$forum_url_site'>$forum_nom_site</A></B></div>";
+		$suite .= "\n<div align='left' class='serif'><B><A HREF='$forum_url_site'>$forum_nom_site</A></B></div>";
+
+	$controle .= safehtml($suite);
 
 	if (lire_meta("mots_cles_forums") == "oui") {
 		$query_mots = "SELECT * FROM spip_mots AS mots, spip_mots_forum AS lien WHERE lien.id_forum = '$id_forum' AND lien.id_mot = mots.id_mot";
diff --git a/ecrire/inc_filtres.php3 b/ecrire/inc_filtres.php3
index dc79218ed940bbd89e7563e7cb84e76a27a2a1a9..6b3b2385d263252083576bda5ad609b8c293e540 100644
--- a/ecrire/inc_filtres.php3
+++ b/ecrire/inc_filtres.php3
@@ -1443,4 +1443,21 @@ function email_valide($adresses) {
 	return $adresse;
 }
 
+// Filtrer les champs de tags (a developper)
+// Un champ de tags c'est un ensemble de mots separes par des espaces
+// On pourrait les envoyer vers les mots-cles correspondants dans la base,
+// ou vers les tags del.icio.us/flickr correspondants, etc...
+// ici essai avec del.icio.us
+function traiter_tags($tags) {
+	$tags = explode(' ', supprimer_tags($tags));
+	foreach($tags as $tag)
+		$l .= " <a href='http://del.icio.us/tag/$tag'>$tag</a>";
+	return trim($l);
+}
+
+// former un tag a parti d'un titre de mot-cle
+function former_tag($mot) {
+	return str_replace(' ', '_', trim(supprimer_tags(typo($mot))));
+}
+
 ?>
diff --git a/ecrire/inc_majbase.php3 b/ecrire/inc_majbase.php3
index 47e43f6b6b60f6a3453aa8e04112ee3be489d372..dabefa5d1be4c732840fb050490c85b470dbd89c 100644
--- a/ecrire/inc_majbase.php3
+++ b/ecrire/inc_majbase.php3
@@ -1063,6 +1063,17 @@ function maj_base() {
 		maj_version(1.901);
 	}
 
+	// Syndication : ajout de source, url_source, tags
+	if ($version_installee < 1.902) {
+		spip_query("ALTER TABLE spip_syndic_articles
+			ADD url_source TINYTEXT DEFAULT '' NOT NULL");
+		spip_query("ALTER TABLE spip_syndic_articles
+			ADD source TINYTEXT DEFAULT '' NOT NULL");
+		spip_query("ALTER TABLE spip_syndic_articles
+			ADD tags TEXT DEFAULT '' NOT NULL");
+		maj_version(1.902);
+	}
+
 	return true;
 }
 
diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3
index fd327becfb6a46fbeb8e235a978245cd7f4a29bf..c93002032d750811e6500bdaee90ef1e540a43a9 100644
--- a/ecrire/inc_presentation.php3
+++ b/ecrire/inc_presentation.php3
@@ -1768,7 +1768,7 @@ function afficher_forum($request, $adresse_retour, $controle_id_article = 0) {
 			if ($controle_id_article)
 				echo boutons_controle_forum($id_forum, $statut, $id_auteur, "id_article=$controle_id_article", $ip);
 
-			echo justifier(propre($texte));
+			echo safehtml(justifier(propre($texte)));
 
 			if (strlen($url_site) > 10 AND $nom_site) {
 				echo "<div align='left' class='verdana2'><b><a href='$url_site'>$nom_site</a></b></div>";
diff --git a/ecrire/inc_serialbase.php3 b/ecrire/inc_serialbase.php3
index cdf3dea87813b079f909890b1af092111c0cbc43..d62e5dbd24388d95d154814d3b5896cdc2a509dc 100644
--- a/ecrire/inc_serialbase.php3
+++ b/ecrire/inc_serialbase.php3
@@ -274,7 +274,10 @@ $spip_syndic_articles = array(
 		"maj"	=> "TIMESTAMP",
 		"statut"	=> "VARCHAR(10) NOT NULL",
 		"descriptif"	=> "blob NOT NULL",
-		"lang"	=> "VARCHAR(10) DEFAULT '' NOT NULL");
+		"lang"	=> "VARCHAR(10) DEFAULT '' NOT NULL",
+		"url_source" => "TINYTEXT DEFAULT '' NOT NULL",
+		"source" => "TINYTEXT DEFAULT '' NOT NULL",
+		"tags" => "TEXT DEFAULT '' NOT NULL");
 
 $spip_syndic_articles_key = array(
 		"PRIMARY KEY"	=> "id_syndic_article",
diff --git a/ecrire/inc_sites.php3 b/ecrire/inc_sites.php3
index 71a3a7a9c0095b32f3a6e5cae4fb733e7b334996..a4bb50885b937a4e940b14485864d331c2c61d29 100644
--- a/ecrire/inc_sites.php3
+++ b/ecrire/inc_sites.php3
@@ -476,13 +476,15 @@ function analyser_backend($rss) {
 		}
 	}
 
-	// chercher un auteur dans le fil au cas ou les entry n'en auraient pas
+	// chercher auteur/lang dans le fil au cas ou les items n'en auraient pas
 	list($channel_head) = preg_split($syndic_regexp['item'], $rss, 2);
 	if (ereg($syndic_regexp['author1'],$channel_head,$mat)) {
 		if (ereg($syndic_regexp['author2'],$mat[1],$match))
 			$les_auteurs_du_site = $match[1];
 	}
-
+	if (preg_match(',<((dc:|[^>]*xml:)lang(uage)?)>([^<>]+)</\1>,i',
+	$channel_head, $match))
+		$langue_du_site = $match[4];
 
 	$items = array();
 	if (preg_match_all($syndic_regexp['item'],$rss,$r, PREG_SET_ORDER))
@@ -573,6 +575,34 @@ function analyser_backend($rss) {
 		AND $lastbuilddate < time())
 			$data['lastbuilddate'] = $lastbuilddate;
 
+		// lang
+		if (preg_match(',<((dc:|[^>]*xml:)lang(uage)?)>([^<>]+)</\1>,i',
+			$item, $match))
+			$data['lang'] = trim($match[4]);
+		else
+			$data['lang'] = trim($langue_du_site);
+
+		// source et url_source  (pas trouve d'exemple en ligne !!)
+		# <source url="http://www.truc.net/music/uatsap.mp3" length="19917" />
+		# <source url="http://www.truc.net/rss">Site source</source>
+		if (preg_match(',(<source[^>]*>)(([^<>]+)</source>)?,i',
+		$item, $match)) {
+			$data['source'] = trim($match[3]);
+			include_ecrire('inc_filtres.php3');
+			$data['url_source'] = trim(extraire_attribut($match[1], 'url'));
+		}
+
+		// tags
+		# a partir de "<dc:subject>", (del.icio.us)
+		# ou <media:category> (flickr)
+		# ou <itunes:category> (apple)
+		if (preg_match_all(
+		',<([a-z]+:)?(subject|category|keywords)[^>]*>([^<>]+),i',
+		$item, $matches, PREG_SET_ORDER))
+			foreach ($matches as $match)
+				$data['tags'] .= ' '.trim($match[3]);
+		$data['tags'] = trim($data['tags']);
+
 		// Attraper les URLs des pieces jointes <enclosure>
 		if (preg_match_all(',<enclosure[[:space:]][^<>]+>,i', $item,
 		$preg_enclosures, PREG_SET_ORDER)) {
@@ -618,30 +648,29 @@ function inserer_article_syndique ($data, $now_id_syndic, $statut, $url_site, $r
 		$desc = couper(trim(textebrut($desc)), 300);
 	} else {
 		// mode "full syndication"
-		// 1. choisir le contenu pertinent
+		// choisir le contenu pertinent
+		// & refaire les liens relatifs
 		$desc = strlen($data['content']) ?
 			$data['content'] : $data['descriptif'];
-		// 2. refaire les liens relatifs
 		$desc = liens_absolus($desc, $le_lien);
-		// 3. securiser (XSS et XHTML)
-		$desc = safehtml($desc);
-		// 4. eviter propre()
-		if (strlen($desc)) $desc = "<html>$desc</html>";
 	}
 
-	// Mise a jour du contenu (titre,auteurs,description)
+	// Mettre a jour la date si lastbuilddate
+	$update_date = $data['lastbuilddate'] ?
+		"date = FROM_UNIXTIME(".$data['lastbuilddate'].")," : '';
+
+	// Mise a jour du contenu (titre,auteurs,description,date?,source...)
 	spip_query ("UPDATE spip_syndic_articles SET
 	titre='".addslashes($data['titre'])."',
+	".$update_date."
 	lesauteurs='".addslashes($data['lesauteurs'])."',
-	descriptif='".addslashes($desc)."'
+	descriptif='".addslashes($desc)."',
+	lang='".addslashes(substr($data['lang'],0,10))."',
+	source='".addslashes(substr($data['source'],0,255))."',
+	url_source='".addslashes(substr($data['url_source'],0,255))."',
+	tags='".addslashes($data['tags'])."'
 	WHERE id_syndic='$now_id_syndic' AND url='".addslashes($le_lien)."'");
 
-	// Mettre a jour la date si lastbuilddate
-	if ($data['lastbuilddate'])
-		spip_query("UPDATE spip_syndic_articles
-		SET date = FROM_UNIXTIME(".$data['lastbuilddate'].")
-		WHERE id_syndic='$now_id_syndic' AND url='".addslashes($le_lien)."'");
-
 	// Inserer les enclosures
 	if ($data['enclosures']) {
 		traiter_les_enclosures_rss($data['enclosures'],
@@ -923,7 +952,7 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false
 			$date=$row["date"];
 			$lesauteurs=typo($row["lesauteurs"]);
 			$statut=$row["statut"];
-			$descriptif=propre($row["descriptif"]);
+			$descriptif=safehtml($row["descriptif"]);
 
 			
 			if ($statut=='publie') {
@@ -966,7 +995,25 @@ function afficher_syndic_articles($titre_table, $requete, $afficher_site = false
 				}
 			}
 
-			if (strlen($descriptif) > 0) $s .= "<div class='arial1'>$descriptif</div>";
+			// descriptif
+			if (strlen($descriptif) > 0)
+				$s .= "<div class='arial1'>".safehtml($descriptif)."</div>";
+
+			// tags
+			if (strlen($row['tags']))
+				$s .= "<div style='float:$spip_lang_right;'><em>"
+					.traiter_tags($row['tags']) . '</em></div>';
+
+			// source
+			if (strlen($row['url_source']))
+				$s .= "<div style='float:$spip_lang_right;'>"
+				. propre("[".$row['source']."->".$row['url_source']."]")
+				. "</div>";
+			else if (strlen($row['source']))
+				$s .= "<div style='float:$spip_lang_right;'>"
+				. typo($row['source'])
+				. "</div>";
+
 			$vals[] = $s;
 
 			// $my_sites cache les resultats des requetes sur les sites
diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index 0d33a4cec16bb6bdfc0097dcb85076946b5bc45c..e936d8f37550ee54a28ebcda772d95d2476c1f10 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -379,7 +379,7 @@ define_once('_AUTH_USER_FILE', '.htpasswd');
 // (utilise pour les modifs de la base de donnees)
 
 // version de la base
-$spip_version = 1.901;
+$spip_version = 1.902;
 
 // version de spip
 $spip_version_affichee = "1.9 alpha";
diff --git a/ecrire/sites.php3 b/ecrire/sites.php3
index f8c83b31a3109227ba129304cebc4af60a775e00..bf8d61e0d35d4b09f6b6cd2d09f81b6e8c754b1d 100644
--- a/ecrire/sites.php3
+++ b/ecrire/sites.php3
@@ -360,8 +360,8 @@ if ($flag_administrable) {
 
 	echo "<select name='nouveau_statut' size=1 class='fondl'>\n";
 
-	echo my_sel("publie",_T('info_statut_site_2'),$statut);
 	echo my_sel("prop",_T('info_statut_site_3'),$statut);
+	echo my_sel("publie",_T('info_statut_site_2'),$statut);
 	echo my_sel("refuse",_T('info_statut_site_4'),$statut);
 
 	echo "</select>\n";
diff --git a/formulaires/inc-formulaire_forum.php3 b/formulaires/inc-formulaire_forum.php3
index e02d62e639b2c9ef4006c71bf47ba1b51c8bddb0..6c2b98465069e21031b239917fad45bfa4566663 100644
--- a/formulaires/inc-formulaire_forum.php3
+++ b/formulaires/inc-formulaire_forum.php3
@@ -168,13 +168,13 @@ function balise_FORMULAIRE_FORUM_dyn($titre, $table, $forums_publics, $id_rubriq
 					'formulaire_forum_previsu',
 					0,
 					array(
-						'titre' => interdire_scripts(typo($titre)),
-						'email_auteur' => $email_auteur,
-						'auteur' => interdire_scripts(typo($auteur)),
-						'texte' => propre($texte),
-						'url_site' => $url_site,
+						'titre' => safehtml(typo($titre)),
+						'email_auteur' => safehtml($email_auteur),
+						'auteur' => safehtml(typo($auteur)),
+						'texte' => safehtml(propre($texte)),
+						'url_site' => safehtml($url_site),
 						'nom_site_forum' =>
-							interdire_scripts(typo($nom_site_forum)),
+							safehtml(typo($nom_site_forum)),
 						'mots_forum' => $mots_forum,
 						'erreur' => $erreur,
 						'bouton' => $bouton
diff --git a/inc-compilo-api.php3 b/inc-compilo-api.php3
index 915ba21fbecd1f01571fe790edeba2d5cc342547..a789730a9b3a243b5b304d49d67e2310c6f4a254 100644
--- a/inc-compilo-api.php3
+++ b/inc-compilo-api.php3
@@ -263,14 +263,16 @@ $table_des_traitements['DATE_REDAC'][]= 'vider_date(%s)';
 $table_des_traitements['DESCRIPTIF'][]= 'traiter_raccourcis(%s)';
 $table_des_traitements['LIEN_TITRE'][]= 'typo(%s)';
 $table_des_traitements['LIEN_URL'][]= 'htmlspecialchars(vider_url(%s))';
-$table_des_traitements['MESSAGE'][]= 'traiter_raccourcis(%s)';
+$table_des_traitements['MESSAGE'][]= 'safehtml(traiter_raccourcis(%s))';
 $table_des_traitements['NOM_SITE_SPIP'][]= 'typo(%s)';
 $table_des_traitements['NOM_SITE'][]= 'typo(%s)';
 $table_des_traitements['NOM'][]= 'typo(%s)';
 $table_des_traitements['PARAMETRES_FORUM'][]= 'htmlspecialchars(lang_parametres_forum(%s))';
 $table_des_traitements['PS'][]= 'traiter_raccourcis(%s)';
+$table_des_traitements['SOURCE'][]= 'typo(%s)';
 $table_des_traitements['SOUSTITRE'][]= 'typo(%s)';
 $table_des_traitements['SURTITRE'][]= 'typo(%s)';
+$table_des_traitements['TAGS'][]= 'traiter_tags(%s)';
 $table_des_traitements['TEXTE'][]= 'traiter_raccourcis(%s)';
 $table_des_traitements['TITRE'][]= 'typo(%s)';
 $table_des_traitements['TYPE'][]= 'typo(%s)';
@@ -282,7 +284,21 @@ $table_des_traitements['URL_MOT'][]= 'htmlspecialchars(vider_url(%s))';
 $table_des_traitements['URL_RUBRIQUE'][]= 'htmlspecialchars(vider_url(%s))';
 $table_des_traitements['URL_SITE_SPIP'][]= 'htmlspecialchars(vider_url(%s))';
 $table_des_traitements['URL_SITE'][]= 'htmlspecialchars(calculer_url(%s))';
+$table_des_traitements['URL_SOURCE'][]= 'htmlspecialchars(vider_url(%s))';
 $table_des_traitements['URL_SYNDIC'][]= 'htmlspecialchars(vider_url(%s))';
 $table_des_traitements['ENV'][]= 'entites_html(%s)';
 
+
+// Securite supplementaire pour certaines tables
+
+// Articles syndiques : remplacer les filtres par safehtml()
+foreach(array('TITRE','DESCRIPTIF','SOURCE') as $balise)
+	if (!isset($table_des_traitements[$balise]['syndic_articles']))
+		$table_des_traitements[$balise]['syndic_articles'] = 'safehtml(%s)';
+
+// Forums : ajouter safehtml aux filtres existants
+foreach(array('TITRE','TEXTE','AUTEUR','EMAIL_AUTEUR','NOM_SITE') as $balise)
+	if (!isset($table_des_traitements[$balise]['forum']))
+		$table_des_traitements[$balise]['forum'] = 'safehtml(%s)';
+
 ?>