diff --git a/.gitattributes b/.gitattributes
index 4d25cf31cd6c1ce49805668bb4d3e4184d22be4a..194377a371c9082e80c9ef61f0eadec5eff98e12 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -730,6 +730,7 @@ prive/squelettes/contenu/page-debug.html -text
 prive/squelettes/extra/dist.html -text
 prive/squelettes/head/dist.html -text
 prive/squelettes/hierarchie/dist.html -text
+prive/squelettes/hierarchie/dist_fonctions.php -text
 prive/squelettes/inclure/admin_autres_bases.html -text
 prive/squelettes/inclure/admin_autres_bases_fonctions.php -text
 prive/squelettes/inclure/admin_vider_cache.html -text
diff --git a/ecrire/exec/articles.php b/ecrire/exec/articles.php
index 6728a38a65b15312e732115e50f1bd14caac0b72..0ec74e1df6033f8588a2430ab83e2185bb3cb091 100644
--- a/ecrire/exec/articles.php
+++ b/ecrire/exec/articles.php
@@ -45,7 +45,7 @@ function exec_articles_args($id_article)
 		echo $commencer_page("« ". $row['titre'] ." »", "naviguer", "articles", $row['id_rubrique']);
 
 		echo debut_grand_cadre(true),
-			afficher_hierarchie($row['id_rubrique'],_T('titre_cadre_interieur_rubrique'),$id_article,'article',$row['id_secteur'],($row['statut'] == 'publie')),
+			afficher_hierarchie($row['id_rubrique'],'',$id_article,'article',$row['id_secteur'],($row['statut'] == 'publie')),
 			fin_grand_cadre(true),
 			$res,
 			fin_page();
diff --git a/ecrire/exec/articles_edit.php b/ecrire/exec/articles_edit.php
index 3589057c3476cdbab57ddc29ad95b440f1bace0c..e54f75d470d7e609f3672d67125f4e46bdc77ca5 100644
--- a/ecrire/exec/articles_edit.php
+++ b/ecrire/exec/articles_edit.php
@@ -56,7 +56,7 @@ function articles_edit($id_article, $id_rubrique, $lier_trad, $new, $config_fonc
 	echo $commencer_page(_T('titre_page_articles_edit', array('titre' => $titre)), "naviguer", "articles", $id_rubrique);
 
 	echo debut_grand_cadre(true);
-	echo afficher_hierarchie($id_rubrique,'',$id_article,'article');
+	echo afficher_hierarchie($id_rubrique,'',$id_article,'article',$row['id_secteur'],($row['statut'] == 'publie'));
 	echo fin_grand_cadre(true);
 
 	echo debut_gauche("",true);
diff --git a/ecrire/exec/breves_edit.php b/ecrire/exec/breves_edit.php
index 38b0fdbb28e6be96f93ae9e6a3c6c41b4db1adbb..1e3bc3c4e9f11c4c9228bd4f32480654ce292840 100644
--- a/ecrire/exec/breves_edit.php
+++ b/ecrire/exec/breves_edit.php
@@ -86,7 +86,7 @@ function breves_edit_ok($row, $id_breve, $id_rubrique, $new)
 	echo $commencer_page(_T('titre_page_breves_edit', array('titre' => $titre)), "naviguer", "breves", $id_rubrique);
 
 	echo debut_grand_cadre(true);
-	echo afficher_hierarchie($id_rubrique);
+	echo afficher_hierarchie($id_rubrique,'',$id_breve,'breve',$row['id_secteur'],($row['statut'] == 'publie'));
 
 	echo fin_grand_cadre(true);
 	echo debut_gauche('', true);
diff --git a/ecrire/exec/breves_voir.php b/ecrire/exec/breves_voir.php
index fa692604c84faf44e5f5664b64e2278cc0b00885..65a181c904247b09020780af6ee0b1538aaf14d1 100644
--- a/ecrire/exec/breves_voir.php
+++ b/ecrire/exec/breves_voir.php
@@ -69,7 +69,7 @@ function exec_breves_voir_args($id_breve, $cherche_mot, $select_groupe)
 	echo $commencer_page("« $titre_breve »", "naviguer", "breves", $id_rubrique);
 
 	echo debut_grand_cadre(true);
-	echo afficher_hierarchie($id_rubrique);
+	echo afficher_hierarchie($id_rubrique,'',$id_breve,'breve',$row['id_secteur'],($row['statut'] == 'publie'));
 	echo fin_grand_cadre(true);
 
 	echo debut_gauche('', true);
diff --git a/ecrire/exec/naviguer.php b/ecrire/exec/naviguer.php
index 83b8897e1111c8e5c9cbd4c628e00f36370cd726..b09d84ca036679069a4299bdc9b01ed545dd0da6 100644
--- a/ecrire/exec/naviguer.php
+++ b/ecrire/exec/naviguer.php
@@ -59,7 +59,7 @@ function exec_naviguer_args($id_rubrique, $cherche_mot, $select_groupe)
 
 	echo debut_grand_cadre(true);
 	if ($id_rubrique  > 0)
-		echo afficher_hierarchie($id_parent,_T('titre_cadre_interieur_rubrique'),$id_rubrique,'rubrique',$id_secteur,(!$GLOBALS['connect_toutes_rubriques']));
+		echo afficher_hierarchie($id_parent,'',$id_rubrique,'rubrique',$id_secteur,(!$GLOBALS['connect_toutes_rubriques']));
 	else $titre = _T('info_racine_site').": ". $GLOBALS['meta']["nom_site"];
 
 	echo fin_grand_cadre(true);
diff --git a/ecrire/exec/rubriques_edit.php b/ecrire/exec/rubriques_edit.php
index 779e186660f8f6fa742f47b247534e45ea04b73d..2132603760bd3ef75981771b50fb8e75ca223605 100644
--- a/ecrire/exec/rubriques_edit.php
+++ b/ecrire/exec/rubriques_edit.php
@@ -60,7 +60,7 @@ function exec_rubriques_edit_args($id_rubrique, $id_parent, $new, $lier_trad)
 	else $ze_logo = "rubrique-24.png";
 
 	echo debut_grand_cadre(true);
-	echo afficher_hierarchie($id_parent,'',$id_rubrique,'rubrique');
+	echo afficher_hierarchie($id_parent,'',$id_rubrique,'rubrique',$id_secteur,(!$GLOBALS['connect_toutes_rubriques']));
 	echo fin_grand_cadre(true);
 
 	echo debut_gauche('', true);
diff --git a/ecrire/exec/sites.php b/ecrire/exec/sites.php
index 5b7f44e28de7a53a4ac59a06bf5c2fb28fdb068c..8f9d54e672cc2fc3b6264ea4a580636621b63eec 100644
--- a/ecrire/exec/sites.php
+++ b/ecrire/exec/sites.php
@@ -76,7 +76,7 @@ function afficher_site($id_syndic, $id_rubrique, $nom_site, $row){
 	$lister_objets = charger_fonction('lister_objets','inc');
 
 	echo debut_grand_cadre(true);
-	echo afficher_hierarchie($id_rubrique);
+	echo afficher_hierarchie($id_rubrique,'',$id_syndic,'site',$row['id_secteur'],($row['statut'] == 'publie'));
 	echo fin_grand_cadre(true);
 
 	echo debut_gauche('', true);
diff --git a/ecrire/exec/sites_edit.php b/ecrire/exec/sites_edit.php
index cfc9765fbf2048780e2f01006c0cf8004f501d5a..7925efc7ccc43bdce1c68a44db9805702dd21168 100644
--- a/ecrire/exec/sites_edit.php
+++ b/ecrire/exec/sites_edit.php
@@ -57,7 +57,7 @@ function exec_sites_edit_dist()
 
 	echo debut_grand_cadre(true);
 
-	echo afficher_hierarchie($id_rubrique);
+	echo afficher_hierarchie($id_rubrique,'',$id_syndic,'site',$row['id_secteur'],($row['statut'] == 'publie'));
 
 	echo fin_grand_cadre(true);
 
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 32b258fcf8307d87e6d702608a18062120249746..1075e738a098c646bb273897e651b384336b0369 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -2178,56 +2178,6 @@ function filtre_info_plugin_dist($plugin, $type_info) {
 }
 
 
-// http://doc.spip.org/@chercher_rubrique
-function chercher_rubrique($msg,$id, $id_parent, $type, $id_secteur, $restreint,$actionable = false, $retour_sans_cadre=false){
-	global $spip_lang_right;
-	include_spip('inc/autoriser');
-	if (intval($id) && !autoriser('modifier', $type, $id))
-		return "";
-	if (!sql_countsel('spip_rubriques'))
-		return "";
-	$chercher_rubrique = charger_fonction('chercher_rubrique', 'inc');
-	$form = $chercher_rubrique($id_parent, $type, $restreint, ($type=='rubrique')?$id:0);
-
-	if ($id_parent == 0) $logo = "racine-24.png";
-	elseif ($id_secteur == $id_parent) $logo = "secteur-24.png";
-	else $logo = "rubrique-24.png";
-
-	$confirm = "";
-	if ($type=='rubrique') {
-		// si c'est une rubrique-secteur contenant des breves, demander la
-		// confirmation du deplacement
-		$contient_breves = sql_countsel('spip_breves', "id_rubrique=$id");
-	
-		if ($contient_breves > 0) {
-			$scb = ($contient_breves>1? 's':'');
-			$scb = _T('avis_deplacement_rubrique',
-				array('contient_breves' => $contient_breves,
-				      'scb' => $scb));
-			$confirm .= "\n<div class='confirmer_deplacement verdana2'><div class='choix'><input type='checkbox' name='confirme_deplace' value='oui' id='confirme-deplace' /><label for='confirme-deplace'>" . $scb . "</label></div></div>\n";
-		} else
-			$confirm .= "<input type='hidden' name='confirme_deplace' value='oui' />\n";
-	}
-	$form .= $confirm;
-	if ($actionable){
-		if (strpos($form,'<select')!==false) {
-			$form .= "<div style='text-align: $spip_lang_right;'>"
-				. '<input class="fondo" type="submit" value="'._T('bouton_choisir').'"/>'
-				. "</div>";
-		}
-		$form = "<input type='hidden' name='editer_$type' value='oui' />\n" . $form;
-		$form = generer_action_auteur("editer_$type", $id, self(), $form, " method='post' class='submit_plongeur'");	
-	}
-
-	if ($retour_sans_cadre)
-		return $form;
-		
-	include_spip('inc/presentation');
-	return debut_cadre_couleur($logo, true, "", $msg) . $form .fin_cadre_couleur(true);
-	
-}
-
-
 // http://doc.spip.org/@puce_changement_statut
 function puce_changement_statut($id_objet, $statut, $id_rubrique, $type, $ajax=false){
 	$puce_statut = charger_fonction('puce_statut','inc');
diff --git a/ecrire/inc/filtres_ecrire.php b/ecrire/inc/filtres_ecrire.php
index f93b614bc069ed78ed612bf2a44e6e0833fd8d0d..184d89d42ec424bce5b08ddcb15ee9d3ee52b582 100644
--- a/ecrire/inc/filtres_ecrire.php
+++ b/ecrire/inc/filtres_ecrire.php
@@ -121,4 +121,54 @@ function boite_fermer(){
 	.'</div>';
 }
 
+
+// http://doc.spip.org/@chercher_rubrique
+function chercher_rubrique($msg,$id, $id_parent, $type, $id_secteur, $restreint,$actionable = false, $retour_sans_cadre=false){
+	global $spip_lang_right;
+	include_spip('inc/autoriser');
+	if (intval($id) && !autoriser('modifier', $type, $id))
+		return "";
+	if (!sql_countsel('spip_rubriques'))
+		return "";
+	$chercher_rubrique = charger_fonction('chercher_rubrique', 'inc');
+	$form = $chercher_rubrique($id_parent, $type, $restreint, ($type=='rubrique')?$id:0);
+
+	if ($id_parent == 0) $logo = "racine-24.png";
+	elseif ($id_secteur == $id_parent) $logo = "secteur-24.png";
+	else $logo = "rubrique-24.png";
+
+	$confirm = "";
+	if ($type=='rubrique') {
+		// si c'est une rubrique-secteur contenant des breves, demander la
+		// confirmation du deplacement
+		$contient_breves = sql_countsel('spip_breves', "id_rubrique=$id");
+
+		if ($contient_breves > 0) {
+			$scb = ($contient_breves>1? 's':'');
+			$scb = _T('avis_deplacement_rubrique',
+				array('contient_breves' => $contient_breves,
+				      'scb' => $scb));
+			$confirm .= "\n<div class='confirmer_deplacement verdana2'><div class='choix'><input type='checkbox' name='confirme_deplace' value='oui' id='confirme-deplace' /><label for='confirme-deplace'>" . $scb . "</label></div></div>\n";
+		} else
+			$confirm .= "<input type='hidden' name='confirme_deplace' value='oui' />\n";
+	}
+	$form .= $confirm;
+	if ($actionable){
+		if (strpos($form,'<select')!==false) {
+			$form .= "<div style='text-align: $spip_lang_right;'>"
+				. '<input class="fondo" type="submit" value="'._T('bouton_choisir').'"/>'
+				. "</div>";
+		}
+		$form = "<input type='hidden' name='editer_$type' value='oui' />\n" . $form;
+		$form = generer_action_auteur("editer_$type", $id, self(), $form, " method='post' class='submit_plongeur'");
+	}
+
+	if ($retour_sans_cadre)
+		return $form;
+
+	include_spip('inc/presentation');
+	return debut_cadre_couleur($logo, true, "", $msg) . $form .fin_cadre_couleur(true);
+
+}
+
 ?>
\ No newline at end of file
diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php
index 6caa63922989b68883e1085a1217328af3544dc6..a01299dda775a82b3794d0c61fdb6dedae662450 100644
--- a/ecrire/inc/presentation.php
+++ b/ecrire/inc/presentation.php
@@ -476,66 +476,15 @@ function fin_cadre_formulaire($return=false){
 
 // http://doc.spip.org/@afficher_hierarchie
 function afficher_hierarchie($id_parent, $message='',$id_objet=0,$type='',$id_secteur=0,$restreint='') {
-	global $spip_lang_left,$spip_lang_right;
-
-	$out = "";
-	$nav = "";
- 	if ($id_objet) {
- 		# desactiver le selecteur de rubrique sur le chemin
- 		# $nav = chercher_rubrique($message,$id_objet, $id_parent, $type, $id_secteur, $restreint,true);
- 		$nav = $nav ?"<div class='none'>$nav</div>":"";
- 	}
-
-	$parents = '';
-	$style1 = "$spip_lang_left center no-repeat; padding-$spip_lang_left: 15px";
-	$style2 = "margin-$spip_lang_left: 15px;";
-	$tag = "a";
-	$on = ' on';
-
-	$id_rubrique = $id_parent;
-	while ($id_rubrique) {
-
-		$res = sql_fetsel("id_parent, titre, lang", "spip_rubriques", "id_rubrique=".intval($id_rubrique));
-
-		if (!$res){  // rubrique inexistante
-			$id_rubrique = 0;
-			break;
-		}
-
-		changer_typo($res['lang']);
-
-		$class = (!$res['id_parent']) ? "secteur"
-		: (acces_restreint_rubrique($id_rubrique)
-		? "admin" : "rubrique");
-
-		$parents = "<ul><li><span class='bloc'><em> &gt; </em><$tag class='$class$on'"
-		. ($tag=='a'?" href='". generer_url_ecrire("naviguer","id_rubrique=$id_rubrique")."'":"")
-		. ">"
-		. textebrut(supprimer_numero(typo(sinon($res['titre'], _T('ecrire:info_sans_titre')))))
-		. "</$tag></span>"
-		. $parents
-		. "</li></ul>";
-
-		$id_rubrique = $res['id_parent'];
-		$tag = 'a';
-		$on = '';
-	}
-
-	$out .=  $nav
-		. "\n<ul id='chemin' class='verdana3' dir='".lang_dir()."'"
-	  //. http_style_background("racine-site-12.gif", $style1)
-	  . "><li><span class='bloc'><$tag class='racine$on'"
-		. ($tag=='a'?" href='". generer_url_ecrire("naviguer","id_rubrique=$id_rubrique")."'":"")
-	  . ">"._T('info_racine_site')."</$tag>"
- 	  . "</span>"
-	  . $parents
- 	  . aide ("rubhier")
- 	  . "</li></ul>"
- 	  . ($nav?
- 	    "&nbsp;<a href='#' onclick=\"$(this).prev().prev().toggle('fast');return false;\" class='verdana2'>"
- 	    . _T('bouton_changer') ."</a>"
- 	    :"");
-
+	$out = recuperer_fond('prive/squelettes/hierarchie/dist',
+					array(
+						'id_parent'=>$id_parent,
+						'objet'=>$type,
+						'id_objet'=>$id_objet,
+						'deplacer'=>_request('deplacer')?'oui':'',
+						'id_secteur'=>$id_secteur,
+						'restreint'=>$restreint,
+					),array('ajax'=>true));
 	$out = pipeline('affiche_hierarchie',array('args'=>array(
 			'id_parent'=>$id_parent,
 			'message'=>$message,
@@ -545,7 +494,7 @@ function afficher_hierarchie($id_parent, $message='',$id_objet=0,$type='',$id_se
 			'restreint'=>$restreint),
 			'data'=>$out));
 
- 	return $out;//."<hr />".recuperer_fond('prive/squelettes/hierarchie/dist',array('id_rubrique'=>$id_parent,'objet'=>$type,'id_objet'=>$id_objet));
+ 	return $out;
 }
 
 // Pour construire des menu avec SELECTED
diff --git a/prive/squelettes/hierarchie/dist.html b/prive/squelettes/hierarchie/dist.html
index eac50b924f0c67ecea22389e7c26ca84a03ede85..fd01fd7ba26425fc65578fddf50d1027ba26c72e 100644
--- a/prive/squelettes/hierarchie/dist.html
+++ b/prive/squelettes/hierarchie/dist.html
@@ -1,5 +1,20 @@
 <!-- hierarchie -->
 <div id="chemin"><a href="#URL_ECRIRE{naviguer}"><:info_racine_site:></a>
+<BOUCLE_rub(RUBRIQUES){id_rubrique=#ENV{id_parent}}{statut?}>
 <BOUCLE_ariane(HIERARCHIE){id_rubrique}{tout}> &gt;
-[(#ID_RUBRIQUE|generer_url_entite{rubrique}|lien_ou_expose{#TITRE|couper{80}|sinon{<:ecrire:info_sans_titre:>},#ENV{objet}|non|et{#ID_RUBRIQUE|=={#ENV{id_rubrique}}}})]
-</BOUCLE_ariane>[ &gt; <strong class="on">(#INFO_TITRE{#ENV{objet},#ENV{id_objet}}|couper{80}|sinon{<:ecrire:info_sans_titre:>})</strong>]</div>
+[(#ID_RUBRIQUE|generer_url_entite{rubrique}|lien_ou_expose{#TITRE|couper{80}|sinon{<:ecrire:info_sans_titre:>},#ENV{objet}|non|et{#ID_RUBRIQUE|=={#ENV{id_parent}}}})]
+#SET{id_secteur,#ID_SECTEUR}</BOUCLE_ariane></BOUCLE_rub>
+[ &gt; <strong class="on">(#INFO_TITRE{#ENV{objet},#ENV{id_objet}}|couper{80}|sinon{<:ecrire:info_sans_titre:>})</strong>]
+#AIDER{rubhier}
+[(#ENV{deplacer}|non)
+<span class="changer">&#91;<a href="[(#SELF|parametre_url{deplacer,oui})]" class="ajax"><:bouton_changer:></a>&#93;</span>
+]
+[(#ENV{deplacer}|oui)
+<span class="changer">&#91;<a href="#" onclick="jQuery('#chercher_rubrique').toggle('fast');return false;"><:bouton_changer:></a>&#93;</span>
+<div id="chercher_rubrique">
+[(#BOITE_OUVRIR{<:titre_cadre_interieur_rubrique:>,'simple'})]
+[(#VAL|chercher_rubrique{#ENV{id_objet},#ENV{id_parent},#ENV{objet},#ENV{id_secteur,#GET{id_secteur}},#ENV{restreint,#ENV{objet}|deplacement_restreint{#INFO_STATUT{#ENV{objet},#ENV{id_objet}}}},true,form_simple})]
+#BOITE_FERMER
+</div>
+]
+</div>
\ No newline at end of file
diff --git a/prive/squelettes/hierarchie/dist_fonctions.php b/prive/squelettes/hierarchie/dist_fonctions.php
new file mode 100644
index 0000000000000000000000000000000000000000..3616145ac02a739d042d1a4dff43d3ae1431a82c
--- /dev/null
+++ b/prive/squelettes/hierarchie/dist_fonctions.php
@@ -0,0 +1,42 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2009                                                *
+ *  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.   *
+\***************************************************************************/
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+/**
+ * Tester le deplacement restreint ou non
+ * de l'objet en fonction de son statut
+ *
+ * @param string $objet
+ * @param string $statut
+ * @return bool
+ */
+function deplacement_restreint($objet,$statut) {
+
+	switch ($objet) {
+		case 'rubrique':
+			return (!$GLOBALS['connect_toutes_rubriques']);
+			break;
+		case 'article':
+		case 'site':
+		case 'syndic':
+		case 'breve':
+			return ($statut=='publie');
+			break;
+		default :
+			return ($statut?$statut=='publie':false);
+			break;
+	}
+	return false;
+}
+
+?>
\ No newline at end of file