diff --git a/ecrire/public-messforum.php b/ecrire/public-messforum.php
index f3486008a52a5d3dadfe24e85cc505032e5603ac..20460efb2763cd24bed9ff75b3d6f57678854bc6 100644
--- a/ecrire/public-messforum.php
+++ b/ecrire/public-messforum.php
@@ -135,9 +135,33 @@ function enregistre_forum() {
 	}
 
 	// initialisation de l'eventuel visiteur connecte
-	if (!$id_auteur)
+	if (!($id_auteur = intval($id_auteur)))
 	$id_auteur = intval($auteur_session['id_auteur']);
 
+	// Verifier hash securite pour les forums avec previsu
+	if ($GLOBALS['afficher_texte'] <> 'non') {
+		include_ecrire("inc_session");
+		if (!verifier_action_auteur("ajout_forum $id_rubrique".
+		" $id_forum $id_article $id_breve".
+		" $id_syndic $alea", $hash)) {
+			spip_log('erreur hash forum');
+			die (_T('forum_titre_erreur')); 	# echec du POST
+		}
+
+		// verifier fichier lock
+		$alea = preg_replace('/[^0-9]/', '', $alea);
+		if (!file_exists($file = _DIR_SESSIONS."forum_$alea.lck"))
+			return $retour_forum; # echec silencieux du POST
+	}
+
+	// securite
+
+	$id_article = intval($id_article);
+	$id_breve = intval($id_breve);
+	$id_forum = intval($id_forum);
+	$id_rubrique = intval($id_rubrique);
+	$id_syndic = intval($id_syndic);
+
 	$statut = controler_forum($id_article, $retour_forum);
 
 	// Ne pas autoriser de changement de nom si forum sur abonnement
@@ -155,21 +179,8 @@ function enregistre_forum() {
 		exit;
 	}
 
-	// Verifier hash securite pour les forums avec previsu
 	if ($GLOBALS['afficher_texte'] <> 'non') {
-		include_ecrire("inc_session");
-		if (!verifier_action_auteur("ajout_forum $id_rubrique".
-		" $id_forum $id_article $id_breve".
-		" $id_syndic $alea", $hash)) {
-			spip_log('erreur hash forum');
-			die (_T('forum_titre_erreur')); 	# echec du POST
-		}
-
-		// verifier fichier lock
-		$alea = preg_replace('/[^0-9]/', '', $alea);
-		if (!file_exists($hash = _DIR_SESSIONS."forum_$alea.lck"))
-			return $retour_forum; # echec silencieux du POST
-		unlink($hash);
+		unlink($file);
 	}
 
 	// Entrer le message dans la base
@@ -213,7 +224,7 @@ function enregistre_forum() {
 		// Cela assure aussi qu'on retrouve son message dans le thread
 		// dans le cas des forums moderes a posteriori, ce qui n'est
 		// pas plus mal.
-		$retour_forum = generer_url_forum($id_message, true);
+		$retour_forum = generer_url_forum($id_message);
 	}
 
 	// Entrer les mots-cles associes
diff --git a/formulaires/formulaire_forum.html b/formulaires/formulaire_forum.html
index c05df18bb71375d55943c41382e3b60ab0010c58..1d4c2c446aa00fddf4deaa247753cf1baad61dbb 100644
--- a/formulaires/formulaire_forum.html
+++ b/formulaires/formulaire_forum.html
@@ -1,5 +1,6 @@
 <a id="formulaire"></a>
 <form action="[(#ENV{url})][(#ENV**{previsu}|?{'#formulaire',''})]" method="post">[
+<input type='hidden' name='page' value='(#ENV{page})' />][
 <input type='hidden' name='id_article' value='(#ENV{id_article})' />][
 <input type='hidden' name='id_breve' value='(#ENV{id_breve})' />][
 <input type='hidden' name='id_forum' value='(#ENV{id_forum})' />][
diff --git a/formulaires/inc-formulaire_forum.php3 b/formulaires/inc-formulaire_forum.php3
index fcdc9acd8499ac173138c03d9079f0998e6656a5..a486bfea78071a04d4fc0b580c483dd40706af81 100644
--- a/formulaires/inc-formulaire_forum.php3
+++ b/formulaires/inc-formulaire_forum.php3
@@ -43,7 +43,7 @@ function balise_FORMULAIRE_FORUM_stat($args, $filtres) {
 
 	// Note : ceci n'est pas documente !!
 	// $filtres[0] peut contenir l'url sur lequel faire tourner le formulaire
-	// exemple dans un squelette article.html : [(#FORMULAIRE_FORUM|forum.php)]
+	// exemple dans un squelette article.html : [(#FORMULAIRE_FORUM|forum)]
 
 	// le denier arg peut contenir l'url sur lequel faire le retour
 	// exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
@@ -67,13 +67,15 @@ function balise_FORMULAIRE_FORUM_stat($args, $filtres) {
 	if (($GLOBALS['meta']["mots_cles_forums"] != "oui"))
 		$table = '';
 
+	// compatibilite: virer l'extension
+	$script = preg_match(',.php3?$,', $filtres[0],$r) ? $r[1] : $filtres[0];
 	return
-	  array($titre, $table, $forums_publics, $filtres[0],
+	  array($titre, $table, $forums_publics, ($script ? $script : 'forum'),
 		$idr, $idf, $ida, $idb, $ids, $am, $ag, $af, $url);
 }
 
 function balise_FORMULAIRE_FORUM_dyn(
-$titre, $table, $type, $url,
+$titre, $table, $type, $page,
 $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic,
 $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 {
@@ -85,31 +87,18 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 	}
 
 // exclure des id_* postees du formulaire tout ce qui n'est pas nombre > 0. 
-// y aura plein de input hidden value=0  dans le squelette mais il faut
-// que le calcul du hachage soit le meme ici et dans inc-messforum
-
-	$ids = array('id_article' => intval($id_article),
-		     'id_breve'=> intval($id_breve),
-		     'id_forum'=> intval($id_forum),
-		     'id_rubrique'=> intval($id_rubrique),
-		     'id_syndic'=> intval($id_syndic));
-
-	// url de reference
-	if (!$url) {
-		$url = new Link();
-		$url = $url->getUrl();
-	} else {
-		// identifiants des parents
-		$args = "";
-		foreach ($ids as $id => $v) $args .= "&$id=$v";
-		if (strpos($url,'?'))
-			$url .= $args;
-		else  $url .= '?' . substr($args,1);
-	}
+// attention le calcul du hachage doit etre le meme ici et dans inc-messforum
+
+	$ids = array();
+	if ($x = intval($id_article)) $ids['id_article'] = $x;
+	if ($x = intval($id_breve)) $ids['id_breve'] = $x;
+	if ($x = intval($id_forum)) $ids['id_forum'] = $x;
+	if ($x = intval($id_rubrique)) $ids['id_rubrique'] = $x;
+	if ($x = intval($id_syndic)) $ids['id_syndic'] = $x;
 
-	$url = ereg_replace("[?&]var_erreur=[^&]*", '', $url);
-	$url = ereg_replace("[?&]var_login=[^&]*", '', $url);
-	$url = ereg_replace("[?&]url=[^&]*", '', $url);
+	$args = "";
+	foreach ($ids as $id => $v) $args .= "&$id=$v";
+	$url = "./?page=$page$args";
 
 	// ne pas mettre '', sinon le squelette n'affichera rien.
 	$previsu = ' ';
@@ -128,7 +117,7 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 			
 			// sauf si on a passe un parametre en argument (exemple : {#SELF})
 			if($url_param_retour)
-				$retour_forum = str_replace("&amp;", "&", $url_param_retour);
+				$retour_forum = urlencode($url_param_retour);
 		}
 
 		if (isset($_COOKIE['spip_forum_user'])
@@ -177,7 +166,8 @@ $ajouter_mot, $ajouter_groupe, $afficher_texte, $url_param_retour)
 		'table' => $table,
 		'texte' => $texte,
 		'titre' => extraire_multi($titre),
-		'url' =>  $url,
+		'page' =>  $page,
+		'url' => $url,
 		'url_site' => ($url_site ? $url_site : "http://"),
 		'id_article' => $ids['id_article'],
 		'id_breve' => $ids['id_breve'],