diff --git a/.gitattributes b/.gitattributes
index ceea1bfe8bd41ed51c48edbfabffd100d7968e9f..2c912b2c0337bc7b2e187b86c78b4765d2eab963 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -91,7 +91,6 @@ ecrire/action/logout.php -text
 ecrire/action/petitionner.php -text
 ecrire/action/poster_forum_prive.php -text
 ecrire/action/purger.php -text
-ecrire/action/redirect.php -text
 ecrire/action/referencer_traduction.php -text
 ecrire/action/regler_moderation.php -text
 ecrire/action/reorganiser.php -text
diff --git a/dist/forum.html b/dist/forum.html
index e183c8d689572665c1fbb74f6bdea289b1c4dd3b..0a5008b92c433e0b468e38008f9a062059fc37b5 100644
--- a/dist/forum.html
+++ b/dist/forum.html
@@ -45,7 +45,7 @@
             <BOUCLE_ariane_site(HIERARCHIE) {id_rubrique}>
             &gt; <a href="#URL_RUBRIQUE">[(#TITRE|couper{80})]</a>
             </BOUCLE_ariane_site>
-            &gt; <a href="[(#ID_SYNDIC|generer_url_site)]">[(#TITRE|couper{80})]</a>
+            &gt; <a href="[(#ID_SYNDIC|generer_url_entite{'site'})]">[(#TITRE|couper{80})]</a>
             </BOUCLE_contexte_site>
     
             <//B_contexte_site>
@@ -94,7 +94,7 @@
             </BOUCLE_rubrique>
             
             <BOUCLE_syndic(SITES) {id_syndic}>
-            <h3><a href="[(#ID_SYNDIC|generer_url_site)]">#NOM_SITE</a></h3>
+            <h3><a href="[(#ID_SYNDIC|generer_url_entite{'site'})]">#NOM_SITE</a></h3>
             [<div class="texte">(#DESCRIPTIF)</div>]
             </BOUCLE_syndic>
             
diff --git a/dist/mot.html b/dist/mot.html
index b29709ca6db673b20ccb1e0d8a1c7e2c87aad459..b340f6b914ab113f3fa8754bad3cfe934cc0d186 100644
--- a/dist/mot.html
+++ b/dist/mot.html
@@ -86,9 +86,9 @@
         <div class="menu">
             <h2><:sites_web:></h2>
             <ul>
-                <BOUCLE_sites(SITES) {id_mot} {par nom_site}>
-                <li><a href="[(#ID_SYNDIC|generer_url_site)]">#NOM_SITE</a></li>
-                </BOUCLE_sites>
+                <BOUCLE_sites(SITES) {id_mot} {par nom_site}><li>
+		<a href="[(#ID_SYNDIC|generer_url_entite{site})]">#NOM_SITE</a>
+		</li></BOUCLE_sites>
             </ul>
         </div>
         </B_sites>
diff --git a/dist/plan.html b/dist/plan.html
index 06abb76c3049436944cdbea2d8f3854b9e897850..c7d302e831c0db14bd8969a715670a1ea7eaeb26 100644
--- a/dist/plan.html
+++ b/dist/plan.html
@@ -72,9 +72,9 @@
         <B_sites>
         <h3><:sites_web:></h3>
         <ul>
-            <BOUCLE_sites(SITES) {id_secteur} {par nom_site}>
-            <li><a href="[(#ID_SYNDIC|generer_url_site)]">#NOM_SITE</a></li>
-            </BOUCLE_sites>
+            <BOUCLE_sites(SITES) {id_secteur} {par nom_site}><li>
+		<a href="[(#ID_SYNDIC|generer_url_entite{site})]">#NOM_SITE</a>
+	    </li></BOUCLE_sites>
         </ul>
         </B_sites>
         
diff --git a/dist/recherche.html b/dist/recherche.html
index e98a351d45170c5788e9a2bbbd621037c175735d..b0c8e0917f92982baa8565dc664c27a80dbc4bdc 100644
--- a/dist/recherche.html
+++ b/dist/recherche.html
@@ -100,9 +100,9 @@
 			#ANCRE_PAGINATION
 			<h2><:sites_web:> (#GRAND_TOTAL)</h2>
 			<ul>
-				<BOUCLE_sites(SITES) {recherche} {par points}{inverse} {pagination 5}>
-				<li><a href="[(#ID_SYNDIC|generer_url_site)]">#NOM_SITE</a></li>
-				</BOUCLE_sites>
+				<BOUCLE_sites(SITES) {recherche} {par points}{inverse} {pagination 5}><li>
+		<a href="[(#ID_SYNDIC|generer_url_entite{site})]">#NOM_SITE</a>
+			</li></BOUCLE_sites>
 			</ul>
 			[<p class="pagination">(#PAGINATION)</p>]
 		</div>
diff --git a/dist/rubrique.html b/dist/rubrique.html
index 55e0504ddf656a0c97255a7d9a98718cb57bfec9..b1908e8269b44a0b6bf87a0f054dc9c19f9e80c3 100644
--- a/dist/rubrique.html
+++ b/dist/rubrique.html
@@ -120,7 +120,7 @@ href="[(#URL_PAGE{backend})]<BOUCLE_URLMOT(MOTS){id_rubrique}>&amp;id_mot[]=#ID_
             <h2><:sur_web:></h2>
             <ul>
                 <BOUCLE_sites(SITES) {id_rubrique} {par nom_site}>
-                <li><a href="[(#ID_SYNDIC|generer_url_site)]">#NOM_SITE</a>
+                <li><a href="[(#ID_SYNDIC|generer_url_entite{site})]">#NOM_SITE</a>
                     <B_syndic>
                     <ul>
                         <BOUCLE_syndic(SYNDIC_ARTICLES) {id_syndic} {age<180} {par date}{inverse} {0,3}>
diff --git a/dist/site.html b/dist/site.html
index 71b2f09ae00f701c8616f9a993cf793e9defa1c9..67357ce1e57809f0dd17967421192d41daa3b6c2 100644
--- a/dist/site.html
+++ b/dist/site.html
@@ -75,7 +75,7 @@
             <h2><:sites_web:></h2>
             <ul>
                 <BOUCLE_sites(SITES) {par nom_site} {pagination 20}>
-                <li><a href="[(#ID_SYNDIC|generer_url_site)]"[ class="(#EXPOSE)"]>#NOM_SITE</a></li>
+                <li><a href="[(#ID_SYNDIC|generer_url_entite{site})]"[ class="(#EXPOSE)"]>#NOM_SITE</a></li>
                 </BOUCLE_sites>
             </ul>
             [<p class="pagination">(#PAGINATION)</p>]
diff --git a/ecrire/action/editer_signatures.php b/ecrire/action/editer_signatures.php
index ac451cf462a590007275765cbd3d341d1b377c05..3fc4f1d6349d452dc0925701a0abfda3bf591353 100644
--- a/ecrire/action/editer_signatures.php
+++ b/ecrire/action/editer_signatures.php
@@ -44,9 +44,8 @@ function action_editer_signatures_post($r)
 			include_spip('balise/formulaire_signature');
 			include_spip('inc/texte');
 			
-			charger_generer_url();
 			$id_article = $row['id_article'];
-			$url = $GLOBALS['meta']['adresse_site'] . '/' . generer_url_article($id_article);
+			$url = $GLOBALS['meta']['adresse_site'] . '/' . generer_url_entite($id_article, 'article');
 			if (signature_a_confirmer($id_article, $url, $row['nom_email'], $row['ad_email'], $row['nom_site'], $row['url_site'], $row['message'], $row['lang'], $row['statut']))
 				sql_update("spip_signatures", array("date_time" => 'NOW()'), "id_signature=$id");
 			$id = 0;
@@ -57,8 +56,7 @@ function action_editer_signatures_post($r)
 	// Invalider les pages ayant trait aux petitions
 	if ($id) {
 		include_spip('inc/invalideur');
-		$id_article = sql_fetsel("id_article", "spip_signatures", "id_signature=$id");
-		$id_article = $id_article['id_article'];
+		$id_article = sql_getfetsel("id_article", "spip_signatures", "id_signature=$id");
 		suivre_invalideur("id='varia/pet$id_article'");
 	}
 
diff --git a/ecrire/action/redirect.php b/ecrire/action/redirect.php
deleted file mode 100644
index 092ffaafbfc54de1b2457599f08db44b0a302d98..0000000000000000000000000000000000000000
--- a/ecrire/action/redirect.php
+++ /dev/null
@@ -1,73 +0,0 @@
-<?php
-
-/***************************************************************************\
- *  SPIP, Systeme de publication pour l'internet                           *
- *                                                                         *
- *  Copyright (c) 2001-2008                                                *
- *  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.   *
-\***************************************************************************/
-
-// pour rediriger vers l'URL canonique de l'article,
-// en indiquant recalcul et previsu
-
-if (!defined("_ECRIRE_INC_VERSION")) return;
-
-// http://doc.spip.org/@action_redirect_dist
-function action_redirect_dist()
-{
-	global $redirect;
-	$redirect = _request('redirect');
-
-	$suite ='';
-	if ($mode = _request('var_mode')) $suite = "var_mode=$mode";
-	if ($connect = _request('connect')) {
-		$suite .= ($suite ? '&' : '') . "connect=$connect";
-		$GLOBALS['type_urls'] = 'propres';
-	}
-
-	#charger les url du public
-	charger_generer_url(false);
-
-	if ($id_article = intval(_request('id_article'))) {
-		$r = generer_url_article($id_article,$suite,_request('ancre'));
-	}
-	else if ($id_breve = intval(_request('id_breve'))) {
-		$r = generer_url_breve($id_breve,$suite,_request('ancre'));
-	}
-	else if ($id_forum = intval(_request('id_forum'))) {
-		$r = generer_url_forum($id_forum,$suite,_request('ancre'));
-	}
-	else if ($id_rubrique = intval(_request('id_rubrique'))) {
-		$r = generer_url_rubrique($id_rubrique,$suite,_request('ancre'));
-	}
-	else if ($id_mot = intval(_request('id_mot'))) {
-		$r = generer_url_mot($id_mot,$suite,_request('ancre'));
-	}
-	else if ($id_auteur = intval(_request('id_auteur'))) {
-		$r = generer_url_auteur($id_auteur,$suite,_request('ancre'));
-	}
-	else if ($id_syndic = intval(_request('id_syndic')) OR $id_syndic = intval(_request('id_site'))) {
-		$r = generer_url_site($id_syndic,$suite,_request('ancre'));
-	}
-	
-// Ne pas masquer cette eventuelle erreur (aide a detecter des lignes vides
-// dans inc-urls ou mes_fonctions/mes_options)
-	else $redirect = _DIR_RESTREINT;
-	
-	// si c'est un url calcule, on l'encode car spip va ensuite le decoder
-	// avant de faire le header(location)
-	if (isset($r))
-			$redirect = rawurlencode($r);
-
-// Compatibilite avec l'ancienne interface a un seul argument des generer_url_
-	if ($mode AND !strpos($redirect, 'var_mode')) {
-		$sep =  (strpos($redirect,'?') !== false) ? '&' : '?';
-		if (strpos($redirect,'#'))
-			$redirect = str_replace('#', "$sep$suite#", $redirect);
-		else $redirect .= "$sep$suite";
-	}
-}
-?>
diff --git a/ecrire/balise/formulaire_forum.php b/ecrire/balise/formulaire_forum.php
index d369bbc492cdf673578b3b008f2b891ca35986fd..83affcfc08b379c0555e6a0389a28f9c8f1a227c 100644
--- a/ecrire/balise/formulaire_forum.php
+++ b/ecrire/balise/formulaire_forum.php
@@ -15,10 +15,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return;	#securite
 include_spip('inc/acces');
 include_spip('inc/texte');
 include_spip('inc/forum');
-include_spip('base/abstract_sql');
-spip_connect();
-
-charger_generer_url();
 
 /*******************************/
 /* GESTION DU FORMULAIRE FORUM */
diff --git a/ecrire/balise/logo_.php b/ecrire/balise/logo_.php
index e7dcb76a64fc0b25e83a9c6bccc5316c57563bcd..b479e9c8f3546a7561a27aee986a3afe0bc64233 100644
--- a/ecrire/balise/logo_.php
+++ b/ecrire/balise/logo_.php
@@ -92,7 +92,7 @@ function balise_LOGO__dist ($p) {
 	// 1. filtre |lien
 
 	if ($flag_lien_auto AND !$lien)
-		$code_lien = '($lien = generer_url_'.$type_objet.'('.$_id_objet.')) ? $lien : ""';
+		$code_lien = '($lien = generer_url_entite('.$_id_objet . ',"' . $type_objet .'")) ? $lien : ""';
 	// 2. lien indique en clair (avec des balises : imprimer#ID_ARTICLE.html)
 	else if ($lien) {
 		$code_lien = "'".texte_script(trim($lien))."'";
diff --git a/ecrire/balise/url_.php b/ecrire/balise/url_.php
index fa8a2705e82649660cb532fdf41e63e330b950bb..9bae4465a9d692d7ccde13ab9619e63ae46960f1 100644
--- a/ecrire/balise/url_.php
+++ b/ecrire/balise/url_.php
@@ -12,17 +12,16 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
-// Les balises URL_$type sont generiques, sauf qq cas particuliers:
-// elles produisent un appel a generer_url_$type(id-courant)
-// grace a la fonction ci-dessous
+// Les balises URL_$type sont generiques, sauf qq cas particuliers.
 // Si ces balises sont utilisees pour la base locale,
-// producttion des appels aux fonctions generer_url parametrees par $type_urls
+// production des appels  a generer_url_entite(id-courant, type_urls)
 // Si la base est externe et non geree par SPIP
 // on retourne NULL pour provoquer leur interpretation comme champ SQL normal.
 // Si la base est externe et sous SPIP,
 // on produit l'URL de l'objet si c'est une piece jointe
 // ou sinon l'URL du site local applique sur l'objet externe
 // ce qui permet de le voir a travers les squelettes du site local
+// Pour bien faire, il faudrait recuperer le choix du type-url distant
 
 // http://doc.spip.org/@generer_generer_url
 function generer_generer_url($type, $p)
@@ -33,8 +32,8 @@ function generer_generer_url($type, $p)
 
 	if ($s = $p->id_boucle) $s = $p->boucles[$s]->sql_serveur;
 
-	if (!$s AND function_exists("generer_url_$type"))
-		return "generer_url_$type($_id)";
+	if (!$s)
+		return "generer_url_entite($_id, '$type')";
 	elseif (!$GLOBALS['connexions'][$s]['spip_connect_version']) {
 		return NULL;
 	} else {
diff --git a/ecrire/exec/articles_page.php b/ecrire/exec/articles_page.php
index 10a1495e22f5b2b9cceeb128422fb5eef5051787..e5ad7e433736656b4486c4541753127c183f3a8d 100644
--- a/ecrire/exec/articles_page.php
+++ b/ecrire/exec/articles_page.php
@@ -13,7 +13,6 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
-charger_generer_url();
 
 // http://doc.spip.org/@exec_articles_page_dist
 function exec_articles_page_dist()
diff --git a/ecrire/exec/breves.php b/ecrire/exec/breves.php
index c6b7279c459735f91d8e6435aad14bda40f7cbe0..125ce532599745975e79d52a6a0e5a00efc897cc 100644
--- a/ecrire/exec/breves.php
+++ b/ecrire/exec/breves.php
@@ -19,7 +19,6 @@ function exec_breves_dist()
 {
 	global  $spip_lang_left, $spip_lang_right;
 
-	charger_generer_url();
  	pipeline('exec_init',array('args'=>array('exec'=>'breves'),'data'=>''));
 	
 	$commencer_page = charger_fonction('commencer_page', 'inc');
diff --git a/ecrire/exec/controle_forum.php b/ecrire/exec/controle_forum.php
index b4bd5b96443ee03c668b7d9dc2535f33c45c3d2c..a284f6165c2f47cd66fcf233b8a1f7b7f94d8185 100644
--- a/ecrire/exec/controle_forum.php
+++ b/ecrire/exec/controle_forum.php
@@ -13,10 +13,8 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
-charger_generer_url();
 include_spip('inc/forum');
 
-
 // http://doc.spip.org/@forum_parent
 function forum_parent($id_forum) {
 	$row=sql_fetsel("*", "spip_forum", "id_forum=$id_forum AND statut != 'redac'");
@@ -43,7 +41,7 @@ function forum_parent($id_forum) {
 	  } else {
 	    $ancre = "forum$id_forum" ;
 	    return array('pref' =>  _T('lien_reponse_article'),
-			 'url' => generer_url_article($id_article,'',$ancre),
+			 'url' => generer_url_entite($id_article,'article', '',$ancre),
 			 'type' => 'id_article',
 			 'valeur' => $id_article,
 			 'titre' => $titre,
@@ -55,7 +53,7 @@ function forum_parent($id_forum) {
 	  $id_rubrique = $row['id_rubrique'];
 	  $titre = $row['titre'];
 	  return array('pref' => _T('lien_reponse_rubrique'),
-		       'url' => generer_url_rubrique($id_rubrique),
+		       'url' => generer_url_entite($id_rubrique,'rubrique'),
 		       'type' => 'id_rubrique',
 		       'valeur' => $id_rubrique,
 		       'titre' => $titre);
@@ -84,7 +82,7 @@ function forum_parent($id_forum) {
 			 'titre' => $titre);
 	  } else {
 	    return array('pref' => _T('lien_reponse_breve_2'),
-			 'url' => generer_url_breve($id_breve),
+			 'url' => generer_url_entite($id_breve, 'breve'),
 			 'type' => 'id_breve',
 			 'valeur' => $id_breve,
 			 'titre' => $titre);
diff --git a/ecrire/exec/controle_petition.php b/ecrire/exec/controle_petition.php
index 465c8a881e9f6a599f60e8c75ebda39d3dfb47e6..9f5d7c07e2fa8bb2c15330d98a985428f753c129 100644
--- a/ecrire/exec/controle_petition.php
+++ b/ecrire/exec/controle_petition.php
@@ -110,10 +110,9 @@ function controle_petition_page($id_article, $titre,  $ong, $statut, $corps)
 	echo bouton_spip_rss('signatures');
 
 	if ($id_article) {
+		$h = generer_url_entite($id_article,'article');
 		echo  "<a href='",
-			(($statut == 'publie') ? 
-			generer_url_action('redirect', "id_article=$id_article") :
-			generer_url_ecrire('articles', "id_article=$id_article")),
+			$h,
 			"'>",
 			typo($titre),
 			"</a>",
diff --git a/ecrire/exec/forum.php b/ecrire/exec/forum.php
index fe91a17f17a7112bb1fa469419ca708d87249838..e5163a5331b27a0ccba1d086f724dad915c5af85 100644
--- a/ecrire/exec/forum.php
+++ b/ecrire/exec/forum.php
@@ -13,7 +13,6 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
-charger_generer_url();
 
 // http://doc.spip.org/@exec_forum_dist
 function exec_forum_dist()
diff --git a/ecrire/exec/message.php b/ecrire/exec/message.php
index 0d532e3012b38ceae8064b45f5a09981637ed1f0..d72c661437631186bb7b244811a6a30b7520bbfe 100644
--- a/ecrire/exec/message.php
+++ b/ecrire/exec/message.php
@@ -13,7 +13,6 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/presentation');
-include_spip('base/abstract_sql');
 include_spip('inc/mots');
 
 // http://doc.spip.org/@exec_message_dist
@@ -41,7 +40,6 @@ function exec_message_args($id_message, $forcer_dest, $cherche_auteur)
 			include_spip('inc/headers');
 			redirige_par_entete(redirige_action_auteur("editer_message","$id_message/:$connect_id_auteur", 'message', "id_message=$id_message", true));
 		}
-		charger_generer_url();
 		exec_affiche_message_dist($id_message, $cherche_auteur, $forcer_dest);
 	}
 }
diff --git a/ecrire/inc/afficher_objets.php b/ecrire/inc/afficher_objets.php
index 23e9545effffd7e1591c58aac584af95d0993b3a..2d109bf96d5d0c0834e4456f0cb9cf9bfea7be7a 100644
--- a/ecrire/inc/afficher_objets.php
+++ b/ecrire/inc/afficher_objets.php
@@ -27,7 +27,7 @@ function lien_editer_objet($type,$key,$id){
 
 // http://doc.spip.org/@lien_voir_objet
 function lien_voir_objet($type,$key,$id){
-	if ($type == 'document') return generer_url_document($id);
+	if ($type == 'document') return generer_url_entite($id, 'document');
 	$exec = array('article'=>'articles','breve'=>'breves_voir','rubrique'=>'naviguer','mot'=>'mots_edit', 'signature'=>'controle_petition');
 	$exec = isset($exec[$type])?$exec[$type]:$type . "s";
 	return generer_url_ecrire($exec,"$key=$id");
diff --git a/ecrire/inc/agenda.php b/ecrire/inc/agenda.php
index 6a6e796e53841fb60883c9406625b1df5c2c6d9a..ed594890967f05d84d8a6d70602ddbb0c196cf39 100644
--- a/ecrire/inc/agenda.php
+++ b/ecrire/inc/agenda.php
@@ -14,7 +14,6 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 
 include_spip('inc/layer');
 include_spip('inc/texte'); // inclut inc_filtre 
-charger_generer_url();
 
 //  Typographie generale des calendriers de 3 type: jour/semaine/mois(ou plus)
 
@@ -1351,6 +1350,7 @@ function quete_calendrier_jour($annee,$mois,$jour) {
 
 // http://doc.spip.org/@quete_calendrier_interval
 function quete_calendrier_interval($limites) {
+	include_spip('inc/urls');
 	list($avant, $apres) = $limites;
 	$evt = array();
 	quete_calendrier_interval_articles($avant, $apres, $evt);
@@ -1369,7 +1369,7 @@ function  quete_calendrier_interval_forums($limites, &$evenements) {
 		if (autoriser('voir','forum',$id))
 			$evenements[$amj][]=
 			array(
-				'URL' => generer_url_forum($id),
+				'URL' => generer_url_entite('forum', $id),
 				'CATEGORIES' => 'calendrier-couleur7',
 				'SUMMARY' => $row['titre'],
 				'DTSTART' => date_ical($row['date_heure']));
diff --git a/ecrire/inc/documenter.php b/ecrire/inc/documenter.php
index 0d608dfa722d6141338b5cd57eb9ad90c951d561..0eee3119a4ad9d8e96049017f9abaca9af4c5685 100644
--- a/ecrire/inc/documenter.php
+++ b/ecrire/inc/documenter.php
@@ -75,7 +75,6 @@ function documenter_bloc($id, $res, $s, $script, $ancre, $tous, $type)
 // http://doc.spip.org/@documenter_boucle
 function documenter_boucle($documents, $type, $ancre, &$tous_autorises, $appelant, $opt=array())
 {
-	charger_generer_url();
 	// la derniere case d'une rangee
 	$bord_droit = ($ancre == 'portfolio' ? 2 : 1);
 	$case = 0;
diff --git a/ecrire/inc/documents.php b/ecrire/inc/documents.php
index eaaa62c63c9a231e358340c1ead05fedc3ed3a2c..1e614060ab47d0afb4afbf1dc66c2d6feb150171 100644
--- a/ecrire/inc/documents.php
+++ b/ecrire/inc/documents.php
@@ -339,7 +339,6 @@ function est_inclus($id_document) {
 function afficher_case_document($id_document, $id, $script, $type, $deplier=false) {
 	global $spip_lang_right;
 	
-	charger_generer_url();
 	$document = sql_fetsel("docs.id_document, docs.id_vignette,docs.extension,docs.titre,docs.descriptif,docs.fichier,docs.largeur,docs.hauteur,docs.taille,docs.mode,docs.distant, docs.date, L.vu", "spip_documents AS docs INNER JOIN spip_documents_liens AS L ON L.id_document=docs.id_document", "L.id_objet=".intval($id)." AND objet=".sql_quote($type)." AND L.id_document=".sql_quote($id_document));
 
 	if (!$document) return "";
@@ -348,7 +347,7 @@ function afficher_case_document($id_document, $id, $script, $type, $deplier=fals
 	$extension = $document['extension'];
 	$titre = $document['titre'];
 	$descriptif = $document['descriptif'];
-	$url = generer_url_document($id_document);
+	$url = generer_url_entite($id_document, 'document');
 	$fichier = $document['fichier'];
 	$largeur = $document['largeur'];
 	$hauteur = $document['hauteur'];
diff --git a/ecrire/inc/forum.php b/ecrire/inc/forum.php
index ec518218e494a48db52f60f7fd63f737d919f693..ce9ed5b4c58bd1fd33bc7a862df38f21e3bdd27a 100644
--- a/ecrire/inc/forum.php
+++ b/ecrire/inc/forum.php
@@ -319,7 +319,7 @@ function racine_forum($id_forum){
 	// On ne devrait jamais arriver ici, mais prevoir des cas de forums
 	// poses sur autre chose que les objets prevus...
 	spip_log("erreur racine_forum $id_forum");
-	return false;
+	return array();
 } 
 
 
@@ -327,32 +327,36 @@ function racine_forum($id_forum){
 function parent_forum($id_forum) {
 	if (!$id_forum = intval($id_forum)) return;
 	$row = sql_fetsel("id_parent, id_rubrique, id_article, id_breve, id_syndic", "spip_forum", "id_forum=".$id_forum);
-	if($row) {
-		if($row['id_parent']) return array('forum', $row['id_parent']);
-		if($row['id_rubrique']) return array('rubrique', $row['id_rubrique']);
-		if($row['id_article']) return array('article', $row['id_article']);
-		if($row['id_breve']) return array('breve', $row['id_breve']);
-		if($row['id_syndic']) return array('site', $row['id_syndic']);
-	}
+	if(!$row) return array();
+	if($row['id_parent']) return array('forum', $row['id_parent']);
+	if($row['id_article']) return array('article', $row['id_article']);
+	if($row['id_breve']) return array('breve', $row['id_breve']);
+	if($row['id_rubrique']) return array('rubrique', $row['id_rubrique']);
+	if($row['id_syndic']) return array('site', $row['id_syndic']);
 } 
 
 
 // http://doc.spip.org/@generer_url_forum_dist
 function generer_url_forum_dist($id_forum, $args='', $ancre='') {
-	if (!$id_forum) return '';
-	list($type, $id, $id_thread) = racine_forum($id_forum);
-	if (!$ancre) $ancre = "forum$id_forum";
-	if (function_exists($f = 'generer_url_'.$type))
-		return $f($id, $args, $ancre);
+	if ($id_forum = intval($id_forum)) {
+		list($type, $id,) = racine_forum($id_forum);
+		if ($type) {
+			if (!$ancre) $ancre = "forum$id_forum";
+			return generer_url_entite($id, $type, $args, $ancre);
+		}
+	}
+	return '';
 }
 
 
 // http://doc.spip.org/@generer_url_forum_parent
 function generer_url_forum_parent($id_forum) {
-	if (!$id_forum = intval($id_forum)) return;
-	list($type, $id) = parent_forum($id_forum);
-	if (function_exists($f = 'generer_url_'.$type))
-		return $f($id);
+	if ($id_forum = intval($id_forum)) {
+		list($type, $id) = parent_forum($id_forum);
+		if ($type)
+			return generer_url_entite($id, $type);
+	}
+	return '';
 } 
 
 
diff --git a/ecrire/inc/forum_insert.php b/ecrire/inc/forum_insert.php
index e37c82df77384c0206c5c00d766bb37df7a893cd..f9e0abe827067e194ef9fad35756b77be5255843 100644
--- a/ecrire/inc/forum_insert.php
+++ b/ecrire/inc/forum_insert.php
@@ -13,16 +13,12 @@
 if (!defined("_ECRIRE_INC_VERSION")) return;
 include_spip('inc/forum');
 include_spip('inc/filtres');
-include_spip('base/abstract_sql');
 include_spip('inc/actions');
 
-spip_connect();
-
 // Ce fichier est inclus lorsqu'on appelle un script de l'espace public
 // avec une variable d'URL nommee confirmer_forum
 // Voir commentaires dans balise/formulaire_forum
 
-
 // http://doc.spip.org/@controler_forum_abo
 function controler_forum_abo($retour)
 {
@@ -107,17 +103,16 @@ function inc_forum_insert_dist($force_statut = NULL) {
 	# retour a calculer (cf. inc-formulaire_forum)
 	if ($retour_forum == '!') {
 		// on calcule a priori l'adresse de retour {en cas d'echec du POST}
-		charger_generer_url(_DIR_RACINE !== '');
 		if ($id_forum>0)
-			$retour_forum = generer_url_forum($id_forum);
+			$retour_forum = generer_url_entite($id_forum, 'forum');
 		elseif ($id_article)
-			$retour_forum = generer_url_article($id_article);
+			$retour_forum = generer_url_entite($id_article, 'article');
 		elseif ($id_breve)
-			$retour_forum = generer_url_breve($id_breve);
+			$retour_forum = generer_url_entite($id_breve, 'breve');
 		elseif ($id_syndic)
-			$retour_forum = generer_url_site($id_syndic);
+			$retour_forum = generer_url_entite($id_syndic, 'site');
 		elseif ($id_rubrique) # toujours en dernier
-			$retour_forum = generer_url_rubrique($id_rubrique);
+			$retour_forum = generer_url_entite($id_rubrique, 'rubrique');
 		$retour_forum = str_replace('&amp;','&',$retour_forum);
 
 		// mais la veritable adresse de retour sera calculee apres insertion
@@ -237,7 +232,6 @@ function inc_forum_insert_dist($force_statut = NULL) {
 	// dans le cas des forums moderes a posteriori, ce qui n'est
 	// pas plus mal.
 
-	charger_generer_url();
-	return generer_url_forum($id_message);
+	return generer_url_entite($id_message, 'forum');
 }
 ?>
diff --git a/ecrire/inc/lien.php b/ecrire/inc/lien.php
index a48aaf33e10c42069abf6aa791eb4c53a58b7c10..cbb871d04a20301841688a6f62411b8a7f55a867 100644
--- a/ecrire/inc/lien.php
+++ b/ecrire/inc/lien.php
@@ -12,6 +12,11 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return;
 
+// Calcul des raccourcis
+// Idealement generer_url_entite delegue au jeu 'type_urls' qui les gere
+// Par souci de compatibilite on teste toujours l'existence des fonctions
+// generer_url_<RACCOURCI> et generer_url_<RACCOURCI>_dist
+
 // http://doc.spip.org/@inc_lien_dist
 function inc_lien_dist($type,$id,$args,$ancre,$texte='',$pour='url',$connect='') {
 	if ($connect) {
@@ -20,12 +25,12 @@ function inc_lien_dist($type,$id,$args,$ancre,$texte='',$pour='url',$connect='')
 		. "?"._SPIP_PAGE."=$type&$id_type=$id&connect=$connect"
 		. (!$args ? '' : "&$args");
 	} else {
-		charger_generer_url();
 		$g = 'generer_url_' . $type;
 		if (function_exists($g) OR function_exists($g .= '_dist')) 
-				$res = $g($id, $args, $ancre);
-		
-		if (!$res) return false;
+			$g = $g($id, $args, $ancre);
+		if (!$g) $g = generer_url_entite($id, $type, $args, $ancre);
+		if (!$g) return false;
+		$res = $g;
 	}
 	if ($pour == 'url') return array($res);
 	$g = 'calculer_url_' . $type;
diff --git a/ecrire/inc/notifications.php b/ecrire/inc/notifications.php
index b5b392eef2317428413cfdf89ff6677702d56153..09315a05e55e74efe69c9dd502b760b010ada0b5 100644
--- a/ecrire/inc/notifications.php
+++ b/ecrire/inc/notifications.php
@@ -92,9 +92,7 @@ function notifier_publication_article($id_article) {
 
 			$l = lang_select($row['lang']);
 
-			// URL de l'article
-			charger_generer_url(false);
-			$url = url_absolue(_DIR_RACINE.generer_url_article($id_article, '','', 'publie'));
+			$url = url_absolue(_DIR_RACINE.generer_url_entite($id_article, 'article'));
 
 			$titre = nettoyer_titre_email($row['titre']);
 
@@ -156,47 +154,47 @@ function email_notification_forum ($t, $email) {
 	if (NULL !== ($l = sql_getfetsel('lang', 'spip_auteurs', "email=" . sql_quote($email))))
 		$l = lang_select($l);
 
-
-	charger_generer_url();
+	$url = '';
+	$id_forum = $t['id_forum'];
 
 	if ($t['statut'] == 'prop') # forum modere
 	{
-		$url = generer_url_ecrire('controle_forum', "debut_id_forum=".$t['id_forum']);
+		$url = generer_url_ecrire('controle_forum', "debut_id_forum=".$id_forum);
 	}
 	else if ($t['statut'] == 'prive') # forum prive
 	{
 		if ($t['id_article'])
-			$url = generer_url_ecrire('articles', 'id_article='.$t['id_article']).'#id'.$t['id_forum'];
+			$url = generer_url_ecrire('articles', 'id_article='.$t['id_article']).'#id'.$id_forum;
 		else if ($t['id_breve'])
-			$url = generer_url_ecrire('breves_voir', 'id_breve='.$t['id_breve']).'#id'.$t['id_forum'];
+			$url = generer_url_ecrire('breves_voir', 'id_breve='.$t['id_breve']).'#id'.$id_forum;
 		else if ($t['id_syndic'])
-			$url = generer_url_ecrire('sites', 'id_syndic='.$t['id_syndic']).'#id'.$t['id_forum'];
+			$url = generer_url_ecrire('sites', 'id_syndic='.$t['id_syndic']).'#id'.$id_forum;
 	}
 	else if ($t['statut'] == 'privrac') # forum general
 	{
-		$url = generer_url_ecrire('forum').'#id'.$t['id_forum'];
+		$url = generer_url_ecrire('forum').'#id'.$id_forum;
 	}
 	else if ($t['statut'] == 'privadm') # forum des admins
 	{
-		$url = generer_url_ecrire('forum_admin').'#id'.$t['id_forum'];
-	}
-	else if (function_exists('generer_url_forum')) {
-		$url = generer_url_forum($t['id_forum']);
+		$url = generer_url_ecrire('forum_admin').'#id'.$id_forum;
 	} else {
-		spip_log('inc-urls personnalise : ajoutez generer_url_forum() !');
 		if ($t['id_article'])
-			$url = generer_url_article($t['id_article']).'#'.$t['id_forum'];
-		else
-			$url = './';
-	}
+			$url = generer_url_entite($t['id_article'], 'article','', 'id'.$id_forum);
+		else if ($t['id_breve'])
+			$url = generer_url_entite($t['id_breve'], 'breve', '', 'id'.$id_forum);
+		else if ($t['id_syndic'])
+			$url = generer_url_entite($t['id_syndic'], 'site', '', '#id'.$id_forum);
 
+	}
+	if (!$url) {
+		spip_log("forum $id_forum sans referent");
+		$url = './';
+	}
 	if ($t['id_article']) {
-		$article = sql_fetsel("titre", "spip_articles", "id_article=".sql_quote($t['id_article']));
-		$titre = textebrut(typo($article['titre']));
+		$titre = textebrut(typo(sql_getfetsel("titre", "spip_articles", "id_article=".sql_quote($t['id_article']))));
 	}
 	if ($t['id_message']) {
-		$message = sql_fetsel("titre", "spip_messages", "id_message=".sql_quote($t['id_message']));
-		$titre = textebrut(typo($message['titre']));
+		$titre = textebrut(typo(sql_getfetsel("titre", "spip_messages", "id_message=".sql_quote($t['id_message']))));
 	}
 
 	$sujet = "[" .
diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php
index 4b29169e254042b72111fccc4a49a45d82b875c7..8715cc79ee2ad5dc94a9efe8c442c33cb6b76ed7 100644
--- a/ecrire/inc/presentation.php
+++ b/ecrire/inc/presentation.php
@@ -1276,9 +1276,11 @@ function voir_en_ligne ($type, $id, $statut=false, $image='racine-24.gif', $af =
 	else
 		return '';
 
-	return
-		$inline ? icone_inline($message, generer_url_action('redirect', "id_$type=$id&var_mode=$en_ligne"), $image, "rien.gif", $GLOBALS['spip_lang_left'])		:
-		icone_horizontale($message, generer_url_action('redirect', "id_$type=$id&var_mode=$en_ligne"), $image, "rien.gif",$af);
+	$h = generer_url_entite($id, $type, "var_mode=$en_ligne", '', false);
+
+	return $inline  
+	  ? icone_inline($message, $h, $image, "rien.gif", $GLOBALS['spip_lang_left'])
+	: icone_horizontale($message, $h, $image, "rien.gif",$af);
 
 }
 
diff --git a/ecrire/inc/referenceurs.php b/ecrire/inc/referenceurs.php
index 8dc5a2fdca97a598600ebe3a869f5427e7caa85b..4b72b3ddec862a9532a337de9662f451943e2d2a 100644
--- a/ecrire/inc/referenceurs.php
+++ b/ecrire/inc/referenceurs.php
@@ -239,18 +239,19 @@ function stats_show_keywords($kw_referer, $kw_referer_host) {
 //
 // http://doc.spip.org/@referes
 function referes($referermd5, $serveur='') {
-	$refarts = sql_select('J2.id_article, J2.titre', 'spip_referers_articles AS J1 LEFT JOIN spip_articles AS J2 ON J1.id_article = J2.id_article', "(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(NOW(), INTERVAL 2 DAY))", '', "titre",'','',$serveur);
+	$retarts = sql_allfetsel('J2.id_article, J2.titre', 'spip_referers_articles AS J1 LEFT JOIN spip_articles AS J2 ON J1.id_article = J2.id_article', "(referer_md5='$referermd5' AND J1.maj>=DATE_SUB(NOW(), INTERVAL 2 DAY))", '', "titre",'','',$serveur);
 
-	$retarts = array();
-	while ($rowart = sql_fetch($refarts,$serveur)) {
-		$id_article = $rowart['id_article'];
-		$titre_article = $rowart['titre'];
-		$retarts[] = "<a href='".generer_url_article($id_article)."'><i>".typo($titre_article)."</i></a>";
+	foreach ($retarts as $k => $rowart) {
+		$titre = typo($rowart['titre']);
+		$url = generer_url_entite($rowart['id_article'], 'article');
+		$retarts[$k] = "<a href='$url'><i>$titre</i></a>";
 	}
-	$r = "";
-	if (count($retarts) > 1) $r = '<br />&rarr; '.join(',<br />&rarr; ',$retarts);
-	if (count($retarts) == 1) $r = '<br />&rarr; '.$retarts[0];
-	return $r;
+
+	if (count($retarts) > 1)
+		return '<br />&rarr; '.join(',<br />&rarr; ',$retarts);
+	if (count($retarts) == 1)
+		return '<br />&rarr; '. array_shift($retarts);
+	return '';
 }
 
 
diff --git a/ecrire/inc/signatures.php b/ecrire/inc/signatures.php
index f700ef0ec4e479ec919d2396e12b2ece6ade4826..9031a8fe720a78c805220289d70d950fc43cd724 100644
--- a/ecrire/inc/signatures.php
+++ b/ecrire/inc/signatures.php
@@ -15,12 +15,11 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // http://doc.spip.org/@message_de_signature
 function message_de_signature($row)
 {
-  return propre(echapper_tags($row['message']));
+	return propre(echapper_tags($row['message']));
 }
 
 // http://doc.spip.org/@inc_signatures_dist
 function inc_signatures_dist($script, $id, $debut, $pas, $where, $order, $type='') {
-	charger_generer_url();
 
 	if ($id) { 
 		$args = "id_article=$id&";
@@ -110,16 +109,14 @@ function signatures_edit($script, $id, $debut, $row, $type) {
 	$res .= message_de_signature($row);
 		
 	if (!$id) {
-		if ($r = sql_fetsel("titre, id_rubrique, statut", "spip_articles", "id_article=$id_article")) {
+		if ($r = sql_fetsel("titre, id_rubrique", "spip_articles", "id_article=$id_article")) {
 			$id_rubrique = $r['id_rubrique'];
-			$publie = ($r['statut'] == 'publie');
 			$titre_a = $r['titre'];
 			$titre_r = supprimer_numero(sql_getfetsel("titre", "spip_rubriques", "id_rubrique=$id_rubrique"));
 		        $href = generer_url_ecrire('naviguer', "id_rubrique=" . $id_rubrique);
+			$h2 = generer_url_entite($id_article, 'article','','',true);
 			$res .= "<br class='nettoyeur' /><a title='$id_article' href='"
-			  .  ($publie ? 
-			      generer_url_action('redirect', "id_article=$id_article") :
-			      generer_url_ecrire('articles', "id_article=$id_article"))
+			  . $h2
 			  . "'>"
 			  . typo($titre_a)
 			  . "</a><a style='float: $spip_lang_right; color: black; padding-$spip_lang_left: 4px;' href='$href' title='$id_rubrique'>"
diff --git a/ecrire/inc/tourner.php b/ecrire/inc/tourner.php
index 00da3308b9826ebba79f2cb0d691012b43a872b0..feeec6bb9870a68de5799f6c6ab35beca65537bd 100644
--- a/ecrire/inc/tourner.php
+++ b/ecrire/inc/tourner.php
@@ -37,8 +37,7 @@ function inc_tourner_dist($id_document, $document, $script, $flag, $type)
 	if (isset($document['url']))
 		$url = $document['url'];
 	else {
-		charger_generer_url();
-		$url = generer_url_document($id_document);
+		$url = generer_url_entite($id_document, 'document');
 	}
 
 	$res = '';
diff --git a/ecrire/inc/urls.php b/ecrire/inc/urls.php
index 7228d10fad1795c18e6b9d90ad9c349fbf7c1fe7..217726372d9b578814a966b360f9259cd04020f7 100644
--- a/ecrire/inc/urls.php
+++ b/ecrire/inc/urls.php
@@ -23,8 +23,7 @@ function generer_url_ecrire_article($id, $suite='', $ancre='', $statut='', $conn
 	}
 	if ($suite) $a .= "&$suite";
 	if ($statut == 'publie') {
-		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
-		return generer_url_action('redirect', $a);
+		return url_absolue(_DIR_RACINE . generer_url_entite($id, 'article', $suite, $ancre, false));
 	} else	return generer_url_ecrire('articles', $a) . ($ancre ? "#$ancre" : '');
 }
 
@@ -36,8 +35,7 @@ function generer_url_ecrire_rubrique($id, $suite='', $ancre='', $statut='', $con
 	}
 	if ($suite) $a .= "&$suite";
 	if ($statut == 'publie') {
-		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
-		return generer_url_action('redirect', $a);
+		return url_absolue(_DIR_RACINE . generer_url_entite($id, 'rubrique', $suite, $ancre, false));
 	} else	return generer_url_ecrire('naviguer',$a) . ($ancre ? "#$ancre" : '');
 }
 
@@ -49,8 +47,7 @@ function generer_url_ecrire_breve($id, $suite='', $ancre='', $statut='', $connec
 	}
 	if ($suite) $a .= "&$suite";
 	if ($statut == 'publie') {
-		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
-		return generer_url_action('redirect', $a);
+		return url_absolue(_DIR_RACINE . generer_url_entite($id, 'breve', $suite, $ancre, false));
 	} else	return generer_url_ecrire('breves_voir',$a) . ($ancre ? "#$ancre" : '');
 }
 
@@ -59,8 +56,7 @@ function generer_url_ecrire_mot($id, $suite='', $ancre='', $statut='', $connect=
 	$a = "id_mot=" . intval($id);
 	if ($suite) $a .= "&$suite";
 	if (!$statut) {
-		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
-		return generer_url_action('redirect', $a);
+		return url_absolue(_DIR_RACINE . generer_url_entite($id, 'mot', $suite, $ancre, false));
 	} else	return generer_url_ecrire('mots_edit',$a) . ($ancre ? "#$ancre" : '');
 }
 
@@ -69,8 +65,7 @@ function generer_url_ecrire_site($id, $suite='', $ancre='', $statut='', $connect
 	$a = "id_syndic=" . intval($id);
 	if ($suite) $a .= "&$suite";
 	if (!$statut) {
-		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
-		return generer_url_action('redirect', $a);
+		return url_absolue(_DIR_RACINE . generer_url_entite($id, 'site', $suite, $ancre, false));
 	} else	return generer_url_ecrire('sites',$a) . ($ancre ? "#$ancre" : '');
 }
 
@@ -79,8 +74,7 @@ function generer_url_ecrire_auteur($id, $suite='', $ancre='', $statut='', $conne
 	$a = "id_auteur=" . intval($id);
 	if ($suite) $a .= "&$suite";
 	if (!$statut) {
-		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
-		return generer_url_action('redirect', $a);
+		return url_absolue(_DIR_RACINE . generer_url_entite($id, 'auteur', $suite, $ancre, false));
 	} else	return generer_url_ecrire('auteur_infos',$a) . ($ancre ? "#$ancre" : '');
 }
 
@@ -92,10 +86,8 @@ function generer_url_ecrire_forum($id, $suite='', $ancre='', $statut='', $connec
 	}
 	if ($suite) $a .= "&$suite";
 	if ($statut == 'publie') {
-		if (strlen($ancre)) $a .= "&ancre=" . $ancre;
-		return generer_url_action('redirect', $a);
+		return url_absolue(_DIR_RACINE . generer_url_entite($id, 'forum', $suite, $ancre, false));
 	}  else return generer_url_ecrire('controle_forum', "debut_id_forum=$id");
-
 }
 
 // http://doc.spip.org/@generer_url_ecrire_document
@@ -109,50 +101,4 @@ function generer_url_ecrire_statistiques($id_article) {
 	return generer_url_ecrire('statistiques_visites', "id_article=$id_article");
 }
 
-// en cas de chargement a partir de l'espace de redac, rabattre la production
-// des URL publiques vers les URL privees en cas d'item non publies 
-
-if (!_DIR_RESTREINT) {
-
-  if (!function_exists('generer_url_article')) {
-// http://doc.spip.org/@generer_url_article
-	function generer_url_article($id, $args='', $ancre='', $stat='')
-		{ return generer_url_ecrire_article($id, $args, $ancre, $stat);}
-  }
-  if (!function_exists('generer_url_rubrique')) {
-// http://doc.spip.org/@generer_url_rubrique
-	function generer_url_rubrique($id, $args='', $ancre='', $stat='')
-		{ return generer_url_ecrire_rubrique($id, $args, $ancre, $stat);}
-  }
-  if (!function_exists('generer_url_breve')) {
-// http://doc.spip.org/@generer_url_breve
-	function generer_url_breve($id, $args='', $ancre='', $stat='')
-		{ return generer_url_ecrire_breve($id, $args, $ancre, $stat);}
-  }
-  if (!function_exists('generer_url_mot')) {
-// http://doc.spip.org/@generer_url_mot
-	function generer_url_mot($id, $args='', $ancre='', $stat='')
-		{ return generer_url_ecrire_mot($id, $args, $ancre, $stat);}
-  }
-  if (!function_exists('generer_url_site')) {
-// http://doc.spip.org/@generer_url_site
-	function generer_url_site($id, $args='', $ancre='', $stat='')
-		{ return generer_url_ecrire_site($id, $args, $ancre, $stat);}
-  }
-  if (!function_exists('generer_url_auteur')) {
-// http://doc.spip.org/@generer_url_auteur
-	function generer_url_auteur($id, $args='', $ancre='', $stat='')
-		{ return generer_url_ecrire_auteur($id, $args, $ancre, $stat);}
-  }
-  if (!function_exists('generer_url_forum')) {
-// http://doc.spip.org/@generer_url_forum
-	function generer_url_forum($id, $args='', $ancre='', $stat='')
-		{ return generer_url_ecrire_forum($id, $args, $ancre, $stat);}
-  }
-  if (!function_exists('generer_url_document')) {
-// http://doc.spip.org/@generer_url_document
-	function generer_url_document($id, $args='', $ancre='', $stat='')
-		{ return generer_url_ecrire_document($id, $args, $ancre, $stat);}
-  }
- }
 ?>
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index d998f564182ce5737594bf7956cc4b3a23e0e509..cdb2537604c78da4667b5c48b54935e2ba570ffd 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -715,28 +715,41 @@ function autoriser_sans_cookie($nom)
   return in_array($nom, $autsanscookie);
 }
 
-// Cette fonction charge le bon fichier d'urls selon qu'on est dans l'espace
-// public ou prive
-// http://doc.spip.org/@charger_generer_url
-function charger_generer_url($prive=NULL) {
-	static $ok;
-	if ($prive===null)
-		$prive = test_espace_prive();
-
-	// espace prive
-	if ($prive)
-		include_spip('inc/urls');
-
-	// espace public
-	else {
-		if ($ok++) return; # fichier deja charge
-
-		if ($GLOBALS['type_urls'] == 'page'
-		AND $GLOBALS['meta']['type_urls'])
-			$GLOBALS['type_urls'] = $GLOBALS['meta']['type_urls'];
+// Fonction codant et decodant les URLS des objets SQL mis en page par SPIP
+// $id = numero de la cle primaire si nombre, URL a decoder si pas numerique
+// $entite = surnom de la table SQL (donne acces au nom de cle primaire)
+// $args = query_string a placer apres cle=$id&....
+// $ancre = ancre a mettre a la fin de l'URL a produire
+// $prive = vrai s'il faut produire l'URL d'edition, celle de lecture sinon
+// $type = fichier dans le repertoire ecrire/urls determinant l'apparence
+
+function generer_url_entite($id='', $entite='', $args='', $ancre='', $prive=NULL, $type=NULL)
+{
+	if ($prive === NULL) $prive = test_espace_prive();
 
-		include_spip('urls/'.$GLOBALS['type_urls']);
+	if ($prive) {
+		include_spip('inc/urls');
+		$f = 'generer_url_ecrire_' . $entite;
+		return !function_exists($f) ? '' : $f($id, $args, $ancre);
+	} else {
+		if ($type === NULL) {
+			$type = ($GLOBALS['type_urls'] === 'page'
+				AND $GLOBALS['meta']['type_urls'])
+			?  $GLOBALS['meta']['type_urls']
+			:  $GLOBALS['type_urls']; // pour SPIP <2
+		}
+		$f = charger_fonction($type, 'urls', true); 
+		// si $entite='', on veut la fonction de passage URL ==> id
+		if (!$entite) return $f; 
+		// sinon on veut effectuer le passage id ==> URL
+		$res = !$f ? '' : $f($entite, $id, $args, $ancre);
+		if ($res) return $res;
+		// compat SPIP < 2 : generer_url non generique, juste les std
+		if (function_exists($f = 'generer_url_' . $entite))
+			return $f($id, $args, $ancre);
 	}
+	spip_log("generer_url_entite: entite $entite inconnue dans $type");
+	return '';
 }
 
 // Sur certains serveurs, la valeur 'Off' tient lieu de false dans certaines
diff --git a/ecrire/inc/vieilles_defs.php b/ecrire/inc/vieilles_defs.php
index 47c6b33f133c2d75b3c99283d8534fc2abf0d8f9..aa3674547d8bb0e67595d0108a55a5175b3e6333 100644
--- a/ecrire/inc/vieilles_defs.php
+++ b/ecrire/inc/vieilles_defs.php
@@ -883,6 +883,27 @@ onkeyup=\'storeCaret(this);\'
 ondblclick=\'storeCaret(this);\'>$texte</textarea>";
 }',
 
+ 'generer_url_article' => '($id, $args="", $ancre="")
+	{ return generer_url_entite($id, "article", $args, $ancre);}',
+
+ 'generer_url_rubrique' => '($id, $args="", $ancre="")
+	{ return generer_url_entite($id, "rubrique", $args, $ancre);}',
+
+ 'generer_url_breve' => '($id, $args="", $ancre="")
+	{ return generer_url_entite($id, "breve", $args, $ancre);}',
+
+ 'generer_url_mot' => '($id, $args="", $ancre="")
+	{ return generer_url_entite($id, "mot", $args, $ancre);}',
+
+ 'generer_url_site' => '($id, $args="", $ancre="")
+	{ return generer_url_entite($id, "site", $args, $ancre);}',
+
+ 'generer_url_auteur' => '($id, $args="", $ancre="")
+	{ return generer_url_entite($id,"auteur", $args, $ancre);}',
+
+ 'charger_generer_url' => '($prive=NULL) {
+	generer_url_entite("", "", "", "", $prive);}'
+
 ) as $f => $def) {
 	if (!function_exists($f)) {
 		eval("function $f$def");
@@ -902,4 +923,5 @@ function article_select($id_article, $id_rubrique=0, $lier_trad=0, $id_version=0
 	return $article_select($id_article,$id_rubrique,$lier_trad,$id_version);
 }
 
+
 ?>
\ No newline at end of file
diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php
index fe9b5cf958721c6eb2b9eb9fff5aba0f4db04ab5..baa7baea5b6d8bce0470e95716f05d956aeeedd6 100644
--- a/ecrire/public/composer.php
+++ b/ecrire/public/composer.php
@@ -404,9 +404,9 @@ function calcule_logo_document($id_document, $doubdoc, &$doublons, $flag_fichier
 	if ($id_vignette) {
 		$vignette = sql_fetsel('fichier','spip_documents',("id_document = $id_vignette"), '','','','',$connect);
 		if (@file_exists(get_spip_doc($vignette['fichier'])))
-			$logo = generer_url_document($id_vignette);
+		  $logo = generer_url_entite($id_vignette, 'document');
 	} else if ($mode == 'vignette') {
-		$logo = generer_url_document($id_document);
+		$logo = generer_url_entite($id_vignette, 'document');
 		if (!@file_exists($logo))
 			$logo = '';
 	}
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index 72837c4077b48cc2c2ff4a5ed176c9fb3444ba3a..314b63105569a55b582616b5dcd3ad838cda776e 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -262,11 +262,8 @@ function quete_meta($nom, $serveur) {
 function public_parametrer_dist($fond, $local='', $cache='', $connect='')  {
 	// verifier que la fonction assembler est bien chargee (cf. #608)
 	$assembler = charger_fonction('assembler', 'public');
-	// et toujours charger les fonctions de generation d'URL.
-	if ($GLOBALS['type_urls'] == 'page'
-	AND $GLOBALS['meta']['type_urls'])
-		$GLOBALS['type_urls'] = $GLOBALS['meta']['type_urls'];
-	$renommer_urls= charger_fonction($GLOBALS['type_urls'], 'urls', true);
+	// charger la fonction de passage d'URL a id et reciproquement
+	$renommer_urls = generer_url_entite();
 	// distinguer le premier appel des appels par inclusion
 	if (!is_array($local)) {
 		include_spip('inc/filtres'); // pour normaliser_date
@@ -280,7 +277,6 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='')  {
 		$GLOBALS['contexte'] = calculer_contexte();
 		if (!$renommer_urls) {
 			// compatibilite <= 1.9.2
-			charger_generer_url();
 			if (function_exists('recuperer_parametres_url'))
 				$renommer_urls = 'recuperer_parametres_url';
 		}
diff --git a/ecrire/urls/arbo.php b/ecrire/urls/arbo.php
index 0a122498a3a2cae940a2a630b661d3247e139241..ec89259125088c373659fc75da610d83ea953450 100644
--- a/ecrire/urls/arbo.php
+++ b/ecrire/urls/arbo.php
@@ -11,15 +11,12 @@
 \***************************************************************************/
 
 if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
-if (!function_exists('generer_url_article')) { // si la place n'est pas prise
 
 
 // TODO: une interface permettant de verifier qu'on veut effectivment modifier
 // une adresse existante
 define('CONFIRMER_MODIFIER_URL', false);
 
-include_spip('base/abstract_sql');
-
 /**
  * - Comment utiliser ce jeu d'URLs ?
  * Recopiez le fichier "htaccess.txt" du repertoire de base du site SPIP sous
@@ -28,8 +25,8 @@ include_spip('base/abstract_sql');
  * "sous-repertoire", vous devrez aussi editer la ligne "RewriteBase" ce fichier.
  * Les URLs definies seront alors redirigees vers les fichiers de SPIP.
  * 
- * Definissez ensuite dans ecrire/mes_options.php :
- * 	< ?php $type_urls = 'arbo'; ? >
+ * Choisissez "arbo" dans les pages de configuration d'URL
+ *
  * SPIP calculera alors ses liens sous la forme "Mon-titre-d-article".
  * Variantes :
  * pour avoir des url terminant par html
@@ -76,19 +73,6 @@ define ('_url_arbo_minuscules',1);
 #define('_MARQUEUR_URL', serialize(array('rubrique1' => '-', 'rubrique2' => '-', 'breve1' => '+', 'breve2' => '+', 'site1' => '@', 'site2' => '@', 'auteur1' => '_', 'auteur2' => '_', 'mot1' => '+-', 'mot2' => '-+')));
 define('_MARQUEUR_URL', false);
 
-// Retire les marqueurs de type dans une URL propre ancienne maniere
-
-// http://doc.spip.org/@retirer_marqueurs_url_propre
-function retirer_marqueurs_url_propre($url_propre) {
-	if (preg_match(',^[+][-](.*?)[-][+]$,', $url_propre, $regs)) {
-		return $regs[1];
-	}
-	else if (preg_match(',^([-+_@])(.*?)\1?$,', $url_propre, $regs)) {
-		return $regs[2];
-	}
-	// les articles n'ont pas de marqueur
-	return $url_propre;
-}
 
 // Pipeline pour creation d'une adresse : il recoit l'url propose par le
 // precedent, un tableau indiquant le titre de l'objet, son type, son id,
@@ -154,32 +138,33 @@ function creer_chaine_url($x) {
 }
 
 // http://doc.spip.org/@_generer_url_arbo
-function _generer_url_arbo($url,$type,$parent,$type_parent){
+function declarer_url_arbo_rec($url,$type,$parent,$type_parent){
 	if (is_null($parent)){
 		return $url;
 	}
 	elseif($type!='rubrique') {
-		$url_parent = _generer_url_propre($type_parent?$type_parent:'rubrique',$parent);
+		$url_parent = declarer_url_arbo($type_parent?$type_parent:'rubrique',$parent);
 		return $url_parent . (substr($url_parent,-1)=='/'?'':'/') .$url;
 	}
 	else{
 		if($parent==0)
 			return $url.'/';
 		else
-			return _generer_url_propre($type_parent?$type_parent:'rubrique',$parent). $url.'/';
+			return declarer_url_arbo($type_parent?$type_parent:'rubrique',$parent). $url.'/';
 	}
 }
 
-// http://doc.spip.org/@_generer_url_propre
-function _generer_url_propre($type, $id_objet) {
+function declarer_url_arbo($type, $id_objet) {
 	static $urls=array();
 	
 	// Se contenter de cette URL si elle existe ;
-	// sauf si on invoque action=redirect avec droit de modifier l'url
-	$modifier_url = (
-		_request('action') == 'redirect'
-		AND autoriser('modifierurl', $type, $id_objet)
-	);
+	// sauf si on invoque par "voir en ligne" avec droit de modifier l'url
+
+	$modifier_url = (_request('var_mode') == 'calcul');
+	if ($modifier_url) {
+		include_spip('inc/autoriser');
+		$modifier_url = autoriser('modifierurl', $type, $id_objet);
+	}
 	
 	if (!isset($urls[$type][$id_objet]) OR $modifier_url) {
 		$table = table_objet_sql($type);
@@ -217,7 +202,7 @@ function _generer_url_propre($type, $id_objet) {
 	$url_propre = $urls[$type][$id_objet]['url'];
 
 	if (!is_null($url_propre) AND !$modifier_url)
-		return _generer_url_arbo($url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
+		return declarer_url_arbo_rec($url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
 
 	// Sinon, creer une URL
 	$url = pipeline('creer_chaine_url',
@@ -237,7 +222,7 @@ function _generer_url_propre($type, $id_objet) {
 
 	// Pas de changement d'url
 	if ($url == $url_propre)
-		return _generer_url_arbo($url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
+		return declarer_url_arbo_rec($url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
 
 	// Verifier si l'utilisateur veut effectivement changer l'URL
 	if ($modifier_url
@@ -288,16 +273,16 @@ function _generer_url_propre($type, $id_objet) {
 			if (sql_countsel('spip_urls AS U', $where  .sql_quote($set['url']))) {
 				sql_update('spip_urls AS U', array('date' => 'NOW()'), $where  .sql_quote($set['url']));
 				spip_log("reordonne $type $id_objet");
-				return _generer_url_arbo($urls[$type][$id_objet]['url']=$set['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
+				return declarer_url_arbo_rec($urls[$type][$id_objet]['url']=$set['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
 			}
 			else {
 				$set['url'] .= _url_arbo_sep_id.$id_objet;
 				if (strlen($set['url']) > 200)
 					//serveur out ? retourner au mieux
-					return  _generer_url_arbo($urls[$type][$id_objet]['url']=$url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
+					return  declarer_url_arbo_rec($urls[$type][$id_objet]['url']=$url_propre,$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
 				elseif (sql_countsel('spip_urls AS U', $where . sql_quote($set['url']))) {
 					sql_update('spip_urls', array('date' => 'NOW()'), 'url='.sql_quote($set['url']));
-					return _generer_url_arbo($urls[$type][$id_objet]['url']=$set['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
+					return declarer_url_arbo_rec($urls[$type][$id_objet]['url']=$set['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
 				}
 			}
 		} while (@sql_insertq('spip_urls', $set) <= 0);
@@ -307,22 +292,34 @@ function _generer_url_propre($type, $id_objet) {
 	spip_log("Creation de l'url propre '" . $set['url'] . "' pour $col_id=$id_objet");
 	
 	$urls[$type][$id_objet]['url'] = $set['url'];
-	return _generer_url_arbo($urls[$type][$id_objet]['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
+	return declarer_url_arbo_rec($urls[$type][$id_objet]['url'],$type,$urls[$type][$id_objet]['parent'],$urls[$type][$id_objet]['type_parent']);
 }
 
 // http://doc.spip.org/@_generer_url_complete
-function _generer_url_complete($type, $id, $args='', $ancre='') {
+function _generer_url_arbo($type, $id, $args='', $ancre='') {
+
+	if ($type == 'forum') {
+		include_spip('inc/forum');
+		return generer_url_forum_dist($id, $args, $ancre);
+	}
+
+	if ($type == 'document') {
+		include_spip('inc/documents');
+		return generer_url_document_dist($id, $args, $ancre);
+	}
 
 	// Mode propre
-	if ($propre = _generer_url_propre($type, $id)) {
+	$propre = declarer_url_arbo($type, $id);
+
+	if ($propre === false) return ''; // objet inconnu. raccourci ? 
+
+	if ($propre) {
 		$url = _debut_urls_arbo
 			. $propre
 			. (substr($propre,-1)=='/'?'':_terminaison_urls_arbo);
+	} else {
 
-	}
-
-	// propre ne veut pas !
-	else {
+	// objet connu mais sans possibilite d'URL lisible, revenir au defaut
 		if ($type == 'site')
 			$id_type = 'id_syndic';
 		else
@@ -341,52 +338,16 @@ function _generer_url_complete($type, $id, $args='', $ancre='') {
 	return $url;
 }
 
-// http://doc.spip.org/@generer_url_article
-function generer_url_article($id_article, $args='', $ancre='') {
-	return _generer_url_complete('article', $id_article, $args, $ancre);
-}
 
-// http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique, $args='', $ancre='') {
-	return _generer_url_complete('rubrique', $id_rubrique, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_breve
-function generer_url_breve($id_breve, $args='', $ancre='') {
-	return _generer_url_complete('breve', $id_breve, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $args='', $ancre='') {
-	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_mot
-function generer_url_mot($id_mot, $args='', $ancre='') {
-	return _generer_url_complete('mot', $id_mot, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur, $args='', $ancre='') {
-	return _generer_url_complete('auteur', $id_auteur, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic, $args='', $ancre='') {
-	return _generer_url_complete('site', $id_syndic, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document, $args='', $ancre='') {
-	include_spip('inc/documents');
-	return generer_url_document_dist($id_document, $args, $ancre);
-}
-
-// retrouve le fond et les parametres d'une URL propre
 // http://doc.spip.org/@urls_arbo_dist
-function urls_arbo_dist(&$fond, $url) {
+function urls_arbo_dist(&$entite, $i, $args='', $ancre='') {
 	global $contexte;
+
+	if (is_numeric($i))
+		return _generer_url_arbo($entite, $i, $args, $ancre);
+
+	$url = $i;
+  
 	$id_objet = $type = 0;
 
 	// Migration depuis anciennes URLs ?
@@ -478,22 +439,22 @@ function urls_arbo_dist(&$fond, $url) {
 	
 			$col_id = id_table_objet($type);
 			$contexte[$col_id] = $row['id_objet'];
-			if ($type!='rubrique' OR !in_array($fond,array('article','breve','site')))
-				$fond = $row['type'];
+			if ($type!='rubrique' OR !in_array($entite,array('article','breve','site')))
+				$entite = $row['type'];
 			if ($type=='rubrique')
 				$url_arbo = array();
 		}
 	}
 
-	if ($fond=='type_urls') {
+	if ($entite=='type_urls') {
 		if ($type)
-			$fond =  ($type == 'syndic') ?  'site' : $type;
+			$entite =  ($type == 'syndic') ?  'site' : $type;
 		else {
-			$fond = '404';
+			$entite = '404';
 			$contexte['erreur'] = ''; // qu'afficher ici ?  l'url n'existe pas... on ne sait plus dire de quel type d'objet il s'agit
 		}
 	}
 	define('_SET_HTML_BASE',1);
 }
-} // function_exists
+
 ?>
diff --git a/ecrire/urls/html.php b/ecrire/urls/html.php
index ffa45e360a0290b1d680672828cd085b762b29d2..fcd4f0fcde48051978276252bc9551fadef596a9 100644
--- a/ecrire/urls/html.php
+++ b/ecrire/urls/html.php
@@ -20,12 +20,10 @@ que vous pourriez avoir mis dans ce fichier) ; si votre site est en
 "sous-repertoire", vous devrez aussi editer la ligne "RewriteBase" ce fichier.
 Les URLs definies seront alors redirigees vers les fichiers de SPIP.
 
-Definissez ensuite dans ecrire/mes_options.php :
-	< ?php $type_urls = 'html'; ? >
+Dans les pages de configuration, choisissez 'html' comme type d'url
 
 SPIP calculera alors ses liens sous la forme "article123.html".
 
-
 Note : si le fichier htaccess.txt se revele trop "puissant", car trop
 generique, et conduit a des problemes (en lien par exemple avec d'autres
 applications installees dans votre repertoire, a cote de SPIP), vous
@@ -34,50 +32,31 @@ pouvez l'editer pour ne conserver que la partie concernant les URLS 'html'.
 */
 
 if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
-if (!function_exists('generer_url_article')) { // si la place n'est pas prise
 
-// http://doc.spip.org/@generer_url_article
-function generer_url_article($id_article, $args='', $ancre='') {
-	return "article$id_article.html" . ($args ? "?$args" : '') . ($ancre ? "#$ancre" : '');
-}
+function _generer_url_html($type, $id, $args='', $ancre='') {
 
-// http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique, $args='', $ancre='') {
-	return "rubrique$id_rubrique.html" . ($args ? "?$args" : '') . ($ancre ? "#$ancre" : '');
-}
-
-// http://doc.spip.org/@generer_url_breve
-function generer_url_breve($id_breve, $args='', $ancre='') {
-	return "breve$id_breve.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
-}
-
-// http://doc.spip.org/@generer_url_mot
-function generer_url_mot($id_mot, $args='', $ancre='') {
-	return "mot$id_mot.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
-}
-
-// http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic, $args='', $ancre='') {
-	return "site$id_syndic.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
-}
+	if ($type == 'forum') {
+		include_spip('inc/forum');
+		return generer_url_forum_dist($id, $args, $ancre);
+	}
 
-// http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur, $args='', $ancre='') {
-	return "auteur$id_auteur.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
-}
+	if ($type == 'document') {
+		include_spip('inc/documents');
+		return generer_url_document_dist($id, $args, $ancre);
+	}
 
-// http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document, $args='', $ancre='') {
-	include_spip('inc/documents');
-	return generer_url_document_dist($id_document, $args, $ancre);
+	return $type . $id . '.html' . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
 }
 
-
 // retrouver les parametres d'une URL dite "html"
 // http://doc.spip.org/@urls_html_dist
-function urls_html_dist(&$fond, $url) {
+function urls_html_dist(&$entite, $i, $args='', $ancre='') {
 	global $contexte;
 
+	if (is_numeric($i))
+		return _generer_url_html($entite, $i, $args, $ancre);
+
+	$url = $i;
 
 	/*
 	 * Le bloc qui suit sert a faciliter les transitions depuis
@@ -92,27 +71,16 @@ function urls_html_dist(&$fond, $url) {
 		(isset($_ENV['url_propre']) ?
 			$_ENV['url_propre'] :
 			'');
-	if ($url_propre AND preg_match(',^(article|breve|rubrique|mot|auteur|site|type_urls)$,', $fond)) {
+	if ($url_propre AND preg_match(',^(article|breve|rubrique|mot|auteur|site|type_urls)$,', $entite)) {
 		$url_propre = (preg_replace('/^[_+-]{0,2}(.*?)[_+-]{0,2}(\.html)?$/',
 			'$1', $url_propre));
 		$r = sql_fetsel("id_objet,type", "spip_urls", "url=" . _q($url_propre));
 		if ($r) {
-			$fond = ($r['type'] == 'syndic') ?  'site' : $r['type'];
-			$contexte[id_table_objet($fond)] = $r['id_objet'];
+			$entite = ($r['type'] == 'syndic') ?  'site' : $r['type'];
+			$contexte[id_table_objet($entite)] = $r['id_objet'];
 		}
 	}
 	/* Fin du bloc compatibilite url-propres */
 }
 
-
-//
-// URLs des forums
-//
-
-// http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $args='', $ancre='') {
-	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $args, $ancre);
-}
- }
 ?>
diff --git a/ecrire/urls/libres.php b/ecrire/urls/libres.php
index 5c05eca543ca2849cf47e53bda22b54ff07e949b..a99f16183b4c5147d5a9ac6cfd45045d68d54b21 100644
--- a/ecrire/urls/libres.php
+++ b/ecrire/urls/libres.php
@@ -23,12 +23,10 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
 if (!defined('_MARQUEUR_URL'))
 	define('_MARQUEUR_URL', false);
 
-include_once dirname(__FILE__).'/propres.php';
-
 // http://doc.spip.org/@urls_libres_dist
-function urls_libres_dist(&$fond, $url) {
-	$f = charger_fonction('propres', 'urls', true);
-	if ($f) $f($fond, $url);
+function urls_libres_dist(&$entite, $i, $args='', $ancre='') {
+	$f = charger_fonction('propres', 'urls');
+	return $f($entite, $i, $args, $ancre);
 }
 
 ?>
diff --git a/ecrire/urls/page.php b/ecrire/urls/page.php
index 35e770eb3ebd959818ad7221f155d6de24a95e55..0e11255d3c22b0f185851f1d97136068a1feb648 100644
--- a/ecrire/urls/page.php
+++ b/ecrire/urls/page.php
@@ -11,7 +11,6 @@
 \***************************************************************************/
 
 if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
-if (!function_exists('generer_url_article')) { // si la place n'est pas prise
 
 ####### modifications possibles dans ecrire/mes_options
 # on peut indiquer '.html' pour faire joli
@@ -25,66 +24,48 @@ define ('_debut_urls_page', get_spip_script('./').'?');
 
 
 // http://doc.spip.org/@composer_url_page
-function composer_url_page($page,$id, $args='', $ancre='') {
-	$url = _debut_urls_page . $page . _separateur_urls_page
-	  . $id . _terminaison_urls_page;
-	if ($args) $args = strpos($url,'?') ? "&$args" : "?$args";
-	return $url . $args . ($ancre ? "#$ancre" : '');
-}
-
-// http://doc.spip.org/@generer_url_article
-function generer_url_article($id_article, $args='', $ancre='') {
-	return composer_url_page('article', $id_article, $args, $ancre);
-}
+function _generer_url_page($page,$id, $args='', $ancre='') {
 
-// http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique, $args='', $ancre='') {
-	return composer_url_page('rubrique', $id_rubrique, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_breve
-function generer_url_breve($id_breve, $args='', $ancre='') {
-	return composer_url_page('breve', $id_breve, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_mot
-function generer_url_mot($id_mot, $args='', $ancre='') {
-	return composer_url_page('mot', $id_mot, $args, $ancre);
-}
+	if ($type == 'forum') {
+		include_spip('inc/forum');
+		return generer_url_forum_dist($id, $args, $ancre);
+	}
 
-// http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic, $args='', $ancre='') {
-	return composer_url_page('site', $id_syndic, $args, $ancre);
-}
+	if ($type == 'document') {
+		include_spip('inc/documents');
+		return generer_url_document_dist($id, $args, $ancre);
+	}
 
-// http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur, $args='', $ancre='') {
-	return composer_url_page('auteur', $id_auteur, $args, $ancre);
-}
+	$url = _debut_urls_page . $page . _separateur_urls_page
+	  . $id . _terminaison_urls_page;
 
-// http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document, $args='', $ancre='') {
-	include_spip('inc/documents');
-	return generer_url_document_dist($id_document);
+	if ($args) $args = strpos($url,'?') ? "&$args" : "?$args";
+	return $url . $args . ($ancre ? "#$ancre" : '');
 }
 
 // retrouve le fond et les parametres d'une URL abregee
 // http://doc.spip.org/@urls_page_dist
-function urls_page_dist(&$fond, $url) {
+function urls_page_dist(&$entite, $i, $args='', $ancre='')
+{
 	global $contexte;
 
+	if (is_numeric($i))
+		return _generer_url_page($entite, $i, $args, $ancre);
+
+	$url = $i;
+
 	// Ce bloc gere les urls page et la compatibilite avec les "urls standard"
-	if ($fond=='sommaire'){
+	if ($entite=='sommaire'){
 		if (preg_match(
 		',^[^?]*[?/](article|rubrique|breve|mot|site|auteur)(?:\.php3?)?.*?([0-9]+),',
 		$url, $regs)) {
-			$fond = $regs[1];
+			$entite = $regs[1];
 			if ($regs[1] == 'site') {
 				if (!isset($contexte['id_syndic']))
 					$contexte['id_syndic'] = $regs[2];
 			} else {
-				if (!isset($contexte['id_'.$fond]))
-					$contexte['id_'.$fond] = $regs[2];
+				if (!isset($contexte['id_'.$entite]))
+					$contexte['id_'.$entite] = $regs[2];
 			}
 	
 			return;
@@ -93,13 +74,13 @@ function urls_page_dist(&$fond, $url) {
 		else if (preg_match(
 			',[?/&](article|breve|rubrique|mot|auteur|site)[=]?([0-9]+),',
 			$url, $regs)) {
-			$fond = $regs[1];
+			$entite = $regs[1];
 			if ($regs[1] == 'site') {
 				if (!isset($contexte['id_syndic']))
 					$contexte['id_syndic'] = $regs[2];
 			} else {
-				if (!isset($contexte['id_'.$fond]))
-					$contexte['id_'.$fond] = $regs[2];
+				if (!isset($contexte['id_'.$entite]))
+					$contexte['id_'.$entite] = $regs[2];
 			}
 			return;
 		}
@@ -118,27 +99,16 @@ function urls_page_dist(&$fond, $url) {
 	if (
 		 (isset($_SERVER['REDIRECT_url_propre']) AND $url_propre = $_SERVER['REDIRECT_url_propre'])
 	OR (isset($_ENV['url_propre']) AND $url_propre = $_ENV['url_propre'])
-	AND preg_match(',^(article|breve|rubrique|mot|auteur|site|type_urls)$,', $fond)) {
+	AND preg_match(',^(article|breve|rubrique|mot|auteur|site|type_urls)$,', $entite)) {
 		$url_propre = (preg_replace('/^[_+-]{0,2}(.*?)[_+-]{0,2}(\.html)?$/',
 			'$1', $url_propre));
 		$r = sql_fetsel("id_objet,type", "spip_urls", "url=" . _q($url_propre));
 		if ($r) {
-			$fond = ($r['type'] == 'syndic') ?  'site' : $r['type'];
-			$contexte[id_table_objet($fond)] = $r['id_objet'];
+			$entite = ($r['type'] == 'syndic') ?  'site' : $r['type'];
+			$contexte[id_table_objet($entite)] = $r['id_objet'];
 		}
 	}
 
 	/* Fin du bloc compatibilite url-propres */
 }
-
-//
-// URLs des forums
-//
-
-// http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $args='', $ancre='') {
-	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $args, $ancre);
-}
- }
 ?>
diff --git a/ecrire/urls/propres.php b/ecrire/urls/propres.php
index 0935136666decd6395a648ceaf5905ce80d4b7a7..666ec40ea98ed5e72f455d66fcc5ac5ffe9a1264 100644
--- a/ecrire/urls/propres.php
+++ b/ecrire/urls/propres.php
@@ -11,15 +11,11 @@
 \***************************************************************************/
 
 if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
-if (!function_exists('generer_url_article')) { // si la place n'est pas prise
-
 
 // TODO: une interface permettant de verifier qu'on veut effectivment modifier
 // une adresse existante
 define('CONFIRMER_MODIFIER_URL', false);
 
-include_spip('base/abstract_sql');
-
 /*
 
 - Comment utiliser ce jeu d'URLs ?
@@ -30,18 +26,17 @@ que vous pourriez avoir mis dans ce fichier) ; si votre site est en
 "sous-repertoire", vous devrez aussi editer la ligne "RewriteBase" ce fichier.
 Les URLs definies seront alors redirigees vers les fichiers de SPIP.
 
-Definissez ensuite dans ecrire/mes_options.php :
-	< ?php $type_urls = 'propres'; ? >
-SPIP calculera alors ses liens sous la forme "Mon-titre-d-article".
+Dans les pages de configuration, choisissez 'propres' comme type d'url
+
+SPIP calculera alors ses liens sous la forme
+	"Mon-titre-d-article".
 
-Variante 'propres2' :
-	< ?php $type_urls = 'propres2'; ? >
-ajoutera '.html' aux adresses generees : "Mon-titre-d-article.html"
+La variante 'propres2' ajoutera '.html' aux adresses generees : 
+	"Mon-titre-d-article.html"
 
 Variante 'qs' (experimentale) : ce systeme fonctionne en "Query-String",
 c'est-a-dire sans utilisation de .htaccess ; les adresses sont de la forme
-"/?Mon-titre-d-article"
-	< ?php $type_urls = 'qs'; ? >
+	"/?Mon-titre-d-article"
 */
 
 define ('_terminaison_urls_propres', '');
@@ -137,10 +132,15 @@ function creer_chaine_url($x) {
 }
 
 
-// http://doc.spip.org/@_generer_url_propre
-function _generer_url_propre($type, $id_objet) {
-	$table = table_objet_sql($type);
-	$col_id = id_table_objet($type);
+// Trouver l'URL associee a la n-ieme cle primaire d'une table SQL
+
+function declarer_url_propre($type, $id_objet) {
+	$trouver_table = charger_fonction('trouver_table', 'base');
+	$desc = $trouver_table(table_objet($type));
+	$table = $desc['table'];
+	$col_id =  @$desc['key']["PRIMARY KEY"];
+	if (!$col_id) return false; // Quand $type ne reference pas une table
+
 	$id_objet = intval($id_objet);
 
 	// Auteurs : on prend le nom
@@ -151,22 +151,21 @@ function _generer_url_propre($type, $id_objet) {
 	else
 		$champ_titre = 'titre';
 
-
 	//  Recuperer une URL propre correspondant a l'objet.
 	$row = sql_fetsel("U.url, U.date, O.$champ_titre", "$table AS O LEFT JOIN spip_urls AS U ON (U.type='$type' AND U.id_objet=O.$col_id)", "O.$col_id=$id_objet", '', 'U.date DESC', 1);
 
-	if (!$row) return ""; # objet inexistant
+	if (!$row) return ""; # Quand $id_objet n'est pas un numero connu
 
 	$url_propre = $row['url'];
 
-
 	// Se contenter de cette URL si elle existe ;
-	// sauf si on invoque action=redirect avec droit de modifier l'url
-	$modifier_url = (
-		_request('action') == 'redirect'
-		AND autoriser('modifierurl', $type, $id_objet)
-	);
+	// sauf si on invoque par "voir en ligne" avec droit de modifier l'url
 
+	$modifier_url = (_request('var_mode') == 'calcul');
+	if ($modifier_url) {
+		include_spip('inc/autoriser');
+		$modifier_url = autoriser('modifierurl', $type, $id_objet);
+	}
 	if ($url_propre AND !$modifier_url)
 		return $url_propre;
 
@@ -259,8 +258,17 @@ function _generer_url_propre($type, $id_objet) {
 	return $set['url'];
 }
 
-// http://doc.spip.org/@_generer_url_complete
-function _generer_url_complete($type, $id, $args='', $ancre='') {
+function _generer_url_propre($type, $id, $args='', $ancre='') {
+
+	if ($type == 'forum') {
+		include_spip('inc/forum');
+		return generer_url_forum_dist($id, $args, $ancre);
+	}
+
+	if ($type == 'document') {
+		include_spip('inc/documents');
+		return generer_url_document_dist($id, $args, $ancre);
+	}
 
 	// Mode compatibilite pour conserver la distinction -Rubrique-
 	if (_MARQUEUR_URL) {
@@ -272,7 +280,11 @@ function _generer_url_complete($type, $id, $args='', $ancre='') {
 	// fin
 
 	// Mode propre
-	if ($propre = _generer_url_propre($type, $id)) {
+	$propre = declarer_url_propre($type, $id);
+
+	if ($propre === false) return ''; // objet inconnu. raccourci ? 
+
+	if ($propre) {
 		$url = _debut_urls_propres
 			. $marqueur1
 			. $propre
@@ -281,10 +293,10 @@ function _generer_url_complete($type, $id, $args='', $ancre='') {
 
 		// Repositionne l'URL par rapport a la racine du site (#GLOBALS)
 		$url = str_repeat('../', $GLOBALS['profondeur_url']).$url;
-	}
+	} else {
+
+	// objet connu mais sans possibilite d'URL lisible, revenir au defaut
 
-	// propre ne veut pas !
-	else {
 		if ($type == 'site')
 			$id_type = 'id_syndic';
 		else
@@ -303,52 +315,16 @@ function _generer_url_complete($type, $id, $args='', $ancre='') {
 	return $url;
 }
 
-// http://doc.spip.org/@generer_url_article
-function generer_url_article($id_article, $args='', $ancre='') {
-	return _generer_url_complete('article', $id_article, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique, $args='', $ancre='') {
-	return _generer_url_complete('rubrique', $id_rubrique, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_breve
-function generer_url_breve($id_breve, $args='', $ancre='') {
-	return _generer_url_complete('breve', $id_breve, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $args='', $ancre='') {
-	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_mot
-function generer_url_mot($id_mot, $args='', $ancre='') {
-	return _generer_url_complete('mot', $id_mot, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur, $args='', $ancre='') {
-	return _generer_url_complete('auteur', $id_auteur, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic, $args='', $ancre='') {
-	return _generer_url_complete('site', $id_syndic, $args, $ancre);
-}
-
-// http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document, $args='', $ancre='') {
-	include_spip('inc/documents');
-	return generer_url_document_dist($id_document, $args, $ancre);
-}
-
 // retrouve le fond et les parametres d'une URL propre
+// ou produit une URL propre si on donne un parametre
 // http://doc.spip.org/@urls_propres_dist
-function urls_propres_dist(&$fond, $url) {
+function urls_propres_dist(&$entite, $i, $args='', $ancre='') {
 	global $contexte;
+
+	if (is_numeric($i))
+		return _generer_url_propre($entite, $i, $args, $ancre);
+
+	$url = $i;
 	$id_objet = $type = 0;
 
 	// Migration depuis anciennes URLs ?
@@ -371,8 +347,7 @@ function urls_propres_dist(&$fond, $url) {
 		}
 	}
 	if ($id_objet) {
-		$func = "generer_url_$type";
-		$url_propre = $func($id_objet);
+		$url_propre = generer_url_entite($id_objet, $type, $args, $ancre);
 		if (strlen($url_propre)
 		AND !strstr($url,$url_propre)) {
 			include_spip('inc/headers');
@@ -429,17 +404,16 @@ function urls_propres_dist(&$fond, $url) {
 
 		$col_id = id_table_objet($type);
 		$contexte[$col_id] = $row['id_objet'];
-		$fond = $row['type'];
+		$entite = $row['type'];
 	}
 
-	if ($fond=='type_urls') {
+	if ($entite=='type_urls') {
 		if ($type)
-			$fond =  ($type == 'syndic') ?  'site' : $type;
+			$entite =  ($type == 'syndic') ?  'site' : $type;
 		else {
-			$fond = '404';
+			$entite = '404';
 			$contexte['erreur'] = ''; // qu'afficher ici ?  l'url n'existe pas... on ne sait plus dire de quel type d'objet il s'agit
 		}
 	}
 }
-} // function_exists
 ?>
diff --git a/ecrire/urls/propres2.php b/ecrire/urls/propres2.php
index 3c4071d36168a1f30d7cf3d2d846bb7f5bb49b39..bcfc80c980599d75bd99142492c4bfd8c662504f 100644
--- a/ecrire/urls/propres2.php
+++ b/ecrire/urls/propres2.php
@@ -23,12 +23,10 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
 if (!defined('_terminaison_urls_propres'))
 	define ('_terminaison_urls_propres', '.html');
 
-include_once dirname(__FILE__).'/propres.php';
-
 // http://doc.spip.org/@urls_propres2_dist
-function urls_propres2_dist(&$fond, $url) {
-	$f = charger_fonction('propres', 'urls', true);
-	if ($f) $f($fond, $url);
+function urls_propres2_dist(&$entite, $i, $args='', $ancre='') {
+	$f = charger_fonction('propres', 'urls');
+	return $f($entite, $i, $args, $ancre);
 }
 
 ?>
diff --git a/ecrire/urls/propres_qs.php b/ecrire/urls/propres_qs.php
index 3b2d7827a3941026dd3e067e2616dbb0dd6b2cea..ab346f435dfea5c762be36b25ef55171e33eb820 100644
--- a/ecrire/urls/propres_qs.php
+++ b/ecrire/urls/propres_qs.php
@@ -31,11 +31,9 @@ if (!defined('_terminaison_urls_propres'))
 
 define ('_debut_urls_propres', './?');
 
-include_once dirname(__FILE__).'/propres.php';
-
 // http://doc.spip.org/@urls_propres_qs_dist
-function urls_propres_qs_dist(&$fond, $url) {
-	$f = charger_fonction('propres', 'urls', true);
-	if ($f) $f($fond, $url);
+function urls_propres_qs_dist(&$entite, $i, $args='', $ancre='') {
+	$f = charger_fonction('propres', 'urls');
+	return $f($entite, $i, $args, $ancre);
 }
 ?>