diff --git a/dist/article.html b/dist/article.html
index 641adf3a790df511c848bf399f3ba87a555db803..170684eb26bc55c55362a2626594e5ea1af52846 100644
--- a/dist/article.html
+++ b/dist/article.html
@@ -250,7 +250,7 @@
 
 <!-- Forums -->
 
-[<div class="forum-repondre"><B><A  HREF="forum.php3?(#PARAMETRES_FORUM)"><:repondre_article:></A></B></div>]
+[<div class="forum-repondre"><B><A  HREF="forum.php3?(#PARAMETRES_FORUM*)"><:repondre_article:></A></B></div>]
 <br />
 
 <B_forums>
@@ -271,7 +271,7 @@
 <div class="forum-item">
 #TEXTE
 [<div class="forum-titre"><a href="(#URL_SITE)" class="spip_out">#NOM_SITE</a></div>]
-[<div class="forum-repondre-message"><a href="forum.php3?(#PARAMETRES_FORUM)"><:repondre_message:></a></div>]
+[<div class="forum-repondre-message"><a href="forum.php3?(#PARAMETRES_FORUM*)"><:repondre_message:></a></div>]
 </div>
 </div>
 
@@ -288,7 +288,7 @@
 	<div class="forum-item">
 	#TEXTE
 	[<div class="forum-titre"><a href="(#URL_SITE)" class="spip_out">#NOM_SITE</a></div>]
-	[<div class="forum-repondre-message"><a href="forum.php3?(#PARAMETRES_FORUM)"><:repondre_message:></a></div>]
+	[<div class="forum-repondre-message"><a href="forum.php3?(#PARAMETRES_FORUM*)"><:repondre_message:></a></div>]
 	</div>
 
 	</div>
diff --git a/dist/breve.html b/dist/breve.html
index e42739a6d1bd14d6157f9489dd93713f92a616f8..6607aad70fb2ea87ec9678faebb7e6d03dceb8d3 100644
--- a/dist/breve.html
+++ b/dist/breve.html
@@ -156,7 +156,7 @@
 
 <!-- Forums -->
 
-[<div class="forum-repondre"><B><A  HREF="forum.php3?(#PARAMETRES_FORUM)"><:repondre_breve:></A></B></div>]
+[<div class="forum-repondre"><B><A  HREF="forum.php3?(#PARAMETRES_FORUM*)"><:repondre_breve:></A></B></div>]
 <br />
 
 <h1 class="structure"><:forum:></h1>
@@ -177,7 +177,7 @@
 <div class="forum-item">
 #TEXTE
 [<div class="forum-titre"><a href="(#URL_SITE)" class="spip_out">#NOM_SITE</a></div>]
-[<div class="forum-repondre-message"><a href="forum.php3?(#PARAMETRES_FORUM)"><:repondre_message:></a></div>]
+[<div class="forum-repondre-message"><a href="forum.php3?(#PARAMETRES_FORUM*)"><:repondre_message:></a></div>]
 </div>
 </div>
 
@@ -195,7 +195,7 @@
 	<div class="forum-item">
 	#TEXTE
 	[<div class="forum-titre"><a href="(#URL_SITE)" class="spip_out">#NOM_SITE</a></div>]
-	[<div class="forum-repondre-message"><a href="forum.php3?(#PARAMETRES_FORUM)"><:repondre_message:></a></div>]
+	[<div class="forum-repondre-message"><a href="forum.php3?(#PARAMETRES_FORUM*)"><:repondre_message:></a></div>]
 	</div>
 
 	</div>
diff --git a/ecrire/inc_forum.php3 b/ecrire/inc_forum.php3
index e6c2cf5afc4d52224a41adaf5a9d14c0768d6d6b..8a81ed483cb08f28cb723a880ae6cbaa931e5e27 100644
--- a/ecrire/inc_forum.php3
+++ b/ecrire/inc_forum.php3
@@ -216,5 +216,41 @@ function calculer_threads() {
 	} while ($discussion != "0");
 }
 
+// Calculs des URLs des forums (pour l'espace public)
+function racine_forum($id_forum){
+	if (!$id_forum = intval($id_forum)) return;
+	$query = "SELECT id_parent, id_rubrique, id_article, id_breve FROM spip_forum WHERE id_forum=".$id_forum;
+	$result = spip_query($query);
+	if($row = spip_fetch_array($result)){
+		if($row['id_parent']) {
+			return racine_forum($row['id_parent']);
+		}
+		else {
+			if($row['id_rubrique']) return array('rubrique',$row['id_rubrique'], $id_forum);
+ 			if($row['id_article']) return array('article',$row['id_article'], $id_forum);
+			if($row['id_breve']) return array('breve',$row['id_breve'], $id_forum);
+		}
+	}
+} 
+
+function generer_url_forum_dist($id_forum, $show_thread=false) {
+	list($type, $id, $id_thread) = racine_forum($id_forum);
+	if ($id_thread>0 AND $show_thread)
+		$id_forum = $id_thread;
+	switch($type) {
+		case 'article':
+			return generer_url_article($id)."#forum$id_forum";
+			break;
+		case 'breve':
+			return generer_url_breve($id)."#forum$id_forum";
+			break;
+		case 'rubrique':
+			return generer_url_rubrique($id)."#forum$id_forum";
+			break;
+		default:
+			return "forum.php3?id_forum=".$id_forum;
+	}
+}
+
 
 ?>
diff --git a/formulaires/inc-formulaire_forum.php3 b/formulaires/inc-formulaire_forum.php3
index b780d483fe569eec5f4a59206c1cca345b61c54c..2ff24afda18859915bf37525f4811b3557b08b14 100644
--- a/formulaires/inc-formulaire_forum.php3
+++ b/formulaires/inc-formulaire_forum.php3
@@ -91,16 +91,16 @@ function balise_FORMULAIRE_FORUM_dyn($titre, $table, $forums_publics, $id_rubriq
 	$previsu = ' ';
 
 	// au premier appel (pas de Post-var nommee "retour_forum")
-	// memoriser l'URL courante pour y revenir apres envoi du message
-	// aux appels suivants, reconduire la valeur.
+	// memoriser evntuellement l'URL de retour pour y revenir apres
+	// envoi du message ; aux appels suivants, reconduire la valeur.
 	// Initialiser aussi l'auteur
-
 	if (!$retour_forum = rawurldecode(_request('retour_forum'))) {
 		if ($retour_forum = rawurldecode(_request('retour')))
 			$retour_forum = str_replace('&var_mode=recalcul','',$retour_forum);
 		else {
-			$retour_forum = new Link();
-			$retour_forum = $retour_forum->getUrl();
+			// par defaut, on veut prendre url_forum(), mais elle ne sera connue
+			// qu'en sortie, on inscrit donc une valeur absurde ("!")
+			$retour_forum = "!";
 		}
 
 		if (isset($_COOKIE['spip_forum_user'])
diff --git a/inc-balises.php3 b/inc-balises.php3
index 9b84f977b9ee03cc27e21e5ea15d8c3530bdad3b..d6d09d299d5762bc04b4ec3831bbfe8c6e4e3d59 100644
--- a/inc-balises.php3
+++ b/inc-balises.php3
@@ -686,7 +686,9 @@ function balise_PARAMETRES_FORUM_dist($p) {
 	}
 
 	$c .= '.
-	"&retour=".rawurlencode($lien=_request("retour") ? $lien : nettoyer_uri())';
+	(($lien = (_request("retour") ? _request("retour") : ('.
+		($p->etoile ? "''" : 'nettoyer_uri()')
+	.'))) ? "&retour=".rawurlencode($lien) : "")';
 
 	$p->code .= code_invalideur_forums($p, "(".$c.")");
 
diff --git a/inc-messforum.php3 b/inc-messforum.php3
index 332174ff5a3242be4c3d0316880712203fb68c96..c22884e3caa16493a638c397da6ff1f274dd4dfe 100644
--- a/inc-messforum.php3
+++ b/inc-messforum.php3
@@ -120,11 +120,19 @@ function mots_du_forum($ajouter_mot, $id_message)
 
 function enregistre_forum() {
 	global $REMOTE_ADDR, $auteur_session,
-	  $afficher_texte, $ajouter_mot, $alea, $hash,
-	  $auteur, $confirmer_forum, $email_auteur, $id_auteur,
-	  $nom_site_forum, $retour_forum, $texte, $titre, $url_site;
+		$afficher_texte, $ajouter_mot, $alea, $hash,
+		$auteur, $confirmer_forum, $email_auteur, $id_auteur,
+		$nom_site_forum, $retour_forum, $texte, $titre, $url_site;
+
 	$retour_forum = rawurldecode($retour_forum);
 
+	# retour a calculer (cf. inc-formulaire_forum)
+	if ($retour_forum == '!') {
+		$retour_forum = new Link();
+		$retour_forum = $retour_forum->getUrl(); # en cas d'echec du post
+		$calculer_retour = true;
+	}
+
 	// Recuperer les donnees postees du formulaire ou stocker '0'
 	foreach (array('id_article', 'id_breve', 'id_syndic',
 	'id_rubrique', 'id_forum') as $id)
@@ -181,7 +189,8 @@ function enregistre_forum() {
 	$statut = ($statut == 'non') ? 'off' : (($statut == 'pri') ? 'prop' :
 						'publie');
 
-	spip_query("UPDATE spip_forum SET id_parent = $id_forum,
+	spip_query("UPDATE spip_forum
+	SET id_parent = $id_forum,
 	id_rubrique = $id_rubrique,
 	id_article = $id_article,
 	id_breve = $id_breve,
@@ -200,7 +209,19 @@ function enregistre_forum() {
 	WHERE id_forum = $id_message
 	");
 
-	// calculer_threads();
+	// Le cas echeant, calculer le retour
+	if ($calculer_retour) {
+		// Gestionnaire d'URLs
+		if (@file_exists("inc-urls.php3"))
+			include_local("inc-urls.php3");
+		else
+			include_local("inc-urls-".$GLOBALS['type_urls'].".php3");
+
+		if ($statut == 'publie')
+			$retour_forum = generer_url_forum($id_message);
+		else
+			$retour_forum = generer_url_forum($id_parent);
+	}
 
 	// Entrer les mots-cles associes
 	if (is_array($ajouter_mot)) mots_du_forum($ajouter_mot, $id_message);
diff --git a/inc-urls-html.php3 b/inc-urls-html.php3
index 99e89265449972752fc08ce19ccf76fdeeb33cb6..147b4a41c9c8ff52218f3d474f38c08ea1a7f90b 100644
--- a/inc-urls-html.php3
+++ b/inc-urls-html.php3
@@ -55,40 +55,9 @@ function recuperer_parametres_url($fond, $url) {
 // URLs des forums
 //
 
-// a mettre dans ecrire/inc_threads.php3 avec les autres trucs de forum
-function racine_forum($id_forum){
-	if (!$id_forum = intval($id_forum)) return;
-	$query = "SELECT id_parent, id_rubrique, id_article, id_breve FROM spip_forum WHERE id_forum=".$id_forum;
-	$result = spip_query($query);
-	if($row = spip_fetch_array($result)){
-		if($row['id_parent']) {
-			return racine_forum($row['id_parent']);
-		}
-		else {
-			if($row['id_rubrique']) return array('rubrique',$row['id_rubrique'], $id_forum);
- 			if($row['id_article']) return array('article',$row['id_article'], $id_forum);
-			if($row['id_breve']) return array('breve',$row['id_breve'], $id_forum);
-		}
-	}
-} 
-
 function generer_url_forum($id_forum, $show_thread=false) {
-	list($type, $id, $id_thread) = racine_forum($id_forum);
-	if ($id_thread>0 AND $show_thread)
-		$id_forum = $id_thread;
-	switch($type) {
-		case 'article':
-			return generer_url_article($id)."#forum$id_forum";
-			break;
-		case 'breve':
-			return generer_url_breve($id)."#forum$id_forum";
-			break;
-		case 'rubrique':
-			return generer_url_rubrique($id)."#forum$id_forum";
-			break;
-		default:
-			return "forum$id_forum.html";
-	}
+	include_ecrire('inc_forum.php3');
+	return generer_url_forum_dist($id_forum, $show_thread);
 }
 
 ?>
diff --git a/inc-urls-propres.php3 b/inc-urls-propres.php3
index 19062a03a492ad74449675d5b8dd33b97c83880a..88b494a45302482dc7b57a7d07ad2a0d1abfc566 100644
--- a/inc-urls-propres.php3
+++ b/inc-urls-propres.php3
@@ -99,8 +99,9 @@ function generer_url_breve($id_breve) {
 	return $url;
 }
 
-function generer_url_forum($id_forum) {
-	return "forum.php3?id_forum=$id_forum";
+function generer_url_forum($id_forum, $show_thread=false) {
+	include_ecrire('inc_forum.php3');
+	return generer_url_forum_dist($id_forum, $show_thread);
 }
 
 function generer_url_mot($id_mot) {
diff --git a/inc-urls-standard.php3 b/inc-urls-standard.php3
index 4b312f92fb22f1821f72dcc5736344129e590fca..1540d032a177423edf5bbb86546702e4e97ff1fa 100644
--- a/inc-urls-standard.php3
+++ b/inc-urls-standard.php3
@@ -54,40 +54,9 @@ function recuperer_parametres_url($fond, $url) {
 // URLs des forums
 //
 
-// a mettre dans ecrire/inc_threads.php3 avec les autres trucs de forum
-function racine_forum($id_forum){
-	if (!$id_forum = intval($id_forum)) return;
-	$query = "SELECT id_parent, id_rubrique, id_article, id_breve FROM spip_forum WHERE id_forum=".$id_forum;
-	$result = spip_query($query);
-	if($row = spip_fetch_array($result)){
-		if($row['id_parent']) {
-			return racine_forum($row['id_parent']);
-		}
-		else {
-			if($row['id_rubrique']) return array('rubrique',$row['id_rubrique'], $id_forum);
- 			if($row['id_article']) return array('article',$row['id_article'], $id_forum);
-			if($row['id_breve']) return array('breve',$row['id_breve'], $id_forum);
-		}
-	}
-} 
-
 function generer_url_forum($id_forum, $show_thread=false) {
-	list($type, $id, $id_thread) = racine_forum($id_forum);
-	if ($id_thread>0 AND $show_thread)
-		$id_forum = $id_thread;
-	switch($type) {
-		case 'article':
-			return generer_url_article($id)."#forum$id_forum";
-			break;
-		case 'breve':
-			return generer_url_breve($id)."#forum$id_forum";
-			break;
-		case 'rubrique':
-			return generer_url_rubrique($id)."#forum$id_forum";
-			break;
-		default:
-			return "forum.php3?id_forum=".$id_forum;
-	}
+	include_ecrire('inc_forum.php3');
+	return generer_url_forum_dist($id_forum, $show_thread);
 }
 
 ?>