diff --git a/ecrire/base/db_mysql.php b/ecrire/base/db_mysql.php
index d000df65ddadd83680a0bdd9c72b76979877dde2..636ec3d3454fd8db3d4453e89b0e3b67f30badc7 100644
--- a/ecrire/base/db_mysql.php
+++ b/ecrire/base/db_mysql.php
@@ -65,7 +65,7 @@ function spip_query_db($query) {
 			include_spip('inc/autoriser');
 		// gare au bouclage sur calcul de droits au premier appel
 			$trace = true;
-			$trace = autoriser('voirstats');
+			$trace = autoriser('debug');
 		}
 		if ($trace) $start = microtime();
 	}
diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php
index 3fae4a7ac7d8a195d2dfa31dc4a9863a4b4b995d..3b6bdca02bd5ab4257ab3d43aac3a5da3d3722f9 100644
--- a/ecrire/inc/autoriser.php
+++ b/ecrire/inc/autoriser.php
@@ -113,7 +113,6 @@ function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) {
 
 // http://doc.spip.org/@autoriser_previsualiser_dist
 function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) {
-
 	return ($GLOBALS['meta']['preview'] == '1comite'
 		OR ($GLOBALS['meta']['preview']== 'oui' AND
 		    $qui['statut']=='0minirezo')); 
@@ -475,6 +474,12 @@ function autoriser_document_voir_dist($faire, $type, $id, $qui, $opt) {
 	;
 }
 
+// Qui peut activer le debugueur ?
+// A noter : pour le moment ne fonctionne que pour ?var_profile (timer SQL)
+function autoriser_debug_dist($faire, $type, $id, $qui, $opt) {
+	return $qui['statut'] == '0minirezo';
+}
+
 // Renvoie la liste des rubriques liees a cet auteur, independamment de son
 // statut (pour les admins restreints, il faut donc aussi verifier statut)
 // Memorise le resultat dans un tableau statique indexe par les id_auteur.
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 1ab62ae9d5e87702a0846cb81e76838d24dc76bf..32b8a155077645907c751a84ae0bece6b7ad76b5 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -966,12 +966,11 @@ function generer_url_action($script, $args="", $no_entities=false) {
 
 // Dirty hack contre le register_globals a 'Off' (PHP 4.1.x)
 // A remplacer (bientot ?) par une gestion propre des variables admissibles ;-)
-// Attention pour compatibilite max $_GET n'est pas superglobale
 // NB: c'est une fonction de maniere a ne pas pourrir $GLOBALS
 // http://doc.spip.org/@spip_register_globals
 function spip_register_globals() {
 
-	define('_FEED_GLOBALS', true);
+	define('_FEED_GLOBALS', false); // si ca marche on simplifiera tout ca
 
 	// Liste des variables dont on refuse qu'elles puissent provenir du client
 	$refuse_gpc = array (
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index d23b71855d884f95d9e67252ea5898defe1373a6..191becac4d74f3abbd0b91dc4edc9a4325af952e 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -450,7 +450,7 @@ AND !headers_sent()) {
 	// si la compression est deja commencee, stop
 	&& !@ini_get("zlib.output_compression")
 	&& !@ini_get("output_handler")
-	&& !isset($GLOBALS['var_mode']) # bug avec le debugueur qui appelle ob_end_clean()
+	&& !isset($_GET['var_mode']) # bug avec le debugueur qui appelle ob_end_clean()
 	)
 		ob_start('ob_gzhandler');
 }
diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php
index 5a516c72f560726d435b366a2cb3281b3780675b..1d83aa3bfb38cdc5f70616b8236e36a969f00304 100644
--- a/ecrire/public/assembler.php
+++ b/ecrire/public/assembler.php
@@ -17,7 +17,7 @@ if (!defined("_ECRIRE_INC_VERSION")) return;
 // elle-meme ne fait que traiter les cas particuliers, puis passe la main.
 // http://doc.spip.org/@public_assembler_dist
 function public_assembler_dist($fond) {
-	  global $auteur_session, $forcer_lang, $ignore_auth_http, $var_mode;
+	  global $forcer_lang, $ignore_auth_http;
 
 	// multilinguisme
 	if ($forcer_lang AND ($forcer_lang!=='non')) {
@@ -43,17 +43,50 @@ function public_assembler_dist($fond) {
 		reponse_confirmation($_GET['var_confirm']);
 	}
 
-	//  forcer la connexion si on veut le debusqueur
-	if ($var_mode=='debug') {
-		include_spip('inc/autoriser');
-		if (autoriser('configurer'))
-			spip_log($auteur_session['nom'] . " ausculte $fond");
-		else {
-			include_spip('inc/headers');
-			redirige_par_entete(generer_url_public('login',
-			'url='.rawurlencode(
-			parametre_url(self(), 'var_mode', 'debug', '&')
-			), true));
+	// On fixe $GLOBALS['var_mode']
+	$GLOBALS['var_mode'] = false;
+	$GLOBALS['var_preview'] = false;
+	if (isset($_GET['var_mode'])) {
+		// tout le monde peut calcul/recalcul
+		if ($_GET['var_mode'] == 'calcul'
+		OR $_GET['var_mode'] == 'recalcul')
+			$GLOBALS['var_mode'] = $_GET['var_mode'];
+
+		// preview et debug necessitent une autorisation
+		else if ($_GET['var_mode'] == 'preview'
+		OR $_GET['var_mode'] == 'debug') {
+			include_spip('inc/autoriser');
+			if (autoriser(
+				($_GET['var_mode'] == 'preview')
+					? 'previsualiser'
+					: 'debug'
+			)) {
+				// preview ?
+				if ($_GET['var_mode'] == 'preview') {
+					// forcer le compilo et ignorer les caches existants
+					$GLOBALS['var_mode'] = 'recalcul';
+					// truquer les boucles et ne pas enregistrer de cache
+					$GLOBALS['var_preview'] = true;
+				}
+				// seul cas ici: 'debug'
+				else { 
+					$GLOBALS['var_mode'] = $_GET['var_mode'];
+				}
+				spip_log($GLOBALS['auteur_session']['nom']
+					. " ".$GLOBALS['var_mode']);
+			}
+			// pas autorise ?
+			else {
+				// si on n'est pas connecte on se redirige
+				if (!$GLOBALS['auteur_session']) {
+					include_spip('inc/headers');
+					redirige_par_entete(generer_url_public('login',
+					'url='.rawurlencode(
+					parametre_url(self(), 'var_mode', $_GET['var_mode'], '&')
+					), true));
+				}
+				// sinon tant pis
+			}
 		}
 	}
 
@@ -62,21 +95,13 @@ function public_assembler_dist($fond) {
 }
 
 
-// http://doc.spip.org/@is_preview
-function is_preview()
-{
-	if ($GLOBALS['var_mode'] !== 'preview') return false;
-	include_spip('inc/autoriser');
-	return autoriser('previsualiser'); 
-}
-
 //
 // calcule la page et les entetes
 //
 // http://doc.spip.org/@assembler_page
 function assembler_page ($fond) {
 	global $flag_preserver,$lastmodified,
-		$use_cache, $var_mode, $var_preview;
+		$use_cache;
 
 	// Cette fonction est utilisee deux fois
 	$cacher = charger_fonction('cacher', 'public');
@@ -85,21 +110,13 @@ function assembler_page ($fond) {
 
 	if (!$chemin_cache || !$lastmodified) $lastmodified = time();
 
-	// demande de previsualisation ?
-	// -> inc-calcul n'enregistrera pas les fichiers caches
-	// -> inc-boucles acceptera les objets non 'publie'
-	if ($var_preview = is_preview()) {
-		$var_mode = 'recalcul';
-		spip_log('preview !');
-	}
-
 	$headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD');
 
 	// Pour les pages non-dynamiques (indiquees par #CACHE{duree,cache-client})
 	// une perennite valide a meme reponse qu'une requete HEAD (par defaut les
 	// pages sont dynamiques)
 	if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])
-	AND !$var_mode
+	AND !$GLOBALS['var_mode']
 	AND $chemin_cache
 	AND isset($page['entetes'])
 	AND isset($page['entetes']['Cache-Control'])
@@ -150,11 +167,11 @@ function assembler_page ($fond) {
 			if ($GLOBALS['flag_ob']) {
 				// Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions
 				if (trim($page['texte']) === ''
-				AND $var_mode != 'debug') {
+				AND $GLOBALS['var_mode'] != 'debug') {
 					$page = message_erreur_404();
 				}
 				// pas de cache client en mode 'observation'
-				if ($var_mode) {
+				if ($GLOBALS['var_mode']) {
 					$page['entetes']["Cache-Control"]= "no-cache,must-revalidate";
 					$page['entetes']["Pragma"] = "no-cache";
 				}