diff --git a/dist/login.html b/dist/login.html
index 2284de275e9b5abbd5be0fe6767bed53a77cce0c..f0f1d852e2d6372ca042e70ef4f3a318153799e5 100644
--- a/dist/login.html
+++ b/dist/login.html
@@ -3,9 +3,6 @@
 	conserver cette page en memoire
 ]
 #CACHE{24 * 3600}
-#HTTP_HEADER{"Cache-Control: no-store, no-cache, must-revalidate"}
-#HTTP_HEADER{Pragma: no-cache}
-
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 <html dir="#LANG_DIR" lang="#LANG">
 <head>
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 7f8eabb2cd3dafb7ad9bdaa2d6e3cb415bae83ed..8c6c8c4a39a689df47e66963f05ddefcab4a7858 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -352,6 +352,9 @@ function self($root = false) {
 	// eviter les hacks
 	$url = htmlspecialchars($url);
 
+	// Si c'est vide, donner './'
+	$url = preg_replace(',^$,', './', $url);
+
 	return $url;
 }
 
diff --git a/ecrire/public/compilo-index.php b/ecrire/public/compilo-index.php
index dfe8c409c5cb970c1b3dd8f310db0c8ca2a7cb4a..e9755ac1d3f60e466696dad5f16002b35d9a9177 100644
--- a/ecrire/public/compilo-index.php
+++ b/ecrire/public/compilo-index.php
@@ -168,6 +168,11 @@ function calculer_balise($nom, $p) {
 		$f = $GLOBALS['balise_' . $nom . '_collecte'];
 		if (is_array($f)) {
 			$res = calculer_balise_dynamique($p, $nom, $f);
+
+			// ajouter un code particulier ?
+			if (function_exists('balise_' . $nom . '_traitement'))
+				$res = call_user_func('balise_' . $nom . '_traitement', $res);
+
 			if ($res !== NULL)
 				return $res;
 		}
@@ -241,10 +246,6 @@ function calculer_balise_dynamique($p, $nom, $l) {
 	$p->fonctions = array();
 	$p->param = array();
 
-	// Cas particulier de #FORMULAIRE_FORUM : inserer l'invalideur
-	if ($nom == 'FORMULAIRE_FORUM')
-		$p->code = code_invalideur_forums($p, $p->code);
-
 	return $p;
 }
 
diff --git a/formulaires/inc-formulaire_forum.php b/formulaires/inc-formulaire_forum.php
index 59dafec5ee88a12f8c9478117ec1db2e0fc9ab2b..5ae85b55f8f5c8184549f0b36ec02b03b4e5e58f 100644
--- a/formulaires/inc-formulaire_forum.php
+++ b/formulaires/inc-formulaire_forum.php
@@ -37,6 +37,11 @@ charger_generer_url();
 global $balise_FORMULAIRE_FORUM_collecte;
 $balise_FORMULAIRE_FORUM_collecte = array('id_rubrique', 'id_forum', 'id_article', 'id_breve', 'id_syndic', 'ajouter_mot', 'ajouter_groupe', 'afficher_texte');
 
+// Ajouter l'invalideur forums sur les pages contenant ce formulaire
+function balise_FORMULAIRE_FORUM_traitement($p) {
+	$p->code = code_invalideur_forums($p, $p->code);
+	return $p;
+}
 
 // verification des droits a faire du forum
 function balise_FORMULAIRE_FORUM_stat($args, $filtres) {
diff --git a/formulaires/inc-login_prive.php b/formulaires/inc-login_prive.php
index 83ad9b141ce3ed605df57b61b55a55be686a15e5..c45e7e4b08fd5ca46b6c796a7a64661ba2f4d8b8 100644
--- a/formulaires/inc-login_prive.php
+++ b/formulaires/inc-login_prive.php
@@ -24,13 +24,16 @@ $balise_LOGIN_PRIVE_collecte = array('url');
 #    programme une <boucle(AUTEURS)>[(#LOGIN_PRIVE{#LOGIN})]
 
 function balise_LOGIN_PRIVE_stat ($args, $filtres) {
-
-	return	array($args[1], ($filtres[0] ? $filtres[0] : $args[0]));
+	return array($args[1], ($filtres[0] ? $filtres[0] : $args[0]));
 }
 
 function balise_LOGIN_PRIVE_dyn($login, $cible) {
+	return login_explicite($login, $cible);
+}
 
-	return	login_explicite($login, $cible);
+function balise_LOGIN_PRIVE_traitement($p) {
+	return balise_LOGIN_PUBLIC_traitement($p);
 }
 
+
 ?>
diff --git a/formulaires/inc-login_public.php b/formulaires/inc-login_public.php
index daaefa2844715edaa5d1eaec73f974ca18955824..18a75737315c07fbb1f098e0b59be9dae1ba11f4 100644
--- a/formulaires/inc-login_public.php
+++ b/formulaires/inc-login_public.php
@@ -12,12 +12,6 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
 
-include_spip('inc/meta');
-include_spip('inc/session');
-include_spip('inc/filtres');
-include_spip('inc/logos');
-spip_connect();
-
 global $balise_LOGIN_PUBLIC_collecte;
 $balise_LOGIN_PUBLIC_collecte = array('url');
 
@@ -31,6 +25,17 @@ function balise_LOGIN_PUBLIC_stat ($args, $filtres) {
 	return array($filtres[0] ? $filtres[0] : $args[0], $args[1], $args[2]);
 }
 
+// Cette balise necessite les entetes "flag_dynamique"
+// (attention, ne fonctionnera pas en INCLURE)
+function balise_LOGIN_PUBLIC_traitement($p) {
+	$p->code = '\'<'
+		.'?php header("Cache-Control: no-store, no-cache, must-revalidate"); ?'
+		.'><'
+		.'?php header("Pragma: no-cache"); ?'
+		.'>\'.' . $p->code;
+	return $p;
+}
+
 function balise_LOGIN_PUBLIC_dyn($url, $login) {
 
 	if (!$url 		# pas d'url passee en filtre ou dans le contexte
@@ -58,14 +63,20 @@ function login_explicite($login, $cible) {
 	include_spip('inc/session');
 	verifier_visiteur();
 
-	if ($auteur_session AND 
+	// Si on est connecte, envoyer vers la destination
+	// sauf si on y est deja
+	if ($auteur_session AND
 	($auteur_session['statut']=='0minirezo'
 	OR $auteur_session['statut']=='1comite')) {
-		if (($cible != $action) && !headers_sent()
-		AND !$_GET['var_mode'])
-			redirige_par_entete($cible);
-		include_spip('inc/minipres');
-		return http_href($cible, _T('login_par_ici'));
+		if ($cible != $action) {
+			if (!headers_sent() AND !$_GET['var_mode'])
+				redirige_par_entete($cible);
+			else {
+				include_spip('inc/minipres');
+				return http_href($cible, _T('login_par_ici'));
+			}
+		} else
+			return ''; # on est arrive on bon endroit, et logue'...
 	}
 	return login_pour_tous($login ? $login : _request('var_login'), $cible, $action);
 }
@@ -137,11 +148,15 @@ function login_pour_tous($login, $cible, $action) {
 	if (_request('var_erreur') == 'pass')
 		$erreur = _T('login_erreur_pass');
 
+	// le formulaire utilise le filtre |chercher_logo si un id_auteur est la...
+	include_spip('inc/logos');
+
+	// Appeler le squelette formulaire_login
 	return array('formulaire_login', $GLOBALS['delais'],
 		array_merge(
 				array_map('texte_script', $row),
 				array(
-				      'action2' => ($login ? $pose_cookie: $action),
+					'action2' => ($login ? $pose_cookie: $action),
 					'erreur' => $erreur,
 					'action' => $action,
 					'url' => $cible,