diff --git a/ecrire/action/instituer_forum.php b/ecrire/action/instituer_forum.php
index bd65e6f95405c2c90cb2187b6d30d6713b218736..ebd2a5e29478cb999f923f5862c9131c554bc0da 100644
--- a/ecrire/action/instituer_forum.php
+++ b/ecrire/action/instituer_forum.php
@@ -52,6 +52,13 @@ function action_instituer_forum_dist() {
 		include_spip('inc/indexation');
 		marquer_indexer ('spip_forum', $id_parent);
 	}
+
+	// Notifier de la publication du message, s'il etait 'prop'
+	if ($old=='prop' AND $statut=='publie') {
+		if ($notifications = charger_fonction('notifications', 'inc')) {
+			$notifications('forumvalide', $id_forum);
+		}
+	}
 }
 
 ?>
diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php
index 72f444e8e36642a09258e6bf52c2269f07f094dd..c4600629099d8014449137376171b6f5e6cc3d03 100644
--- a/ecrire/inc/autoriser.php
+++ b/ecrire/inc/autoriser.php
@@ -43,13 +43,11 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
 	static $restreint = array();
 
 	// Qui ? auteur_session ?
-	if (!is_array($qui)) {
-		if (is_int($qui)) {
-			$qui = spip_fetch_array(spip_query(
-			"SELECT * FROM spip_auteurs WHERE id_auteur=".$qui));
-		} else {
-			$qui = $GLOBALS['auteur_session'];
-		}
+	if ($qui === NULL)
+		$qui = $GLOBALS['auteur_session'];
+	elseif (!is_array($qui)) {
+		$qui = spip_fetch_array(spip_query(
+		"SELECT * FROM spip_auteurs WHERE id_auteur=".$qui));
 	}
 
 	// Admins restreints, les verifier ici (pas generique mais...)
@@ -65,7 +63,7 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
 		$qui['restreint'] = $restreint[$qui['id_auteur']];
 	}
 
-	if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id ?");
+	if (_DEBUG_AUTORISER) spip_log("autoriser $faire $type $id ($qui[nom]) ?");
 
 	// Chercher une fonction d'autorisation explicite
 	if (
@@ -99,7 +97,7 @@ function autoriser_dist($faire, $type='', $id=0, $qui = NULL, $opt = NULL) {
 	)
 		$a = $f($faire,$type,intval($id),$qui,$opt);
 
-	if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id): ".($a?'OK':'niet'));
+	if (_DEBUG_AUTORISER) spip_log("$f($faire,$type,$id,$qui[nom]): ".($a?'OK':'niet'));
 
 	return $a;
 }
diff --git a/ecrire/inc/notifications.php b/ecrire/inc/notifications.php
index 24f595963c2db0a0f765ccdefd2b16f262c3c59b..a42d479ef2c917f0d19d7f521cfb62cafc2ade84 100644
--- a/ecrire/inc/notifications.php
+++ b/ecrire/inc/notifications.php
@@ -151,7 +151,7 @@ function notifier_proposition_article($id_article) {
 // http://doc.spip.org/@email_notification_forum
 function email_notification_forum ($t, $email) {
 
-	// Rechercher la langue du destinataire
+	// Rechercher eventuellement la langue du destinataire
 	if ($l = spip_fetch_array(spip_query("SELECT lang FROM spip_auteurs WHERE email=" . _q($email))))
 		lang_select($l['lang']);
 
@@ -165,28 +165,36 @@ function email_notification_forum ($t, $email) {
 	else {
 		spip_log('inc-urls personnalise : ajoutez generer_url_forum() !');
 		if ($t['id_article'])
-			$url = generer_url_article($t['id_article']);
+			$url = generer_url_article($t['id_article']).'#'.$t['id_forum'];
 		else
 			$url = './';
 	}
 
+	if ($t['id_article']) {
+		$article = spip_fetch_array(spip_query("SELECT titre FROM spip_articles WHERE id_article="._q($t['id_article'])));
+		$titre = textebrut(typo($article['titre']));
+	}
+
 	$sujet = "[" .
 	  entites_html(textebrut(typo($GLOBALS['meta']["nom_site"]))) .
 	  "] ["._T('forum_forum')."] ".typo($t['titre']);
 
 	$parauteur = (strlen($t['auteur']) <= 2) ? '' :
-	  (" " ._T('forum_par_auteur', array('auteur' => $t['auteur'])) . 
+	  (" " ._T('forum_par_auteur', array(
+	  	'auteur' => $t['auteur'])
+	  ) . 
 	   ($t['email_auteur'] ? ' <' . $t['email_auteur'] . '>' : ''));
 
+	// TODO: squelettiser
 	$corps = _T('form_forum_message_auto') .
 		"\n\n" .
-		_T('forum_poste_par', array('parauteur' => $parauteur)).
-		"\n"
-		. _T('forum_ne_repondez_pas')
-		. "\n"
+		_T('forum_poste_par', array('parauteur' => $parauteur,
+	  	'titre' => $titre)).
+		"\n\n"
+		. (($t['statut'] == 'publie') ? _T('forum_ne_repondez_pas')."\n" : '')
 		. url_absolue($url)
-		. "\n\n\n".textebrut(typo($t['titre']))
-		."\n\n".textebrut(propre($t['texte']))
+		. "\n\n\n** ".textebrut(typo($t['titre']))
+		."\n\n* ".textebrut(propre($t['texte']))
 		. "\n\n".$t['nom_site']."\n".$t['url_site']."\n";
 
 	if ($l)
@@ -195,8 +203,12 @@ function email_notification_forum ($t, $email) {
 	return array('subject' => $sujet, 'body' => $corps);
 }
 
-// http://doc.spip.org/@notifications_forumposte_dist
-function notifications_forumposte_dist($quoi, $id_forum) {
+
+// cette notification s'execute quand on valide un message 'prop'ose,
+// dans ecrire/inc/forum_insert.php ; ici on va notifier ceux qui ne l'ont
+// pas ete a la notification forumposte (sachant que les deux peuvent se
+// suivre si le forum est valide directement ('pos' ou 'abo')
+function notifications_forumvalide_dist($quoi, $id_forum) {
 	$s = spip_query("SELECT * FROM spip_forum WHERE id_forum="._q($id_forum));
 	if (!$t = spip_fetch_array($s))
 		return;
@@ -204,31 +216,39 @@ function notifications_forumposte_dist($quoi, $id_forum) {
 	include_spip('inc/texte');
 	include_spip('inc/filtres');
 	include_spip('inc/mail');
+	include_spip('inc/autoriser');
 
 
 	// Qui va-t-on prevenir ?
 	$tous = array();
+	$pasmoi = array();
+
+	// 1. Les auteurs de l'article ; si c'est un article, ceux qui n'ont
+	// pas le droit de le moderer (les autres l'ont recu plus tot)
+	if ($t['id_article']
+	AND $GLOBALS['meta']['prevenir_auteurs'] == 'oui') {
+		$result = spip_query("SELECT auteurs.* FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE lien.id_article="._q($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur");
 
-	// 1. Les auteurs de l'article ?
-	if ($GLOBALS['meta']['prevenir_auteurs'] == 'oui') {
-		$result = spip_query("SELECT auteurs.email FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE lien.id_article="._q($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur");
+		while ($qui = spip_fetch_array($result)) {
+			if (!autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur']))
+				$tous[] = $qui['email'];
+			else
+				$pasmoi[] = $qui['email'];
 
-		while ($r = spip_fetch_array($result))
-			$tous[] = $r['email'];
+		}
 	}
 
-	// 2. Tous les participants a ce *thread* (desactive pour l'instant,
-	// et ne fonctionne que pour les forums moderes a posteriori)
+	// 2. Tous les participants a ce *thread* (desactive pour l'instant)
 	// TODO: proposer une case a cocher ou un lien dans le message
 	// pour se retirer d'un troll (hack: replacer @ par % dans l'email)
 	if (defined('_SUIVI_FORUM_THREAD')
-	AND _SUIVI_FORUM_THREAD
-	AND $t['statut'] == 'publie') {
+	AND _SUIVI_FORUM_THREAD) {
 		$s = spip_query("SELECT DISTINCT(email_auteur) FROM spip_forum WHERE id_thread=".$t['id_thread']." AND email_auteur != ''");
 		while ($r = spip_fetch_array($s))
 			$tous[] = $r['email_auteur'];
 	}
 
+
 	// 3. Tous les auteurs des messages qui precedent (desactive egalement)
 	// (possibilite exclusive de la possibilite precedente)
 	// TODO: est-ce utile, par rapport au thread ?
@@ -242,7 +262,57 @@ function notifications_forumposte_dist($quoi, $id_forum) {
 		}
 	}
 
-	// 4. Les moderateurs definis par mes_options
+	// Nettoyer le tableau
+	// Ne pas ecrire au posteur du message, ni au moderateur qui active le mail,
+	// ni aux auteurs deja notifies precedemment
+	$destinataires = array();
+	foreach ($tous as $m) {
+		if ($m = email_valide($m)
+		AND $m != trim($t['email_auteur'])
+		AND $m != $GLOBALS['auteur_session']['email']
+		AND !in_array($m, $pasmoi))
+			$destinataires[$m]++;
+	}
+
+	//
+	// Envoyer les emails
+	//
+	foreach (array_keys($destinataires) as $email) {
+		$msg = email_notification_forum($t, $email);
+		envoyer_mail($email, $msg['subject'], $msg['body']);
+	}
+}
+
+
+// http://doc.spip.org/@notifications_forumposte_dist
+function notifications_forumposte_dist($quoi, $id_forum) {
+	$s = spip_query("SELECT * FROM spip_forum WHERE id_forum="._q($id_forum));
+	if (!$t = spip_fetch_array($s))
+		return;
+
+	include_spip('inc/texte');
+	include_spip('inc/filtres');
+	include_spip('inc/mail');
+	include_spip('inc/autoriser');
+
+
+	// Qui va-t-on prevenir ?
+	$tous = array();
+
+	// 1. Les auteurs de l'article (si c'est un article), mais
+	// seulement s'ils ont le droit de le moderer (les autres seront
+	// avertis par la notifications_forumvalide).
+	if ($t['id_article']
+	AND $GLOBALS['meta']['prevenir_auteurs'] == 'oui') {
+		$result = spip_query("SELECT auteurs.* FROM spip_auteurs AS auteurs, spip_auteurs_articles AS lien WHERE lien.id_article="._q($t['id_article'])." AND auteurs.id_auteur=lien.id_auteur");
+
+		while ($qui = spip_fetch_array($result)) {
+			if (autoriser('modererforum', 'article', $t['id_article'], $qui['id_auteur']))
+				$tous[] = $qui['email'];
+		}
+	}
+
+	// 2. Les moderateurs definis par mes_options
 	// TODO: a passer en meta
 	// define('_MODERATEURS_FORUM', 'email1,email2,email3');
 	if (defined('_MODERATEURS_FORUM'))
@@ -263,12 +333,16 @@ function notifications_forumposte_dist($quoi, $id_forum) {
 	//
 	// Envoyer les emails
 	//
-	// TODO: changer le corps selon le statut (auteur de l'article, moderateur, etc)
 	foreach (array_keys($destinataires) as $email) {
 		$msg = email_notification_forum($t, $email);
 		envoyer_mail($email, $msg['subject'], $msg['body']);
 	}
 
+	// Notifier les autres si le forum est valide
+	if ($t['statut'] == 'publie') {
+		$notifications = charger_fonction('notifications', 'inc');
+		$notifications('forumvalide', $id_forum);
+	}
 }
 
 ?>