diff --git a/ecrire/balise/formulaire_.php b/ecrire/balise/formulaire_.php
index 023ac20ab1f2e4a89f62b1d641f97001c22e1fd0..4219a6603c2db351d8f2bbf1a2e10b502e2b82ba 100644
--- a/ecrire/balise/formulaire_.php
+++ b/ecrire/balise/formulaire_.php
@@ -35,7 +35,7 @@ function existe_formulaire($form)
 
 	if (!$form) return ''; // on ne sait pas, le nom du formulaire n'est pas fourni ici
 
-	return trouve_modele($form, 'formulaires/') ? $form : false;
+	return trouver_fond($form, 'formulaires/') ? $form : false;
 }
 
 
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index b2d423ec7203a6f7c0c4505e96f7b9b3dd9438f1..9aea6cab08d0459f11e0910d56dde1be97955948 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -1826,22 +1826,51 @@ function recuperer_fond($fond, $contexte=array(), $options = array(), $connect='
 		return $options['trim'] ? ltrim($texte) : $texte;
 }
 
-// Trouve un squelette, par defaut dans le repertoire modeles/
-// Attention, si le 2arg fourni, il doit avoir le / final 
-function trouve_modele($nom, $dir='modeles/')
-{
-	return find_in_path($nom.'.'. _EXTENSION_SQUELETTES, $dir);
+/**
+ * Trouve un squelette dans le repertoire modeles/
+ *
+ * @param  $nom
+ * @return string
+ */
+function trouve_modele($nom) {
+	return trouver_fond($nom,'modeles/');
+}
+
+/**
+ * Trouver un squelette dans le chemin
+ * on peut specifier un sous-dossier dans $dir
+ * si $pathinfo est a true, retourne un tableau avec
+ * les composantes du fichier trouve
+ * + le chemin complet sans son extension dans fond
+ *
+ * @param string $nom
+ * @param string $dir
+ * @param bool $pathinfo
+ * @return array|string
+ */
+function trouver_fond($nom, $dir='', $pathinfo = false) {
+	$f = find_in_path($nom.'.'. _EXTENSION_SQUELETTES, $dir?rtrim($dir,'/').'/':'');
+  if (!$pathinfo) return $f;
+  // renvoyer un tableau detaille si $pathinfo==true
+	$p = pathinfo($f);
+  if (!$p['extension'])
+	  $p['extension'] = _EXTENSION_SQUELETTES;
+  if (!$p['filename'])
+	   $p['filename'] = ($p['basename']?substr($p['basename'],0,-strlen($p['extension'])-1):'');
+	$p['fond'] = ($f?substr($f,0,-strlen($p['extension'])-1):'');
+  return $p;
 }
 
 function tester_url_ecrire($nom){
 	// tester si c'est une page en squelette
-	if (trouve_modele($nom, 'prive/squelettes/contenu/'))
+	if (trouver_fond($nom, 'prive/squelettes/contenu/'))
 		return 'fond';
 	// compat skels orthogonaux version precedente
-	elseif (trouve_modele($nom, 'prive/exec/'))
+	elseif (trouver_fond($nom, 'prive/exec/'))
 		return 'fond_monobloc';
-	// attention, il ne faut pas inclure l'exec ici car sinon on modifie l'environnement
-	// par un simple #URL_ECRIRE dans un squelette (cas d'un define en debut d'exec/nom )
+	// attention, il ne faut pas inclure l'exec ici
+	// car sinon #URL_ECRIRE provoque des inclusions
+	// et des define intrusifs potentiels
 	return (find_in_path("{$nom}.php",'exec/') OR charger_fonction($nom,'exec',true))?$nom:'';
 }
 
diff --git a/ecrire/public/styliser.php b/ecrire/public/styliser.php
index 459f5bd2823a28287ec5992d859d9d4789c96170..9ed6b6d5ac95a61f82dc46f53ee7b92c707b39b3 100644
--- a/ecrire/public/styliser.php
+++ b/ecrire/public/styliser.php
@@ -42,13 +42,10 @@ function public_styliser_dist($fond, $contexte, $lang='', $connect='') {
 	// trouver un squelette du nom demande
 	// ne rien dire si on ne trouve pas, 
 	// c'est l'appelant qui sait comment gerer la situation
-	$squelette = trouve_modele($fond,"");
-	
-	// supprimer l'extension pour pouvoir affiner par id_rubrique ou par langue
-	if ($squelette AND preg_match('/^(.*)[.](\w+)$/', $squelette, $r)) {
-		list(, $squelette, $ext) = $r;
-	} else $ext = 'html'; // valeur par defaut, historique.
-		
+	// ou les plugins qui feront mieux dans le pipeline
+	$squelette = trouver_fond($fond,"",true);
+	$ext = $squelette['extension'];
+
 	$flux = array(
 		'args' => array(
 			'id_rubrique' => $id_rubrique,
@@ -58,7 +55,7 @@ function public_styliser_dist($fond, $contexte, $lang='', $connect='') {
 			'contexte' => $contexte, // le style d'un objet peut dependre de lui meme
 			'connect' => $connect
 		),
-		'data' => $squelette,
+		'data' => $squelette['fond'],
 	);
 
 	if (test_espace_prive() OR defined('_ZPIP')) {
diff --git a/ecrire/public/styliser_par_z.php b/ecrire/public/styliser_par_z.php
index 3b2c93bbdf2907ce53ef026cdc4215139a172565..30df398aeb22b83a6be8ebde6ac3edd03e20e412 100644
--- a/ecrire/public/styliser_par_z.php
+++ b/ecrire/public/styliser_par_z.php
@@ -83,8 +83,10 @@ function public_styliser_par_z_dist($flux){
 				if (!isset($disponible[$fond]))
 					$disponible[$fond] = z_contenu_disponible($prefix_path,$z_contenu,$fond,$ext);
 
-				if ($disponible[$fond])
-					$flux['data'] = substr(find_in_path($prefix_path."page.$ext"), 0, - strlen(".$ext"));
+				if ($disponible[$fond]) {
+					$flux['data'] = trouver_fond("page",$prefix_path,true);
+			    $flux['data'] = $flux['data']['fond'];
+				}
 			}
 
 			// echaffaudage :
@@ -142,8 +144,9 @@ function public_styliser_par_z_dist($flux){
 			AND $dir = explode('/',$dir)
 			AND $dir = reset($dir)
 			AND in_array($dir,$z_blocs)
-			AND $f=find_in_path($prefix_path.$fond."-".$flux['args']['contexte']['composition'].".$ext")){
-			$flux['data'] = substr($f,0,-strlen(".$ext"));
+			AND $f=trouver_fond($fond."-".$flux['args']['contexte']['composition'],$prefix_path,true)
+			AND $f['fond']){
+			$flux['data'] = $f['fond'];
 		}
 	}
 	return $flux;
@@ -194,10 +197,12 @@ function z_contenu_disponible($prefix_path,$z_contenu,$type,$ext){
  * @return string
  */
 function z_trouver_bloc($prefix_path,$bloc,$fond,$ext){
-	if ($f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext")
-		OR $f = find_in_path("$prefix_path$bloc/$fond.$ext"))
-		return substr($f, 0, - strlen(".$ext"));
-	return "";
+	$f = trouver_fond("$bloc.$fond","$prefix_path$bloc/",true);
+	if ($f['fond']) return $f['fond'];
+
+	$f = trouver_fond($fond,"$prefix_path$bloc/",true);
+	// vide si rien trouve
+	return $f['fond'];
 }
 /**
  * Tester si un type est echaffaudable