diff --git a/.gitattributes b/.gitattributes
index 0a83afb980d95bf27a47338d6d597de4f8a45aa7..fd4b4b4401121bcc63d234c34b29e4ff43158f47 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -695,7 +695,7 @@ ecrire/typographie/fr.php -text
 ecrire/typographie/index.php -text
 ecrire/urls/index.php -text
 ecrire/urls/page.php -text
-ecrire/urls/propres-qs.php -text
+ecrire/urls/propres_qs.php -text
 ecrire/win_png.htc -text
 ecrire/xml/analyser_dtd.php -text
 ecrire/xml/atom.php -text
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index 138953838df672ddfdd2c499f669cb63c0719e97..0abc6c807c3d08b24a52673b8c8b854f3bb92726 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -31,8 +31,6 @@ if (@is_readable(_DIR_TMP."charger_plugins_fonctions.php")){
 	include_once(_DIR_TMP."charger_plugins_fonctions.php");
 }
 
-charger_generer_url(); # pour recuperer_parametres_url
-
 //
 // Contexte : lors du calcul d'une page spip etablit le contexte a partir
 // des variables $_GET et $_POST, et leur ajoute la date
@@ -289,16 +287,25 @@ function public_parametrer_dist($fond, $local='', $cache='')  {
 
 	// distinguer le premier appel des appels par inclusion
 	if (!is_array($local)) {
-		global $contexte;
-		// ATTENTION, gestion des URLs personnalises (propre etc):
+		include_spip('inc/filtres'); // pour normaliser_date
+
+		// ATTENTION, gestion des URLs transformee par le htaccess
+		// en appelant la fonction nommee urls_$type_urls
 		// 1. $contexte est global car cette fonction le modifie.
 		// 2. $fond est passe par reference, pour la meme raison
 		// Bref,  les URL dites propres ont une implementation sale.
 		// Interdit de nettoyer, faut assumer l'histoire.
-		include_spip('inc/filtres'); // pour normaliser_date
+		global $contexte;
 		$contexte = calculer_contexte();
-		if (function_exists("recuperer_parametres_url")) {
-			recuperer_parametres_url($fond, nettoyer_uri());
+		$f = charger_fonction($GLOBALS['type_urls'], 'urls', true);
+		if (!$f) {
+			// compatibilite < 1.9.3
+			charger_generer_url();
+			if (function_exists('recuperer_parametres_url'))
+				$f = 'recuperer_parametres_url';
+		}
+		if ($f) {
+			$f($fond, nettoyer_uri());
 			// remettre les globales (bouton "Modifier cet article" etc)
 			foreach ($contexte as $var=>$val) {
 				if (substr($var,0,3) == 'id_') $GLOBALS[$var] = $val;
diff --git a/ecrire/urls/html.php b/ecrire/urls/html.php
index 20ef1008b1c62e35ab05858233c2395cac513f10..43a098f461f364e243d98ece8088db54183c924b 100644
--- a/ecrire/urls/html.php
+++ b/ecrire/urls/html.php
@@ -73,8 +73,8 @@ function generer_url_document($id_document, $args='', $ancre='') {
 }
 
 
-// http://doc.spip.org/@recuperer_parametres_url
-function recuperer_parametres_url($fond, $url) {
+// retrouver les parametres d'une URL dite "html"
+function urls_html_dist($fond, $url) {
 	global $contexte;
 
 
diff --git a/ecrire/urls/page.php b/ecrire/urls/page.php
index f85b06ac1b8779771038ea606a2fb4c066bcf040..75c7b82a23c7e3881b44c98f37a5b5d4969d0b3c 100644
--- a/ecrire/urls/page.php
+++ b/ecrire/urls/page.php
@@ -13,7 +13,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
 define ('_terminaison_urls_page', '');
@@ -69,8 +68,8 @@ function generer_url_document($id_document, $args='', $ancre='') {
 	return generer_url_document_dist($id_document);
 }
 
-// http://doc.spip.org/@recuperer_parametres_url
-function recuperer_parametres_url(&$fond, $url) {
+// retrouve le fond et les parametres d'une URL abregee
+function urls_page_dist(&$fond, $url) {
 	global $contexte;
 
 	// Ce bloc gere les urls page et la compatibilite avec les "urls standard"
diff --git a/ecrire/urls/propres.php b/ecrire/urls/propres.php
index e89c672df5c07dd999079a98d0ba82b9b1dbb3e9..7d67430fbbe9b3eb0d4fdaee315633cb4f7f7068 100644
--- a/ecrire/urls/propres.php
+++ b/ecrire/urls/propres.php
@@ -12,6 +12,7 @@
 
 if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
 if (!function_exists('generer_url_article')) { // si la place n'est pas prise
+include_spip('base/abstract_sql');
 
 /*
 
@@ -35,27 +36,55 @@ 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'; ? >
-
 */
 
 define ('_terminaison_urls_propres', '');
 define ('_debut_urls_propres', '');
 
 // Ces chaines servaient de marqueurs a l'epoque ou les URL propres devaient
-// indiquer la table ou les chercher (articles, auteurs etc).
-// Maintenant que ce n'est plus necessaire, elles ne sont la que pour eviter
-// d'encombrer l'unique table des URL avec des doublons quasi identiques.
-// Si ce n'est pas un probleme, ou si le site est nouveau, 
-// les definir a '' produira des URL plus jolies.
+// indiquer la table ou les chercher (articles, auteurs etc),
+// et elles etaient retirees par les preg_match dans la fonction ci-dessous.
+// Elles sont a present definies a "" pour avoir des URL plus jolies
+// mais les preg_match restent necessaires pour gerer les anciens signets.
 
+/*
 define ('_marqueur_rubrique', '-');
 define ('_marqueur_auteur', '_');
 define ('_marqueur_breve', '+');
 define ('_marqueur_site', '@');
 define ('_marqueur_mot_d', '+-');
 define ('_marqueur_mot_f', '-+');
+*/
+define ('_marqueur_rubrique', '');
+define ('_marqueur_auteur', '');
+define ('_marqueur_breve', '');
+define ('_marqueur_site', '');
+define ('_marqueur_mot_d', '');
+define ('_marqueur_mot_f', '');
+
+// Retire les marqueurs de type dans une URL propre ancienne maniere
+
+function retirer_marqueurs_url_propre($url_propre)
+{
+	if (preg_match(',^\+\-(.*?)\-\+$,', $url_propre, $regs)) {
+		return $regs[1];
+	}
+	else if (preg_match(',^-(.*?)-?$,', $url_propre, $regs)) {
+		return $regs[1];
+	}
+	else if (preg_match(',^\+(.*?)\+?$,', $url_propre, $regs)) {
+		return $regs[1];
+	}
+	else if (preg_match(',^_(.*?)_?$,', $url_propre, $regs)) {
+		return $regs[1];
+	}
+	else if (preg_match(',^@(.*?)@?$,', $url_propre, $regs)) {
+		return $regs[1];
+	}
+	// les articles n'ont pas de marqueur
+	return $url_propre;
+}
 
-include_spip('base/abstract_sql');
 
 // http://doc.spip.org/@_generer_url_propre
 function _generer_url_propre($type, $id_objet) {
@@ -241,10 +270,10 @@ function generer_url_document($id_document, $args='', $ancre='') {
 	return generer_url_document_dist($id_document, $args, $ancre);
 }
 
-// http://doc.spip.org/@recuperer_parametres_url
-function recuperer_parametres_url(&$fond, $url) {
+// retrouve le fond et les parametres d'une URL propre
+function urls_propres_dist(&$fond, $url) {
 	global $contexte;
-	$id_objet = 0;
+	$id_objet = $type = 0;
 
 	// Migration depuis anciennes URLs ?
 	if ($_SERVER['REQUEST_METHOD'] != 'POST') {
@@ -293,11 +322,10 @@ function recuperer_parametres_url(&$fond, $url) {
 		$url_propre = preg_replace(',[?].*,', '', $url);
 	}
 	// Mode Query-String ?
-	$adapter_le_fond = false;
+
 	if (!$url_propre
 	AND preg_match(',([?])([^=/?&]+)(&.*)?$,', $GLOBALS['REQUEST_URI'], $r)) {
 		$url_propre = $r[2];
-		$adapter_le_fond = true;
 	}
 
 	if (!$url_propre) return;
@@ -305,25 +333,9 @@ function recuperer_parametres_url(&$fond, $url) {
 	// Compatilibite avec propres2
 	$url_propre = preg_replace(',\.html$,i', '', $url_propre);
 
-	// Retirer les marqueurs de type dans l'URL propre
-	// Detecter les differents types d'objets demandes
-	// Note: on pourrait evacuer ca maintenant qu'on a une seule table
-	if (preg_match(',^\+\-(.*?)\-\+$,', $url_propre, $regs)) {
-		$url_propre = $regs[1];
-	}
-	else if (preg_match(',^-(.*?)-?$,', $url_propre, $regs)) {
-		$url_propre = $regs[1];
-	}
-	else if (preg_match(',^\+(.*?)\+?$,', $url_propre, $regs)) {
-		$url_propre = $regs[1];
-	}
-	else if (preg_match(',^_(.*?)_?$,', $url_propre, $regs)) {
-		$url_propre = $regs[1];
-	}
-	else if (preg_match(',^@(.*?)@?$,', $url_propre, $regs)) {
-		$url_propre = $regs[1];
-	}
-	// les articles n'ont pas de marqueur
+	// Compatibilite avec les anciennes URL propres
+
+	$url_propre = retirer_marqueurs_url_propre($url_propre);
 
 	$row = sql_fetch(spip_query("SELECT id_objet, type FROM spip_urls WHERE url=" . _q($url_propre)));
 
@@ -333,14 +345,10 @@ function recuperer_parametres_url(&$fond, $url) {
 		$contexte[$col_id] = $row['id_objet'];
 	}
 
-	// En mode Query-String, on fixe ici le $fond utilise
-	if ($adapter_le_fond) {
-		$fond = $type;
-		if ($type == 'syndic') $fond = 'site';
-	}
+	if ($type AND ($adapter_le_fond OR $fond='type_urls')) {
 
-	return;
+	$fond =  ($type == 'syndic') ?  'site' : $type;
+	}
 }
- }
-
+} // function_exists
 ?>
diff --git a/ecrire/urls/propres2.php b/ecrire/urls/propres2.php
index 88118f131489571d359a36620b23735dd5742e93..ded404798e47d471c443699f21e221f65d49256f 100644
--- a/ecrire/urls/propres2.php
+++ b/ecrire/urls/propres2.php
@@ -23,6 +23,9 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
 if (!defined('_terminaison_urls_propres'))
 	define ('_terminaison_urls_propres', '.html');
 
-include_spip('urls/propres');
+function urls_propres2_dist(&$fond, $url) {
+	$f = charger_fonction('propres', 'urls', true);
+	if ($f) $f($fond, $url);
+}
 
 ?>
diff --git a/ecrire/urls/propres-qs.php b/ecrire/urls/propres_qs.php
similarity index 84%
rename from ecrire/urls/propres-qs.php
rename to ecrire/urls/propres_qs.php
index dcdb24577c22e5871deb20bc10b0bf31ed5dc475..bb56ceec12afcfa0db548098c494a3e5def29954 100644
--- a/ecrire/urls/propres-qs.php
+++ b/ecrire/urls/propres_qs.php
@@ -20,9 +20,9 @@ mode "Query-String", sans .htaccess ;
 
 	<http://mon-site-spip/?-Rubrique->
 
-Attention : le mode 'propres-qs' est moins fonctionnel que le mode 'propres' ou
+Attention : le mode 'propres_qs' est moins fonctionnel que le mode 'propres' ou
 'propres2'. Si vous pouvez utiliser le .htaccess, ces deux derniers modes sont
-preferables au mode 'propres-qs'.
+preferables au mode 'propres_qs'.
 
 */
 if (!defined("_ECRIRE_INC_VERSION")) return; // securiser
@@ -31,6 +31,9 @@ if (!defined('_terminaison_urls_propres'))
 
 define ('_debut_urls_propres', './?');
 
-include_spip('urls/propres');
 
+function urls_propres_qs_dist(&$fond, $url) {
+	$f = charger_fonction('propres', 'urls', true);
+	if ($f) $f($fond, $url);
+}
 ?>
diff --git a/htaccess.txt b/htaccess.txt
index c005d81ef75f0f674134ae101ec503534eb03fc5..e557d63a456881248d8bb4a5e55bb67685db9616 100644
--- a/htaccess.txt
+++ b/htaccess.txt
@@ -79,23 +79,7 @@ RewriteRule ^spip_rss\.php3?$	spip.php?action=rss [QSA,L]
 # dans ecrire/mes_options.php
 # (fichier associe : ecrire/urls/propres.php)
 
-# Les mots-cles
-RewriteRule ^\+-[^/\.]+(-\+)?(\.html)?$	spip.php?page=mot [QSA,E=url_propre:$0,L]
-
-# Les breves
-RewriteRule ^\+[^/\.]+\+?(\.html)?$ 	spip.php?page=breve [QSA,E=url_propre:$0,L]
-
-# Les rubriques
-RewriteRule ^-[^/\.]+-?(\.html)?$	spip.php?page=rubrique [QSA,E=url_propre:$0,L]
-
-# les auteurs
-RewriteRule ^_[^/\.]+_?(\.html)?$	spip.php?page=auteur [QSA,E=url_propre:$0,L]
-
-# Les sites
-RewriteRule ^@[^/\.]+@?(\.html)?$	spip.php?page=site [QSA,E=url_propre:$0,L]
-
-# Les articles (en dernier car expression plus "large")
-RewriteRule ^[^/\.]+(\.html)?$		spip.php?page=article [QSA,E=url_propre:$0,L]
+RewriteRule ^[^/\.]+(\.html)?$		spip.php?page=type_urls [QSA,E=url_propre:$0,L]
 
 # Fin URLs "propres" et "propres2"
 ###