diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php
index 72ebe1d389e12a390dd7f4ccd2ed4921f3a8ef2b..faf64d0fec99c8305161a9ff908f82a4cc8fb4ef 100644
--- a/ecrire/action/cookie.php
+++ b/ecrire/action/cookie.php
@@ -87,12 +87,11 @@ if ($logout_public) {
  }
 // tentative de logout
 if ($logout) {
-	if ($auteur_session['login'] == $logout) {
+	if ($auteur_session['login'] == $logout) { // init verifier_visiteur
 		spip_query("UPDATE spip_auteurs SET en_ligne = DATE_SUB(NOW(),INTERVAL 6 MINUTE) WHERE id_auteur = ".$auteur_session['id_auteur']);
 		if ($spip_session) {
 			$var_f = charger_fonction('session', 'inc');
 			$var_f($auteur_session['id_auteur']);
-			spip_setcookie('spip_session', $spip_session, time() - 3600 * 24);
 		}
 		
 		if ($_SERVER['PHP_AUTH_USER']
@@ -100,9 +99,9 @@ if ($logout) {
 		AND verifier_php_auth()) {
 			auth_http(($url ? $url : _DIR_RESTREINT_ABS), 'logout');
 		}
-		unset ($auteur_session);
 	}
 	spip_log("logout: $logout");
+	spip_setcookie('spip_session', $spip_session, 0);
 	redirige_par_entete($url ? $url : generer_url_public('login'));
 }
 
@@ -131,6 +130,7 @@ if ($essai_login == "oui") {
 	// Essayer l'authentification par MySQL
 	$f = charger_fonction('auth_spip', 'inc', true);
 	if ($f) $row_auteur = $f($session_login, $session_password);		
+
 	// Marche pas: essayer l'authentification par LDAP si present
 	if (!$row_auteur AND $GLOBALS['ldap_present']) {
 		$f = charger_fonction('auth_ldap', 'inc', true);
@@ -157,10 +157,22 @@ if ($essai_login == "oui") {
 		if ($row_auteur['statut'] == '0minirezo')
 			$cookie_admin = "@".$session_login;
 	        
-		$var_f = charger_fonction('session', 'inc');
-		$cookie_session = $var_f($row_auteur);
+		if (!$_COOKIE['spip_session']) {
+			$var_f = charger_fonction('session', 'inc');
+			$cookie_session = $var_f($row_auteur);
+		}
+
+		if ($session_remember == 'oui')
+			spip_setcookie('spip_session', $cookie_session, time() + 3600 * 24 * 14);
+		else
+			spip_setcookie('spip_session', $cookie_session);
+
+		$prefs = ($row_auteur['prefs']) ? unserialize($row_auteur['prefs']) : array();
+		$prefs['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
+
+		spip_query("UPDATE spip_auteurs SET prefs = " . spip_abstract_quote(serialize($prefs)) . " WHERE id_auteur = " . $row_auteur['id_auteur']);
 	}
-}
+ }
 
 // cookie d'admin ?
 if ($cookie_admin == "non") {
@@ -178,18 +190,6 @@ else if ($cookie_admin AND $spip_admin != $cookie_admin) {
 	spip_setcookie('spip_admin', $cookie_admin, time() + 3600 * 24 * 14);
 }
 
-// cookie de session ?
-if ($cookie_session) {
-	if ($session_remember == 'oui')
-		spip_setcookie('spip_session', $cookie_session, time() + 3600 * 24 * 14);
-	else
-		spip_setcookie('spip_session', $cookie_session);
-
-	$prefs = ($row_auteur['prefs']) ? unserialize($row_auteur['prefs']) : array();
-	$prefs['cnx'] = ($session_remember == 'oui') ? 'perma' : '';
-
-	spip_query("UPDATE spip_auteurs SET prefs = " . spip_abstract_quote(serialize($prefs)) . " WHERE id_auteur = " . $row_auteur['id_auteur']);
- }
 
 // changement de langue espace public
 if ($var_lang) {
diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php
index 32f1ffc724aa59220b164241192db68e479739d0..3daec774ecd9de11885cbe9280de08ac5ba44ce4 100644
--- a/ecrire/inc/actions.php
+++ b/ecrire/inc/actions.php
@@ -95,16 +95,25 @@ function verifier_php_auth() {
 	if ($_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW']
 	&& !$GLOBALS['ignore_auth_http']) {
 		$result = spip_query("SELECT * FROM spip_auteurs WHERE login=" . spip_abstract_quote($_SERVER['PHP_AUTH_USER']));
-		if (!$GLOBALS['db_ok'])
-			return false;
+
+		if (!$GLOBALS['db_ok'])	return false;
+
 		$row = spip_fetch_array($result);
-		if (($row['source'] != 'ldap' OR !$GLOBALS['ldap_present'])
-                AND $row['pass'] != md5($row['alea_actuel'] . $_SERVER['PHP_AUTH_PW'])) {
-			return false;
-		} else {
+		if ($row AND $row['source'] != 'ldap') {
+		  if ($row['pass'] != md5($row['alea_actuel'] . $_SERVER['PHP_AUTH_PW'])) {
 			$GLOBALS['auteur_session'] = $row;
-			$GLOBALS['auteur_session']['hash_env'] = hash_env();
 			return true;
+		  } else return false;
+		} else {
+		  if (!$row AND !$GLOBALS['ldap_present'])
+		    return false;
+		  else {
+			$f = charger_fonction('auth_ldap', 'inc', true);
+			if ($f) {
+			  $GLOBALS['auteur_session'] =  $f($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']);
+			  return true;
+			}
+		  }
 		}
 	}
 }
diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php
index c08ce135bb0b805f6018ccde9453da512e86096a..e0fd0786e180bbba36f67530606a1f5edebc5af0 100644
--- a/ecrire/inc/auth.php
+++ b/ecrire/inc/auth.php
@@ -68,19 +68,16 @@ function acces_statut($id_auteur, $statut, $bio)
 }
 
 function inc_auth_dist() {
-	global $_GET, $_COOKIE, $_SERVER;
 	global $auth_can_disconnect, $ignore_auth_http, $ignore_remote_user;
-
-	global $connect_id_auteur, $connect_login;
+	global $prefs, $connect_id_auteur, $connect_login;
 	global $connect_statut, $connect_toutes_rubriques, $connect_id_rubrique;
 
-	global $auteur_session, $prefs;
-
 	//
 	// Initialiser variables (eviter hacks par URL)
 	//
 
 	$connect_login = '';
+	$connect_id_auteur = 0;
 	$connect_id_rubrique = array();
 	$auth_can_disconnect = false;
 	$connect_toutes_rubriques = false;
@@ -88,87 +85,97 @@ function inc_auth_dist() {
 	//
 	// Recuperer les donnees d'identification
 	//
-
-	// Authentification session
-	if ($cookie_session = $_COOKIE['spip_session']) {
+	
+	// Session valide en cours ?
+	if ($_COOKIE['spip_session']) {
 		$var_f = charger_fonction('session', 'inc');
-		if ($var_f()) {
-			if ($auteur_session['statut'] == '0minirezo'
-			OR $auteur_session['statut'] == '1comite') {
-				$connect_login = $auteur_session['login'];
-				$auth_can_disconnect = true;
-			}
-		}
-	}
-
-	// Peut-etre sommes-nous en auth http?
-	else if ($_SERVER['PHP_AUTH_USER'] && $_SERVER['PHP_AUTH_PW']
-	&& !$ignore_auth_http) {
-
-		// Si le login existe dans la base, se loger
-		if (verifier_php_auth()) {
-			$connect_login = $_SERVER['PHP_AUTH_USER'];
+		if ($connect_id_auteur = $var_f()) {
 			$auth_can_disconnect = true;
-			$_SERVER['PHP_AUTH_PW'] = '';
 		}
-		// Sinon c'est un login d'intranet independant de spip, on ignore
 	}
+	
+	// sinon, essayer auth http si significatif
+	// (ignorer les login d'intranet independants de spip)
+	if (!$ignore_auth_http AND !$connect_id_auteur) {
+		if ($_SERVER['PHP_AUTH_USER'] AND $_SERVER['PHP_AUTH_PW']) {
+			include_spip('inc/actions');
+			if (verifier_php_auth()) {
+				$connect_login = $_SERVER['PHP_AUTH_USER'];
+				$auth_can_disconnect = true;
+				$_SERVER['PHP_AUTH_PW'] = '';
+			}
+
+		} else if ($GLOBALS['_SERVER']['REMOTE_USER'])
 
 	// Authentification .htaccess old style, car .htaccess semble
 	// souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW
-	else if ($GLOBALS['_SERVER']['REMOTE_USER']
-	&& !$ignore_remote_user) {
-		$connect_login = $GLOBALS['_SERVER']['REMOTE_USER'];
-	}
+
+			$connect_login = $GLOBALS['_SERVER']['REMOTE_USER'];
+	}    
+
+	$where = $connect_id_auteur ?
+	  "id_auteur=$connect_id_auteur" :
+	  (!$connect_login ? '' : "login=" . spip_abstract_quote($connect_login));
 
 	// pas authentifie par cookie ni rien: demander login / mdp
 
-	if (!$connect_login) {
-		return auth_arefaire();
-	}
-	//
-	// Trouver le login dans la table auteurs pour avoir les autres infos
-	//
+	if (!$where) return auth_arefaire();
+
+	// Trouver les autres infos dans la table auteurs.
 
-	$result = @spip_query("SELECT UNIX_TIMESTAMP(en_ligne) AS quand, id_auteur, pass, statut, bio, prefs FROM spip_auteurs WHERE login=" . spip_abstract_quote($connect_login) . " AND statut!='5poubelle'");
+	$result = @spip_query("SELECT *, UNIX_TIMESTAMP(en_ligne) AS quand FROM spip_auteurs WHERE $where AND statut!='5poubelle'");
 
 	if (!$row = spip_fetch_array($result)) {
+
 		auth_areconnecter($connect_login);
 		exit;
 	}
 
-	// Le tableau global auteur_session  contient toutes les infos
-	// mais on duplique les plus utiles dans des variables simples
+	// Indiquer la connexion. A la minute pres ca suffit.
+	if ((time() - $row['quand']) >= 60) {
+		@spip_query("UPDATE spip_auteurs SET en_ligne=NOW() WHERE id_auteur='$connect_id_auteur'");
+	}
+
+	$connect_id_auteur = $row['id_auteur'];
+	$connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);
+	if ($connect_statut == '0minirezo') auth_rubrique();
+	else if ($connect_statut != '1comite') return auth_arefaire();
 
-	$GLOBALS['auteur_session']['id_auteur'] = $connect_id_auteur = $row['id_auteur'];
-	$GLOBALS['auteur_session']['pass'] = $row['pass'] ? $row['pass'] : $connect_login;
-	$GLOBALS['auteur_session']['statut'] = $connect_statut = acces_statut($connect_id_auteur, $row['statut'], $row['bio']);
+	$prefs = unserialize($row['prefs']);
+	$connect_login = $row['login'];
+	if (!$row['pass']) $row['pass'] = $connect_login; // pour LDAP
 
-	$GLOBALS['auteur_session']['prefs'] = $prefs = unserialize($row['prefs']);
+	// Le tableau global auteur_session contient toutes les infos.
+	// Les plus utiles sont aussi dans les variables simples ci-dessus
 
-	if ($connect_statut == '6forum') return auth_arefaire();
-	if ($connect_statut == '0minirezo') auth_rubrique();
+	$GLOBALS['auteur_session'] = $row;
+
+	// rajouter les sessions meme en mode auth_http
+	// pour permettre les connexions multiples
+	if (!$_COOKIE['spip_session']) {
+		$var_f = charger_fonction('session', 'inc');
+		if ($session = $var_f($row))
+			spip_setcookie('spip_session', $session, time() + 3600 * 24 * 14);
+	}
 
 	// ceci n'arrive qu'a la premiere connexion il me semble
 	// si oui ce serait mieux de le mettre a la creation de l'auteur
-	if (! isset($prefs['display'])) {
-
-		if (!$GLOBALS['set_disp'] = $GLOBALS['_COOKIE']['spip_display'])
-			$GLOBALS['set_disp'] = 2;
-		if (!$GLOBALS['set_couleur'] = $GLOBALS['_COOKIE']['spip_couleur'])
-			$GLOBALS['set_couleur'] = 6;
-		if (!$GLOBALS['set_options'] = $GLOBALS['_COOKIE']['spip_options'])
-			$GLOBALS['set_options'] = 'basiques';
-	}
+	if (! isset($prefs['display'])) auth_prefs();
 
-	// Indiquer la connexion. A la minute pres ca suffit.
-	if ((time() - $row['quand']) >= 60) {
-		@spip_query("UPDATE spip_auteurs SET en_ligne=NOW() WHERE id_auteur='$connect_id_auteur'");
-	}
 	// vide = pas de message d'erreur (cf exit(0) Unix)
 	return "";
 }
 
+function auth_prefs()
+{
+	if (!$GLOBALS['set_disp'] = $GLOBALS['_COOKIE']['spip_display'])
+		$GLOBALS['set_disp'] = 2;
+	if (!$GLOBALS['set_couleur'] = $GLOBALS['_COOKIE']['spip_couleur'])
+		$GLOBALS['set_couleur'] = 6;
+	if (!$GLOBALS['set_options'] = $GLOBALS['_COOKIE']['spip_options'])
+		$GLOBALS['set_options'] = 'basiques';
+}
+
 // Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui
 // C'est soit parce que le serveur MySQL ne repond pas,
 // soit parce que la table des auteurs a changee (restauration etc)
diff --git a/ecrire/inc/session.php b/ecrire/inc/session.php
index 478fe8b2f0daca659ed07e9dc2a01de2f55efaf5..0652f942922cc473376439e839bd3f4518a8c7e2 100644
--- a/ecrire/inc/session.php
+++ b/ecrire/inc/session.php
@@ -86,17 +86,19 @@ function supprimer_sessions($id_auteur) {
 }
 
 //
-// Verifie et inclut une session. 
+// Verifie si le cookie spip_session indique une session valide.
+// Si oui, la decrit dans le tableau $auteur_session et retourne id_auteur
 // La rejoue si IP change puis accepte le changement si $change=true
 //
 
 function verifier_session($change=false) {
 
-	global $spip_session; // issu du cookie
+	global $auteur_session, $spip_session; 
 
-	// Tester avec alea courant
+	// si pas de cookie, c'est fichu
 	if (!$spip_session) return false;
 
+	// Tester avec alea courant
 	$fichier_session = fichier_session($spip_session, $GLOBALS['meta']['alea_ephemere']);
 	if (@file_exists($fichier_session)) {
 		include($fichier_session);
@@ -133,7 +135,7 @@ function verifier_session($change=false) {
 		spip_setcookie('spip_session', $cookie);
 	  }
 	}
-	return 	true;
+	return 	$auteur_session['id_auteur'];
 }
 
 // Code a inserer par inc/presentation pour rejouer la session