diff --git a/dev/skeletons/build_class_from_table.php b/dev/skeletons/build_class_from_table.php
index 7e9eebf118c3e73a7765ebf172a9fbe062fe09d5..59591ead8a258fd83cbfccf68fdef8b8d3a61e4d 100644
--- a/dev/skeletons/build_class_from_table.php
+++ b/dev/skeletons/build_class_from_table.php
@@ -58,7 +58,7 @@ if (! isset($argv[1]))
 
 if ($db->type != 'mysql' && $db->type != 'mysqli')
 {
-	print "Error: This script works with mysql driver only\n";
+	print "Error: This script works with mysql or mysqli driver only\n";
 	exit;
 }
 
@@ -67,15 +67,10 @@ print 'Tablename='.$argv[1]."\n";
 print "Current dir is ".getcwd()."\n";
 
 
-
-//--------------------------------
-// Build skeleton_class.class.php
-//--------------------------------
-
-$table=$argv[1];
+// Define array with list of properties
 $property=array();
+$table=$argv[1];
 $foundprimary=0;
-
 $resql=$db->DDLDescTable($table);
 if ($resql)
 {
@@ -121,9 +116,32 @@ if ($resql)
 else
 {
 	print "Error: Failed to get description for table '".$table."'.\n";
+	return false;
 }
 //var_dump($property);
 
+// Define substitute select parameters
+$varpropselect="\n";
+$cleanparam='';
+$i=0;
+foreach($property as $key => $prop)
+{
+    $i++;
+    if ($prop['field'] != 'rowid')
+    {
+        $varpropselect.="\t\t\$sql.= \" ";
+        $varpropselect.="t.".$prop['field'];
+        if ($i < count($property)) $varpropselect.=",";
+        $varpropselect.="\";";
+        $varpropselect.="\n";
+    }
+}
+
+
+
+//--------------------------------
+// Build skeleton_class.class.php
+//--------------------------------
 
 // Define working variables
 $table=strtolower($table);
@@ -296,22 +314,7 @@ $targetcontent=preg_replace('/\$sql.= " field1=".\(isset\(\$this->field1\)\?"\'"
 $targetcontent=preg_replace('/\$sql.= " field2=".\(isset\(\$this->field2\)\?"\'".\$this->db->escape\(\$this->field2\)."\'":"null"\)."";/', '', $targetcontent);
 
 // Substitute select parameters
-$varprop="\n";
-$cleanparam='';
-$i=0;
-foreach($property as $key => $prop)
-{
-	$i++;
-	if ($prop['field'] != 'rowid')
-	{
-		$varprop.="\t\t\$sql.= \" ";
-		$varprop.="t.".$prop['field'];
-		if ($i < count($property)) $varprop.=",";
-		$varprop.="\";";
-		$varprop.="\n";
-	}
-}
-$targetcontent=preg_replace('/\$sql\.= " t\.field1,";/', $varprop, $targetcontent);
+$targetcontent=preg_replace('/\$sql\.= " t\.field1,";/', $varpropselect, $targetcontent);
 $targetcontent=preg_replace('/\$sql\.= " t\.field2";/', '', $targetcontent);
 
 // Substitute select set parameters
@@ -405,6 +408,54 @@ if ($fp)
 }
 else $error++;
 
+
+
+//--------------------------------
+// Build skeleton_page.php
+//--------------------------------
+
+// Read skeleton_page.php file
+$skeletonfile=$path.'skeleton_page.php';
+$sourcecontent=file_get_contents($skeletonfile);
+if (! $sourcecontent)
+{
+    print "\n";
+    print "Error: Failed to read skeleton sample '".$skeletonfile."'\n";
+    print "Try to run script from skeletons directory.\n";
+    exit;
+}
+
+// Define output variables
+$outfile='out.'.$classmin.'_page.php';
+$targetcontent=$sourcecontent;
+
+// Substitute class name
+$targetcontent=preg_replace('/skeleton_class\.class\.php/', $classmin.'.class.php', $targetcontent);
+$targetcontent=preg_replace('/skeleton_script\.php/', $classmin.'_script.php', $targetcontent);
+$targetcontent=preg_replace('/\$element=\'skeleton\'/', '\$element=\''.$classmin.'\'', $targetcontent);
+$targetcontent=preg_replace('/\$table_element=\'skeleton\'/', '\$table_element=\''.$classmin.'\'', $targetcontent);
+$targetcontent=preg_replace('/Skeleton_Class/', $classname, $targetcontent);
+$targetcontent=preg_replace('/skeleton/', $classname, $targetcontent);
+
+// Substitute comments
+$targetcontent=preg_replace('/This file is an example to create a new class file/', 'Put here description of this class', $targetcontent);
+$targetcontent=preg_replace('/\s*\/\/\.\.\./', '', $targetcontent);
+$targetcontent=preg_replace('/Put here some comments/','Initialy built by build_class_from_table on '.strftime('%Y-%m-%d %H:%M',mktime()), $targetcontent);
+
+// Substitute table name
+$targetcontent=preg_replace('/MAIN_DB_PREFIX."mytable/', 'MAIN_DB_PREFIX."'.$tablenoprefix, $targetcontent);
+
+// Build file
+$fp=fopen($outfile,"w");
+if ($fp)
+{
+    fputs($fp, $targetcontent);
+    fclose($fp);
+    print "File '".$outfile."' has been built in current directory.\n";
+}
+else $error++;
+
+
 // -------------------- END OF BUILD_CLASS_FROM_TABLE SCRIPT --------------------
 
 print "You can now rename generated files by removing the 'out.' prefix in their name and store them in a directory of your choice.\n";
diff --git a/dev/skeletons/skeleton_page.php b/dev/skeletons/skeleton_page.php
index 9e331e72b2f995cbc2449ef26ac49b8c5894438c..82d6f74497c71ef73305aded70015d09dd8cbba1 100644
--- a/dev/skeletons/skeleton_page.php
+++ b/dev/skeletons/skeleton_page.php
@@ -43,8 +43,8 @@ if (! $res && file_exists("../../../dolibarr/htdocs/main.inc.php")) $res=@includ
 if (! $res && file_exists("../../../../dolibarr/htdocs/main.inc.php")) $res=@include("../../../../dolibarr/htdocs/main.inc.php");   // Used on dev env only
 if (! $res && file_exists("../../../../../dolibarr/htdocs/main.inc.php")) $res=@include("../../../../../dolibarr/htdocs/main.inc.php");   // Used on dev env only
 if (! $res) die("Include of main fails");
-// Change this following line to use the correct relative path from htdocs (do not remove DOL_DOCUMENT_ROOT)
-require_once(DOL_DOCUMENT_ROOT."/skeleton/skeleton_class.class.php");
+// Change this following line to use the correct relative path from htdocs
+dol_include_once("/module/class/skeleton_class.class.php");
 
 // Load traductions files requiredby by page
 $langs->load("companies");
@@ -118,11 +118,57 @@ jQuery(document).ready(function() {
 </script>';
 
 
-
-// Example 2 : Adding jquery code
+// Example 2 : Adding links to objects
 $somethingshown=$myobject->showLinkedObjectBlock();
 
 
+// Example 3 : List of data
+if ($action == 'list')
+{
+    $sql = "SELECT";
+    $sql.= " t.field1,";
+    $sql.= " t.field2";
+    $sql.= " FROM ".MAIN_DB_PREFIX."skeleton as t";
+    $sql.= " WHERE field3 = 'xxx'";
+    $sql.= " ORDER BY field1 ASC";
+
+    print '<tr class="liste_titre">';
+    print_liste_field_titre($langs->trans('field1'),$_SERVER['PHP_SELF'],'t.field1','',$param,'',$sortfield,$sortorder);
+    print_liste_field_titre($langs->trans('field2'),$_SERVER['PHP_SELF'],'t.field2','',$param,'',$sortfield,$sortorder);
+    print '</tr>';
+
+    dol_syslog($script_file." sql=".$sql, LOG_DEBUG);
+    $resql=$db->query($sql);
+    if ($resql)
+    {
+        $num = $db->num_rows($resql);
+        $i = 0;
+        if ($num)
+        {
+            while ($i < $num)
+            {
+                $obj = $db->fetch_object($resql);
+                if ($obj)
+                {
+                    // You can use here results
+                    print '<tr><td>';
+                    print $obj->field1;
+                    print $obj->field2;
+                    print '</td></tr>';
+                }
+                $i++;
+            }
+        }
+    }
+    else
+    {
+        $error++;
+        dol_print_error($db);
+    }
+}
+
+
+
 // End of page
 llxFooter();
 $db->close();
diff --git a/dev/skeletons/skeleton_script.php b/dev/skeletons/skeleton_script.php
index 0a0e8ecca04e68076122995011750b10a643ac96..56436fcb2b155cdd7bd73a98262f1e5ab5cf61d2 100644
--- a/dev/skeletons/skeleton_script.php
+++ b/dev/skeletons/skeleton_script.php
@@ -112,7 +112,7 @@ else print "Object with id ".$myobject->id." deleted\n";
 // An example of a direct SQL read without using the fetch method
 /*
 $sql = "SELECT field1, field2";
-$sql.= " FROM ".MAIN_DB_PREFIX."c_pays";
+$sql.= " FROM ".MAIN_DB_PREFIX."skeleton";
 $sql.= " WHERE field3 = 'xxx'";
 $sql.= " ORDER BY field1 ASC";