diff --git a/.gitattributes b/.gitattributes
index 843ceabca1c78ea01e7265f7cbe839ccd2c32dca..a02f7b9c073ab49733ba1da977cad74f8d1299e3 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -1129,6 +1129,14 @@ prive/vignettes/zip.png -text
 /rien.gif -text
 /spip.php -text
 squelettes-dist/favicon.ico.html -text
+squelettes-dist/formulaires/ecrire_auteur.php -text
+squelettes-dist/formulaires/inscription.php -text
+squelettes-dist/formulaires/mot_de_passe.html -text
+squelettes-dist/formulaires/mot_de_passe.php -text
+squelettes-dist/formulaires/oubli.php -text
+squelettes-dist/formulaires/recherche.php -text
+squelettes-dist/formulaires/signature.php -text
+squelettes-dist/formulaires/site.php -text
 squelettes-dist/identifiants.html -text
 squelettes-dist/robots.txt.html -text
 squelettes-dist/sitemap.xml.html -text
diff --git a/squelettes-dist/formulaires/administration.html b/squelettes-dist/formulaires/administration.html
new file mode 100644
index 0000000000000000000000000000000000000000..ef56fb6923b03b4207394342b9f1922035445121
--- /dev/null
+++ b/squelettes-dist/formulaires/administration.html
@@ -0,0 +1,31 @@
+ <div[ class="(#ENV{divclass,spip-admin-bloc})"] id='spip-admin' dir="#LANG_DIR">[
+	<a href="(#ENV{analyser})" class="spip-admin-boutons"
+		id="analyser"><:analyse_xml:>[ ((#ENV{xhtml_error}))]</a>]
+	[<a href="[(#ENV{voir_article})]" class="spip-admin-boutons"
+		id="voir_article"><:article:>
+			((#ENV{id_article}))</a>]
+	[<a href="[(#ENV{voir_breve})]" class="spip-admin-boutons"
+		id="voir_breve"><:breve:>
+			((#ENV{id_breve}))</a>]
+	[<a href="[(#ENV{voir_rubrique})]" class="spip-admin-boutons"
+		id="voir_rubrique"><:rubrique:>
+			((#ENV{id_rubrique}))</a>]
+	[<a href="[(#ENV{voir_mot})]" class="spip-admin-boutons"
+		id="voir_mot"><:mots_clef:>
+			((#ENV{id_mot}))</a>]
+	[(#ENV{id_syndic}|oui)[(#AUTORISER{modifier,site,#ENV{id_syndic}}|oui)
+	<a href="[(#ENV{voir_site})]" class="spip-admin-boutons"
+		id="voir_site"><:info_site:>
+			[((#ENV{id_syndic}))]</a>]]
+	[<a href="[(#ENV{voir_auteur})]" class="spip-admin-boutons"
+		id="voir_auteur"><:auteur:>
+			((#ENV{id_auteur}))</a>]<!--extra-->[
+	<a href="(#ENV{ecrire})" class="spip-admin-boutons"
+		id="ecrire"><:espace_prive:></a>]
+	<a href="[(#SELF|parametre_url{var_mode,#ENV{calcul}})]" class="spip-admin-boutons"
+		id="var_mode"><:admin_recalculer:>[(#ENV{use_cache})]</a>[
+	<a href="(#ENV{preview})" class="spip-admin-boutons"
+		id="preview"><:previsualisation:></a>][
+	<a href="(#ENV{debug})" class="spip-admin-boutons"
+		id="debug"><:admin_debug:></a>]
+</div>
diff --git a/squelettes-dist/formulaires/ecrire_auteur.html b/squelettes-dist/formulaires/ecrire_auteur.html
new file mode 100644
index 0000000000000000000000000000000000000000..027262de928edcb9fd91a02e9e816476cc7d1e53
--- /dev/null
+++ b/squelettes-dist/formulaires/ecrire_auteur.html
@@ -0,0 +1,49 @@
+<div class="formulaire_spip formulaire_ecrire_auteur ajax" id="formulaire_ecrire_auteur#ENV{id}">
+<br class='bugajaxie' />
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+[(#ENV{editable})
+<form method='post' action='#ENV{action}#formulaire_ecrire_auteur#ENV{id}' enctype='multipart/form-data'>
+	[(#REM) declarer les hidden qui declencheront le service du formulaire parametre : url d'action ]
+	#ACTION_FORMULAIRE{#ENV{action}}
+	[(#REM) Previsualisation... ]
+	[(#ENV*{erreurs}|table_valeur{previsu}|oui)
+	<fieldset class="previsu">
+		<legend><:previsualisation:></legend>
+		<ul>
+			<li><strong>#ENV{sujet_message_auteur}</strong> - <em>#ENV{email_message_auteur}</em></li>
+			<li>[(#ENV{texte_message_auteur}|nl2br)]</li>
+		</ul>
+		<p class="boutons"><input type="submit" class="submit" name="confirmer" value="<:form_prop_confirmer_envoi:>" /></p>
+	</fieldset>
+	]
+	[(#REM) Sinon, formulaire normal ]
+	<fieldset>
+		<legend><:envoyer_message:></legend>
+		<ul>
+			<li class='saisie_email_message_auteur obligatoire[ (#ENV*{erreurs}|table_valeur{email_message_auteur}|oui)erreur]'>
+				<label for="email_message_auteur#ENV{id}"><:form_pet_votre_email:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{email_message_auteur})</span>]
+				<input type="text" class="text" name="email_message_auteur" id="email_message_auteur#ENV{id}" value="#ENV{email_message_auteur}" size="30" />
+			</li>
+			<li class='saisie_sujet_message_auteur obligatoire[ (#ENV*{erreurs}|table_valeur{sujet_message_auteur}|oui)erreur]'>
+				<label for="sujet_message_auteur#ENV{id}"><:form_prop_sujet:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{sujet_message_auteur})</span>]
+				<input type="text" class="text" name="sujet_message_auteur" id="sujet_message_auteur#ENV{id}" value="#ENV{sujet_message_auteur}" size="30" />
+			</li>
+			<li class='saisie_texte_message_auteur obligatoire[ (#ENV*{erreurs}|table_valeur{texte_message_auteur}|oui)erreur]'>
+				<label for="texte_message_auteur#ENV{id}"><:info_texte_message:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{texte_message_auteur})</span>]
+				<textarea name="texte_message_auteur" id="texte_message_auteur#ENV{id}" rows="8" cols="60">#ENV{texte_message_auteur}</textarea>
+			</li>
+		</ul>
+	</fieldset>
+	[(#REM) Piege a robots spammeurs ]
+	<p style="display: none;">
+		<label for="nobot"><:antispam_champ_vide:></label>
+		<input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" />
+	</p>
+	<p class="boutons"><input type="submit" class="submit" name="valide" value="<:form_prop_envoyer:>" /></p>
+</form>
+]
+</div>
diff --git a/squelettes-dist/formulaires/ecrire_auteur.php b/squelettes-dist/formulaires/ecrire_auteur.php
new file mode 100644
index 0000000000000000000000000000000000000000..201bccf1dc9fb733fb002b91a30de993528c1edd
--- /dev/null
+++ b/squelettes-dist/formulaires/ecrire_auteur.php
@@ -0,0 +1,78 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+
+function formulaires_ecrire_auteur_charger_dist($id_auteur, $id_article, $mail){
+	include_spip('inc/texte');
+	$puce = definir_puce();
+	$valeurs = array(
+		'sujet_message_auteur'=>'',
+		'texte_message_auteur'=>'',
+		'email_message_auteur'=>$GLOBALS['visiteur_session']['email']
+	);
+	
+	// id du formulaire (pour en avoir plusieurs sur une meme page)
+	$valeurs['id'] = ($id_auteur ? '_'.$id_auteur : '_ar'.$id_article);
+	// passer l'id_auteur au squelette
+	$valeurs['id_auteur'] = $id_auteur;
+	$valeurs['id_article'] = $id_article;
+	
+	return $valeurs;
+}
+
+function formulaires_ecrire_auteur_verifier_dist($id_auteur, $id_article, $mail){
+	$erreurs = array();
+	include_spip('inc/filtres');
+	
+	if (!$adres = _request('email_message_auteur'))
+		$erreurs['email_message_auteur'] = _T("info_obligatoire");
+	elseif(!email_valide($adres))
+		$erreurs['email_message_auteur'] = _T('form_prop_indiquer_email');
+	else {
+		include_spip('inc/session');
+		session_set('email', $adres);
+	}
+
+	if (!$sujet=_request('sujet_message_auteur'))
+		$erreurs['sujet_message_auteur'] = _T("info_obligatoire");
+	elseif(!(strlen($sujet)>3))
+		$erreurs['sujet_message_auteur'] = _T('forum_attention_trois_caracteres');
+
+	if (!$texte=_request('texte_message_auteur'))
+		$erreurs['texte_message_auteur'] = _T("info_obligatoire");
+	elseif(!(strlen($texte)>10))
+		$erreurs['texte_message_auteur'] = _T('forum_attention_dix_caracteres');
+
+	if (!_request('confirmer') AND !count($erreurs))
+		$erreurs['previsu']=' ';
+	return $erreurs;
+}
+
+function formulaires_ecrire_auteur_traiter_dist($id_auteur, $id_article, $mail){
+	
+	$adres = _request('email_message_auteur');
+	$sujet=_request('sujet_message_auteur');
+	$texte=_request('texte_message_auteur');
+	
+	$texte .= "\n\n-- "._T('envoi_via_le_site')." ".supprimer_tags(extraire_multi($GLOBALS['meta']['nom_site']))." (".$GLOBALS['meta']['adresse_site']."/) --\n";
+	$envoyer_mail = charger_fonction('envoyer_mail','inc');
+
+	if ($envoyer_mail($mail, $sujet, $texte, $adres,
+	"X-Originating-IP: ".$GLOBALS['ip']))
+		$message = _T('form_prop_message_envoye');
+	else
+		$message = _T('pass_erreur_probleme_technique');
+
+	return array('message_ok'=>$message);
+}
+
+?>
diff --git a/squelettes-dist/formulaires/inscription.html b/squelettes-dist/formulaires/inscription.html
new file mode 100644
index 0000000000000000000000000000000000000000..ede845fa7536d96d24e30ba74868252f5039cbfa
--- /dev/null
+++ b/squelettes-dist/formulaires/inscription.html
@@ -0,0 +1,49 @@
+<div class="formulaire_spip formulaire_inscription ajax" id="formulaire_inscription">
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+[(#ENV{editable})
+<form method="post" action="#ENV{action}">
+	#ACTION_FORMULAIRE{#ENV{action}}
+	<fieldset>
+		[(#REM) on affiche plus ce message en cas d'erreur pour eviter d'allonger trop le formulaire]
+		[(#ENV*{message_erreur}|non)
+		[<legend><:pass_vousinscrire:></legend>
+		<p class='explication'>(#ENV*{_commentaire})</p>]
+		]<legend><:form_forum_identifiants:></legend>
+		<p class='explication'><:form_forum_indiquer_nom_email:></p>
+		<ul>
+			<li class='saisie_nom_inscription obligatoire[ (#ENV*{erreurs}|table_valeur{nom_inscription}|oui)erreur]'>
+				<label for="nom_inscription"><:form_pet_votre_nom:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{nom_inscription})</span>]
+				<input type="text" class="text" name="nom_inscription" id="nom_inscription" value="#ENV{nom_inscription}" size="30" />
+			</li>
+			<li class='saisie_mail_inscription obligatoire[ (#ENV*{erreurs}|table_valeur{mail_inscription}|oui)erreur]'>
+				<label for="mail_inscription"><:form_pet_votre_email:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{mail_inscription})</span>]
+				<input type="text" class="text" name="mail_inscription" id="mail_inscription" value="#ENV{mail_inscription}" size="30" />
+			</li>
+		</ul>
+	</fieldset>
+	[(#REM) Piege a robots spammeurs ]
+	<p style="display: none;">
+		<label for="nobot"><:antispam_champ_vide:></label>
+		<input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" />
+	</p>
+	<p class="boutons"><input type="submit" class="submit" value="<:bouton_valider:>" /></p>
+ </form>
+[<script type="text/javascript"><!--
+document.getElementById('(#ENV{focus})').focus();
+--></script>]
+]
+</div>
+[(#ENV{focus,''}|?{' '})
+<div style="text-align: #LANG_RIGHT;">
+<script type="text/javascript">/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/
+document.write("<a style='color: #e86519' href='")
+document.write((window.opener) ? "javascript:close()" : "./")
+document.write("'><:pass_quitter_fenetre:><" + "/a>");
+/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script>
+<noscript>
+	&#91;<a href='./'><:pass_retour_public:></a>&#93;
+</noscript>
+</div>]
\ No newline at end of file
diff --git a/squelettes-dist/formulaires/inscription.php b/squelettes-dist/formulaires/inscription.php
new file mode 100644
index 0000000000000000000000000000000000000000..fbcdaad5f0ec736c47e972053c05533aa21fc056
--- /dev/null
+++ b/squelettes-dist/formulaires/inscription.php
@@ -0,0 +1,228 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function formulaires_inscription_charger_dist($mode, $focus, $id=0) {
+	$valeurs = array('nom_inscription'=>'','mail_inscription'=>'', 'id'=>$id);
+	if ($mode=='1comite')
+		$valeurs['_commentaire'] = _T('pass_espace_prive_bla');
+	else 
+		$valeurs['_commentaire'] = _T('pass_forum_bla');
+
+	if (!tester_config($id, $mode))
+		$valeurs['editable'] = false;
+
+	return $valeurs;
+}
+
+// Si inscriptions pas autorisees, retourner une chaine d'avertissement
+function formulaires_inscription_verifier_dist($mode, $focus, $id=0) {
+
+	$erreurs = array();
+	include_spip('inc/filtres');	
+	if (!tester_config($id, $mode) OR (strlen(_request('nobot'))>0))
+		$erreurs['message_erreur'] = _T('rien_a_faire_ici');
+
+	if (!$nom = _request('nom_inscription'))
+		$erreurs['nom_inscription'] = _T("info_obligatoire");
+	if (!$mail = _request('mail_inscription'))
+		$erreurs['mail_inscription'] = _T("info_obligatoire");
+	
+	// compatibilite avec anciennes fonction surchargeables
+	// plus de definition par defaut
+	if (!count($erreurs)){
+		if (function_exists('test_inscription'))
+			$f = 'test_inscription';
+		else 
+			$f = 'test_inscription_dist';
+		$declaration = $f($mode, $mail, $nom, $id);
+		if (is_string($declaration)) {
+			$k = (strpos($declaration, 'mail')  !== false) ?
+			  'mail_inscription' : 'nom_inscription';
+			$erreurs[$k] = _T($declaration);
+		} else {
+			include_spip('base/abstract_sql');
+			
+			if ($row = sql_fetsel("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($declaration['email']))){
+				if (($row['statut'] == '5poubelle') AND !$declaration['pass'])
+					// irrecuperable
+					$erreurs['message_erreur'] = _T('form_forum_access_refuse');	
+				else if (($row['statut'] != 'nouveau') AND !$declaration['pass'])
+					// deja inscrit
+					$erreurs['message_erreur'] = _T('form_forum_email_deja_enregistre');
+				spip_log($row['id_auteur'] . " veut se resinscrire");
+			}
+		}
+	}
+	return $erreurs;
+}
+
+function formulaires_inscription_traiter_dist($mode, $focus, $id=0) {
+
+	$nom = _request('nom_inscription');
+	$mail_complet = _request('mail_inscription');
+	
+	if (function_exists('test_inscription'))
+		$f = 'test_inscription';
+	else 	$f = 'test_inscription_dist';
+	$desc = $f($mode, $mail_complet, $nom, $id);
+
+	if (!is_array($desc)) {
+		$desc = _T($desc);
+	} else {
+		include_spip('base/abstract_sql');
+		$res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email']));
+		if (!$res) 
+			$desc = _T('titre_probleme_technique');
+		else {
+			$row = sql_fetch($res);
+			// s'il n'existe pas deja, creer les identifiants  
+			$desc = $row ? $row : inscription_nouveau($desc);
+		}
+	}
+
+	if (is_array($desc)) {
+	// generer le mot de passe (ou le refaire si compte inutilise)
+		$desc['pass'] = creer_pass_pour_auteur($desc['id_auteur']);
+		// charger de suite cette fonction, pour ses utilitaires
+		$envoyer_mail = charger_fonction('envoyer_mail','inc');
+		if (function_exists('envoyer_inscription'))
+			$f = 'envoyer_inscription';
+		else 	$f = 'envoyer_inscription_dist';
+		list($sujet,$msg,$from,$head) = $f($desc, $nom, $mode, $id);
+		if (!$envoyer_mail($mail_complet, $sujet, $msg, $from, $head))
+			$desc = _T('form_forum_probleme_mail');
+		// Notifications
+		if ($notifications = charger_fonction('notifications', 'inc')) {
+			$notifications('inscription', $desc['id_auteur'],
+				array('nom' => $desc['nom'], 'email' => $desc['email'])
+			);
+		}
+	}
+
+	return array('message_ok'=>is_string($desc) ? $desc : _T('form_forum_identifiant_mail'));
+}
+
+// fonction qu'on peut redefinir pour filtrer les adresses mail et les noms,
+// et donner des infos supplementaires
+// Std: controler que le nom (qui sert a calculer le login) est plausible
+// et que l'adresse est valide. On les normalise au passage (trim etc).
+// Retour: 
+// - si ok un tableau avec au minimum email, nom, mode (redac / forum)
+// - si ko une chaine de langue servant d'argument a  _T expliquant le refus
+
+// http://doc.spip.org/@test_inscription_dist
+function test_inscription_dist($mode, $mail, $nom, $id=0) {
+
+	include_spip('inc/filtres');
+	$nom = trim(corriger_caracteres($nom));
+	if((strlen ($nom) < _LOGIN_TROP_COURT) OR (strlen($nom) > 64))
+	    return 'ecrire:info_login_trop_court';
+	if (!$r = email_valide($mail)) return 'info_email_invalide';
+	return array('email' => $r, 'nom' => $nom, 'bio' => $mode);
+}
+
+// On enregistre le demandeur comme 'nouveau', en memorisant le statut final
+// provisoirement dans le champ Bio, afin de ne pas visualiser les inactifs
+// A sa premiere connexion il obtiendra son statut final.
+
+// http://doc.spip.org/@inscription_nouveau
+function inscription_nouveau($desc)
+{
+	if (!isset($desc['login']))
+		$desc['login'] = test_login($desc['nom'], $desc['email']);
+
+	$desc['statut'] = 'nouveau';
+	include_spip('action/editer_auteur');
+	$id_auteur = insert_auteur();
+
+	if (!$id_auteur) return _T('titre_probleme_technique');
+
+	include_spip('inc/modifier');
+	revision_auteur($id_auteur, $desc);
+
+	instituer_auteur($id_auteur, $desc);
+
+	$desc['id_auteur'] = $id_auteur;
+
+	return $desc;
+}
+
+// construction du mail envoyant les identifiants 
+// fonction redefinissable qui doit retourner un tableau
+// dont les elements seront les arguments de inc_envoyer_mail
+
+// http://doc.spip.org/@envoyer_inscription_dist
+function envoyer_inscription_dist($desc, $nom, $mode, $id) {
+
+	$nom_site_spip = nettoyer_titre_email($GLOBALS['meta']["nom_site"]);
+	$adresse_site = $GLOBALS['meta']["adresse_site"];
+	if ($mode == '6forum') {
+		$adresse_login = generer_url_public('login'); 
+		$msg = 'form_forum_voici1';
+	} else {
+		$adresse_login = $adresse_site .'/'. _DIR_RESTREINT_ABS;
+		$msg = 'form_forum_voici2';
+	}
+
+	$msg = _T('form_forum_message_auto')."\n\n"
+		. _T('form_forum_bonjour', array('nom'=>$nom))."\n\n"
+		. _T($msg, array('nom_site_spip' => $nom_site_spip,
+			'adresse_site' => $adresse_site . '/',
+			'adresse_login' => $adresse_login)) . "\n\n- "
+		. _T('form_forum_login')." " . $desc['login'] . "\n- "
+		. _T('form_forum_pass'). " " . $desc['pass'] . "\n\n";
+
+	return array("[$nom_site_spip] "._T('form_forum_identifiants'), $msg);
+}
+
+// http://doc.spip.org/@test_login
+function test_login($nom, $mail) {
+	include_spip('inc/charsets');
+	$nom = strtolower(translitteration($nom));
+	$login_base = preg_replace("/[^\w\d_]/", "_", $nom);
+
+	// il faut eviter que le login soit vraiment trop court
+	if (strlen($login_base) < 3) {
+		$mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail)));
+		$login_base = preg_replace("/[^\w\d]/", "_", $nom);
+	}
+	if (strlen($login_base) < 3)
+		$login_base = 'user';
+
+	// eviter aussi qu'il soit trop long (essayer d'attraper le prenom)
+	if (strlen($login_base) > 10) {
+		$login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/",
+			'\1', $login_base);
+		$login_base = substr($login_base, 0,13);
+	}
+
+	$login = $login_base;
+
+	for ($i = 1; ; $i++) {
+		if (!sql_countsel('spip_auteurs', "login='$login'"))
+			return $login;
+		$login = $login_base.$i;
+	}
+}
+
+// http://doc.spip.org/@creer_pass_pour_auteur
+function creer_pass_pour_auteur($id_auteur) {
+	include_spip('inc/acces');
+	$pass = creer_pass_aleatoire(8, $id_auteur);
+	include_spip('action/editer_auteur');
+	instituer_auteur($id_auteur, array('pass'=>$pass));
+	return $pass;
+}
+
+?>
diff --git a/squelettes-dist/formulaires/mot_de_passe.html b/squelettes-dist/formulaires/mot_de_passe.html
new file mode 100644
index 0000000000000000000000000000000000000000..bca8ad73ea6500624bdbccbf499ba1f4f916d1da
--- /dev/null
+++ b/squelettes-dist/formulaires/mot_de_passe.html
@@ -0,0 +1,29 @@
+<div class="formulaire_spip formulaire_mot_de_passe">
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+[(#ENV*{editable}|?{' '})
+<form id="oubli_form" action="[(#ENV{action})]" method="post">
+	[(#REM) activer le traitement auto et dispatch sur charger/verifier/traiter]
+	#ACTION_FORMULAIRE{#ENV{action}}
+	<fieldset>
+		<legend><:pass_nouveau_pass:></legend>
+		<ul>
+			<li class="saisie_oubli obligatoire[ (#ENV*{erreurs}|table_valeur{oubli}|oui)erreur]">
+				<label for="oubli"><:pass_choix_pass:></label>
+				[<span class='erreur'>(#ENV**{erreurs}|table_valeur{oubli})</span>]
+				<input type='password' name='oubli' id='oubli' value="#ENV**{oubli}" />
+			</li>
+		</ul>
+	</fieldset>
+	[(#REM) Piege a robots spammeurs ]
+	<p style="display: none;">
+		<label for="nobot"><:antispam_champ_vide:></label>
+		<input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" />
+	</p>
+	<p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p>
+</form>
+<script type='text/javascript'>/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/
+ document.getElementById('oubli').focus()
+/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script>
+]
+</div>
\ No newline at end of file
diff --git a/squelettes-dist/formulaires/mot_de_passe.php b/squelettes-dist/formulaires/mot_de_passe.php
new file mode 100644
index 0000000000000000000000000000000000000000..77d0a5801ec7044be4bab6d18fb5312933732b2e
--- /dev/null
+++ b/squelettes-dist/formulaires/mot_de_passe.php
@@ -0,0 +1,93 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// chargement des valeurs par defaut des champs du formulaire
+/**
+ * Chargement de l'auteur qui peut changer son mot de passe.
+ * Soit un cookie d'oubli fourni par #FORMULAIRE_OUBLI est passe dans l'url par &p=
+ * Soit un id_auteur est passe en parametre #FORMULAIRE_MOT_DE_PASSE{#ID_AUTEUR}
+ * Dans les deux cas on verifie que l'auteur est autorise
+ *
+ * @param int $id_auteur
+ * @return array
+ */
+function formulaires_mot_de_passe_charger_dist($id_auteur=null){
+
+	$valeurs = array();
+	if ($id_auteur=intval($id_auteur)) {
+		$id_auteur = sql_getfetsel('id_auteur','spip_auteurs',array('id_auteur='.intval($id_auteur),"statut<>'5poubelle'","pass<>''"));
+	}
+	elseif ($p=_request('p')) {
+		$p = preg_replace(',[^0-9a-f.],i','',$p);
+		if ($p AND $id_auteur = sql_getfetsel('id_auteur','spip_auteurs',array('cookie_oubli='.sql_quote($p),"statut<>'5poubelle'","pass<>''")))
+			$valeurs['_hidden'] = '<input type="hidden" name="p" value="'.$p.'" />';
+	}
+
+	if ($id_auteur){
+		$valeurs['id_auteur'] = $id_auteur; // a toutes fins utiles pour le formulaire
+	}
+	else {
+		$valeurs['_hidden'] = _T('pass_erreur_code_inconnu');
+		$valeurs['editable'] =  false; // pas de saisie
+	}
+	return $valeurs;
+}
+
+/**
+ * Verification de la saisie du mot de passe.
+ * On verifie qu'un mot de passe est saisi, et que sa longuer est suffisante
+ * Ce serait le lieu pour verifier sa qualite (caracteres speciaux ...)
+ *
+ * @param int $id_auteur
+ */
+function formulaires_mot_de_passe_verifier_dist($id_auteur=null){
+	$erreurs = array();
+	if (!_request('oubli'))
+		$erreurs['oubli'] = _T('info_obligatoire');
+	else if (strlen(_request('oubli')) < 6)
+		$erreurs['oubli'] = _T('info_passe_trop_court');
+
+	return $erreurs;
+}
+
+/**
+ * Modification du mot de passe d'un auteur.
+ * Utilise le cookie d'oubli fourni en url ou l'argument du formulaire pour identifier l'auteur
+ *
+ * @param int $id_auteur
+ */
+function formulaires_mot_de_passe_traiter_dist($id_auteur=null){
+	$message = '';
+	include_spip('base/abstract_sql');
+	if ($id_auteur=intval($id_auteur)) {
+		$row = sql_fetsel('id_auteur,login','spip_auteurs',array('id_auteur='.intval($id_auteur),"statut<>'5poubelle'","pass<>''"));
+	}
+	elseif ($p=_request('p')) {
+		$p = preg_replace(',[^0-9a-f.],i','',$p);
+		$row = sql_fetsel('id_auteur,login,source','spip_auteurs',array('cookie_oubli='.sql_quote($p),"statut<>'5poubelle'","pass<>''"));
+	}
+
+	if ($row
+	 && ($id_auteur = $row['id_auteur'])
+	 && ($oubli = _request('oubli'))) {
+		include_spip('action/editer_auteur');
+		auteurs_set($id_auteur, array('pass'=>$oubli,'cookie_oubli'=>''));
+
+		$login = $row['login'];
+		$message = "<b>" . _T('pass_nouveau_enregistre') . "</b>".
+		"<p>" . _T('pass_rappel_login', array('login' => $login));
+	}
+	return array('message_ok'=>$message);
+}
+?>
diff --git a/squelettes-dist/formulaires/oubli.html b/squelettes-dist/formulaires/oubli.html
new file mode 100644
index 0000000000000000000000000000000000000000..c965b97a4732de164c61784884fe6a2f41d6a69f
--- /dev/null
+++ b/squelettes-dist/formulaires/oubli.html
@@ -0,0 +1,29 @@
+<div class="formulaire_spip formulaire_oubli">
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+[(#ENV*{editable}|?{' '})
+<form id="oubli_form" action="[(#ENV{action})]" method="post">
+	[(#REM) activer le traitement auto et dispatch sur charger/verifier/traiter]
+	#ACTION_FORMULAIRE{#ENV{action}}
+	<fieldset>
+		<legend><:pass_nouveau_pass:></legend>
+		<ul>
+			<li class="saisie_oubli obligatoire[ (#ENV*{erreurs}|table_valeur{oubli}|oui)erreur]">
+				<label for="oubli"><:form_pet_votre_email:></label>
+				[<span class='erreur'>(#ENV**{erreurs}|table_valeur{oubli})</span>]
+				<input type='text' name='oubli' id='oubli' value="#ENV**{oubli}" />
+			</li>
+		</ul>
+	</fieldset>
+	[(#REM) Piege a robots spammeurs ]
+	<p style="display: none;">
+		<label for="nobot"><:antispam_champ_vide:></label>
+		<input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" />
+	</p>
+	<p class="boutons"><input type="submit" class="submit" value="<:pass_ok:>" /></p>
+</form>
+<script type='text/javascript'>/*<!#EVAL{chr(91)}CDATA#EVAL{chr(91)}*/
+ document.getElementById('oubli').focus()
+/*#EVAL{chr(93)}[(#EVAL{chr(93)})]>*/</script>
+]
+</div>
\ No newline at end of file
diff --git a/squelettes-dist/formulaires/oubli.php b/squelettes-dist/formulaires/oubli.php
new file mode 100644
index 0000000000000000000000000000000000000000..21b8548ce34c17f198c8ceefeb48b7ce6ddf0bd2
--- /dev/null
+++ b/squelettes-dist/formulaires/oubli.php
@@ -0,0 +1,100 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// chargement des valeurs par defaut des champs du formulaire
+function formulaires_oubli_charger_dist(){
+	$valeurs = array('oubli'=>'');
+	return $valeurs;
+}
+
+// http://doc.spip.org/@message_oubli
+function message_oubli($email, $param)
+{
+	$r = formulaires_oubli_mail($email);
+	if (is_array($r) AND $r[1]) {
+		include_spip('inc/acces'); # pour creer_uniqid
+		$cookie = creer_uniqid();
+		sql_updateq("spip_auteurs", array("cookie_oubli" => $cookie), "id_auteur=" . $r[1]['id_auteur']);
+	
+		$nom = $GLOBALS['meta']["nom_site"];
+		$envoyer_mail = charger_fonction('envoyer_mail','inc');
+	
+		if ($envoyer_mail($email,
+				  ("[$nom] " .  _T('pass_oubli_mot')),
+				  _T('pass_mail_passcookie',
+				     array('nom_site_spip' => $nom,
+					   'adresse_site' => url_de_base(),
+					   'sendcookie' => generer_url_public('spip_pass', 
+					   "$param=$cookie", true)))) )
+		  return _T('pass_recevoir_mail');
+		else
+		  return  _T('pass_erreur_probleme_technique');
+	}
+	return  _T('pass_erreur_probleme_technique');
+}
+
+// la saisie a ete validee, on peut agir
+function formulaires_oubli_traiter_dist(){
+
+	$message = message_oubli(_request('oubli'),'p');
+	return array('message_ok'=>$message);
+}
+
+
+// fonction qu'on peut redefinir pour filtrer les adresses mail 
+// http://doc.spip.org/@test_oubli
+function test_oubli_dist($email)
+{
+	include_spip('inc/filtres'); # pour email_valide()
+	if (!email_valide($email) ) 
+		return _T('pass_erreur_non_valide', array('email_oubli' => htmlspecialchars($email)));
+	return array('mail' => $email);
+}
+
+function formulaires_oubli_verifier_dist(){
+	$erreurs = array();
+
+	$email = _request('oubli');
+
+	$r = formulaires_oubli_mail($email);
+
+	if (!is_array($r))
+		$erreurs['oubli'] = $r;
+	else {
+		if (!$r[1]) 
+			$erreurs['oubli'] = _T('pass_erreur_non_enregistre', array('email_oubli' => htmlspecialchars($email)));
+	
+		elseif ($r[1]['statut'] == '5poubelle' OR $r[1]['pass'] == '')
+			$erreurs['oubli'] =  _T('pass_erreur_acces_refuse');
+	}
+
+	return $erreurs;
+}
+
+function formulaires_oubli_mail($email)
+{
+	if (function_exists('test_oubli'))
+		$f = 'test_oubli';
+	else 
+		$f = 'test_oubli_dist';
+	$declaration = $f($email);
+
+	if (!is_array($declaration))
+		return $declaration;
+	else {
+		include_spip('base/abstract_sql');
+		return array($declaration, sql_fetsel("id_auteur,statut,pass", "spip_auteurs", "email =" . sql_quote($declaration['mail'])));
+	}
+}
+?>
diff --git a/squelettes-dist/formulaires/recherche.html b/squelettes-dist/formulaires/recherche.html
new file mode 100644
index 0000000000000000000000000000000000000000..49f93c18210929352b15dffb66a2d3542bd50374
--- /dev/null
+++ b/squelettes-dist/formulaires/recherche.html
@@ -0,0 +1,9 @@
+<div class="formulaire_spip formulaire_recherche" id="formulaire_recherche">
+<form action="[(#ENV{action})]" method="get"><div>
+	[(#ENV{action}|form_hidden)]
+	[<input type="hidden" name="lang" value="(#ENV{lang})" />]
+	<label for="recherche"><:info_rechercher_02:></label>
+	<input type="text" class="text" size="10" name="recherche" id="recherche"[ value="(#ENV{recherche})"] accesskey="4" />
+	<input type="submit" class="submit" value="&gt;&gt;" title="<:info_rechercher:>" />
+</div></form>
+</div>
diff --git a/squelettes-dist/formulaires/recherche.php b/squelettes-dist/formulaires/recherche.php
new file mode 100644
index 0000000000000000000000000000000000000000..fff9eabf862dbdd79791cdf93f5319653367e169
--- /dev/null
+++ b/squelettes-dist/formulaires/recherche.php
@@ -0,0 +1,31 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// chargement des valeurs par defaut des champs du formulaire
+function formulaires_recherche_charger_dist($lien_filtre = NULL,$lien_arg = NULL){
+	$lien = $lien_filtre ? $lien_filtre : $lien_arg;
+	if ($GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site'])
+		$lang = $GLOBALS['spip_lang'];
+	else
+		$lang='';
+
+	return 
+		array(
+			'action' => ($lien ? $lien : generer_url_public('recherche')), # action specifique, ne passe pas par Verifier, ni Traiter
+			'recherche' => _request('recherche'),
+			'lang' => $lang
+		);
+}
+
+?>
diff --git a/squelettes-dist/formulaires/signature.html b/squelettes-dist/formulaires/signature.html
new file mode 100644
index 0000000000000000000000000000000000000000..dcfb85e18fbd94d18a15d0ed39dedf998cff028e
--- /dev/null
+++ b/squelettes-dist/formulaires/signature.html
@@ -0,0 +1,66 @@
+<div class="formulaire_spip formulaire_signature ajax" id="sp#ENV{id_article}">
+
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok,#ENV*{_confirm}|affiche_reponse_confirmation})</p>]
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+[(#ENV{editable})
+<form method="post" action="#ENV{action}#sp#ENV{id_article}">
+	#ACTION_FORMULAIRE{#ENV{action}}
+	
+	<input type="hidden" name="url_page" value="[(#SELF|url_absolue)]" />
+	[<fieldset>
+		<legend><:info_descriptif:></legend>
+		<div class='explication'>(#ENV*{_texte}|propre)</div>
+	</fieldset>]
+	<fieldset>
+		<legend><:form_forum_identifiants:></legend>
+		<ul>
+			<li class='saisie_nom_email[ (#ENV*{erreurs}|table_valeur{session_nom}|oui)erreur] obligatoire'>
+				<label for="session_nom"><:form_pet_votre_nom:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{session_nom})</span>]
+				<input type="text" class="text" name="session_nom" id="session_nom" value="#ENV{session_nom}" size="30" />
+			</li>
+			<li class='saisie_adresse_email[ (#ENV*{erreurs}|table_valeur{session_email}|oui)erreur] obligatoire'>
+				<label for="session_email"><:form_pet_votre_email:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{session_email})</span>]
+				<input type="text" class="text" name="session_email" id="session_email" value="#ENV{session_email}" size="30" />
+			</li>
+		</ul>
+	</fieldset>
+	<fieldset>
+		<legend><:info_lien_hypertexte:></legend>
+		[<p class='explication'>(#ENV{site_obli})<:form_pet_votre_site:></p>]
+		<ul>
+			<li class='saisie_signature_nom_site[ (#ENV*{erreurs}|table_valeur{signature_nom_site}|oui)erreur][(#ENV{site_obli})obligatoire]'>
+				<label for="signature_nom_site"><:form_pet_nom_site2:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{signature_nom_site})</span>]
+				<input type="text" class="text" name="signature_nom_site" id="signature_nom_site" value="#ENV{signature_nom_site}" size="30" />
+			</li>
+				<li class='saisie_signature_url_site[ (#ENV*{erreurs}|table_valeur{signature_url_site}|oui)erreur][(#ENV{site_obli})obligatoire]'>
+				<label for="signature_url_site"><:form_pet_adresse_site:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{signature_url_site})</span>]
+				<input type="text" class="text" name="signature_url_site" id="signature_url_site" value="#ENV{signature_url_site}" size="30" />
+			</li>
+		</ul>
+	</fieldset>
+
+	[(#REM) Piege a robots spammeurs ]
+	<p style="display: none;">
+		<label for="nobot"><:antispam_champ_vide:></label>
+		<input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" />
+	</p>
+
+	[(#ENV{_message})
+	<fieldset>
+		<legend><:form_pet_message_commentaire:></legend>
+		<ul>
+			<li class='saisie_message'>
+				<label for="message"><:info_texte_message:></label>
+				<textarea name="message" id="message" rows="6" cols="60">#ENV{message}</textarea>
+			</li>
+		</ul>
+	</fieldset>]
+
+	<p class="boutons"><input type="submit" class="submit" value="<:bouton_valider:>" /></p>
+</form>
+]
+</div>
\ No newline at end of file
diff --git a/squelettes-dist/formulaires/signature.php b/squelettes-dist/formulaires/signature.php
new file mode 100644
index 0000000000000000000000000000000000000000..786d18aefef8de6dbf1fed48aa2e5866a231e83b
--- /dev/null
+++ b/squelettes-dist/formulaires/signature.php
@@ -0,0 +1,384 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function formulaires_signature_charger_dist($id_article, $petition, $texte, $site_obli, $message) {
+	$valeurs = array(
+		'id_article' => $id_article,
+		'session_nom' => sinon($GLOBALS['visiteur_session']['session_nom'],
+			$GLOBALS['visiteur_session']['nom']),
+		'session_email'=> sinon($GLOBALS['visiteur_session']['session_email'],
+			$GLOBALS['visiteur_session']['email']),
+		'signature_nom_site'=>'',
+		'signature_url_site'=>'http://',
+		'_texte'=>$petition,
+		'_message'=>$message,
+		'message'=>'',
+		'site_obli' => $site_obli,
+		'debut_signatures'=>'' // pour le nettoyer de l'url d'action !
+		);
+
+	if ($c = _request('var_confirm')) {
+		$valeurs['_confirm'] = $c;
+		$valeurs['editable'] = false;
+	}
+	return $valeurs;
+}
+function affiche_reponse_confirmation($confirm) {
+	$reponse_confirmation = charger_fonction('reponse_confirmation','formulaires/signature/');
+	return $reponse_confirmation($confirm);  # calculee plus tot: assembler.php
+}
+
+function formulaires_signature_verifier_dist($id_article, $petition, $texte, $site_obli, $message) {
+	$erreurs = array();
+	$oblis = array('session_email','session_email');
+
+	if ($site_obli){
+		$oblis[] = 'signature_nom_site';
+		$oblis[] = 'signature_url_site';
+		set_request('signature_url_site', vider_url(_request('signature_url_site')));
+	}
+	foreach ($oblis as $obli)
+		if (!_request($obli))
+			$erreurs[$obli] = _T('info_obligatoire');
+	
+	if ($nom = _request('session_nom') AND strlen($nom) < 2)
+		$erreurs['nom_email'] =  _T('form_indiquer_nom');
+
+	include_spip('inc/filtres');
+	if (($mail=_request('session_email')) == _T('info_mail_fournisseur'))
+		$erreurs['adresse_email'] = _T('form_indiquer');
+	elseif ($mail AND !email_valide($mail)) 
+		$erreurs['adresse_email'] = _T('form_email_non_valide');
+	elseif (strlen(_request('nobot'))
+		OR (@preg_match_all(',\bhref=[\'"]?http,i', // bug PHP
+				    $message 
+				    # ,  PREG_PATTERN_ORDER
+				   )
+		    >2)) {
+		#$envoyer_mail = charger_fonction('envoyer_mail','inc');
+		#envoyer_mail('email_moderateur@example.tld', 'spam intercepte', var_export($_POST,1));
+		$erreurs['message_erreur'] = _T('form_pet_probleme_liens');
+	}
+	if ($site_obli){
+		if (!vider_url($url_site = _request('signature_url_site'))) {
+			$erreurs['signature_url_site'] = _T('form_indiquer_nom_site');
+		}
+		elseif (!count($erreurs)) {
+			include_spip('inc/distant');
+			if (!recuperer_page($url_site, false, true, 0))
+				$erreurs['signature_url_site'] = _T('form_pet_url_invalide');
+		}
+	}
+	
+	if (!count($erreurs)){
+		// tout le monde est la.
+		include_spip('base/abstract_sql');
+		$row = sql_fetsel('*', 'spip_petitions', "id_article=".intval($id_article));
+
+		if (!$row) 
+			$erreurs['message_erreur'] = _T('form_pet_probleme_technique');
+		else {
+			$email_unique = $row['email_unique']  == "oui";
+			$site_unique = $row['site_unique']  == "oui";
+		
+			// Refuser si deja signe par le mail ou le site quand demande
+			// Il y a un acces concurrent potentiel,
+			// mais ca n'est qu'un cas particulier de qq n'ayant jamais confirme'.
+			// On traite donc le probleme a la confirmation.
+		
+			if ($email_unique) {
+				$r = sql_countsel('spip_signatures', "id_article=$id_article AND ad_email=" . sql_quote($mail) . " AND statut='publie'");
+				if ($r)	$erreurs['message_erreur'] =  _T('form_pet_deja_signe');
+			}
+		
+			if ($site_unique) {
+				$r = sql_countsel('spip_signatures', "id_article=$id_article AND url_site=" . sql_quote($url_site) . " AND (statut='publie' OR statut='poubelle')");
+				if ($r)	$erreurs['message_erreur'] = _T('form_pet_site_deja_enregistre');
+			}
+		}
+	}
+
+	return $erreurs;
+}
+
+function formulaires_signature_traiter_dist($id_article, $petition, $texte, $site_obli, $message) {
+	$reponse = _T('form_pet_probleme_technique');
+	include_spip('base/abstract_sql');
+	if (spip_connect()) {
+		$controler_signature = charger_fonction('controler_signature', 'inc');
+		$reponse = $controler_signature($id_article,
+		_request('session_nom'), _request('session_email'),
+		_request('message'), _request('signature_nom_site'),
+		_request('signature_url_site'), _request('url_page'));
+	}
+
+	return array('message_ok'=>$reponse);
+}
+
+// Retour a l'ecran du lien de confirmation d'une signature de petition.
+// Si var_confirm est non vide, c'est l'appel dans public/assembler.php
+// pour vider le cache au demarrage afin que la nouvelle signature apparaisse.
+// Sinon, c'est l'execution du formulaire et on retourne le message 
+// de confirmation ou d'erreur construit lors de l'appel par assembler.php
+// Le controle d'unicite du mail ou du site (si requis) refait ici correspond
+// au cas de mails de demande de confirmation laisses sans reponse
+
+// http://doc.spip.org/@reponse_confirmation_dist
+function formulaires_signature_reponse_confirmation_dist($var_confirm = '') {
+	static $confirm = null;
+
+	// reponse mise en cache dans la session ?
+	$code_message = 'signature_message_'.strval($var_confirm);
+	if (isset($GLOBALS['visiteur_session'][$code_message]))
+		return $GLOBALS['visiteur_session'][$code_message];
+
+	// reponse deja calculee depuis public/assembler.php
+	if (isset($confirm))
+		return $confirm;
+
+	if ($var_confirm == 'publie' OR $var_confirm == 'poubelle')
+		return '';
+
+	if (!spip_connect()) {
+		$confirm = _T('form_pet_probleme_technique');
+		return '';
+	}
+	include_spip('inc/texte');
+	include_spip('inc/filtres');
+
+	// Suppression d'une signature par un moderateur ?
+	// Cf. plugin notifications
+	if (isset($_GET['refus'])) {
+		// verifier validite de la cle de suppression
+		// l'id_signature est dans var_confirm
+		include_spip('inc/securiser_action');
+		if ($id_signature = intval($var_confirm)
+		    AND (
+			$_GET['refus'] == _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere')
+				OR
+			$_GET['refus'] == _action_auteur("supprimer signature $id_signature", '', '', 'alea_ephemere_ancien')
+			)) {
+			sql_updateq("spip_signatures", array("statut" => 'poubelle'), "id_signature=$id_signature");
+			$confirm = _T('info_signature_supprimee');
+		} else $confirm = _T('info_signature_supprimee_erreur');
+		return '';
+	}
+
+	$row = sql_fetsel('*', 'spip_signatures', "statut=" . sql_quote($var_confirm), '', "1");
+
+	if (!$row) {
+		$confirm = _T('form_pet_aucune_signature');
+		return '';
+	}
+
+	$id_signature = $row['id_signature'];
+	$id_article = $row['id_article'];
+	$adresse_email = $row['ad_email'];
+	$url_site = $row['url_site'];
+
+	$row = sql_fetsel('email_unique, site_unique', 'spip_petitions', "id_article=$id_article");
+
+	$email_unique = $row['email_unique']  == "oui";
+	$site_unique = $row['site_unique']  == "oui";
+
+	sql_updateq('spip_signatures',
+		    array('statut' => 'publie', 'date_time' => 'NOW()'),
+		    "id_signature=$id_signature");
+
+	if ($email_unique) {
+
+		$r = "id_article=$id_article AND ad_email=" . sql_quote($adresse_email);
+		if (signature_entrop($r))
+			  $confirm =  _T('form_pet_deja_signe');
+	} 
+
+	if ($site_unique) {
+		$r = "id_article=$id_article AND url_site=" . sql_quote($url_site);
+		if (signature_entrop($r))
+			$confirm = _T('form_pet_site_deja_enregistre');
+	}
+
+	include_spip('inc/session');
+
+	if (!$confirm) {
+		$confirm = _T('form_pet_signature_validee');
+
+		// noter dans la session que l'email est valide
+		// de facon a permettre de signer les prochaines
+		// petitions sans refaire un tour d'email
+		session_set('email_confirme', $adresse_email);
+
+		// invalider les pages ayant des boucles signatures
+		include_spip('inc/invalideur');
+		suivre_invalideur("id='varia/pet$id_article'");
+	}
+
+	// Conserver la reponse dans la session du visiteur
+	if ($confirm)
+		session_set($code_message, $confirm);
+}
+
+//
+// Recevabilite de la signature d'une petition
+// les controles devraient mantenant etre faits dans formulaires_signature_verifier()
+// 
+
+// http://doc.spip.org/@inc_controler_signature_dist
+function inc_controler_signature_dist($id_article, $nom, $mail, $message, $site, $url_site, $url_page) {
+
+	include_spip('inc/texte');
+	include_spip('inc/filtres');
+
+	// tout le monde est la.
+	// cela a ete verifie en amont, dans formulaires_signature_verifier()
+	if (!$row = sql_fetsel('*', 'spip_petitions', "id_article=$id_article"))
+		return _T('form_pet_probleme_technique');
+
+	$statut = "";
+	if (!$ret = signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url_site, $message, $lang, $statut))
+		return _T('form_pet_probleme_technique');
+
+	$id_signature = sql_insertq('spip_signatures', array(
+		'id_article' => $id_article,
+		'date_time' => 'NOW()',
+		'statut' => $statut,
+		'ad_email' => $mail,
+		'url_site' => $url_site));
+
+	if (!$id_signature) return _T('form_pet_probleme_technique');
+
+	include_spip('inc/modifier');
+	revision_signature($id_signature, array(
+		'nom_email' => $nom,
+		'ad_email' => $mail,
+		'message' => $message,
+		'nom_site' => $site,
+		'url_site' => $url_site
+	));
+
+	return $ret;
+}
+
+// http://doc.spip.org/@signature_a_confirmer
+function signature_a_confirmer($id_article, $url_page, $nom, $mail, $site, $url, $msg, $lang, &$statut)
+{
+
+	// Si on est deja connecte et que notre mail a ete valide d'une maniere
+	// ou d'une autre, on entre directement la signature dans la base, sans
+	// envoyer d'email. Sinon email de verification
+	if (
+		// Cas 1: on est loge et on signe avec son vrai email
+		(
+		isset($GLOBALS['visiteur_session']['statut'])
+		AND $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email']
+		AND strlen($GLOBALS['visiteur_session']['email'])
+		)
+
+		// Cas 2: on a deja signe une petition, et on conserve le meme email
+		OR (
+		isset($GLOBALS['visiteur_session']['email_confirme'])
+		AND $GLOBALS['visiteur_session']['session_email'] == $GLOBALS['visiteur_session']['email_confirme']
+		AND strlen($GLOBALS['visiteur_session']['session_email'])
+		)
+	) {
+		// Si on est en ajax on demande a reposter sans ajax, car il faut
+		// recharger toute la page pour afficher la signature
+		refuser_traiter_formulaire_ajax();
+
+		$statut = 'publie';
+		// invalider le cache !
+		include_spip('inc/invalideur');
+		suivre_invalideur("id='varia/pet$id_article'");
+
+		// message de reussite : en ajax, preciser qu'il faut recharger la page
+		// pour voir le resultat
+		return
+			_T('form_pet_signature_validee');
+	}
+
+
+	//
+	// Cas normal : envoi d'une demande de confirmation
+	//
+	$row = sql_fetsel('titre,lang', 'spip_articles', "id_article=$id_article");
+	$lang = lang_select($row['lang']);
+	$titre = textebrut(typo($row['titre']));
+	if ($lang) lang_select();
+
+	if (!strlen($statut))
+		$statut = signature_test_pass();
+
+	if ($lang != $GLOBALS['meta']['langue_site'])
+		  $url_page = parametre_url($url_page, "lang", $lang,'&');
+
+	$url_page = parametre_url($url_page, 'var_confirm', $statut, '&')
+	. "#sp$id_article";
+
+	$r = _T('form_pet_mail_confirmation',
+		 array('titre' => $titre,
+		       'nom_email' => $nom,
+		       'nom_site' => $site,
+		       'url_site' => $url, 
+		       'url' => $url_page,
+		       'message' => $msg));
+
+	$titre = _T('form_pet_confirmation')." ". $titre;
+	$envoyer_mail = charger_fonction('envoyer_mail','inc');
+	if ($envoyer_mail($mail,$titre, $r))
+		return _T('form_pet_envoi_mail_confirmation',array('email'=>$mail));
+
+	return false; # erreur d'envoi de l'email
+}
+
+// Pour eviter le recours a un verrou (qui bloque l'acces a la base),
+// on commence par inserer systematiquement la signature 
+// puis on demande toutes celles ayant la propriete devant etre unique
+// (mail ou site). S'il y en a plus qu'une on les retire sauf la premiere
+// En cas d'acces concurrents il y aura des requetes de retraits d'elements
+// deja detruits. Bizarre ?  C'est mieux que de bloquer!
+
+// http://doc.spip.org/@signature_entrop
+function signature_entrop($where)
+{
+	$where .= " AND statut='publie'";
+	$query = sql_select('id_signature', 'spip_signatures', $where,'',"date_time desc");
+	$n = sql_count($query);
+	if ($n>1) {
+		$entrop = array();
+		for ($i=$n-1;$i;$i--) {
+			$r = sql_fetch($query);
+			$entrop[]=$r['id_signature'];
+		}
+		sql_free($query);
+		$where .= " OR " . sql_in('id_signature', $entrop);
+	
+		sql_delete('spip_signatures', $where);
+	}
+
+	return $entrop;
+}
+
+// Creer un mot de passe aleatoire et verifier qu'il est unique
+// dans la table des signatures
+// http://doc.spip.org/@signature_test_pass
+function signature_test_pass() {
+	include_spip('inc/acces');
+	do {
+		$passw = creer_pass_aleatoire();
+	} while (sql_countsel('spip_signatures', "statut='$passw'") > 0);
+
+	return $passw;
+}
+
+?>
diff --git a/squelettes-dist/formulaires/site.html b/squelettes-dist/formulaires/site.html
new file mode 100644
index 0000000000000000000000000000000000000000..d7f00ca61b04db456fdea377f94bfe1ada6e4ade
--- /dev/null
+++ b/squelettes-dist/formulaires/site.html
@@ -0,0 +1,36 @@
+<div class="formulaire_spip formulaire_site ajax" id="formulaire_site">
+[<p class="reponse_formulaire reponse_formulaire_ok">(#ENV*{message_ok})</p>]
+[<p class="reponse_formulaire reponse_formulaire_erreur">(#ENV*{message_erreur})</p>]
+[(#ENV{editable})
+<form method="post" action="#ENV{action}">
+	#ACTION_FORMULAIRE{#ENV{action}}
+	<fieldset>
+		<legend><:info_site:></legend>
+		<p class='explication'><:proposer_site:></p>
+		<ul>
+			<li class='saisie_nom_site obligatoire[ (#ENV*{erreurs}|table_valeur{nom_site}|oui)erreur]'>
+				<label for="nom_site"><:form_prop_nom_site:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{nom_site})</span>]
+				<input type="text" class="text" name="nom_site" id="nom_site" value="#ENV{nom_site}" size="30" />
+			</li>
+			<li class='saisie_url_site[ (#ENV*{erreurs}|table_valeur{url_site}|oui)erreur]'>
+				<label for="url_site"><:form_prop_url_site:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{url_site})</span>]
+				<input type="text" class="text" name="url_site" id="url_site" value="#ENV{url_site}" size="30" />
+			</li>
+			<li class='saisie_description_site[ (#ENV*{erreurs}|table_valeur{description_site}|oui)erreur]'>
+				<label for="description_site"><:form_prop_description:></label>
+				[<span class="erreur_message">(#ENV*{erreurs}|table_valeur{description_site})</span>]
+				<textarea name="description_site" id="description_site" rows="6" cols="60">#ENV{description_site}</textarea>
+			</li>
+		</ul>
+	</fieldset>
+	[(#REM) Piege a robots spammeurs ]
+	<p style="display: none;">
+		<label for="nobot"><:antispam_champ_vide:></label>
+		<input type="text" class="text" name="nobot" id="nobot" value="#ENV{nobot}" size="10" />
+	</p>
+	<p class="boutons"><input type="submit" class="submit" value="<:bouton_valider:>" /></p>
+</form>
+]
+</div>
\ No newline at end of file
diff --git a/squelettes-dist/formulaires/site.php b/squelettes-dist/formulaires/site.php
new file mode 100644
index 0000000000000000000000000000000000000000..146390bca9b4bf2690d8f25d0dc74c7a7f20ab49
--- /dev/null
+++ b/squelettes-dist/formulaires/site.php
@@ -0,0 +1,64 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2010                                                *
+ *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
+ *                                                                         *
+ *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
+ *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+function formulaires_site_charger_dist($id_rubrique) {
+
+	return array('nom_site'=>'','url_site'=>'http://','description_site'=>'');
+}
+
+function formulaires_site_verifier_dist($id_rubrique){
+
+	$erreurs = array();
+	if (!$nom = _request('nom_site'))
+		$erreurs['nom_site'] = _T("info_obligatoire");
+	else {
+		if((strlen ($nom) < 2) OR (strlen(_request('nobot'))>0))
+			$erreurs['email_message_auteur'] = _T('form_prop_indiquer_nom_site');
+	}
+	if (!$url = _request('url_site'))
+		$erreurs['url_site'] = _T("info_obligatoire");
+
+	if (!count($erreurs)) {
+		// Tester l'URL du site
+		include_spip('inc/distant');
+		if (!recuperer_page($url))
+			$erreurs['url_site'] = _T('form_pet_url_invalide');
+	}
+	return $erreurs;
+}
+
+function formulaires_site_traiter_dist($id_rubrique){
+	$res = array('message_erreur'=>_T('titre_probleme_technique'));
+
+	$nom = _request('nom_site');
+	$url = _request('url_site');
+	$desc = _request('description_site');
+
+	include_spip('base/abstract_sql');
+	if ($id_syndic = sql_insertq('spip_syndic', array(
+		'nom_site' => $nom,
+		'url_site' => $url,
+		'id_rubrique' => $id_rubrique,
+		'id_secteur' => sql_getfetsel('id_secteur','spip_rubriques','id_rubrique='.sql_quote($id_rubrique)),
+		'descriptif' => $desc,
+		'date' => date('Y-m-d H:i:s'),
+		'date_syndic' => date('Y-m-d H:i:s'),
+		'statut' => 'prop',
+		'syndication' => 'non')))
+			  $res = array('message_ok' => _T('form_prop_enregistre'), 'id_syndic'=>$id_syndic);
+
+	return $res;
+}
+
+?>