diff --git a/ecrire/inc/forum.php b/ecrire/inc/forum.php
index 41c9fdc9152e635a2efa356e50e0a1eea53c5b72..f6009c265823b26b635ac18f735ef32779cdcd8b 100644
--- a/ecrire/inc/forum.php
+++ b/ecrire/inc/forum.php
@@ -85,7 +85,7 @@ function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref
 	}
 
 	$link = new Link();
-	$link = str_replace('&', '&', _DIR_RESTREINT_ABS . $link->geturl() . "#id$id_forum");
+	$link = _DIR_RESTREINT_ABS . $link->geturl() . "#id$id_forum";
 
 	if ($supprimer)
 	  $controle .= icone(_T('icone_supprimer_message'), generer_action_auteur('instituer', "forum $id_forum $supprimer", $link),
@@ -99,7 +99,7 @@ function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref
 
 	if ($valider_repondre) {
 
-	  $controle .= icone(_T('icone_valider_message') . " & " .   _T('lien_repondre_message'), generer_action_auteur('instituer', "forum $id_forum $valider", generer_url_public('forum', "$ref&id_forum=$id_forum&retour=" . urlencode($link), true)),
+	  $controle .= icone(_T('icone_valider_message') . " & " .   _T('lien_repondre_message'), generer_action_auteur('instituer', "forum $id_forum $valider", generer_url_public('forum', "$ref&id_forum=$id_forum&retour=" . rawurlencode(str_replace('&', '&', $link)), true)),
 			     $logo,
 			     "creer.gif", 'right', 'non');
 	}
diff --git a/ecrire/inc/forum_insert.php b/ecrire/inc/forum_insert.php
index 18c90d85f870d6f8d856ed3dd566c6bab9ad892c..7e7ace9e014c7c0799709b97cd486f286f80c2db 100644
--- a/ecrire/inc/forum_insert.php
+++ b/ecrire/inc/forum_insert.php
@@ -130,7 +130,6 @@ function inc_forum_insert_dist() {
 	$alea = _request('alea');
 	$hash = _request('hash');
 	$auteur = _request('auteur');
-	$confirmer_forum = _request('confirmer_forum');
 	$email_auteur = _request('email_auteur');
 	$id_auteur = _request('id_auteur');
 	$nom_site_forum = _request('nom_site_forum');
@@ -155,11 +154,11 @@ function inc_forum_insert_dist() {
 		include_spip('inc/session');
 
 // Recalcule la signature faite dans formulaires/inc-formulaire-forum
-// en fonction des input du formulaire
+// en fonction des input POST du formulaire (gaffe a ce qui passe par l'URL)
 		$ids = array();
 
 		foreach (array('id_article', 'id_breve', 'id_forum', 'id_rubrique', 'id_syndic') as $o) {
-			$ids[$o] = ($x = intval($$o)) ? $x : '';
+			$ids[$o] = ($x = intval($_POST[$o])) ? $x : '';
 		}
 
 		if (!verifier_action_auteur('ajout_forum'.join(' ', $ids).' '.$alea,
@@ -255,11 +254,6 @@ function inc_forum_insert_dist() {
 	if ($GLOBALS['meta']["prevenir_auteurs"] == "oui" AND ($afficher_texte != "non"))
 		prevenir_auteurs($auteur, $email_auteur, $id_message, $id_article, $texte, $titre, $statut);
 
-	// Poser un cookie pour ne pas retaper le nom / email
-	include_spip('inc/cookie');
-	spip_setcookie('spip_forum_user',
-		       serialize(array('nom' => $auteur, 'email' => $email_auteur)));
-
 	if ($statut == 'publie') {
 	//
 	// INVALIDATION DES CACHES LIES AUX FORUMS
diff --git a/formulaires/inc-formulaire_forum.php b/formulaires/inc-formulaire_forum.php
index 3035452d9ec4d9b6d1cc4b14be81e5eca29df7c6..59dafec5ee88a12f8c9478117ec1db2e0fc9ab2b 100644
--- a/formulaires/inc-formulaire_forum.php
+++ b/formulaires/inc-formulaire_forum.php
@@ -82,12 +82,17 @@ $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic,
 $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 {
 	// verifier l'identite des posteurs pour les forums sur abo
-	if (($type == "abo") && (!$GLOBALS["auteur_session"])) {
-		return array('formulaire_login_forum', 0,
-			     array('inscription' => generer_url_public('spip_inscription'),
-				   'oubli' => generer_url_public('spip_pass')));
+	if ($type == "abo") {
+		if (!$GLOBALS["auteur_session"]) {
+			return array('formulaire_login_forum', 0,
+				array('inscription' => generer_url_public('spip_inscription'),
+					'oubli' => generer_url_public('spip_pass')));
+		} else {
+	  // forcer ces valeur
+		$auteur = $GLOBALS['auteur_session']['nom'];
+		$email_auteur = $GLOBALS['auteur_session']['email'];
+		}
 	}
-
 	// 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.
@@ -103,6 +108,7 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 		$ids[$o] = ($x = intval($$o)) ? $x : '';
 	}
 
+
 	// ne pas mettre '', sinon le squelette n'affichera rien.
 	$previsu = ' ';
 
@@ -118,16 +124,13 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 			// 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 = $url_param_retour;
-				$script = $retour_forum;
-			}
 		}
 		if (isset($_COOKIE['spip_forum_user'])
 		AND is_array($cookie_user = unserialize($_COOKIE['spip_forum_user']))) {
 			$auteur = $cookie_user['nom'];
 			$email_auteur = $cookie_user['email'];
+			$nom_site_forum = $cookie_user['nom_site_forum'];
+			$url_site = $cookie_user['url_site'];
 		} else {
 			$auteur = $GLOBALS['auteur_session']['nom'];
 			$email_auteur = $GLOBALS['auteur_session']['email'];
@@ -143,9 +146,6 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 		$nom_site_forum = _request('nom_site_forum');
 		$url_site = _request('url_site');
 
-		// cas du #FORMULAIRE_FORUM{#SELF} (??)
-		if ($retour_forum != "!") $script = $retour_forum;
-		
 		if ($afficher_texte != 'non') 
 			$previsu = inclure_previsu($texte, $titre, $email_auteur, $auteur, $url_site, $nom_site_forum, $ajouter_mot);
 
@@ -154,6 +154,19 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 		$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,
+				       'nom_site_forum' => $nom_site_forum,
+				       'url_site' => $url_site)));
+
+	// sauf si on a passe un parametre en argument (exemple : {#SELF})
+	if ($url_param_retour) {
+			$script = $url_param_retour;
+	}
+
 	// pour la chaine de hidden
 	$script_hidden = $script = str_replace('&', '&', $script);
 	foreach ($ids as $id => $v)