diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index e81937f381d1f4aecaea526e15255b0df451ec8a..d35e47ff6c654b709d818e200f161c9a05c35c71 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -2024,6 +2024,9 @@ function tester_url_ecrire($nom){
 	// compat skels orthogonaux version precedente
 	elseif (trouver_fond($nom, 'prive/exec/'))
 		return 'fond_monobloc';
+	// echaffaudage d'un fond !
+	elseif(include_spip('public/styliser_par_z') AND z_echaffaudable($nom))
+		return 'fond';
 	// attention, il ne faut pas inclure l'exec ici
 	// car sinon #URL_ECRIRE provoque des inclusions
 	// et des define intrusifs potentiels
diff --git a/ecrire/public/styliser_par_z.php b/ecrire/public/styliser_par_z.php
index e5f2101cb808a59cd272bc90a03a220588bc919e..72c1d198b1e161c0514e7a8563475571c835149e 100644
--- a/ecrire/public/styliser_par_z.php
+++ b/ecrire/public/styliser_par_z.php
@@ -36,7 +36,7 @@ function public_styliser_par_z_dist($flux){
 			$prefix_length = strlen($prefix_path);
 			$apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD';
 			$page = 'exec';
-			$echaffauder = ""; // pas d'echaffaudage dans ecrire/ pour le moment
+			$echaffauder = charger_fonction('echaffauder','prive',true);
 			define('_ZCORE_EXCLURE_PATH','');
 		}
 		else {
@@ -239,21 +239,87 @@ function z_trouver_bloc($prefix_path,$bloc,$fond,$ext){
  * @return bool
  */
 function z_echaffaudable($type){
+	static $pages = null;
 	static $echaffaudable = array();
 	if (isset($echaffaudable[$type]))
 		return $echaffaudable[$type];
 	if (preg_match(',[^\w],',$type))
 		return $echaffaudable[$type] = false;
-	if ($table = table_objet($type)
-	  AND $type == objet_type($table)
-	  AND $trouver_table = charger_fonction('trouver_table','base')
-	  AND
-		($desc = $trouver_table($table)
-		OR $desc = $trouver_table($table_sql = "spip_$table"))
-		)
-		return $echaffaudable[$type] = array($table,$desc['table'],$desc);
-	else
-		return $echaffaudable[$type] = false;
+
+	if (test_espace_prive()){
+		include_spip('inc/pipelines_ecrire');
+		if ($e=trouver_objet_exec($type)){
+			return $echaffaudable[$type] = array($e['table'],$e['table_objet_sql'],$e);
+		}
+		else {
+			// peut etre c'est un exec=types qui liste tous les objets "type"
+			if (($t=objet_type($type,false))!==$type
+			  AND $e=trouver_objet_exec($t)){
+				return $echaffaudable[$type] = array($e['table'],$e['table_objet_sql'],$t);
+			}
+		}
+	}
+	else {
+		if (is_null($pages)) {
+			$pages = array();
+			$liste = lister_tables_objets_sql();
+			foreach($liste as $t=>$d)
+				if ($d['page']) $pages[$d['page']] = array($d['table_objet'],$t);
+		}
+		if (!isset($pages[$type]))
+			return $echaffaudable[$type] = false;
+		if (count($pages[$type])==2){
+			$trouver_table = charger_fonction('trouver_table','base');
+			$pages[$type][] = $trouver_table(reset($pages[$type]));
+		}
+		return $echaffaudable[$type] = $pages[$type];
+	}
+	return $echaffaudable[$type] = false;
+}
+
+
+/**
+ * Generer a la volee un fond a partir d'un contenu connu
+ * tous les squelettes d'echafaudage du prive sont en fait explicites dans prive/echaffaudage
+ * on ne fait qu'un mini squelette d'inclusion pour reecrire les variables d'env
+ *
+ * @param string $type
+ * @param string $table
+ * @param string $table_sql
+ * @param array $desc
+ * @param string $ext
+ * @return string
+ */
+function prive_echaffauder_dist($exec,$table,$table_sql,$desc_exec,$ext){
+	$scaffold = "";
+
+	// page objet ou objet_edit
+	if (is_array($desc_exec)) {
+		$type = $desc_exec['type'];
+		$primary = $desc_exec['id_table_objet'];
+
+		if ($desc_exec['edition']===false)
+			$fond = "objet";
+		else {
+			$trouver_table = charger_fonction('trouver_table','base');
+			$desc = $trouver_table($table_sql);
+			if (isset($desc['field']['id_rubrique']))
+				$fond = 'objet_edit';
+			else
+				$fond = 'objet_edit.sans_rubrique';
+		}
+		$scaffold = "<INCLURE{fond=prive/echafaudage/contenu/".$fond.",objet=".$type.",id_objet=#".strtoupper($primary).",env}>";
+	}
+	// page objets
+	elseif($type = $desc_exec){
+		$scaffold = "<INCLURE{fond=prive/echafaudage/contenu/objets,objet=".$type."} />";
+	}
+	
+	$dir = sous_repertoire(_DIR_CACHE,"scaffold",false);
+	$dir = sous_repertoire($dir,"contenu",false);
+	$f = $dir."$exec";
+	ecrire_fichier("$f.$ext",$scaffold);
+	return $f;
 }
 
 ?>
\ No newline at end of file
diff --git a/prive/squelettes/navigation/dist.html b/prive/squelettes/navigation/dist.html
index 3ec37d5dfdcef8cd06808166dc07a5e51f6251d1..351c5d65cc15f99e5357d222637f2032cfdcefd7 100644
--- a/prive/squelettes/navigation/dist.html
+++ b/prive/squelettes/navigation/dist.html
@@ -1,3 +1,8 @@
 [(#ENV{exec}|match{configurer_}|oui)
 <INCLURE{fond=prive/squelettes/navigation/configurer,env}>
+]
+#SET{objet_exec,#ENV{exec}|trouver_objet_exec}
+[(#GET{objet_exec}|oui)
+	#SET{f,#GET{objet_exec}|table_valeur{edition}|?{objet_edit,objet}}
+	<INCLURE{fond=prive/echafaudage/navigation/#GET{f},objet=#GET{objet_exec}|table_valeur{type},id_objet=#ENV{#GET{objet_exec}|table_valeur{id_table_objet}},env} />
 ]
\ No newline at end of file