diff --git a/ecrire/inc_db_mysql.php3 b/ecrire/inc_db_mysql.php3
index e89f6b320771d6cc211ca186b776d82f828facc6..f7aadf914da9d289a507455da20f5d9bec814ae8 100644
--- a/ecrire/inc_db_mysql.php3
+++ b/ecrire/inc_db_mysql.php3
@@ -143,7 +143,10 @@ function spip_get_lock($nom, $timeout = 0) {
 	if ($spip_mysql_db) $nom = "$spip_mysql_db:$nom";
 
 	$nom = addslashes($nom);
-	list($lock_ok) = spip_fetch_array(spip_query("SELECT GET_LOCK('$nom', $timeout)"));
+	$q = spip_query("SELECT GET_LOCK('$nom', $timeout)");
+	list($lock_ok) = spip_fetch_array($q);
+
+	if (!$lock_ok) spip_log("pas de lock sql pour $lock");
 	return $lock_ok;
 }
 
diff --git a/ecrire/inc_invalideur.php3 b/ecrire/inc_invalideur.php3
index f4e3b336af8d252f83be1629922b8cdba319221c..34ca81bfe7f812d3ef2030104184446538315177 100644
--- a/ecrire/inc_invalideur.php3
+++ b/ecrire/inc_invalideur.php3
@@ -29,9 +29,6 @@ function maj_invalideurs ($fichier, $infosurpage, $delais) {
 #		insere_invalideur($infosurpage['id_breve'], 'id_breve', $fichier);
 #		insere_invalideur($infosurpage['id_rubrique'],'id_rubrique', $fichier);
 #		insere_invalideur($infosurpage['id_syndic'],'id_syndic', $fichier);
-
-### pas du tout prevus au programme ?
-#		insere_invalideur($infosurpage['id_signature'],'id_signature', $fichier);
 	}
 }
 
diff --git a/inc-calcul_mysql3.php b/inc-calcul_mysql3.php
index f9d59759b4d9bc72ea6b1af5a97ba9f9ff2622f1..2fd021cdbf3b4f71867b83088f55351f76c78892 100644
--- a/inc-calcul_mysql3.php
+++ b/inc-calcul_mysql3.php
@@ -206,7 +206,7 @@ WHERE	lien.id_article=$id_article
 	$nom_auteur = typo($row_auteur["nom"]);
 	$email_auteur = $row_auteur["email"];
 	if ($email_auteur) {
-	  $auteurs[] = "<A HREF=\"mailto:$email_auteur\">$nom_auteur</A>";
+	  $auteurs[] = "<a href=\"mailto:$email_auteur\">$nom_auteur</a>";
 	}
 	else {
 	  $auteurs[] = "$nom_auteur";
@@ -216,13 +216,13 @@ WHERE	lien.id_article=$id_article
   return (!$auteurs) ? "" : join($auteurs, ", ");
 }
 
-function sql_petitions($id_article)
-{
-  return spip_fetch_array(spip_query("
-SELECT	id_article
-FROM	spip_petitions
-WHERE	id_article='$id_article'"));
-    }
+function sql_petitions($id_article) {
+	$q = spip_query("SELECT
+	id_article, email_unique, site_obli, site_unique, message, texte
+	FROM spip_petitions
+	WHERE id_article=".intval($id_article));
+	return spip_fetch_array($q);
+}
 
 # retourne le chapeau d'un article, et seulement s'il est publie
 
diff --git a/inc-form-squel.php3 b/inc-form-squel.php3
index df165cbddf54d180ccecf04765bee2ce044cf2c5..db2fd393eb463eb9b9491ccaa00176c647a857a7 100644
--- a/inc-form-squel.php3
+++ b/inc-form-squel.php3
@@ -51,9 +51,10 @@ function calculer_champ_FORMULAIRE_SIGNATURE($fonctions, $nom_champ, $id_boucle,
 	$milieu = '
 		$spip_lang = $GLOBALS["spip_lang"];
 		$lacible = ' . index_pile($id_boucle, 'id_article', $boucles) . ";";
-	$code = '(!sql_petitions($lacible) ? "" :
+	$code = '(!($petition = texte_script(serialize(sql_petitions($lacible)))) ? "" :
 		("<"."?php include(\'inc-formulaires.php3\');
-		lang_select(\'$spip_lang\'); echo formulaire_signature($lacible);
+		lang_select(\'$spip_lang\');
+		echo formulaire_signature($lacible,\'$petition\');
 		lang_dselect(); ?".">"))';
 	list($c,$m) = applique_filtres($fonctions, $code, $id_boucle, $boucles, $id_mere, 'php');
 	return array($c,$milieu . $m);
diff --git a/inc-formulaires.php3 b/inc-formulaires.php3
index 73e93c0a4404d72df5bbad325be97385d5a26432..7c01410fb318fc3d74365213c4e536e6efc02d7a 100644
--- a/inc-formulaires.php3
+++ b/inc-formulaires.php3
@@ -50,6 +50,7 @@ function erreur($zetexte){
 function reponse_confirmation($id_article) {
 	global $val_confirm;
 
+	spip_log("validation petition $id_article ($val_confirm)");
 	include_ecrire("inc_connect.php3");
 	
 	if ($GLOBALS['db_ok']) {
@@ -115,7 +116,11 @@ function reponse_confirmation($id_article) {
 				else {
 					$query = "UPDATE spip_signatures SET statut=\"publie\" WHERE id_signature='$id_signature'";
 					$result = spip_query($query);
-	
+
+					// invalider les pages de l'article
+					include_ecrire('inc_invalideur.php3');
+					suivre_invalideur("id='id_article/$id_article'");
+
 					$texte .= erreur(_T('form_pet_signature_validee'));
 				}
 			}
@@ -128,7 +133,11 @@ function reponse_confirmation($id_article) {
 	else {
 		$texte = _T('form_pet_probleme_technique');
 	}
-	echo "<div class='reponse_formulaire'>$texte</div>";
+
+	$texte = "<div class='reponse_formulaire'><a name='sp$id_article'></a>$texte</div>";
+
+	// message pour formulaire_signature()
+	define('_REPONSE_CONFIRMATION_SIGNATURE', $texte);
 }
 
 //
@@ -138,6 +147,7 @@ function reponse_confirmation($id_article) {
 function reponse_signature($id_article) {
 	global $nom_email, $adresse_email, $message, $nom_site, $url_site, $url_page;
 
+	spip_log("signature petition $id_article ($adresse_email)");
 	include_ecrire("inc_connect.php3");
 	
 	if ($GLOBALS['db_ok']) {
@@ -226,7 +236,7 @@ function reponse_signature($id_article) {
 				$link->addVar('val_confirm', $passw);
 				$url = $link->getUrl("sp$id_article");
 	
-				$messagex = _T('form_pet_mail_confirmation', array('titre' => $titre, 'nom_email' => $nom_email, 'nom_site' => $nom_site, 'url_site' => $url_site, 'url' => $url));
+				echo $messagex = _T('form_pet_mail_confirmation', array('titre' => $titre, 'nom_email' => $nom_email, 'nom_site' => $nom_site, 'url_site' => $url_site, 'url' => $url));
 
 				if (envoyer_mail($adresse_email, _T('form_pet_confirmation')." ".$titre, $messagex)) {
 					$reponse_signature .= "<P><B>"._T('form_pet_envoi_mail_confirmation')."</B>";
@@ -258,13 +268,9 @@ function reponse_signature($id_article) {
 // Formulaire de signature d'une petition
 //
 
-function formulaire_signature_normal($id_article) {
+function formulaire_signature_normal($id_article, $row_petition) {
 	include_ecrire("inc_texte.php3");
 
-	$query_petition = "SELECT * FROM spip_petitions WHERE id_article=$id_article";
-	$result_petition = spip_query($query_petition);
-
-	if ($row_petition = spip_fetch_array($result_petition)) {
 		$id_article = $row_petition['id_article'];
 		$email_unique = $row_petition['email_unique'];
 		$site_obli = $row_petition['site_obli'];
@@ -279,7 +285,7 @@ function formulaire_signature_normal($id_article) {
 
 		$retour .= propre($texte_petition);
 
-		$retour .= "<div><fieldset><p><b>"._T('form_pet_votre_nom')."</b><br />";
+		$retour .= "<div><a name='sp$id_article'></a><fieldset><p><b>"._T('form_pet_votre_nom')."</b><br />";
 		$retour .= "<input type=\"text\" class=\"forml\" name=\"nom_email\" value=\"\" size=\"20\" /></p>";
 
 		$retour .= "<p><b>"._T('form_pet_votre_email')."</b><br />";
@@ -309,19 +315,18 @@ function formulaire_signature_normal($id_article) {
 
 		$retour .= "<br /><div align=\"right\"><input type=\"submit\" name=\"Valider\" class=\"spip_bouton\" value=\""._T('bouton_valider')."\" />";
 		$retour .= "</div></form>\n";
-	}
+
 	return $retour;
 }
 
 
-function formulaire_signature ($id_article) {
-spip_log("petition $id_article");
+function formulaire_signature ($id_article, $petition) {
 	if ($GLOBALS['val_confirm'])
-		return reponse_confirmation($id_article);
+		return _REPONSE_CONFIRMATION_SIGNATURE;	// geree par inc-public.php3
 	else if ($GLOBALS['nom_email'] AND $GLOBALS['adresse_email'])
 		return reponse_signature($id_article);
 	else
-		return formulaire_signature_normal($id_article);
+		return formulaire_signature_normal($id_article,unserialize($petition));
 }
 
 // inscrire les visiteurs dans l'espace public (statut 6forum) ou prive (statut nouveau->1comite)
diff --git a/inc-public.php3 b/inc-public.php3
index 0377012fafebc227cca42f9299ae7a95b0033479..0848a43d5c80166f757eb50a1e5fc033e3d34870 100644
--- a/inc-public.php3
+++ b/inc-public.php3
@@ -49,12 +49,8 @@ else {
 	}
 
 
-	// Ajout_forum est une HTTP_GET_VARS installee par retour_forum dans
-	// inc-forum.
-	// Il s'agit de memoriser les HTTP_POST_VARS, afin de mettre en base
-	// les valeurs transmises, avant reaffichage du formulaire avec celles-ci.
-	// En cas de validation finale ca redirige vers l'URL ayant provoque l'appel
-	// au lieu de laisser l'URL appelee resynthetiser le formulaire.
+	// Ajout_forum (pour les forums) et $val_confirm signalent des modifications
+	// a faire avant d'afficher la page
 	if ($ajout_forum) {
 		$redirect = '';
 		include('inc-messforum.php3');
@@ -63,6 +59,14 @@ else {
 			exit();
 		}
 	}
+	if ($val_confirm) {
+		// il nous faut id_article ! C'est donc encore a nettoyer...
+		include_local('inc-calcul.php3');
+		calculer_contexte();
+		include_local('inc-formulaires.php3');
+		reponse_confirmation($id_article);
+	}
+
 
 	// Faut-il effacer des pages invalidees ?
 	if (lire_meta('invalider')) {