diff --git a/ecrire/inc/filtres_images_lib_mini.php b/ecrire/inc/filtres_images_lib_mini.php
index db219fc088e7603c8000f7b65073dd2841fb7316..4b4bbb41fcd697c3d61b67ecf7342485b66582d3 100644
--- a/ecrire/inc/filtres_images_lib_mini.php
+++ b/ecrire/inc/filtres_images_lib_mini.php
@@ -666,7 +666,7 @@ function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process='AUTO',
 function _image_ratio ($srcWidth, $srcHeight, $maxWidth, $maxHeight) {
 	$ratioWidth = $srcWidth/$maxWidth;
 	$ratioHeight = $srcHeight/$maxHeight;
-
+	
 	if ($ratioWidth <=1 AND $ratioHeight <=1) {
 		$destWidth = $srcWidth;
 		$destHeight = $srcHeight;
@@ -699,7 +699,7 @@ function ratio_passe_partout ($srcWidth, $srcHeight, $maxWidth, $maxHeight) {
 		$destWidth = $maxWidth;
 		$destHeight = $srcHeight/$ratioWidth;
 	}
-	return array (floor($destWidth), floor($destHeight),
+	return array (ceil($destWidth), ceil($destHeight),
 		min($ratioWidth,$ratioHeight));
 }
 
@@ -713,6 +713,7 @@ function process_image_reduire($fonction,$img,$taille,$taille_y,$force,$cherche_
 	if ($process == "netpbm") $format_sortie = "jpg";
 	else if ($process == 'gd1' OR $process == 'gd2') {
 		$image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}",$format_sortie,$fonction);
+
 		// on verifie que l'extension choisie est bonne (en principe oui)
 		$gd_formats = explode(',',$GLOBALS['meta']["gd_formats"]);
 		if (!in_array($image['format_dest'],$gd_formats)
diff --git a/ecrire/inc/flock.php b/ecrire/inc/flock.php
index c6da46116e1d87743ace34a83712668a6dcb0767..cc115af1a611bd2e942d89e497fe7b95f207b75d 100644
--- a/ecrire/inc/flock.php
+++ b/ecrire/inc/flock.php
@@ -119,20 +119,12 @@ function lire_fichier ($fichier, &$contenu, $options=false) {
 
 //
 // Ecrire un fichier de maniere un peu sure
-//
+// $ecrire_quand_meme ne sert plus mais est conservee dans l'appel pour compatibilite
+// 
 // zippe les fichiers .gz
 // http://doc.spip.org/@ecrire_fichier
 function ecrire_fichier ($fichier, $contenu, $ecrire_quand_meme = false, $truncate=true) {
 
-	// Ne rien faire si on est en preview, debug, ou si une erreur
-	// grave s'est presentee (compilation du squelette, MySQL, etc)
-	if ((
-		(isset($GLOBALS['var_preview'])&&$GLOBALS['var_preview'])
-		OR (_request('var_mode') == 'debug')
-		OR defined('spip_interdire_cache'))
-	AND !$ecrire_quand_meme)
-		return;
-
 	#spip_timer('ecrire_fichier');
 
 	// verrouiller le fichier destination
diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php
index 7bc6d17b14c5c31bad1dbf6c1b6973e9c0316dde..9a66b74c3277666261e364dd8aaf8442589fe53d 100644
--- a/ecrire/inc/utils.php
+++ b/ecrire/inc/utils.php
@@ -1499,6 +1499,11 @@ function init_var_mode(){
 							// indiquer qu'on doit recalculer les images
 							$GLOBALS['var_images'] = true;
 							break;
+						case 'debug':
+							$GLOBALS['var_mode'] = 'debug';
+							// et ne pas enregistrer de cache
+							$GLOBALS['var_nocache'] = true;
+							break;
 						default :
 							$GLOBALS['var_mode'] = $_GET['var_mode'];
 							break;
diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php
index f8528af5fd7574e33ef1591670e7200e8dcceb01..e20fcb03a9fdda9e55770adde59bcae03f3b0884 100644
--- a/ecrire/public/cacher.php
+++ b/ecrire/public/cacher.php
@@ -95,8 +95,8 @@ function gunzip_page(&$page) {
 function cache_valide(&$page, $date) {
 
 	if (isset($GLOBALS['var_nocache']) AND $GLOBALS['var_nocache']) return -1;
-	if (defined('_NO_CACHE')) return (_NO_CACHE==0 AND !$page)?1:_NO_CACHE;
-	if (!$page OR !isset($page['entetes']['X-Spip-Cache'])) return 1;
+	if (defined('_NO_CACHE')) return (_NO_CACHE==0 AND !isset($page['texte']))?1:_NO_CACHE;
+	if (!$page OR !isset($page['texte']) OR !isset($page['entetes']['X-Spip-Cache'])) return 1;
 
 	// #CACHE{n,statique} => on n'invalide pas avec derniere_modif
 	// cf. ecrire/public/balises.php, balise_CACHE_dist()
@@ -154,6 +154,14 @@ function cache_sessionne($chemin_cache, $session, $creer=false) {
 // http://doc.spip.org/@creer_cache
 function creer_cache(&$page, &$chemin_cache) {
 
+	// Ne rien faire si on est en preview, debug, ou si une erreur
+	// grave s'est presentee (compilation du squelette, MySQL, etc)
+	// le cas var_nocache ne devrait jamais arriver ici (securite)
+	// le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable
+	if ((isset($GLOBALS['var_nocache'])&&$GLOBALS['var_nocache'])
+		OR defined('spip_interdire_cache'))
+		return;
+
 	// Si la page c1234 a un invalideur de session 'zz', sauver dans
 	// 'tmp/cache/MD5(chemin_cache)/_zz'
 	// en prenant soin de supprimer un eventuel cache non-sessionne
diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 2e1141c3c4ab13021554cde049b30b27427ade6b..d2122e1203c1caddbbb765aded93a0a9a5100173 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -421,7 +421,7 @@ function memoriser_contexte_compil($p) {
 		_q($p->descr['nom']),
 		@_q($p->id_boucle),
 		intval($p->ligne),
-		_q($GLOBALS['spip_lang'])));
+		'$GLOBALS[\'spip_lang\']'));
 }
 
 function reconstruire_contexte_compil($context_compil)
diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php
index ebcdb99a7a922ce78217aa0016cb5f04208b44af..be9c74a436cddcca3317e58d482e64680dd2247c 100644
--- a/ecrire/public/composer.php
+++ b/ecrire/public/composer.php
@@ -195,7 +195,11 @@ function analyse_resultat_skel($nom, $cache, $corps, $source='') {
 		$corps = str_replace($r[0], '', $corps);
 		# $j = Content-Type, et pas content-TYPE.
 		$j = join('-', array_map('ucwords', explode('-', strtolower($r[2]))));
-		$headers[$j] = $r[3];
+
+		if ($j=='X-Spip-Filtre' AND isset($headers[$j]))
+			$headers[$j].="|".$r[3];
+		else
+			$headers[$j] = $r[3];
 	}
 
 	// S'agit-il d'un resultat constant ou contenant du code php
diff --git a/prive/javascript/login.js b/prive/javascript/login.js
index f0a23ad5a811830c426328fee7cff699708213ea..d49744dcdb389571d8f07f5c807c48ea1064c1f6 100644
--- a/prive/javascript/login.js
+++ b/prive/javascript/login.js
@@ -55,7 +55,8 @@ function actualise_auteur(){
 
 function login_submit(){
 	actualise_auteur();
-	pass = jQuery('input[name=password]').attr('value');
+	var inputpass = jQuery('input[name=password]');
+	pass = inputpass.attr('value');
 	// ne pas laisser le pass d'un auteur "auth=spip" circuler en clair
 	if (pass) {
 		// si l'information est en cours, retenter sa chance
@@ -69,13 +70,21 @@ function login_submit(){
 			return false;
 		}
 
+		// il ne faut pas injecter le pass hashe directement dans l'input password visible car
+		// - cela est perturbant
+		// - certains navigateurs memorisent le hash au lieu du pass ...
+		// on cree un input hidden a cote, on lui met le name="password"
+		// et on vide le champ visible
+		inputpass.after('<input name="password" type="hidden" value="" />');
+		inputpass.attr('name','nothing').attr('value','');
+
 		// Si on a l'alea, on peut lancer le submit apres avoir hashe le pass
 		if (alea_actuel || alea_futur) {
 			calcule_hash_pass(pass);
 		}
 		// si on arrive pas a avoir une reponse, vider le pass pour forcer un passage en 2 fois
-		else if(informe_auteur_en_cours)
-			jQuery('input[name=password]').attr('value','');
+		//else if(informe_auteur_en_cours)
+		//	jQuery('input[name=password]').attr('value','');
 		// sinon c'est que l'auteur n'existe pas
 		// OU qu'il sera accepte par LDAP ou autre auth
 	}