diff --git a/ecrire/action/redirect.php b/ecrire/action/redirect.php
index 289d04bcd43c0539173941bf875026da690b5b9d..2c5f6f98c48e47e5ef5905892d92b811542e214f 100644
--- a/ecrire/action/redirect.php
+++ b/ecrire/action/redirect.php
@@ -20,38 +20,40 @@ charger_generer_url();
 // http://doc.spip.org/@action_redirect_dist
 function action_redirect_dist()
 {
-  global $id_article, $id_auteur, $id_breve, $id_forum, $id_mot, $id_rubrique, $id_site, $id_syndic, $var_mode;
+  global $var_mode, $redirect;
 
-
-  if ($id_article = intval($id_article)) {
-	$url = generer_url_article($id_article);
+  if ($id_article = intval(_request('id_article'))) {
+	$redirect = generer_url_article($id_article,'',_request('ancre'));
 }
-  else if ($id_breve = intval($id_breve)) {
-	$url = generer_url_breve($id_breve);
+  else if ($id_breve = intval(_request('id_breve'))) {
+	$redirect = generer_url_breve($id_breve,'',_request('ancre'));
 }
-  else if ($id_forum = intval($id_forum)) {
-	$url = generer_url_forum($id_forum);
+  else if ($id_forum = intval(_request('id_forum'))) {
+	$redirect = generer_url_forum($id_forum,'',_request('ancre'));
 }
-  else if ($id_rubrique = intval($id_rubrique)) {
-	$url = generer_url_rubrique($id_rubrique);
+  else if ($id_rubrique = intval(_request('id_rubrique'))) {
+	$redirect = generer_url_rubrique($id_rubrique,'',_request('ancre'));
 }
-  else if ($id_mot = intval($id_mot)) {
-	$url = generer_url_mot($id_mot);
+  else if ($id_mot = intval(_request('id_mot'))) {
+	$redirect = generer_url_mot($id_mot,'',_request('ancre'));
 }
-  else if ($id_auteur = intval($id_auteur)) {
-	$url = generer_url_auteur($id_auteur);
+  else if ($id_auteur = intval(_request('id_auteur'))) {
+	$redirect = generer_url_auteur($id_auteur,'',_request('ancre'));
 }
-  else if ($id_syndic = intval($id_syndic) OR $id_syndic = intval($id_site)) {
-	$url = generer_url_site($id_syndic);
+  else if ($id_syndic = intval(_request('id_syndic')) OR $id_syndic = intval(_request('id_site'))) {
+	$redirect = generer_url_site($id_syndic,'',_request('ancre'));
 }
 else {
-	$url = _DIR_RESTREINT_ABS;
-}
-
 // Ne pas masquer cette eventuelle erreur (aide a detecter des lignes vides
 // dans inc-urls ou mes_fonctions/mes_options)
- header("Location: " . (!$var_mode ?  $url : ($url . (strpos($url,'?') ? '&' : '?') ."var_mode=" . $var_mode)));
+	$redirect = _DIR_RESTREINT_ABS;
+}
+	if ($var_mode) {
+		$var_mode = (strpos($redirect,'?') ? '&' : '?') ."var_mode="
+		. $var_mode;
+		$redirect = strpos($redirect,'#')
+		  ? str_replace('#', "$var_mode#", $redirect)
+		  : "$redirect$var_mode";
+	}
 }
-
-
 ?>
diff --git a/ecrire/balise/formulaire_admin.php b/ecrire/balise/formulaire_admin.php
index c476096b4cdfb11abae4fa1c11252fa1d92f8eca..22caea822445ee307e41cb016089b263f0ed8705 100644
--- a/ecrire/balise/formulaire_admin.php
+++ b/ecrire/balise/formulaire_admin.php
@@ -185,7 +185,7 @@ function balise_FORMULAIRE_ADMIN_dyn($float='', $debug='') {
 			$env['id_'.$id] = ${'id_'.$id};
 			$g = 'generer_url_ecrire_'.$obj;
 			$env['voir_'.$obj] = str_replace('&', '&',
-				$g(${'id_'.$id}, 'prop'));
+				$g(${'id_'.$id}, '','', 'prop'));
 		}
 	}
 
diff --git a/ecrire/inc/agenda.php b/ecrire/inc/agenda.php
index 0aa65521f53fb58feada31613683aeb6e21f6399..d166721e88c5387e6453ab07c275207582ceb5fa 100644
--- a/ecrire/inc/agenda.php
+++ b/ecrire/inc/agenda.php
@@ -1399,10 +1399,10 @@ function sql_calendrier_interval_articles($avant, $apres, &$evenements) {
 		if (autoriser('voir','article',$id))
 			$evenements[$amj][]=
 			    array(
-				  'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
-				  'DESCRIPTION' => $row['descriptif'] ? $row['descriptif'] : $langues[$row['lang']],
+				'CATEGORIES' => calendrier_categories('spip_articles', $id, 'id_article'),
+				'DESCRIPTION' => $row['descriptif'] ? $row['descriptif'] : $langues[$row['lang']],
 				'SUMMARY' => $row['titre'],
-				'URL' => generer_url_article($id, 'prop'));
+				'URL' => generer_url_article($id, '','','prop'));
 	}
 }
 
@@ -1416,10 +1416,10 @@ function sql_calendrier_interval_rubriques($avant, $apres, &$evenements) {
 		if (autoriser('voir','rubrique',$id))
 			$evenements[$amj][]=
 			    array(
-				  'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
+				'CATEGORIES' => calendrier_categories('spip_rubriques', $id, 'id_rubrique'),
 				'DESCRIPTION' => $row['descriptif'],
 				'SUMMARY' => $row['titre'],
-				'URL' => generer_url_rubrique($id, 'prop'));
+				'URL' => generer_url_rubrique($id, '','', 'prop'));
 	}
 }
 
@@ -1433,7 +1433,7 @@ function sql_calendrier_interval_breves($avant, $apres, &$evenements) {
 		if (autoriser('voir','breve',$id))
 			$evenements[$amj][]=
 			array(
-			      'URL' => generer_url_breve($id, 'prop'),
+			      'URL' => generer_url_breve($id, '','', 'prop'),
 			      'CATEGORIES' => calendrier_categories('spip_breves', $ir, 'id_breve'),
 			      'SUMMARY' => $row['titre']);
 	}
diff --git a/ecrire/inc/documents.php b/ecrire/inc/documents.php
index 8784359761841d688eb6bf17f60514a8d7f4c4a8..cf74e08861d7ae777c0ee6ea2828d03c2eb60f68 100644
--- a/ecrire/inc/documents.php
+++ b/ecrire/inc/documents.php
@@ -39,23 +39,18 @@ function get_spip_doc($fichier) {
 }
 
 // http://doc.spip.org/@generer_url_document_dist
-function generer_url_document_dist($id_document) {
+function generer_url_document_dist($id_document, $args='', $ancre='') {
 	if (intval($id_document) <= 0)
 		return '';
 	$row = spip_fetch_array(spip_query("SELECT fichier,distant FROM spip_documents WHERE id_document="._q($id_document)));
-	if ($row) {
-
-		// Cette variable de configuration peut etre posee par un plugin
-		// par exemple acces_restreint
-		if ($GLOBALS['meta']["creer_htaccess"] == 'oui'
-		AND $row['distant'] != 'oui')
-			return parametre_url(
-				generer_url_action('acceder_document', "arg=$id_document"),
-				'file', $row['fichier'], '&');
-		else
-			return get_spip_doc($row['fichier']);
-	}
-	return '';
+	if (!$row) return '';
+	// Cette variable de configuration peut etre posee par un plugin
+	// par exemple acces_restreint
+	if ($GLOBALS['meta']["creer_htaccess"] == 'oui'
+	AND $row['distant'] != 'oui') {
+	  $args .= ($args ? "&" : '') . "arg=$id_document&file=" . $row['fichier'] . ($ancre ? "&ancre=$ancre" : '');
+		return generer_url_action('acceder_document', $args);
+	} else	return get_spip_doc($row['fichier']);
 }
 
 //
diff --git a/ecrire/inc/forum.php b/ecrire/inc/forum.php
index d66aa2cd41267c27cff54a965bd720b31dad105d..55bc4c975f583bb379df9310c48b22ea2e8b858c 100644
--- a/ecrire/inc/forum.php
+++ b/ecrire/inc/forum.php
@@ -257,23 +257,22 @@ function racine_forum($id_forum){
 } 
 
 // http://doc.spip.org/@generer_url_forum_dist
-function generer_url_forum_dist($id_forum, $show_thread=false) {
+function generer_url_forum_dist($id_forum, $args='', $ancre='') {
 	if (!$id_forum) return '';
 	list($type, $id, $id_thread) = racine_forum($id_forum);
-	if ($id_thread>0 AND $show_thread)
-		$id_forum = $id_thread;
+	if (!$ancre) $ancre = "forum$id_forum";
 	switch($type) {
 		case 'article':
-			return generer_url_article($id)."#forum$id_forum";
+			return generer_url_article($id, $args, $ancre);
 			break;
 		case 'breve':
-			return generer_url_breve($id)."#forum$id_forum";
+			return generer_url_breve($id, $args, $ancre);
 			break;
 		case 'rubrique':
-			return generer_url_rubrique($id)."#forum$id_forum";
+			return generer_url_rubrique($id, $args, $ancre);
 			break;
 		case 'site':
-			return generer_url_site($id)."#forum$id_forum";
+			return generer_url_site($id, $args, $ancre);
 			break;
 		default:
 		  return '';
diff --git a/ecrire/inc/notifications.php b/ecrire/inc/notifications.php
index 3d471d837b234ba4431621a59ba1751dd6a44060..dbf34d1c988a7f008274a76f254c108007e97c32 100644
--- a/ecrire/inc/notifications.php
+++ b/ecrire/inc/notifications.php
@@ -88,7 +88,7 @@ function notifier_publication_article($id_article) {
 
 			// URL de l'article
 			charger_generer_url();
-			$url = url_absolue(generer_url_article($id_article, true));
+			$url = url_absolue(generer_url_article($id_article, '','', 'publie'));
 
 			$titre = nettoyer_titre_email($row['titre']);
 
diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php
index 01ae4bb8a75fdaac3c4e9803f40bbbdce22ab258..9f16bc08441ecc1e836d4cde9a0cf991608c786c 100644
--- a/ecrire/inc/texte.php
+++ b/ecrire/inc/texte.php
@@ -16,7 +16,6 @@ include_spip('inc/filtres');
 include_spip('inc/charsets');
 include_spip('inc/lang');
 
-
 //
 // Gerer les variables de personnalisation, qui peuvent provenir
 // des fichiers d'appel, en verifiant qu'elles n'ont pas ete passees
@@ -514,13 +513,13 @@ function typo($letexte, $echapper=true) {
 	return $letexte;
 }
 
-// traitement des raccourcis issus de [TITRE->RACCOURCInnn] et connexes
+// analyse des raccourcis issus de [TITRE->RACCOURCInnn] et connexes
 
-define('_RACCOURCI_URL', ',^(\S*?)\s*(\d+)(\?.*?)?(#[^\s]*)?$,S');
+define('_RACCOURCI_URL', ',^\s*(\w*?)\s*(\d+)(\?(.*?))?(#([^\s]*))?\s*$,S');
 
 // http://doc.spip.org/@typer_raccourci
 function typer_raccourci ($lien) {
-	if (!preg_match(_RACCOURCI_URL, trim($lien), $match)) return false;
+	if (!preg_match(_RACCOURCI_URL, $lien, $match)) return array();
 	$f = $match[1];
 	// valeur par defaut et alias historiques
 	if (!$f) $f = 'article';
@@ -539,37 +538,28 @@ function typer_raccourci ($lien) {
 // associe a une fonction generer_url_raccourci()
 //
 // Valeur retournee selon le parametre $pour:
-// 'tout' : <a href="L">T</a>
+// 'tout' : tableau [U,C,T,L] (vise <a href="U" class='C' hreflang='L'>T</a>)
 // 'titre': seulement T ci-dessus (i.e. le TITRE ci-dessus ou dans table SQL)
-// 'url':   seulement L (i.e. generer_url_RACCOURCI)
+// 'url':   seulement U  (i.e. generer_url_RACCOURCI)
 
 // http://doc.spip.org/@calculer_url
 function calculer_url ($lien, $texte='', $pour='url') {
-	$lien = vider_url($lien); # supprimer 'http://' ou 'mailto:'
+	$lien = vider_url($lien); # 'http://' ou 'mailto:' seuls == ""
 	if ($match = typer_raccourci ($lien)) {
-		@list($f,$objet,$id,$params,$ancre) = $match;
-		// chercher la fonction nommee generer_url_$raccourci
-		// ou calculer_url_raccourci si on n'a besoin que du lien
-		$f=(($pour == 'url') ? 'generer' : 'calculer') . '_url_' . $f;
+		@list($f,,$id,,$param,,$ancre) = $match;
 		charger_generer_url();
-		if (function_exists($f) OR function_exists($f .= '_dist')) {
-			if ($pour == 'url') {
-				$url = $f($id);
-				if ($params)
-					$url .= (strstr($url, '?') ? '&amp;' : '?')
-						. substr($params,1);
-				return $url . $ancre;
-			}
-
-			$res = $f($id, $texte, $ancre);
-			if ($pour == 'titre')
+		$g = 'generer_url_' . $f;
+		if (function_exists($g) OR function_exists($g .= '_dist')) {
+			$res = $g($id, $param, $ancre);
+			if ($pour == 'url') return $res;
+			$g = 'calculer_url_' . $f;
+			if (function_exists($g) OR function_exists($g .= '_dist')) { 
+				if ($pour == 'tout')
+					return $g($id, $texte, $res);
+				$res = $g($id, $texte, $res);
 				return $res[2];
-			if ($params)
-				$res[0] .= (strstr($res[0], '?') ? '&amp;' : '?')
-					. substr($params,1);
-			$res[0] .= $ancre;
-			return $res;
-		}
+			}
+		} else spip_log("raccourci indefini $f");
 	}
   
 	$lien = ltrim($lien);
@@ -606,8 +596,7 @@ function calculer_url ($lien, $texte='', $pour='url') {
 }
 
 // http://doc.spip.org/@calculer_url_article_dist
-function calculer_url_article_dist($id, $texte='') {
-	$lien = generer_url_article($id);
+function calculer_url_article_dist($id, $texte, $lien) {
 	$s = spip_query("SELECT titre,lang FROM spip_articles WHERE id_article=$id");
 	$row = spip_fetch_array($s);
 	if (!trim($texte))
@@ -618,60 +607,58 @@ function calculer_url_article_dist($id, $texte='') {
 }
 
 // http://doc.spip.org/@calculer_url_rubrique_dist
-function calculer_url_rubrique_dist($id, $texte='')
+function calculer_url_rubrique_dist($id, $texte, $lien)
 {
-	$lien = generer_url_rubrique($id);
 	$s = spip_query("SELECT titre,lang FROM spip_rubriques WHERE id_rubrique=$id");
 	$row = spip_fetch_array($s);
-	if (!trim($texte))
+	if (!trim($texte)) {
 		$texte = supprimer_numero($row['titre']);
-	if (!trim($texte))
-	    $texte = $id;
+		if (!trim($texte))
+		  $texte = $id;
+	}
 	return array($lien, 'spip_in', $texte, $row['lang']);
 }
 
-// http://doc.spip.org/@calculer_url_mot_dist
-function calculer_url_mot_dist($id, $texte='')
-{
-	$lien = generer_url_mot($id);
-	$s = spip_query("SELECT titre FROM spip_mots WHERE id_mot=$id");
-	$row = spip_fetch_array($s);
-	if (!trim($texte))
-		$texte = supprimer_numero($row['titre']);
-	if (!trim($texte))
-	    $texte = $id;
-	return array($lien, 'spip_in', $texte);
-}
-
 // http://doc.spip.org/@calculer_url_breve_dist
-function calculer_url_breve_dist($id, $texte='')
+ function calculer_url_breve_dist($id, $texte, $lien)
 {
-	$lien = generer_url_breve($id);
 	$s = spip_query("SELECT titre,lang FROM spip_breves WHERE id_breve=$id");
 	$row = spip_fetch_array($s);
-	if (!trim($texte))
+	if (!trim($texte)) {
 		$texte = supprimer_numero($row['titre']);
-	if (!trim($texte))
-	    $texte = $id;
+		if (!trim($texte))
+		  $texte = $id;
+	}
 	return array($lien, 'spip_in', $texte, $row['lang']);
 }
 
 // http://doc.spip.org/@calculer_url_auteur_dist
-function calculer_url_auteur_dist($id, $texte='')
+ function calculer_url_auteur_dist($id, $texte, $lien)
 {
-	$lien = generer_url_auteur($id);
 	if ($texte=='') {
 		$s = spip_query("SELECT nom FROM spip_auteurs WHERE id_auteur=$id");
-	$row = spip_fetch_array($s);
+		$row = spip_fetch_array($s);
 		$texte = $row['nom'];
 	}
 	return array($lien, 'spip_in', $texte); # pas de hreflang
 }
 
+// http://doc.spip.org/@calculer_url_mot_dist
+function calculer_url_mot_dist($id, $texte, $lien)
+{
+	if (!trim($texte)) {
+		$s = spip_query("SELECT titre FROM spip_mots WHERE id_mot=$id");
+		$row = spip_fetch_array($s);
+		$texte = supprimer_numero($row['titre']);
+		if (!trim($texte))
+		  $texte = $id;
+	}
+	return array($lien, 'spip_in', $texte);
+}
+
 // http://doc.spip.org/@calculer_url_document_dist
-function calculer_url_document_dist($id, $texte='')
+ function calculer_url_document_dist($id, $texte, $lien)
 {
-	$lien = generer_url_document($id);
 	if ($texte=='') {
 		$s = spip_query("SELECT titre,fichier FROM spip_documents WHERE id_document=$id");
 		$row = spip_fetch_array($s);
@@ -685,7 +672,7 @@ function calculer_url_document_dist($id, $texte='')
 }
 
 // http://doc.spip.org/@calculer_url_site_dist
-function calculer_url_site_dist($id, $texte='')
+function calculer_url_site_dist($id, $texte, $lien)
 {
 	# attention dans le cas des sites le lien pointe non pas sur
 	# la page locale du site, mais directement sur le site lui-meme
@@ -702,9 +689,8 @@ function calculer_url_site_dist($id, $texte='')
 }
 
 // http://doc.spip.org/@calculer_url_forum_dist
-function calculer_url_forum_dist($id, $texte='')
+function calculer_url_forum_dist($id, $texte, $lien)
 {
-	$lien = generer_url_forum($id);
 	if (!trim($texte)) {
 		$s = spip_query("SELECT titre FROM spip_forum WHERE id_forum=$id AND statut='publie'");
 		$row = spip_fetch_array($s);
@@ -715,7 +701,6 @@ function calculer_url_forum_dist($id, $texte='')
 	return array($lien, 'spip_in', $texte); # pas de hreflang
 }
 
-
 //
 // Tableaux
 //
diff --git a/ecrire/inc/urls.php b/ecrire/inc/urls.php
index 5f819339f587f0683a0770f951869df7bf0f9911..a98f46a37279ea1f7073dd876ff5f8c3e0a92246 100644
--- a/ecrire/inc/urls.php
+++ b/ecrire/inc/urls.php
@@ -16,69 +16,89 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // des items des tables SQL principales, selon le statut de publication
 
 // http://doc.spip.org/@generer_url_ecrire_article
-function generer_url_ecrire_article($id_article, $statut='') {
-	$args = "id_article=" . intval($id_article);
-	if (!$statut)
-		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_articles WHERE $args"));
-	if ($statut['statut'] == 'publie')
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('articles', $args);
+function generer_url_ecrire_article($id, $suite='', $ancre='', $statut='') {
+	$a = "id_article=" . intval($id);
+	if (!$statut) {
+		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_articles WHERE $a"), SPIP_NUM);
+		$statut = $statut[0];
+	}
+	if ($suite) $a .= "&$suite";
+	if ($statut == 'publie') {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('articles', $a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_rubrique
-function generer_url_ecrire_rubrique($id_rubrique, $statut='') {
-	$args = "id_rubrique=" . intval($id_rubrique);
-	if (!$statut)
-		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_rubriques WHERE $args"));
-	if ($statut['statut'] == 'publie')
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('naviguer',$args);
+function generer_url_ecrire_rubrique($id, $suite='', $ancre='', $statut='') {
+	$a = "id_rubrique=" . intval($id);
+	if (!$statut) {
+		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_rubriques WHERE $a"), SPIP_NUM);
+		$statut = $statut[0];
+	}
+	if ($suite) $a .= "&$suite";
+	if ($statut == 'publie') {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('naviguer',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_breve
-function generer_url_ecrire_breve($id_breve, $statut='') {
-	$args = "id_breve=" . intval($id_breve);
-	if (!$statut)
-		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_breves WHERE $args"));
-	if ($statut['statut'] == 'publie')
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('breves_voir',$args);
+function generer_url_ecrire_breve($id, $suite='', $ancre='', $statut='') {
+	$a = "id_breve=" . intval($id);
+	if (!$statut) {
+		$statut = spip_fetch_array(spip_query("SELECT statut FROM spip_breves WHERE $a"), SPIP_NUM);
+		$statut = $statut[0];
+	}
+	if ($suite) $a .= "&$suite";
+	if ($statut == 'publie') {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('breves_voir',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_mot
-function generer_url_ecrire_mot($id_mot, $statut='') {
-	$args = "id_mot=" . intval($id_mot);
-	if (!$statut)
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('mots_edit',$args);
+function generer_url_ecrire_mot($id, $suite='', $ancre='', $statut='') {
+	$a = "id_mot=" . intval($id);
+	if ($suite) $a .= "&$suite";
+	if (!$statut) {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('mots_edit',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_site
-function generer_url_ecrire_site($id_syndic, $statut='') {
-	$args = "id_syndic=" . intval($id_syndic);
-	if (!$statut)
-		return generer_url_action('redirect', $args);
-	else	return generer_url_ecrire('sites',$args);
+function generer_url_ecrire_site($id, $suite='', $ancre='', $statut='') {
+	$a = "id_syndic=" . intval($id);
+	if ($suite) $a .= "&$suite";
+	if (!$statut) {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('sites',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_auteur
-function generer_url_ecrire_auteur($id_auteur, $statut='') {
-	$args = "id_auteur=" . intval($id_auteur);
-	if (!$statut)
-		return generer_url_action('redirect', $args);
-	else
-		return generer_url_ecrire('auteur_infos',$args);
+function generer_url_ecrire_auteur($id, $suite='', $ancre='', $statut='') {
+	$a = "id_auteur=" . intval($id);
+	if ($suite) $a .= "&$suite";
+	if (!$statut) {
+		$a .= "&ancre=" . $ancre;
+		return generer_url_action('redirect', $a);
+	} else	return generer_url_ecrire('auteur_infos',$a) . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_ecrire_forum
-function generer_url_ecrire_forum($id_forum, $statut='') {
-	return generer_url_action('redirect', "id_forum=$id_forum");
+function generer_url_ecrire_forum($id, $suite='', $ancre='', $statut='') {
+	$a = "id_forum=" . intval($id);
+	if ($suite) $a .= "&$suite"; 
+	$a .= "&ancre=" . $ancre;
+	return generer_url_action('redirect', $a);
 }
 
 // http://doc.spip.org/@generer_url_ecrire_document
-function generer_url_ecrire_document($id_document, $statut='') {
+function generer_url_ecrire_document($id, $suite='', $ancre='', $statut='') {
 	include_spip('inc/documents');
-	return generer_url_document_dist($id_document);
+	return generer_url_document_dist($id);
 }
 
 // http://doc.spip.org/@generer_url_ecrire_statistiques
@@ -93,43 +113,43 @@ if (!_DIR_RESTREINT) {
 
   if (!function_exists('generer_url_article')) {
 // http://doc.spip.org/@generer_url_article
-	function generer_url_article($id, $stat='')
-		{ return generer_url_ecrire_article($id, $stat);}
+	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, $stat='')
-		{ return generer_url_ecrire_rubrique($id, $stat);}
+	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, $stat='')
-		{ return generer_url_ecrire_breve($id, $stat);}
+	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, $stat='')
-		{ return generer_url_ecrire_mot($id, $stat);}
+	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, $stat='')
-		{ return generer_url_ecrire_site($id, $stat);}
+	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, $stat='')
-		{ return generer_url_ecrire_auteur($id, $stat);}
+	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, $stat='')
-		{ return generer_url_ecrire_forum($id, $stat);}
+	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, $stat='')
-		{ return generer_url_ecrire_document($id, $stat);}
+	function generer_url_document($id, $args='', $ancre='', $stat='')
+		{ return generer_url_ecrire_document($id, $args, $ancre, $stat);}
   }
  }
 ?>
\ No newline at end of file
diff --git a/ecrire/urls/html.php b/ecrire/urls/html.php
index c6bd0cc9cbeb633c690a19583a0cb416686e4431..5358a161b2f7d8902c04639edfa57d868e2b47a8 100644
--- a/ecrire/urls/html.php
+++ b/ecrire/urls/html.php
@@ -37,39 +37,39 @@ 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) {
-	return "article$id_article.html";
+function generer_url_article($id_article, $args='', $ancre='') {
+	return "article$id_article.html" . ($args ? "?$args" : '') . ($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique) {
-	return "rubrique$id_rubrique.html";
+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) {
-	return "breve$id_breve.html";
+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) {
-	return "mot$id_mot.html";
+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) {
-	return "site$id_syndic.html";
+function generer_url_site($id_syndic, $args='', $ancre='') {
+	return "site$id_syndic.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur) {
-	return "auteur$id_auteur.html";
+function generer_url_auteur($id_auteur, $args='', $ancre='') {
+	return "auteur$id_auteur.html" . ($args ? "?$args" : '') .($ancre ? "#$ancre" : '');
 }
 
 // http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document) {
+function generer_url_document($id_document, $args='', $ancre='') {
 	include_spip('inc/documents');
-	return generer_url_document_dist($id_document);
+	return generer_url_document_dist($id_document, $args, $ancre);
 }
 
 
@@ -108,9 +108,9 @@ function recuperer_parametres_url($fond, $url) {
 //
 
 // http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $show_thread=false) {
+function generer_url_forum($id_forum, $args='', $ancre='') {
 	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $show_thread);
+	return generer_url_forum_dist($id_forum, $args, $ancre);
 }
  }
 ?>
diff --git a/ecrire/urls/page.php b/ecrire/urls/page.php
index bbb6147fedf2903ae76a77b83b717167c6d1ebb4..654bb7218c22ad5e89aa9ea804b4811f759d0ade 100644
--- a/ecrire/urls/page.php
+++ b/ecrire/urls/page.php
@@ -26,43 +26,45 @@ define ('_debut_urls_page', get_spip_script('./').'?');
 
 
 // http://doc.spip.org/@composer_url_page
-function composer_url_page($page,$id) {
-	return _debut_urls_page . $page . _separateur_urls_page
-	. $id . _terminaison_urls_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) {
-	return composer_url_page('article', $id_article);
+function generer_url_article($id_article, $args='', $ancre='') {
+	return composer_url_page('article', $id_article, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique) {
-	return composer_url_page('rubrique', $id_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) {
-	return composer_url_page('breve', $id_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) {
-	return composer_url_page('mot', $id_mot);
+function generer_url_mot($id_mot, $args='', $ancre='') {
+	return composer_url_page('mot', $id_mot, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic) {
-	return composer_url_page('site', $id_syndic);
+function generer_url_site($id_syndic, $args='', $ancre='') {
+	return composer_url_page('site', $id_syndic, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur) {
-	return composer_url_page('auteur', $id_auteur);
+function generer_url_auteur($id_auteur, $args='', $ancre='') {
+	return composer_url_page('auteur', $id_auteur, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document) {
+function generer_url_document($id_document, $args='', $ancre='') {
 	include_spip('inc/documents');
 	return generer_url_document_dist($id_document);
 }
@@ -117,9 +119,9 @@ function recuperer_parametres_url(&$fond, $url) {
 //
 
 // http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $show_thread=false) {
+function generer_url_forum($id_forum, $args='', $ancre='') {
 	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $show_thread);
+	return generer_url_forum_dist($id_forum, $args, $ancre);
 }
  }
 ?>
diff --git a/ecrire/urls/propres.php b/ecrire/urls/propres.php
index 16a4324c1ef1d1724d1ddd41b4b9302481e98d81..18a9a3048fe042c8545a9b16b446ee65f0b0edd5 100644
--- a/ecrire/urls/propres.php
+++ b/ecrire/urls/propres.php
@@ -136,69 +136,82 @@ function _generer_url_propre($type, $id_objet) {
 }
 
 // http://doc.spip.org/@generer_url_article
-function generer_url_article($id_article) {
+function generer_url_article($id_article, $args='', $ancre='') {
+  spip_log("generer_url_article($id_article, $args='', $ancre");
 	$url = _generer_url_propre('article', $id_article);
 	if ($url)
-		return _debut_urls_propres . $url . _terminaison_urls_propres;
+		$url = _debut_urls_propres . $url . _terminaison_urls_propres  . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=article&id_article=$id_article";
+		$url = get_spip_script('./')."?page=article&id_article=$id_article" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_rubrique
-function generer_url_rubrique($id_rubrique) {
+function generer_url_rubrique($id_rubrique, $args='', $ancre='') {
 	$url = _generer_url_propre('rubrique', $id_rubrique);
 	if ($url)
-		return _debut_urls_propres . '-'.$url.'-'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '-'.$url.'-'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=rubrique&id_rubrique=$id_rubrique";
+		$url = get_spip_script('./')."?page=rubrique&id_rubrique=$id_rubrique" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_breve
-function generer_url_breve($id_breve) {
+function generer_url_breve($id_breve, $args='', $ancre='') {
 	$url = _generer_url_propre('breve', $id_breve);
 	if ($url)
-		return _debut_urls_propres . '+'.$url.'+'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '+'.$url.'+'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=breve&id_breve=$id_breve";
+		$url = get_spip_script('./')."?page=breve&id_breve=$id_breve"  . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_forum
-function generer_url_forum($id_forum, $show_thread=false) {
+function generer_url_forum($id_forum, $args='', $ancre='') {
 	include_spip('inc/forum');
-	return generer_url_forum_dist($id_forum, $show_thread);
+	return generer_url_forum_dist($id_forum, $args, $ancre);
 }
 
 // http://doc.spip.org/@generer_url_mot
-function generer_url_mot($id_mot) {
+function generer_url_mot($id_mot, $args='', $ancre='') {
 	$url = _generer_url_propre('mot', $id_mot);
 	if ($url)
-		return _debut_urls_propres . '+-'.$url.'-+'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '+-'.$url.'-+'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=mot&id_mot=$id_mot";
+		$url = get_spip_script('./')."?page=mot&id_mot=$id_mot" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_auteur
-function generer_url_auteur($id_auteur) {
+function generer_url_auteur($id_auteur, $args='', $ancre='') {
 	$url = _generer_url_propre('auteur', $id_auteur);
 	if ($url)
-		return _debut_urls_propres . '_'.$url.'_'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '_'.$url.'_'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=auteur&id_auteur=$id_auteur";
+		$url = get_spip_script('./')."?page=auteur&id_auteur=$id_auteur" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_site
-function generer_url_site($id_syndic) {
+function generer_url_site($id_syndic, $args='', $ancre='') {
 	$url = _generer_url_propre('site', $id_syndic);
 	if ($url)
-		return _debut_urls_propres . '@'.$url.'@'._terminaison_urls_propres;
+		$url = _debut_urls_propres . '@'.$url.'@'._terminaison_urls_propres . ($args ? "?$args" : '');
 	else
-		return get_spip_script('./')."?page=site&id_syndic=$id_syndic";
+		$url = get_spip_script('./')."?page=site&id_syndic=$id_syndic" . ($args ? "&$args" : '');
+	if ($ancre) $url .= "#$ancre";
+	return $url;
 }
 
 // http://doc.spip.org/@generer_url_document
-function generer_url_document($id_document) {
+function generer_url_document($id_document, $args='', $ancre='') {
 	include_spip('inc/documents');
-	return generer_url_document_dist($id_document);
+	return generer_url_document_dist($id_document, $args, $ancre);
 }
 
 // http://doc.spip.org/@recuperer_parametres_url