diff --git a/ecrire/action/editer_article.php b/ecrire/action/editer_article.php
index c18ea4b20055642e8560d6a4d16cd9f349fc1f88..22b7ef943a784ddc4ef0fb2b70dd96492cfcb691 100644
--- a/ecrire/action/editer_article.php
+++ b/ecrire/action/editer_article.php
@@ -142,7 +142,7 @@ function insert_article($id_rubrique) {
 	$id_article = sql_insertq("spip_articles", $champs);
 
 	// controler si le serveur n'a pas renvoye une erreur
-	if ($id_article > 0) 
+	if ($id_article > 0 AND $GLOBALS['visiteur_session']['id_auteur'])
 		sql_insertq('spip_auteurs_articles', array('id_auteur' => $GLOBALS['visiteur_session']['id_auteur'], 'id_article' => $id_article));;
 
 	return $id_article;
diff --git a/ecrire/action/purger.php b/ecrire/action/purger.php
index 6ff2b95ff17c333d997193eaaa00ccb255488a29..784b899855009aa9ad6e96c0017c43081319ccd5 100644
--- a/ecrire/action/purger.php
+++ b/ecrire/action/purger.php
@@ -28,6 +28,7 @@ function action_purger_dist()
 		supprime_invalideurs();
 		@spip_unlink(_CACHE_RUBRIQUES);
 		@spip_unlink(_CACHE_PIPELINES);
+		@spip_unlink(_CACHE_PLUGINS_PATH);
 		@spip_unlink(_CACHE_PLUGINS_OPT);
 		@spip_unlink(_CACHE_PLUGINS_FCT);
 		@spip_unlink(_CACHE_PLUGINS_VERIF);
diff --git a/ecrire/balise/logo_.php b/ecrire/balise/logo_.php
index 1dc9c60da93b9a78174e8f9cbbf12861fcc076de..24e3ecfe8dd67dbb13feb193937c06c6c0290f93 100644
--- a/ecrire/balise/logo_.php
+++ b/ecrire/balise/logo_.php
@@ -106,7 +106,7 @@ function logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p,
 	$code = "\n((!is_array(\$l = $code)) ? '':\n (" .
 		     '"<img class=\"spip_logos\" alt=\"\"' .
 		    ($align ? " align=\\\"$align\\\"" : '')
-		    . ' src=\"$l[0]\"" . $l[3] .  ($l[1] ? " onmouseover=\"this.src=\'$l[1]\'\" onmouseout=\"this.src=\'$l[0]\'\"" : "") . \' />\'))';
+		    . ' src=\"$l[0]\"" . $l[2] .  ($l[1] ? " onmouseover=\"this.src=\'$l[1]\'\" onmouseout=\"this.src=\'$l[0]\'\"" : "") . \' />\'))';
 
 	if (!$lien) return $code;
 
diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index 8fcd7eca16cfaa941cb3db586368631e5a37c4e1..287e9200dcc5bf02aca939c53b3ee1c97024559a 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -2202,10 +2202,20 @@ function encoder_contexte_ajax($c,$form='', $emboite=NULL) {
 	include_spip("inc/securiser_action");
 	$cle = calculer_cle_action($form.(is_array($c)?serialize($c):$c));
 	$c = serialize(array($c,$cle));
-	if (function_exists('gzdeflate') && function_exists('gzinflate'))
-		$c = gzdeflate($c);
-	$c = _xor($c);
-	$c = base64_encode($c);
+
+	if ((defined('_CACHE_CONTEXTES_AJAX') AND _CACHE_CONTEXTES_AJAX)
+		AND $dir = sous_repertoire(_DIR_CACHE, 'contextes')) {
+		// stocker les contextes sur disque et ne passer qu'un hash dans l'url
+		$md5 = md5($c);
+		ecrire_fichier("$dir/c$md5",$c);
+		$c = $md5;
+	} else {
+		if (function_exists('gzdeflate') && function_exists('gzinflate'))
+			$c = gzdeflate($c);
+		$c = _xor($c);
+		$c = base64_encode($c);
+	}
+	
 	if ($emboite === NULL) return $c;
 	return !trim($emboite) ? '' :  
 	"<div class='ajaxbloc env-$c'>\n$emboite</div><!-- ajaxbloc -->\n";
@@ -2215,11 +2225,16 @@ function encoder_contexte_ajax($c,$form='', $emboite=NULL) {
 // http://doc.spip.org/@decoder_contexte_ajax
 function decoder_contexte_ajax($c,$form='') {
 	include_spip("inc/securiser_action");
-
-	$c = @base64_decode($c);
-	$c = _xor($c);
-	if (function_exists('gzdeflate') && function_exists('gzinflate'))
-		$c = @gzinflate($c);
+	if (( (defined('_CACHE_CONTEXTES_AJAX') AND _CACHE_CONTEXTES_AJAX) OR strlen($c)==32)
+		AND $dir = sous_repertoire(_DIR_CACHE, 'contextes')
+		AND lire_fichier("$dir/c$c",$contexte)) {
+			$c = $contexte;
+	} else {
+		$c = @base64_decode($c);
+		$c = _xor($c);
+		if (function_exists('gzdeflate') && function_exists('gzinflate'))
+			$c = @gzinflate($c);
+	}
 	list($env, $cle) = @unserialize($c);
 
 	if ($cle == calculer_cle_action($form.(is_array($env)?serialize($env):$env)))
diff --git a/ecrire/inc/instituer_auteur.php b/ecrire/inc/instituer_auteur.php
index 2dc27fdc7538a642b6b3f612509afa5ebd61eb26..07226b9e9e6d60ca0a0ea2e1029d2c26298c8ef5 100644
--- a/ecrire/inc/instituer_auteur.php
+++ b/ecrire/inc/instituer_auteur.php
@@ -103,9 +103,11 @@ function traduire_statut_auteur($statut){
 		return $recom[$statut];
 	
 	// retrouver directement par le statut sinon
-	if ($t = array_search($statut, $GLOBALS['liste_des_statuts'])
-	  AND isset($recom[$t]))
-		return $recom[$t];
+	if ($t = array_search($statut, $GLOBALS['liste_des_statuts'])){
+	  if (isset($recom[$t]))
+			return $recom[$t];
+		return $t;
+	}
 	
 	return '';
 }
@@ -128,7 +130,7 @@ function choix_statut_auteur($statut, $id_auteur, $ancre) {
 		       null, array('statut' => '0minirezo')))
 		unset($droits["info_administrateurs"]);
 
-	if (!avoir_visiteurs())
+	if (!avoir_visiteurs() AND $statut!==$droits['info_visiteurs'])
 		unset($droits['info_visiteurs']);
 
 	$menu = '';
diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php
index 99517aadda9969ba5b2dab75db0025f9fcb77959..d7737aa65b98e082604c8a0e52ba60fa4b3a0d2e 100644
--- a/ecrire/inc/plugin.php
+++ b/ecrire/inc/plugin.php
@@ -349,7 +349,7 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') {
 	// generer les fichier
 	// charger_plugins_options.php
 	// charger_plugins_fonctions.php
-	foreach(array('options','fonctions') as $charge){
+	foreach(array('chemins'=>_CACHE_PLUGINS_PATH,'options'=>_CACHE_PLUGINS_OPT,'fonctions'=>_CACHE_PLUGINS_FCT) as $charge=>$fileconf){
 		$s = "";
 		$splugs = "";
 		if (is_array($infos)){
@@ -363,7 +363,7 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') {
 				$info = $infos[$dir_type][$plug];
 				// definir le plugin, donc le path avant l'include du fichier options
 				// permet de faire des include_spip pour attraper un inc_ du plugin
-				if ($charge=='options'){
+				if ($charge=='chemins'){
 					$prefix = strtoupper(preg_replace(',\W,','_',$info['prefix']));
 					$splugs .= "define('_DIR_PLUGIN_$prefix',$dir); ";
 					foreach($info['path'] as $chemin){
@@ -376,6 +376,7 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') {
 						}
 					}
 				}
+				// concerne uniquement options et fonctions
 				if (isset($info[$charge])){
 					foreach($info[$charge] as $file){
 						// on genere un if file_exists devant chaque include pour pouvoir garder le meme niveau d'erreur general
@@ -395,9 +396,8 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') {
 		if ($charge=='options'){
 			$s .= "function boutons_plugins(){return unserialize('".str_replace("'","\'",serialize($liste_boutons))."');}\n";
 			$s .= "function onglets_plugins(){return unserialize('".str_replace("'","\'",serialize($liste_onglets))."');}\n";
-			$f = _CACHE_PLUGINS_OPT;
-		} else  $f = _CACHE_PLUGINS_FCT;
-		ecrire_fichier($f, $start_file . $splugs . $s . $end_file);
+		}
+		ecrire_fichier($fileconf, $start_file . $splugs . $s . $end_file);
 	}
 
 	if (is_array($infos)){
diff --git a/ecrire/inc/securiser_action.php b/ecrire/inc/securiser_action.php
index 5b4ec411e66f500f18063e052f6504a2d1360828..04891ad17a619116a813d61a8bf23c43a7a5a19d 100644
--- a/ecrire/inc/securiser_action.php
+++ b/ecrire/inc/securiser_action.php
@@ -100,18 +100,25 @@ function caracteriser_auteur() {
 
 // http://doc.spip.org/@_action_auteur
 function _action_auteur($action, $id_auteur, $pass, $alea) {
-	if (!isset($GLOBALS['meta'][$alea]) AND _request('exec')!=='install') {
-		include_spip('base/abstract_sql');
-		$GLOBALS['meta'][$alea] = sql_getfetsel('valeur', 'spip_meta', "nom=" . sql_quote($alea));
-		if (!($GLOBALS['meta'][$alea])) {
-			include_spip('inc/minipres');
-			echo minipres();
-			spip_log("$alea indisponible");
-			exit;
+	static $sha = array();
+	if (!isset($sha[$id_auteur.$pass.$alea])){
+		if (!isset($GLOBALS['meta'][$alea]) AND _request('exec')!=='install') {
+			include_spip('base/abstract_sql');
+			$GLOBALS['meta'][$alea] = sql_getfetsel('valeur', 'spip_meta', "nom=" . sql_quote($alea));
+			if (!($GLOBALS['meta'][$alea])) {
+				include_spip('inc/minipres');
+				echo minipres();
+				spip_log("$alea indisponible");
+				exit;
+			}
 		}
+		include_spip('auth/sha256.inc');
+		$sha[$id_auteur.$pass.$alea] = sha256($id_auteur.$pass.@$GLOBALS['meta'][$alea]);
 	}
-	include_spip('auth/sha256.inc');
-	return sha256($action.$id_auteur.$pass.@$GLOBALS['meta'][$alea]);
+	if (function_exists('sha1'))
+		return sha1($action.$sha[$id_auteur.$pass.$alea]);
+	else
+		return md5($action.$sha[$id_auteur.$pass.$alea]);
 }
 
 // http://doc.spip.org/@calculer_action_auteur
@@ -144,10 +151,10 @@ function secret_du_site() {
 		$GLOBALS['meta']['secret_du_site'] = sql_getfetsel('valeur', 'spip_meta', "nom='secret_du_site'");
 	}
 	if (!isset($GLOBALS['meta']['secret_du_site'])
-	OR !strlen($GLOBALS['meta']['secret_du_site'])
-	) {
+	  OR (strlen($GLOBALS['meta']['secret_du_site'])<64)) {
 		include_spip('inc/acces');
-		ecrire_meta('secret_du_site', creer_uniqid(), 'non');
+		include_spip('auth/sha256.inc');
+		ecrire_meta('secret_du_site', sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non');
 		lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas
 	}
 	return $GLOBALS['meta']['secret_du_site'];
@@ -155,8 +162,10 @@ function secret_du_site() {
 
 // http://doc.spip.org/@calculer_cle_action
 function calculer_cle_action($action) {
-	include_spip('auth/sha256.inc');
-	return sha256($action . secret_du_site());
+	if (function_exists('sha1'))
+		return sha1($action . secret_du_site());
+	else
+		return md5($action . secret_du_site());
 }
 
 // http://doc.spip.org/@verifier_cle_action
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 93e848d0ab94cf8142d17f32218c4c24fb82e887..7bc6d17b14c5c31bad1dbf6c1b6973e9c0316dde 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -755,6 +755,10 @@ function find_in_path ($file, $dirname='', $include=false) {
 }
 
 function load_path_cache(){
+	// charger le path des plugins
+	if (@is_readable(_CACHE_PLUGINS_PATH)){
+		include_once(_CACHE_PLUGINS_PATH);
+	}
 	$GLOBALS['path_files'] = array();
 	// si le visiteur est admin,
 	// on ne recharge pas le cache pour forcer sa mise a jour
@@ -1169,6 +1173,7 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
 
 	// Declaration des fichiers
 
+	define('_CACHE_PLUGINS_PATH', _DIR_CACHE . "charger_plugins_chemins.php");
 	define('_CACHE_PLUGINS_OPT', _DIR_CACHE . "charger_plugins_options.php");
 	define('_CACHE_PLUGINS_FCT', _DIR_CACHE . "charger_plugins_fonctions.php");
 	define('_CACHE_PLUGINS_VERIF', _DIR_CACHE . "verifier_plugins.txt");
@@ -1236,7 +1241,7 @@ function spip_initialisation_core($pi=NULL, $pa=NULL, $ti=NULL, $ta=NULL) {
 	// systematique du noyau ou une baisse de perfs => a etudier)
 	include_once _DIR_RESTREINT . 'inc/flock.php';
 
-	// charger tout de suite le cache path
+	// charger tout de suite le path et son cache
 	load_path_cache();
 
 	// *********** traiter les variables ************
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index 1471250ba785c510ccb1fc48aba748587b0ac4bb..efc39dd248e4dc0828f3e923f95740868a703741 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -448,7 +448,7 @@ error_reporting(SPIP_ERREUR_REPORT);
 // qui ne sera pas execute car _ECRIRE_INC_VERSION est defini
 // donc il faut avoir tout fini ici avant de charger les plugins
 
-if (@is_readable(_CACHE_PLUGINS_OPT)){
+if (@is_readable(_CACHE_PLUGINS_OPT) AND @is_readable(_CACHE_PLUGINS_PATH)){
 	// chargement optimise precompile
 	include_once(_CACHE_PLUGINS_OPT);
 } else {
@@ -457,6 +457,8 @@ if (@is_readable(_CACHE_PLUGINS_OPT)){
 	// generer les fichiers php precompiles
 	// de chargement des plugins et des pipelines
 	if (verif_plugin()) {
+		if (@is_readable(_CACHE_PLUGINS_PATH))
+			include_once(_CACHE_PLUGINS_PATH); // securite : a priori n'a pu etre fait plus tot
 		if (@is_readable(_CACHE_PLUGINS_OPT))
 			include_once(_CACHE_PLUGINS_OPT);
 		else spip_log("pipelines desactives: impossible de produire " . _CACHE_PLUGINS_OPT); 
diff --git a/prive/javascript/ajaxCallback.js b/prive/javascript/ajaxCallback.js
index 2b9813c81404ca1a87455284e52bb21aac3f3b14..14b1b2369b09ea66c6a329b1d1030c5186fc9bc1 100644
--- a/prive/javascript/ajaxCallback.js
+++ b/prive/javascript/ajaxCallback.js
@@ -74,7 +74,7 @@ jQuery.fn.animeajax = function(end) {
 // le bloc cible en haut de l'ecran
 // si force = true, scroller dans tous les cas
 jQuery.fn.positionner = function(force) {
-	var offset = jQuery(this).offset({'scroll':false});
+	var offset = jQuery(this).offset();
 	var hauteur = parseInt(jQuery(this).css('height'));
 	var scrolltop = self['pageYOffset'] ||
 		jQuery.boxModel && document.documentElement[ 'scrollTop' ] ||
diff --git a/prive/javascript/layer.js b/prive/javascript/layer.js
index 45825b092b57eb407b9d738cc8799fc829163722..6c9d173b70038e023e3a3a03ae8e76c1c05bf3e4 100644
--- a/prive/javascript/layer.js
+++ b/prive/javascript/layer.js
@@ -269,24 +269,6 @@ function onkey_rechercher(valeur, rac, url, img, nid, init) {
 // * retailler les input
 // * utiliser ctrl-s, F8 etc comme touches de sauvegarde
 function verifForm(racine) {
-	if(!jQuery.browser.mozilla) return;
-	jQuery("input.forml,input.formo,textarea.forml,textarea.formo", racine||document)
-	.each(function() {
-		var jField = jQuery(this);
-		var w = jField.css('width');
-		if (!w || w == '100%') {
-			jField.css('width','95%');
-		} else {
-			w = parseInt(w) -
-			(parseInt(jField.css("borderLeftWidth")) +
-				parseInt(jField.css("borderRightWidth")) +
-				parseInt(jField.css("paddingLeft")) +
-				parseInt(jField.css("paddingRight")
-			));
-			jField.width(w+'px');
-		}
-	});
-
 	// Clavier pour sauver (cf. crayons)
 	jQuery('form', racine||document)
 	.keypress(function(e){
@@ -303,6 +285,20 @@ function verifForm(racine) {
 			return false;
 		}
 	});
+	
+	// vieux fonctionnement verifForm, desormais uniquement sur MSIE < 8:
+	// forcer la largeur des elements de formulaires a 100%
+	// (desormais, on utilise la CSS box-sizing pour brouteurs recents).
+	if(jQuery.browser.msie && jQuery.browser.version.substr(0,3) < 8) {
+		jQuery(".formulaire_spip", racine||document).find("input.text, input.password, textarea")
+		.each(function() {
+			if(this.currentStyle && this.currentStyle.width=="100%") {
+				var jField = jQuery(this);
+				jField.width(2*jField.width()-jField.outerWidth());
+			}
+		});	
+	}
+
 }
 
 // Si Ajax est disponible, cette fonction l'utilise pour envoyer la requete.