diff --git a/.gitattributes b/.gitattributes
index c91bda02d35d9794f7144012f192fa19e8ca9e3e..12d74db7911d8015028798fa155109880edfb3b1 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -394,6 +394,7 @@ ecrire/public/index.php -text
 ecrire/public/jointures.php -text
 ecrire/public/normaliser.php -text
 ecrire/public/quete.php -text
+ecrire/public/tracer.php -text
 ecrire/req/pg.php -text
 ecrire/req/sqlite2.php -text
 ecrire/req/sqlite3.php -text
diff --git a/ecrire/exec/brouteur_frame.php b/ecrire/exec/brouteur_frame.php
index b9d5dbbe901097759a9c25293f14578b37736c20..2c65e02d30722df946929fac0be14f8e6ca3bdc6 100644
--- a/ecrire/exec/brouteur_frame.php
+++ b/ecrire/exec/brouteur_frame.php
@@ -241,7 +241,7 @@ function exec_brouteur_frame_dist() {
 	}
    }
 	if (count($GLOBALS['tableau_des_temps'])) {
-		include_spip('public/debug');
+		include_spip('public/tracer');
 		echo chrono_requete($GLOBALS['tableau_des_temps']);
 	}
 	echo "</div>";
diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php
index 46fb35de91659c44326442832cdbd73f2ec6e4f9..0b7d19a6c6996a785a4436e393c6c6efbd0962c2 100644
--- a/ecrire/inc/actions.php
+++ b/ecrire/inc/actions.php
@@ -206,7 +206,7 @@ function ajax_retour($corps,$xml = true)
 	} else {
 
 		if (isset($GLOBALS['tableau_des_temps'])) {
-			include_spip('public/debug');
+			include_spip('public/tracer');
 			$fin = chrono_requete($GLOBALS['tableau_des_temps']);
 		} else $fin = '';
 
diff --git a/ecrire/inc/presentation_mini.php b/ecrire/inc/presentation_mini.php
index 894f305a2201dc5f03e51204c95fb6c237af990d..7fd8b1b03be4234afbb11a27cf550e317c2f52ce 100644
--- a/ecrire/inc/presentation_mini.php
+++ b/ecrire/inc/presentation_mini.php
@@ -324,7 +324,7 @@ function fin_page()
 
 	// avec &var_profile=1 on a le tableau de mesures SQL
 	if (@count($GLOBALS['tableau_des_temps'])) {
-		include_spip('public/debug');
+		include_spip('public/tracer');
 		$chrono = chrono_requete($GLOBALS['tableau_des_temps']);
 	} else $chrono = '';
 
diff --git a/ecrire/public/debug.php b/ecrire/public/debug.php
index 03e18588a1fb37235650115360ec0ea2d9ae91a3..98b4a369b1f3229e72e82be2419e5217dd7cec16 100644
--- a/ecrire/public/debug.php
+++ b/ecrire/public/debug.php
@@ -74,76 +74,6 @@ function affiche_erreurs_page($tableau_des_erreurs, $message='') {
 	. "</table>";
 }
 
-// http://doc.spip.org/@chrono_requete
-function chrono_requete($temps)
-{
-	$total = 0;
-	$hors = "<i>" . _T('zbug_hors_compilation') . "</i>";
-	$t = $q = $n = $d = array();
-	foreach ($temps as $key => $row) {
-		list($dt, $nb, $boucle, $query, $explain, $res) = $row;
-		$total += $dt;
-		$d[$boucle]+= $dt;
-		$t[$key] = $dt;
-		$q[$key] = $nb;
-
-		$e = "<tr><th colspan='2' style='text-align:center'>"
-		. (!$boucle ? $hors :
-		   ($boucle . '&nbsp;(' . @++$n[$boucle] . ")"))
-		. "</th></tr>"
-		.  "<tr><td>Time</td><td>$dt</td></tr>" 
-		.  "<tr><td>Order</td><td>$nb</td></tr>" 
-		. "<tr><td>Res</td><td>$res</td></tr>" ;
-
-		foreach($explain as $k => $v) {
-			$e .= "<tr><td>$k</td><td>"
-			  . str_replace(';','<br />',$v)
-			  . "</td></tr>";
-		}
-		$e = "<br /><table border='1'>$e</table>";
-		$temps[$key] = array($boucle, $e, $query);
-	}
-	array_multisort($t, SORT_DESC, $q, $temps);
-	arsort($d);
-	$i = 1;
-	$t = array();
-	foreach($temps as $k => $v) {
-		$boucle = array_shift($v);
-		$temps[$k] = $v;
-		$x = "<a style='font-family: monospace' title='"
-		  .  textebrut(preg_replace(',</tr>,', "\n",$v[0]))
-		  . "' href='".quote_amp($GLOBALS['REQUEST_URI'])."#req$i'>"
-		  . str_replace(' ', '&nbsp;', sprintf("%5d",$i))
-		  . "</a>";
-		if (count($t[$boucle]) % 30 == 29) $x .= "<br />";
-		$t[$boucle][] = $x;
-		$i++;
-	}
-
-	if ($d['']) {
-		$d[$hors] = $d[''];
-		$n[$hors] = $n[''];
-		$t[$hors] = $t[''];
-	}
-	unset($d['']);
-	foreach ($d as $k => $v) {
-		$d[$k] =  $n[$k] . "</td><td>$k</td><td>$v</td><td>"
-		  . join('',$t[$k]);
-	}
-
-	$titre = '<br />'
-	  . _T('zbug_statistiques')
-	  . '<br />'
-	  . "<table style='text-align: left; border: 1px solid;'><tr><td>"
-	  . join("</td></tr>\n<tr><td>", $d)
-	  . "</td></tr>\n"
-	  . (_request('var_mode_objet') ? '' : 
-	     ("<tr><td>" .  count($temps) . " </td><td> " . _T('info_total') . '</td><td>' . $total . "</td></td><td></td></tr>"))
-	  . "</table>";
-
-	return (_DIR_RESTREINT ? '' : affiche_erreurs_page($GLOBALS['tableau_des_erreurs']))
-	. affiche_erreurs_page($temps, $titre);
-}
 
 //
 // Si une boucle cree des soucis, on peut afficher la requete fautive
@@ -676,63 +606,4 @@ function count_occ($regs)
 	return $encore;
 }
 
-// http://doc.spip.org/@trace_query_start
-function trace_query_start()
-{
-	static $trace = '?';
-	if ($trace === '?') {
-		include_spip('inc/autoriser');
-		// gare au bouclage sur calcul de droits au premier appel
-		// A fortiori quand on demande une trace
-		$trace = isset($_GET['var_profile']) AND (autoriser('debug'));
-	}
-	return  $trace ?  microtime() : 0;
-}
-
-// http://doc.spip.org/@trace_query_end
-function trace_query_end($query, $start, $result, $err, $serveur='')
-{
-	global $tableau_des_erreurs;
-	if ($start)
-		trace_query_chrono($start, microtime(), $query, $result, $serveur);
-	if (!($err = sql_errno())) return $result;
-	$err .= ' '.sql_error();
-	if (autoriser('debug')) {
-		include_spip('public/debug');
-		$tableau_des_erreurs[] = array(
-		_T('info_erreur_requete'). " "  .  htmlentities($query),
-		"&laquo; " .  htmlentities($err)," &raquo;");
-	}
-	return $result;
-}
-
-// http://doc.spip.org/@trace_query_chrono
-function trace_query_chrono($m1, $m2, $query, $result, $serveur='')
-{
-	static $tt = 0, $nb=0;
-	global $tableau_des_temps;
-
-	$x = _request('var_mode_objet');
-	if (isset($GLOBALS['debug']['aucasou'])) {
-		list(, $boucle, $serveur) = $GLOBALS['debug']['aucasou'];
-		if ($x AND !preg_match("/$boucle\$/", $x))
-			return;
-		if ($serveur) $boucle .= " ($serveur)";
-		$boucle = "<b>$boucle</b>";
-	} else {
-		if ($x) return;
-		$boucle = '';
-	}
-
-	list($usec, $sec) = explode(" ", $m1);
-	list($usec2, $sec2) = explode(" ", $m2);
- 	$dt = $sec2 + $usec2 - $sec - $usec;
-	$tt += $dt;
-	$nb++;
-
-	$q = preg_replace('/([a-z)`])\s+([A-Z])/', '$1<br />$2',htmlentities($query));
-	$e =  sql_explain($query, $serveur);
-	$r = str_replace('Resource id ','',(is_object($result)?get_class($result):$result));
-	$tableau_des_temps[] = array($dt, $nb, $boucle, $q, $e, $r);
-}
 ?>
diff --git a/ecrire/public/tracer.php b/ecrire/public/tracer.php
new file mode 100644
index 0000000000000000000000000000000000000000..f7d547467ffc97d7845ce0095a84572a36afd80e
--- /dev/null
+++ b/ecrire/public/tracer.php
@@ -0,0 +1,146 @@
+<?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;
+
+// http://doc.spip.org/@trace_query_start
+function trace_query_start()
+{
+	static $trace = '?';
+	if ($trace === '?') {
+		include_spip('inc/autoriser');
+		// gare au bouclage sur calcul de droits au premier appel
+		// A fortiori quand on demande une trace
+		$trace = isset($_GET['var_profile']) AND (autoriser('debug'));
+	}
+	return  $trace ?  microtime() : 0;
+}
+
+// http://doc.spip.org/@trace_query_end
+function trace_query_end($query, $start, $result, $err, $serveur='')
+{
+	global $tableau_des_erreurs;
+	if ($start)
+		trace_query_chrono($start, microtime(), $query, $result, $serveur);
+	if (!($err = sql_errno())) return $result;
+	$err .= ' '.sql_error();
+	if (autoriser('debug')) {
+		include_spip('public/debug');
+		$tableau_des_erreurs[] = array(
+		_T('info_erreur_requete'). " "  .  htmlentities($query),
+		"&laquo; " .  htmlentities($err)," &raquo;");
+	}
+	return $result;
+}
+
+// http://doc.spip.org/@trace_query_chrono
+function trace_query_chrono($m1, $m2, $query, $result, $serveur='')
+{
+	static $tt = 0, $nb=0;
+	global $tableau_des_temps;
+
+	$x = _request('var_mode_objet');
+	if (isset($GLOBALS['debug']['aucasou'])) {
+		list(, $boucle, $serveur) = $GLOBALS['debug']['aucasou'];
+		if ($x AND !preg_match("/$boucle\$/", $x))
+			return;
+		if ($serveur) $boucle .= " ($serveur)";
+		$boucle = "<b>$boucle</b>";
+	} else {
+		if ($x) return;
+		$boucle = '';
+	}
+
+	list($usec, $sec) = explode(" ", $m1);
+	list($usec2, $sec2) = explode(" ", $m2);
+ 	$dt = $sec2 + $usec2 - $sec - $usec;
+	$tt += $dt;
+	$nb++;
+
+	$q = preg_replace('/([a-z)`])\s+([A-Z])/', '$1<br />$2',htmlentities($query));
+	$e =  sql_explain($query, $serveur);
+	$r = str_replace('Resource id ','',(is_object($result)?get_class($result):$result));
+	$tableau_des_temps[] = array($dt, $nb, $boucle, $q, $e, $r);
+}
+
+
+function chrono_requete($temps)
+{
+	$total = 0;
+	$hors = "<i>" . _T('zbug_hors_compilation') . "</i>";
+	$t = $q = $n = $d = array();
+	foreach ($temps as $key => $row) {
+		list($dt, $nb, $boucle, $query, $explain, $res) = $row;
+		$total += $dt;
+		$d[$boucle]+= $dt;
+		$t[$key] = $dt;
+		$q[$key] = $nb;
+
+		$e = "<tr><th colspan='2' style='text-align:center'>"
+		. (!$boucle ? $hors :
+		   ($boucle . '&nbsp;(' . @++$n[$boucle] . ")"))
+		. "</th></tr>"
+		.  "<tr><td>Time</td><td>$dt</td></tr>" 
+		.  "<tr><td>Order</td><td>$nb</td></tr>" 
+		. "<tr><td>Res</td><td>$res</td></tr>" ;
+
+		foreach($explain as $k => $v) {
+			$e .= "<tr><td>$k</td><td>"
+			  . str_replace(';','<br />',$v)
+			  . "</td></tr>";
+		}
+		$e = "<br /><table border='1'>$e</table>";
+		$temps[$key] = array($boucle, $e, $query);
+	}
+	array_multisort($t, SORT_DESC, $q, $temps);
+	arsort($d);
+	$i = 1;
+	$t = array();
+	foreach($temps as $k => $v) {
+		$boucle = array_shift($v);
+		$temps[$k] = $v;
+		$x = "<a style='font-family: monospace' title='"
+		  .  textebrut(preg_replace(',</tr>,', "\n",$v[0]))
+		  . "' href='".quote_amp($GLOBALS['REQUEST_URI'])."#req$i'>"
+		  . str_replace(' ', '&nbsp;', sprintf("%5d",$i))
+		  . "</a>";
+		if (count($t[$boucle]) % 30 == 29) $x .= "<br />";
+		$t[$boucle][] = $x;
+		$i++;
+	}
+
+	if ($d['']) {
+		$d[$hors] = $d[''];
+		$n[$hors] = $n[''];
+		$t[$hors] = $t[''];
+	}
+	unset($d['']);
+	foreach ($d as $k => $v) {
+		$d[$k] =  $n[$k] . "</td><td>$k</td><td>$v</td><td>"
+		  . join('',$t[$k]);
+	}
+
+	$titre = '<br />'
+	  . _T('zbug_statistiques')
+	  . '<br />'
+	  . "<table style='text-align: left; border: 1px solid;'><tr><td>"
+	  . join("</td></tr>\n<tr><td>", $d)
+	  . "</td></tr>\n"
+	  . (_request('var_mode_objet') ? '' : 
+	     ("<tr><td>" .  count($temps) . " </td><td> " . _T('info_total') . '</td><td>' . $total . "</td></td><td></td></tr>"))
+	  . "</table>";
+
+	return (_DIR_RESTREINT ? '' : affiche_erreurs_page($GLOBALS['tableau_des_erreurs']))
+	. affiche_erreurs_page($temps, $titre);
+}
+
+?>
diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php
index ab6713bc0fc637cfe251ffe2bd6b407ae0094fa0..983f3f94c91631adf48a1e6978e84855f3f5ec56 100644
--- a/ecrire/req/mysql.php
+++ b/ecrire/req/mysql.php
@@ -124,7 +124,11 @@ function spip_mysql_query($query, $serveur='',$requeter=true) {
 	// renvoyer la requete inerte si demandee
 	if (!$requeter) return $query;
 
-	$t = !isset($_GET['var_profile']) ? 0 : trace_query_start();
+	if (isset($_GET['var_profile'])) {
+		include_spip('public/tracer');
+		$t = trace_query_start();
+	} else $t = 0 ;
+ 
 	$r = $link ? mysql_query($query, $link) : mysql_query($query);
 
 	if ($e = spip_mysql_errno())	// Log de l'erreur eventuelle
@@ -548,7 +552,11 @@ function spip_mysql_insert($table, $champs, $valeurs, $desc='', $serveur='',$req
 
 	if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table);
 
-	$t = !isset($_GET['var_profile']) ? 0 : trace_query_start();
+	if (isset($_GET['var_profile'])) {
+		include_spip('public/tracer');
+		$t = trace_query_start();
+	} else $t = 0 ;
+ 
 	$query="INSERT INTO $table $champs VALUES $valeurs";
 #	spip_log($query);
 	if (mysql_query($query, $link))
diff --git a/ecrire/req/pg.php b/ecrire/req/pg.php
index cfffeb9c4c9d1cc40d837c8fb1ed837a0469cd27..d4b647fcf76d33cf14aa04414436d228594ff8e5 100644
--- a/ecrire/req/pg.php
+++ b/ecrire/req/pg.php
@@ -111,7 +111,11 @@ function spip_pg_trace_query($query, $serveur='')
 	$link = $connexion['link'];
 	$db = $connexion['db'];
 
-	$t = !isset($_GET['var_profile']) ? 0 : trace_query_start();
+	if (isset($_GET['var_profile'])) {
+		include_spip('public/tracer');
+		$t = trace_query_start();
+	} else $t = 0 ;
+ 
 	$r = spip_pg_query_simple($link, $query);
 
 	if ($e = spip_pg_errno())	// Log de l'erreur eventuelle
diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php
index c30e5dafc21536dcdcab5df330c836cb01ef2e90..084f87d87ddb276770abcf09c3e9eedcdb5d6abf 100644
--- a/ecrire/req/sqlite_generique.php
+++ b/ecrire/req/sqlite_generique.php
@@ -685,8 +685,11 @@ function spip_sqlite_insert($table, $champs, $valeurs, $desc='', $serveur='',$re
 	if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table);
 
 
-	$t = !isset($_GET['var_profile']) ? 0 : trace_query_start();
-
+	if (isset($_GET['var_profile'])) {
+		include_spip('public/tracer');
+		$t = trace_query_start();
+	} else $t = 0 ;
+ 
 	$query="INSERT OR REPLACE INTO $table $champs VALUES $valeurs";
 	if (!$requeter) return $query;
 	
@@ -1596,7 +1599,11 @@ class sqlite_traiter_requete{
 	// faire le tracage si demande 
 // http://doc.spip.org/@executer_requete
 	function executer_requete(){
-		$t = $this->tracer ? trace_query_start(): 0;
+		if ($this->tracer) {
+			include_spip('public/tracer');
+			$t = trace_query_start();
+		} else $t = 0 ;
+ 
 # spip_log("requete: $this->serveur >> $this->query",'query'); // boum ? pourquoi ?
 		if ($this->link){
 			if ($this->sqlite_version == 3) {