diff --git a/.gitattributes b/.gitattributes
index e92528e7b44062d75968db62dcba280cca35c414..5b31c30d6c63b46d59616c005fd294c5c864ef47 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -700,6 +700,7 @@ ecrire/maj/v019.php -text
 ecrire/maj/v019_pre193.php -text
 ecrire/prive.php -text
 ecrire/public/index.php -text
+ecrire/public/vertebrer.php -text
 ecrire/req/pg.php -text
 ecrire/rien.gif -text
 ecrire/typographie/en.php -text
diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php
index 804ad019175656b722edf6645dc963c48a8dccfc..2e604ed31e706ace674acc58c502f38b1626fc2c 100644
--- a/ecrire/public/parametrer.php
+++ b/ecrire/public/parametrer.php
@@ -326,7 +326,7 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='')  {
 
 	$styliser = charger_fonction('styliser', 'public');
 	list($skel,$mime_type, $gram, $sourcefile) =
-		$styliser($fond, $id_rubrique_fond, $GLOBALS['spip_lang']);
+		$styliser($fond, $id_rubrique_fond, $GLOBALS['spip_lang'], $connect);
 
 	// Charger le squelette en specifiant les langages cibles et source
 	// au cas il faudrait le compiler (source posterieure au resultat)
diff --git a/ecrire/public/styliser.php b/ecrire/public/styliser.php
index f2e98eef35311286b3595bfb3ad18dabae1afecc..cb9fca2470a59cebe6d630418d77edf114a139cd 100644
--- a/ecrire/public/styliser.php
+++ b/ecrire/public/styliser.php
@@ -19,21 +19,34 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // pour des raisons historiques, ce qui est trompeur
 
 // http://doc.spip.org/@public_styliser_dist
-function public_styliser_dist($fond, $id_rubrique, $lang, $ext='html') {
+function public_styliser_dist($fond, $id_rubrique, $lang='', $connect='', $ext='html') {
 	
-	// Accrocher un squelette de base dans le chemin, sinon erreur
+	// Trouver un squelette de base dans le chemin
 	if (!$base = find_in_path("$fond.$ext")) {
+		// Si pas de squelette regarder si c'est une table
+		$trouver_table = charger_fonction('trouver_table', 'base');
+		$table = $trouver_table($fond, $connect);
+		if ($table) {
+			$base = _DIR_TMP . $fond . ".$ext";
+			if (!file_exists($base)
+			OR  $GLOBALS['var_mode'] == 'recalcul') {
+				$vertebrer = charger_fonction('vertebrer', 'public');
+				$f = fopen($base, 'w');
+				fwrite($f, $vertebrer($table));
+				fclose($f);
+			}
+		} else { // on est gentil, mais la ...
 		include_spip('public/debug');
 		erreur_squelette(_T('info_erreur_squelette2',
-			array('fichier'=>"'$fond'")),
-			$GLOBALS['dossier_squelettes']);
+				    array('fichier'=>"'$fond'")),
+				 $GLOBALS['dossier_squelettes']);
 		$f = find_in_path(".$ext"); // on ne renvoie rien ici, c'est le resultat vide qui provoquere un 404 si necessaire
 		return array(substr($f, 0, -strlen(".$ext")),
 			     $ext,
 			     $ext,
 			     $f);
+		}
 	}
-
 	// supprimer le ".html" pour pouvoir affiner par id_rubrique ou par langue
 	$squelette = substr($base, 0, - strlen(".$ext"));
 
diff --git a/ecrire/public/vertebrer.php b/ecrire/public/vertebrer.php
new file mode 100755
index 0000000000000000000000000000000000000000..ff69c73899a3c7d4444ce3fbbec78290ed357e1a
--- /dev/null
+++ b/ecrire/public/vertebrer.php
@@ -0,0 +1,109 @@
+<?php
+
+/***************************************************************************\
+ *  SPIP, Systeme de publication pour l'internet                           *
+ *                                                                         *
+ *  Copyright (c) 2001-2007                                                *
+ *  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.   *
+\***************************************************************************/
+
+//
+// Production dynamique d'un squelette lorsqu'il ne figure pas 
+// dans les dossiers de squelettes mais que son nom est celui d'une table SQL:
+// on produit une table HTML montrant le contenu de la table SQL
+// Le squelette produit illustre quelques possibilites de SPIP:
+// - pagination automatique
+// - tri ascendant et descendant sur chacune des colonnes
+// - critere conditionnel donnant l'extrait correspondant a la colonne en URL
+// 
+
+if (!defined("_ECRIRE_INC_VERSION")) return;
+
+// nomme chaque colonne par le nom du champ, 
+// qui sert de lien vers la meme page, avec la table triee selon ce champ
+// distingue champ numerique et non numerique
+
+function vertebrer_sort($fields, $direction)
+{
+	$res = '';
+	foreach($fields as $n => $t) {
+		$tri = $direction
+		. ((test_sql_int($t) OR test_sql_date($r)) ? 'tri_n' : 'tri');
+		$args ="";
+		foreach (array('tri', 'tri_n', '_tri', '_tri_n') as $c) {
+		  if ($tri != $c) $args .= '|parametre_url{' . $c .',""}';
+		}
+      // #SELF contient tous les parametes *tri*. A ameliorer
+		$url = "[(#SELF$args|parametre_url{" . $tri . ",'" . $n . "'})]";
+		$res .= "\n\t\t<th><a href='$url'>$n</a></th>";
+	}
+	return $res;
+}
+
+// Autant de criteres conditionnels que de champs
+
+function vertebrer_crit($v)
+{
+	 $res = "{pagination}" 
+	  . "\n\t{par #ENV{tri}}{!par #ENV{_tri}}{par num #ENV{tri_n}}{!par num #ENV{_tri_n}}";
+
+	 foreach($v as $n => $t) {  $res .= "\n\t{" . $n .  " ?}"; }
+	 return $res;
+}
+
+// Class CSS en fonction de la parite du numero de ligne.
+// Si une colonne reference une table, ajoute un href sur sa page dynamique.
+// Ce serait encore mieux d'aller chercher sa cle primaire.
+
+function vertebrer_cell($fields)
+{
+  $res = "\n\t<tr class='[row_(#COMPTEUR_BOUCLE|alterner{'odd','even'})]'>\n\t\t<td>#COMPTEUR_BOUCLE</td>";
+  foreach($fields as $n => $t) {
+ {
+      $texte = "#" . strtoupper($n);
+      if (preg_match('/\s+references\s+([\w_]+)/' , $t, $r)) {
+	$url = "[(#SELF|parametre_url{page,'" . $r[1] . "'})]";
+	$texte = "<a href='$url'>" . $texte . "</a>";
+      }
+      $res .= "\n\t\t<td>$texte</td>";
+    }
+  }
+  return $res;
+}
+
+function public_vertebrer_dist($desc)
+{
+	$nom = $desc['table'];
+	$surnom = $desc['id_table'];
+	$field = $desc['field'];
+	$key = $desc['key'];
+	ksort($field);
+	return
+"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>
+<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='#LANG' lang='#LANG' dir='#LANG_DIR'>
+<head>
+<title>SPIPAdmin $surnom [(#NOM_SITE_SPIP|textebrut)]</title>
+<INCLURE{fond=inc-head}>
+</head>
+<body class=page_rubrique><div id='page'>
+<h1 style='text-align:center'>SPIPAdmin $surnom</h1><br />\n" .
+	  // au minimum: "<BOUCLE1($fond)></BOUCLE1>#TOTAL_BOUCLE<//B1>")
+	  // au maximum:
+	"<B1>#ANCRE_PAGINATION[<p class='pagination'>(#PAGINATION)</p>]" .
+	"<table class='spip' border='1' width='90%'>" .
+	"<tr>\n\t<th>Nb</th>" .
+	vertebrer_sort($field,'') .
+	"\n</tr>\n<BOUCLE1($nom)" .
+	vertebrer_crit($field) .
+	'>' .
+	vertebrer_cell($field) .
+	"\n\t</tr>\n</BOUCLE1>" .
+	"\n\t<tr>\n\t<th>Nb</th>" .
+	vertebrer_sort($field,'_') .
+	"\n</tr></table>" .
+'</B1></div></body></html>';
+}
+?>