diff --git a/ecrire/balise/formulaire_forum.php b/ecrire/balise/formulaire_forum.php
index e8c6c869e0a59c5ee7481c482f30503f4ffded92..6020d84bd9f5731a1f476db281e19054fa52b0fb 100644
--- a/ecrire/balise/formulaire_forum.php
+++ b/ecrire/balise/formulaire_forum.php
@@ -98,7 +98,7 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 	}
 	// Tableau des valeurs servant au calcul d'une signature de securite.
 	// Elles seront placees en Input Hidden pour que inc/forum_insert
-	// recalcule la meme chose et verifie l'identité des resultats.
+	// recalcule la meme chose et verifie l'identite des resultats.
 	// Donc ne pas changer la valeur de ce tableau entre le calcul de
 	// la signature et la fabrication des Hidden
 	// Faire attention aussi a 0 != ''
@@ -116,7 +116,7 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 	$previsu = ' ';
 
 	// au premier appel (pas de Post-var nommee "retour_forum")
-	// memoriser evntuellement l'URL de retour pour y revenir apres
+	// memoriser eventuellement 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'))) {
@@ -126,7 +126,9 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 			// par defaut, on veut prendre url_forum(), mais elle ne sera connue
 			// qu'en sortie, on inscrit donc une valeur absurde ("!")
 			$retour_forum = "!";
-			
+			// sauf si on a passe un parametre en argument (exemple : {#SELF})
+			if ($url_param_retour)
+				$retour_forum = str_replace('&', '&', $url_param_retour);
 		}
 		if (isset($_COOKIE['spip_forum_user'])
 		AND is_array($cookie_user = unserialize($_COOKIE['spip_forum_user']))) {
@@ -156,17 +158,12 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 
 		include_spip('inc/actions');
 		$hash = calculer_action_auteur('ajout_forum'.join(' ', $ids).' '.$alea);
-	}
-
-	// Poser un cookie pour ne pas retaper les infos invariables
-	include_spip('inc/cookie');
-	spip_setcookie('spip_forum_user',
-		       serialize(array('nom' => $auteur, 
-				       'email' => $email_auteur)));
 
-	// sauf si on a passe un parametre en argument (exemple : {#SELF})
-	if ($url_param_retour) {
-			$script = $url_param_retour;
+		// Poser un cookie pour ne pas retaper les infos invariables
+		include_spip('inc/cookie');
+		spip_setcookie('spip_forum_user',
+			serialize(array('nom' => $auteur,
+				'email' => $email_auteur)));
 	}
 
 	// pour la chaine de hidden
diff --git a/ecrire/inc/forum_insert.php b/ecrire/inc/forum_insert.php
index 1c1fd92685df333ada9424194001d1615ab5f5a2..52381a4bc416e5da11259f8289e1daa457281902 100644
--- a/ecrire/inc/forum_insert.php
+++ b/ecrire/inc/forum_insert.php
@@ -252,10 +252,10 @@ function inc_forum_insert_dist() {
 	// Entrer les mots-cles associes
 	if (is_array($ajouter_mot)) mots_du_forum($ajouter_mot, $id_message);
 
-	if ($statut == 'publie') {
 	//
 	// INVALIDATION DES CACHES LIES AUX FORUMS
 	//
+	if ($statut == 'publie') {
 		include_spip('inc/invalideur');
 		suivre_invalideur ("id='id_forum/" .
 			calcul_index_forum($id_article,
@@ -271,7 +271,12 @@ function inc_forum_insert_dist() {
 			prevenir_auteurs($auteur, $email_auteur, $id_message, $id_article, $texte, $titre, $statut);
 	}
 
-	if (!$calculer_retour) 	return $retour_forum;
+	// En cas de retour sur (par exemple) {#SELF}, on ajoute quand
+	// meme #forum12 a la fin de l'url, sauf si un #ancre est explicite
+	if (!$calculer_retour)
+		return strstr('#', $retour_forum) ?
+			$retour_forum
+			: $retour_forum.'#forum'.$id_message;
 
 	// le retour automatique envoie sur le thread, ce qui permet
 	// de traiter elegamment le cas des forums moderes a priori.
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index ae114bb7ea2991c1040880f8c877de1d75b41238..63f879fe2d8e241d53da5975c0c2b5ebbc8179b4 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -30,7 +30,6 @@ function public_assembler_dist($fond) {
 	}
 
 	// Si envoi pour un forum, enregistrer puis rediriger
-
 	if (isset($_POST['confirmer_forum'])
 	OR (isset($_POST['ajouter_mot']) AND $GLOBALS['afficher_texte']=='non')) {
 		$f = charger_fonction('forum_insert', 'inc');
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 2d310f4aef77c9b75e068dbb394f0a318d2d03a3..67b3031200355d6352eb6a22def9d11c8167d1f5 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -850,7 +850,7 @@ function balise_PARAMETRES_FORUM_dist($p) {
 
 	// Attention un eventuel &retour=xxx dans l'URL est prioritaire
 	$c .= '.
-	(($lien = (_request("retour") ? _request("retour") : '.$retour.')) ? "&retour=".rawurlencode($lien) : "")';
+	(($lien = (_request("retour") ? _request("retour") : str_replace("&", "&", '.$retour.'))) ? "&retour=".rawurlencode($lien) : "")';
 
 	$p->code .= code_invalideur_forums($p, "(".$c.")");