diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php
index f2928790b986df38b5d33866b95976a18e69ad6b..3f92ca0603d563fabb849f0e6bad367a60238bda 100644
--- a/ecrire/inc/filtres.php
+++ b/ecrire/inc/filtres.php
@@ -1949,7 +1949,8 @@ function direction_css ($css, $voulue='') {
 function url_absolue_css ($css) {
 	if (!preg_match(',\.css$,i', $css, $r)) return $css;
 
-	$path = dirname(url_absolue($css))."/"; // pour mettre sur les images
+	$url_absolue_css = url_absolue($css);
+	$path = dirname($url_absolue_css)."/"; // pour mettre sur les images
 	
 	$f = basename($css,'.css');
 	$f = sous_repertoire (_DIR_VAR, 'cache-css') 
@@ -1960,7 +1961,15 @@ function url_absolue_css ($css) {
 	AND ($GLOBALS['var_mode'] != 'recalcul'))
 		return $f;
 
-	if (!lire_fichier($css, $contenu))
+	if ($url_absolue_css==$css){
+		if (strncmp($GLOBALS['meta']['adresse_site'],$css,$l=strlen($GLOBALS['meta']['adresse_site']))!=0
+		 OR !lire_fichier(_DIR_RACINE . substr($css,$l), $contenu)){
+		 		include_spip('inc/distant');
+		 		if (!$contenu = recuperer_page($css))
+					return $css;
+		}
+	}
+	elseif (!lire_fichier($css, $contenu))
 		return $css;
 
 	// passer les url relatives a la css d'origine en url absolues
@@ -2258,4 +2267,96 @@ function filtre_info_plugin_dist($plugin, $type_info) {
 			return $plugins_actifs[$plugin][$type_info];
 }
 
-?>
+
+function filtre_cache_static($scripts,$type='js'){
+	$nom = "";
+	if (!is_array($scripts) && $scripts) $scripts = array($scripts);
+	if (count($scripts)){
+		$dir = sous_repertoire(_DIR_VAR,'cache-'.$type);
+		$nom = $dir . md5(serialize($scripts)) . ".$type";
+		if (
+		  (_request('var_mode')=='recalcul')
+		  OR (!file_exists($nom))){
+		  	$fichier = "";
+		  	foreach($scripts as $script){
+		  		if (!is_array($script)){
+				  	if ($type=='css')
+				  		$script = url_absolue_css($script);
+		  			lire_fichier($script,$contenu);
+		  			$fichier .= $contenu . "\n";
+		  		}
+		  		else {
+		  			parse_str($script[1],$contexte);
+		  			$contenu = evaluer_fond($script[0],$contexte);
+		  			if ($type=='css'){
+							$self = url_absolue(self(true));
+							$path = $path = pathinfo($self);
+							$path = $path['dirname'].'/';
+							// passer les url relatives a la css d'origine en url absolues
+							$contenu = preg_replace(",url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims","url($path\\1)",$contenu);
+		  				
+		  			}
+		  			$fichier .= $contenu['texte'];
+		  		}
+		  	}
+		  	// compacter
+		  	$fichier = compacte($fichier,$type);
+		  	// ecrire
+		  	ecrire_fichier($nom,$fichier);
+		  }
+	}
+	return $nom;
+}
+
+function f_compacte_head($flux){
+	$self = url_absolue(self(true));
+	$path = $path = pathinfo($self);
+	$dir = preg_quote($path['dirname'].'/',',');
+
+	// rechercher les js, les agglomerer et les compacter, et mettre le tout dans un cache statique
+	$scripts = array();
+	preg_match_all(",<script\s[^>]*src=['\"]([^'\"]*)['\"][^>]*>\s*</script>,",$flux,$regs,PREG_SET_ORDER);
+	foreach($regs as $script){
+		$src = $script[1];
+		if (preg_match(",(".$dir."|)spip.php[?](page=([^&]*).*)$,",$src,$r)){
+			$src = array($r[3],str_replace('&amp;','&',$r[2]));
+		}
+		$scripts[$script[0]] = $src;
+	}
+	if ($src = filtre_cache_static($scripts,'js')){
+		$scripts = array_keys($scripts);
+		$flux = str_replace(reset($scripts),"<script type='text/javascript' src='$src'></script>",$flux);
+		$flux = str_replace($scripts,"",$flux);
+	}
+
+	// rechercher les css, les agglomerer et les compacter, par type de media
+	$css = array();
+	preg_match_all(",<link\s[^>]*href=['\"]([^'\"]*)['\"][^>]*>,",$flux,$regs,PREG_SET_ORDER);
+	foreach($regs as $style){
+		if (preg_match(',rel=["\']stylesheet["\'],i',$style[0])) {
+			$m = 0;
+			// regarder si un media est dispo
+			preg_match(',media=["\']([^\'"]*)["\'],i',$style[0],$m);
+			$src = $style[1];
+			if (preg_match(",(".$dir."|)spip.php[?](page=([^&]*).*)$,",$src,$r)){
+				$src = array($r[3],str_replace('&amp;','&',$r[2]));
+			}
+			$css[$m[1]][$style[0]] = $src;
+		}
+	}
+
+	// et mettre le tout dans un cache statique
+	foreach($css as $m=>$s){
+		// si plus d'une css pour ce media ou si c'est une css dynamique
+		if (count($s)>1 OR is_array(reset($s))){
+			if ($src = filtre_cache_static($s,'css')){
+				$s = array_keys($s);
+				$flux = str_replace(reset($s),"<link rel='stylesheet'".($m?" media='$m'":"")." href='$src' />",$flux);
+				$flux = str_replace($s,"",$flux);
+			}
+		}
+	}
+	return $flux;
+}
+
+?>
\ No newline at end of file
diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php
index 1caa6a525bf8a662eddc388dfd4f5fa376c18842..560c104d7467e9b476edf809c03734fce16ab5d4 100644
--- a/ecrire/inc/plugin.php
+++ b/ecrire/inc/plugin.php
@@ -329,7 +329,7 @@ function ecrire_plugin_actifs($plugin,$pipe_recherche=false,$operation='raz') {
 					if (!isset($GLOBALS['spip_pipeline'][$nom])) // creer le pipeline eventuel
 						$GLOBALS['spip_pipeline'][$nom]="";
 					if (strpos($GLOBALS['spip_pipeline'][$nom],"|$prefix$action")===FALSE)
-						$GLOBALS['spip_pipeline'][$nom] .= "|$prefix$action";
+						$GLOBALS['spip_pipeline'][$nom] = preg_replace(",(\|\||$),","|$prefix$action\\1",$GLOBALS['spip_pipeline'][$nom],1);
 					if (isset($pipe['inclure'])){
 						$GLOBALS['spip_matrice']["$prefix$action"] = 
 							"_DIR_PLUGINS$plug/".$pipe['inclure'];
diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php
index 7ca736af610b433dea01ed918091e397db403ea4..263f5e40adf3fa16132c4621c3bbf621335ff256 100644
--- a/ecrire/inc_version.php
+++ b/ecrire/inc_version.php
@@ -225,8 +225,8 @@ $spip_pipeline = array(
 	'delete_all' => '',
 	'delete_statistiques' => '',
 	'exec_init' => '',
-	'header_prive' => '|f_jQuery',
-	'insert_head' => '|f_jQuery',
+	'header_prive' => '|f_jQuery||f_compacte_head',
+	'insert_head' => '|f_jQuery||f_compacte_head',
 	'insert_js' => '',
 	'lister_tables_noexport' => '',
 	'verifie_js_necessaire' => '',