diff --git a/ecrire/balise/formulaire_admin.php b/ecrire/balise/formulaire_admin.php
index 22caea822445ee307e41cb016089b263f0ed8705..f8f35c8e50df50392971cf063f283339643bdd41 100644
--- a/ecrire/balise/formulaire_admin.php
+++ b/ecrire/balise/formulaire_admin.php
@@ -156,7 +156,7 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 	// Preparer le #ENV des boutons
 	$env = array(
 		'ecrire' => $ecrire,
-		'action' => self(),
+		'action' => self('&'),
 		'divclass' => $float,
 		'lang' => $lang,
 		'calcul' => (_request('var_mode') ? 'recalcul' : 'calcul'),
diff --git a/ecrire/balise/formulaire_inscription.php b/ecrire/balise/formulaire_inscription.php
index 782b089c27f4e24871a7c5f5423ad55fd5bcedfd..906188070b51054dfd170015c5452411e2121b53 100644
--- a/ecrire/balise/formulaire_inscription.php
+++ b/ecrire/balise/formulaire_inscription.php
@@ -78,7 +78,9 @@ function balise_FORMULAIRE_INSCRIPTION_dyn($mode, $focus, $id=0) {
 				'commentaire' => $commentaire,
 				'nom_inscription' => _request('nom_inscription'),
 				'mail_inscription' => _request('mail_inscription'),
-				'self' => str_replace('&','&',(self()))));
+				'self' => self('&')
+			)
+		);
 }
 
 // http://doc.spip.org/@test_mode_inscription
diff --git a/ecrire/balise/formulaire_site.php b/ecrire/balise/formulaire_site.php
index 0d88f15089746a22b935e19f53a3decec9964196..a697bda0c47c7aabe55bb3ace2f4ebf29c6d3269 100644
--- a/ecrire/balise/formulaire_site.php
+++ b/ecrire/balise/formulaire_site.php
@@ -62,7 +62,7 @@ function balise_FORMULAIRE_SITE_dyn($id_rubrique) {
 
 	return array('formulaires/site', $GLOBALS['delais'],
 		array(
-			'self' => str_replace('&', '&', self()),
+			'self' => self('&'),
 			'message_ok' => $message_ok,
 			'message_erreur' => $message_erreur,
 			'nom_site' => $nom,
diff --git a/ecrire/balise/login_public.php b/ecrire/balise/login_public.php
index 1d14c52b00f4ea37b42cea09d5a5bdb661e8373b..9cca3625e18bb7d988f02821b485aff859088194 100644
--- a/ecrire/balise/login_public.php
+++ b/ecrire/balise/login_public.php
@@ -172,7 +172,7 @@ function login_pour_tous($login, $cible, $action) {
 					'echec_visiteur' => $echec_visiteur,
 					'login' => $login,
 					'login_alt' => (isset($login_alt) ? $login_alt : $login),
-					'self' => str_replace('&', '&', self()),
+					'self' => self('&'),
 					'rester_connecte' => $rester_connecte
 					)
 				)
diff --git a/ecrire/balise/menu_lang_ecrire.php b/ecrire/balise/menu_lang_ecrire.php
index 5f630de55c18a0f37c3326c9b34eb76fdd725503..a880a50a6868bad33c37a447be89d7584f7c07b1 100644
--- a/ecrire/balise/menu_lang_ecrire.php
+++ b/ecrire/balise/menu_lang_ecrire.php
@@ -52,7 +52,8 @@ function menu_lang_pour_tous($nom, $default) {
 	if (!$opt)
 		return '';
 
-	$cible = str_replace('&', '&', parametre_url(self( /* racine */ true), 'lang' , '')); # lien a partir de /
+	# lien a partir de /
+	$cible = parametre_url(self('&', /* racine */ true), 'lang' , '', '&');
 	$post = generer_url_action('converser', 'redirect='. rawurlencode($cible), '&');
 
 	return array('formulaires/menu_lang',
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index e3d652c4363adcd4cb549f9bd5b947b83a612e08..c5f3a4ff38fd1933e000befc99f90b6eca1db762 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1027,7 +1027,7 @@ function agenda_affiche($i)
 	$sinon = array_shift($args);
 	$type = array_shift($args);
 	if (!$nb){ 
-		return http_calendrier_init('', ($type != 'periode') ? $type : 'mois', '', '', str_replace('&', '&', self()), $sinon);
+		return http_calendrier_init('', ($type != 'periode') ? $type : 'mois', '', '', self('&'), $sinon);
 	}	
 	$agenda = agenda_memo(0);
 	$evt = array();
@@ -1058,7 +1058,7 @@ function agenda_affiche($i)
 		$evt = array('', $evt, $min, $max);
 		$type = 'mois';
 	}
-	return http_calendrier_init($start, $type, '', '', str_replace('&', '&', self()), $evt);
+	return http_calendrier_init($start, $type, '', '', self('&'), $evt);
 }
 
 //
diff --git a/ecrire/inc/forum.php b/ecrire/inc/forum.php
index 06411a4bf1a5f3e956fa0cce92ca26805f25de96..78ba0699ed65a414833cc3502512e153aa442960 100644
--- a/ecrire/inc/forum.php
+++ b/ecrire/inc/forum.php
@@ -120,7 +120,7 @@ function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref
 			return;
 	}
 
-	$lien = str_replace('&', '&', self()) . "#id$id_forum";
+	$lien = self('&') . "#id$id_forum";
 	$boutons ='';
 	if ($suppression)
 	  $boutons .= icone_inline(_T('icone_supprimer_message'), generer_action_auteur('instituer_forum',"$id_forum-$suppression", _DIR_RESTREINT_ABS . $lien),
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 3d1ad11b13ec590a59fe56b079fee910426329d0..f3af945afb822f27a3b14c11658b05aa22f30cb0 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -443,7 +443,7 @@ function nettoyer_uri() {
 // les trucs inutiles
 //
 // http://doc.spip.org/@self
-function self($root = false) {
+function self($amp = '&', $root = false) {
 	$url = nettoyer_uri();
 	if (!$root)
 		$url = preg_replace(',^[^?]*/,', '', $url);
@@ -465,6 +465,10 @@ function self($root = false) {
 	// eviter les hacks
 	$url = htmlspecialchars($url);
 
+	// & ?
+	if ($amp != '&')
+		$url = str_replace('&', $amp, $url);
+
 	// Si c'est vide, donner './'
 	$url = preg_replace(',^$,', './', $url);
 
diff --git a/ecrire/public.php b/ecrire/public.php
index e17ef8f403bbacae7f81e7de778626990fd0bf52..bd2a66ab396c2636fd8ae6830bfda98f34412356 100644
--- a/ecrire/public.php
+++ b/ecrire/public.php
@@ -123,8 +123,7 @@ if (defined('_INC_PUBLIC')) {
 
 	if ($var_preview AND $html) {
 		include_spip('inc/minipres'); // pour http_img_pack
-		$x = _T('previsualisation');
-		$page['texte'] .= '<div class="spip_large" style="
+		$x = '<div class="spip_large" style="
 		display: block;
 		color: #eeeeee;
 		background-color: #111111;
@@ -135,8 +134,11 @@ if (defined('_INC_PUBLIC')) {
 		left: 0px;
 		position: absolute;
 		">' 
-		. http_img_pack('naviguer-site.png', $x, '')
-		. '&nbsp;' . majuscules($x) . '</div>';
+		. http_img_pack('naviguer-site.png', _T('previsualisation'), '')
+		. '&nbsp;' . majuscules(_T('previsualisation')) . '</div>';
+		if (!$pos = strpos($page['texte'], '</body>'))
+			$pos = strlen($page['texte']);
+		$page['texte'] = substr_replace($page['texte'], $x, $pos, 0);
 	}
 
 	// est-on admin ?
diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php
index 3089b1a84dc302130bcba7f526b3cbf92afa2f0b..11e08e6e9ddfbe1f4a966f9e05cb993f72e8209f 100644
--- a/ecrire/public/balises.php
+++ b/ecrire/public/balises.php
@@ -908,7 +908,7 @@ function balise_PARAMETRES_FORUM_dist($p) {
 // http://www.spip.net/@self
 // http://doc.spip.org/@balise_SELF_dist
 function balise_SELF_dist($p) {
-	$p->code = 'quote_amp(self())';
+	$p->code = 'self()';
 	$p->interdire_scripts = false;
 	return $p;
 }