diff --git a/ecrire/inc_admin_vider.php b/ecrire/inc_admin_vider.php
index 3c70e9739fdd112ade4f7b80b72399c8c7828868..39a2ed8c5f94f999130b632089ad3ffe061420e8 100644
--- a/ecrire/inc_admin_vider.php
+++ b/ecrire/inc_admin_vider.php
@@ -113,7 +113,7 @@ if ($quota_cache) {
   "\n<input type='hidden' name='id_auteur' value='$connect_id_auteur' />", 
   "\n<input type='hidden' name='hash' value='$hash' />", 
   "\n<input type='hidden' name='redirect' value='",
-  generer_url_ecrire(_DIR_RESTREINT_ABS . "admin_vider"),
+  generer_url_ecrire("admin_vider"),
   "' />", 
   "\n<p><div align='right'><input class='fondo' type='submit' value=\"",
   str_replace('"', '&quot;', _T('bouton_vider_cache')),
@@ -146,7 +146,7 @@ if ($quota_cache) {
    "\n<input type='hidden' name='id_auteur' value='$connect_id_auteur' />",
    "\n<input type='hidden' name='hash' value='$hash' />",
    "\n<input type='hidden' name='redirect' value='",
-   generer_url_ecrire(_DIR_RESTREINT_ABS . "admin_vider"),
+   generer_url_ecrire("admin_vider"),
    "' />", 
    "\n<p><DIV align='right'><input class='fondo' type='submit'  value=\"",
    str_replace('"', '&quot;', _T('bouton_vider_cache')),
diff --git a/ecrire/inc_auteurs_edit.php b/ecrire/inc_auteurs_edit.php
index e62b2b16e4041f80fd6c3d80e784545140cea39a..e492b2fd59af9d2167d7067e27102149531bffd9 100644
--- a/ecrire/inc_auteurs_edit.php
+++ b/ecrire/inc_auteurs_edit.php
@@ -104,9 +104,7 @@ function table_auteurs_edit($auteur)
 
 	// Afficher le formulaire de changement de statut (cf. inc_acces)
 	if ($options == 'avancees')
-	  afficher_formulaire_statut_auteur ($id_auteur,
-			$auteur['statut'],
-			"auteurs_edit");
+	  afficher_formulaire_statut_auteur ($id_auteur, $auteur['statut'], "auteurs_edit");
 
 	fin_cadre_relief();
 
diff --git a/ecrire/inc_debug_sql.php3 b/ecrire/inc_debug_sql.php3
index b067d96ec910fad84eb501732884619315686f45..708cf172f50746b0b16e2f1292e33da7b1745cac 100644
--- a/ecrire/inc_debug_sql.php3
+++ b/ecrire/inc_debug_sql.php3
@@ -82,7 +82,7 @@ function erreur_requete_boucle($query, $id_boucle, $type, $errno, $erreur) {
 		. _T('info_erreur_systeme', array('errsys'=>$errno))
 		. "</blink><br />\n<b>"
 		. _T('info_erreur_systeme2',
-			array('script' => generer_url_ecrire(_DIR_RESTREINT_ABS . 'admin_repair'))) 
+			array('script' => generer_url_ecrire('admin_repair'))) 
 		. '</b><br />';
 		spip_log("Erreur systeme $errno");
 	}
diff --git a/ecrire/inc_mail.php3 b/ecrire/inc_mail.php3
index 07b3c253f5d4d341559b9df6d4659b8e1d02dd2d..91114a49aa76e79ca19de1ddf13a5081bd794491 100644
--- a/ecrire/inc_mail.php3
+++ b/ecrire/inc_mail.php3
@@ -188,7 +188,8 @@ function extrait_article($row) {
 	$extrait .= "\n\n".textebrut(propre(couper_intro("$chapo<p>$texte", 700)))."\n\n";
 	if ($statut == 'publie') 
 		$extrait .= "-> ".
-		  generer_url_public('spip_action.php', "action=redirect&id_article=$id_article") .
+		  // surtout pas de &amp; dans ce cas la.
+		  generer_url_public('spip_action.php') . "?action=redirect&id_article=$id_article" .
 		  "\n\n";
 	return $extrait;
 }
@@ -255,10 +256,7 @@ function envoyer_mail_proposition($id_article) {
 				     ."\n" 
 				     . _T('info_propose_5')
 				     ."\n" 
-				     . generer_url_ecrire($adresse_site 
-							 . '/' 
-							 . _DIR_RESTREINT_ABS 
-							 . "articles",
+				     . generer_url_ecrire("articles",
 							 "id_article=$id_article")
 				     . "\n\n\n" 
 				     . extrait_article($row));
diff --git a/ecrire/inc_minipres.php b/ecrire/inc_minipres.php
index 88d94db4c5c6a84cfb7a66db6eca97a0a09e92df..bf78014651d19442768a72cdb6961c7e10f5a964 100644
--- a/ecrire/inc_minipres.php
+++ b/ecrire/inc_minipres.php
@@ -34,7 +34,7 @@ function install_debut_html($titre = 'AUTO') {
 	  $titre,
 	  "</title>\n" ,
 	  '<link rel="stylesheet" type="text/css" href=\'' ,
-	  generer_url_ecrire(_DIR_RESTREINT . 'spip_style', 
+	  generer_url_ecrire('spip_style', 
 			  "couleur_claire=" .
 			  urlencode('#FFCC66') .
 			  '&couleur_foncee=' .
@@ -76,7 +76,7 @@ function aide($aide='') {
 	if (!$aide OR $spip_display == 4) return;
 
 	return "&nbsp;&nbsp;<a class='aide' href='" 
-		. generer_url_ecrire(_DIR_RESTREINT . "aide_index", 
+		. generer_url_ecrire("aide_index", 
 			"aide=$aide&var_lang=$spip_lang")
 		. "' target=\"spip_aide\" "
 		. "onclick=\"javascript:window.open(this.href,"
@@ -94,7 +94,7 @@ function info_copyright() {
 	echo _T('info_copyright', 
 		   array('spip' => "<b>SPIP $spip_version_affichee</b> ",
 			 'lien_gpl' => 
-			 "<a href='". generer_url_ecrire(_DIR_RESTREINT . "aide_index", "aide=licence&var_lang=$spip_lang") . "' target='spip_aide' onClick=\"javascript:window.open(this.href, 'aide_spip', 'scrollbars=yes,resizable=yes,width=740,height=580'); return false;\">" . _T('info_copyright_gpl')."</a>"));
+			 "<a href='". generer_url_ecrire("aide_index", "aide=licence&var_lang=$spip_lang") . "' target='spip_aide' onClick=\"javascript:window.open(this.href, 'aide_spip', 'scrollbars=yes,resizable=yes,width=740,height=580'); return false;\">" . _T('info_copyright_gpl')."</a>"));
 
 }
 
diff --git a/ecrire/inc_presentation.php3 b/ecrire/inc_presentation.php3
index 5262d86105737328174fa361600e25cccbd9657d..0e0ad63b5c60dd5a99f5a11f17d0b7a9f24c0596 100644
--- a/ecrire/inc_presentation.php3
+++ b/ecrire/inc_presentation.php3
@@ -1798,7 +1798,7 @@ function envoi_link($nom_site_spip, $rubrique="")
 
 	return $res .
 	  '<link rel="stylesheet" type="text/css" href=\'' .
-	  generer_url_ecrire(_DIR_RESTREINT . 'spip_style',
+	  generer_url_ecrire('spip_style',
 			  "couleur_claire=" .
 			  urlencode($couleur_claire) .
 			  '&couleur_foncee=' .
diff --git a/ecrire/inc_rss.php3 b/ecrire/inc_rss.php3
index be2dc5ae748c483a2d7fa826d5149f5eeb051c2a..bd71313e6378c6c27534dbbfc57ff49c526382c6 100644
--- a/ecrire/inc_rss.php3
+++ b/ecrire/inc_rss.php3
@@ -206,8 +206,7 @@ function rss_suivi_forums($a, $query_forum='', $lien_moderation=false) {
 		$item['email'] = $t['email_auteur'];
 
 		if ($lien_moderation)
-		  $item['url'] = generer_url_ecrire(_DIR_RESTREINT_ABS
-						   .'controle_forum', 'page='.$a['page']
+		  $item['url'] = generer_url_ecrire('controle_forum', 'page='.$a['page']
 						   .'&debut_id_forum='.$t['id_forum']);
 		else
 			$item['url'] = generer_url_forum($t['id_forum']);
@@ -252,8 +251,7 @@ function rss_suivi_messagerie($a) {
 				'author' => typo($auteur['nom']),
 				'email' => $auteur['email'],
 				'description' => propre($t['texte']),
-				'url' => generer_url_ecrire(_DIR_RESTREINT_ABS
-							   .'message', 'id_message='.$t['id_message']
+				'url' => generer_url_ecrire('message', 'id_message='.$t['id_message']
 							   ));
 			$rss[] = $item;
 		}
@@ -273,8 +271,7 @@ function rss_suivi_messagerie($a) {
 				'description' => propre($t['texte']),
 				'author' => typo($t['auteur']),
 				'email' => $t['email_auteur'],
-				'url' => generer_url_ecrire(_DIR_RESTREINT_ABS
-							   .'message', 'id_message='.$t['id_message']
+				'url' => generer_url_ecrire('message', 'id_message='.$t['id_message']
 					.'#'.$t['id_forum']
 							   ));
 			$rss[] = $item;
@@ -310,8 +307,7 @@ function rss_articles($critere) {
 			'author' => typo($auteur['nom']),
 			'email' => $auteur['email'],
 			'description' => propre(couper("{{".$t['chapo']."}}\n\n".$t['texte'],300)),
-			'url' => generer_url_ecrire(_DIR_RESTREINT_ABS
-						   .'articles', 'id_article='.$t['id_article']
+			'url' => generer_url_ecrire('articles', 'id_article='.$t['id_article']
 						   ));
 		if ($t['statut'] == 'prop')
 		  $item['title'] = _T('info_article_propose').' : '.$item['title'];
@@ -331,8 +327,7 @@ function rss_breves($critere) {
 			'title' => typo($t['titre']),
 			'date' => $t['date_heure'],
 			'description' => propre(couper($t['texte'],300)),
-			'url' => generer_url_ecrire(_DIR_RESTREINT_ABS
-						   .'breves_voir', 'id_breve='.$t['id_breve']
+			'url' => generer_url_ecrire('breves_voir', 'id_breve='.$t['id_breve']
 						   ));
 		if ($t['statut'] == 'prop')
 			$item['title'] = _T('titre_breve_proposee').' : '.$item['title'];
@@ -352,8 +347,7 @@ function rss_sites($critere) {
 			'title' => typo($t['titre']." ".$t['url_site']),
 			'date' => $t['date'],
 			'description' => propre(couper($t['texte'],300)),
-			'url' => generer_url_ecrire(_DIR_RESTREINT_ABS
-						   .'sites', 'id_syndic='.$t['id_syndic']
+			'url' => generer_url_ecrire('sites', 'id_syndic='.$t['id_syndic']
 						   ));
 		if ($t['statut'] == 'prop')
 			$item['title'] = _T('info_site_attente').' : '.$item['title'];
@@ -430,7 +424,7 @@ switch($op) {
 		$critere = critere_statut_controle_forum($a['page']);
 		$rss = rss_suivi_forums($a, $critere, true);
 		$title = _T("ecrire:titre_page_forum_suivi")." (".$a['page'].")";
-		$url = generer_url_ecrire(_DIR_RESTREINT_ABS .'controle_forum', 'page='.$a['page']);
+		$url = generer_url_ecrire('controle_forum', 'page='.$a['page']);
 		break;
 	# revisions des articles
 	case 'revisions':
@@ -439,13 +433,13 @@ switch($op) {
 		$url = "";
 		foreach (array('id_secteur', 'id_auteur', 'lang_choisie') as $var)
 			if ($a[$var]) $url.= $var.'='.$a[$var] . '&';
-		$url = generer_url_ecrire(_DIR_RESTREINT_ABS .'suivi_revisions', $url);
+		$url = generer_url_ecrire('suivi_revisions', $url);
 		break;
 	# messagerie privee
 	case 'messagerie':
 		$rss = rss_suivi_messagerie($a);
 		$title = _T("icone_messagerie_personnelle");
-		$url = generer_url_ecrire(_DIR_RESTREINT_ABS .'messagerie');
+		$url = generer_url_ecrire('messagerie');
 		break;
 	# a suivre
 	case 'a-suivre':
diff --git a/ecrire/inc_spip_action_test_dirs.php b/ecrire/inc_spip_action_test_dirs.php
index 53b33e611806a88792c059dcdb1030f4b86e15c4..4cc616d0cb19a9e07270b408b8eb2c6059157704 100644
--- a/ecrire/inc_spip_action_test_dirs.php
+++ b/ecrire/inc_spip_action_test_dirs.php
@@ -105,7 +105,7 @@ if ($bad_dirs OR $absent_dirs) {
 
  } else {
 	if (!_FILE_CONNECT)
-		header("Location: " . generer_url_ecrire(_DIR_RESTREINT_ABS . "install",  "etape=1"));
+		header("Location: " . generer_url_ecrire("install",  "etape=1"));
 	else
 		header("Location: " . _DIR_RESTREINT_ABS);
  }
diff --git a/ecrire/inc_suivi_revisions.php b/ecrire/inc_suivi_revisions.php
index b13441db02ef5295db2ceea0bdcb906c9dfcf073..0b8bef9e831638119fcdc8c66ea655c2b65adccb 100644
--- a/ecrire/inc_suivi_revisions.php
+++ b/ecrire/inc_suivi_revisions.php
@@ -236,7 +236,7 @@ function afficher_suivi_versions ($debut = 0, $id_secteur = 0, $id_auteur = fals
 			} else {
 				$item = array(
 					'title' => $titre,
-					'url' => generer_url_ecrire($GLOBALS['meta']['adresse_site'].'/'._DIR_RESTREINT_ABS."articles_versions","id_article=$id_article&id_version=$id_version"),
+					'url' => generer_url_ecrire("articles_versions","id_article=$id_article&id_version=$id_version"),
 					'date' => $date,
 					'author' => $nom,
 					'email' => $email
diff --git a/ecrire/inc_utils.php b/ecrire/inc_utils.php
index 8b8173d7b924524eb74e64956913a9ff82208716..2175d985056d9e35c6828451b00274dfb4b24da0 100644
--- a/ecrire/inc_utils.php
+++ b/ecrire/inc_utils.php
@@ -20,7 +20,7 @@ $included_files = array();
 
 function include_local($file, $silence=false) {
 	$nom = preg_replace("/\.php[3]?$/",'', $file);
-#	spip_log("$nom $file");
+#	spip_log("'$nom' '$file'");
 	if (@$GLOBALS['included_files'][$nom]++) return;
 	if (is_readable($f = $nom . '.php'))
 	  include($f);
@@ -614,9 +614,12 @@ function charger_generer_url() {
 // entre les scripts ecrire/*.php[3] et le script generique ecrire/index.php
 
 function generer_url_ecrire($script, $args="", $retour="", $retour_args="") {
-	return $script .
-		(ereg('.php[3]?$', $script) ? '' :_EXTENSION_PHP) .
-		(!$args ? "" : ('?'  .str_replace('&', '&amp;', $args))) .
+	$site = $GLOBALS['meta']["adresse_site"];
+	$site .= ((substr($site, -1) <> '/') ? '/' : '') . _DIR_RESTREINT_ABS;
+	$args = str_replace('&', '&amp;', $args);
+	$ext =  (ereg('.php[3]?$', $script) ? '' :_EXTENSION_PHP).($args ? '?' : "");
+
+	return $site . $script . $ext . $args .
 		(!$retour ? "" : 
 		urlencode($retour . _EXTENSION_PHP .
 			  (!$retour_args ? "" : ('?' . $retour_args))));
@@ -626,11 +629,13 @@ function generer_url_ecrire($script, $args="", $retour="", $retour_args="") {
 // il faudra substituer a l'appel ci-dessous la definition ci-dessus
 // lorsque celle-ci deviendra generique
 
-function generer_url_public($script, $args="", $retour="", $retour_args="") {
+function generer_url_public($script, $args="") {
 	if (!($site = $GLOBALS['meta']["adresse_site"]))
 		$site = _DIR_RACINE;
 	$site .= (($site[strlen($site)-1] <> '/') ?'/':'') . $script;
-	return generer_url_ecrire($site, $args, $retour, $retour_args);
+	return $site . 
+	  (ereg('.php[3]?$', $script) ? '' :_EXTENSION_PHP) .
+	  (!$args ? "" : ('?'  .str_replace('&', '&amp;', $args)));
 }
 
 ?>
diff --git a/formulaires/inc-formulaire_admin.php3 b/formulaires/inc-formulaire_admin.php3
index 5b4d737852b6b017f37b8f2241cff45fd562f7b0..6f387e935b3ce1c510c396c7301861aa3178a43a 100644
--- a/formulaires/inc-formulaire_admin.php3
+++ b/formulaires/inc-formulaire_admin.php3
@@ -152,12 +152,12 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 			'id_breve' => $id_breve,
 			'id_mot' => $id_mot,
 			'id_syndic' => $id_syndic,
-			'voir_article' => generer_url_ecrire(_DIR_RESTREINT_ABS . 'articles', "id_article=$id_article"),
-			'voir_breve' => generer_url_ecrire(_DIR_RESTREINT_ABS . 'breves_voir', "id_breve=$id_breve"),
-			'voir_rubrique' => generer_url_ecrire(_DIR_RESTREINT_ABS . 'naviguer', "id_rubrique=$id_rubrique"),
-			'voir_mot' => generer_url_ecrire(_DIR_RESTREINT_ABS . 'mots_edit', "id_mot=$id_mot"),
-			'voir_site' => generer_url_ecrire(_DIR_RESTREINT_ABS . 'sites', "id_syndic=$id_syndic"),
-			'voir_auteur' => generer_url_ecrire(_DIR_RESTREINT_ABS . 'auteurs_edit', "id_auteur=$id_auteur"),
+			'voir_article' => generer_url_ecrire('articles', "id_article=$id_article"),
+			'voir_breve' => generer_url_ecrire('breves_voir', "id_breve=$id_breve"),
+			'voir_rubrique' => generer_url_ecrire('naviguer', "id_rubrique=$id_rubrique"),
+			'voir_mot' => generer_url_ecrire('mots_edit', "id_mot=$id_mot"),
+			'voir_site' => generer_url_ecrire('sites', "id_syndic=$id_syndic"),
+			'voir_auteur' => generer_url_ecrire('auteurs_edit', "id_auteur=$id_auteur"),
 			'ecrire' => $ecrire,
 			'action' => $action,
 			'preview' => $preview,