diff --git a/ecrire/inc_version.php3 b/ecrire/inc_version.php3
index f89579b5da5ac9336417aa84dfbe8b40dd8c864d..85e77867a437d3a0a473eeffd4b31a7131e4a7eb 100644
--- a/ecrire/inc_version.php3
+++ b/ecrire/inc_version.php3
@@ -236,7 +236,7 @@ if ($ob_exists) {
 	// special bug Netscape Win 4.0x
 	if (eregi("Mozilla/4\.0[^ ].*Win", $HTTP_SERVER_VARS['HTTP_USER_AGENT'])) {
 		$use_gz = false;
-	}	
+	}
 
 	if ($use_gz) {
 		@ob_start("ob_gzhandler");
diff --git a/inc-cache.php3 b/inc-cache.php3
index dce3e4a04a4cb64c03764eef78b36d1bead313c2..de81ecd9ef9730f887eb80d7ec2d6d0fe8f42158 100644
--- a/inc-cache.php3
+++ b/inc-cache.php3
@@ -6,6 +6,31 @@ if (defined("_INC_CACHE")) return;
 define("_INC_CACHE", "1");
 
 
+//
+// Retourne true si le sous-repertoire peut etre cree, false sinon
+//
+
+function creer_repertoire($base, $subdir) {
+	if (file_exists("$base/.plat")) return false;
+	$path = $base.'/'.$subdir;
+	if (file_exists($path)) return true;
+
+	@mkdir($path, 0777);
+	@chmod($path, 0777);
+	$ok = false;
+	if ($f = @fopen("$path/.test", "w")) {
+		@fputs($f, '<?php $ok = true; ?'.'>');
+		@fclose($f);
+		include("$path/.test");
+	}
+	if (!$ok) {
+		$f = fopen("$base/.plat", "w");
+		fclose($f);
+	}
+	return $ok;
+}
+
+
 function purger_repertoire($dir, $age, $regexp = '') {
 	$handle = opendir($dir);
 	$t = time();
diff --git a/inc-public.php3 b/inc-public.php3
index a3246d52f82ec7fa34ef9408f4607d3303912dca..40bdb5942de3e7dd5e3669956124a41726768e97 100644
--- a/inc-public.php3
+++ b/inc-public.php3
@@ -2,6 +2,7 @@
 
 $dir_ecrire = 'ecrire/';
 include ("ecrire/inc_version.php3");
+include_local ("inc-cache.php3");
 
 //
 // Ajouter un forum
@@ -24,7 +25,10 @@ $fichier_requete = eregi_replace('&(submit|valider|(var_[^=&]*)|recalcul)=[^&]*'
 $fichier_cache = substr(rawurlencode($fichier_requete), 0, 128);
 $sousrep_cache = substr(md5($fichier_cache), 0, 1);
 
-if (!file_exists("CACHE/.plat") AND !file_exists("CACHE/$sousrep_cache")) {
+if (creer_repertoire("CACHE", $sousrep_cache))
+	$fichier_cache = "$sousrep_cache/$fichier_cache";
+
+/*if (!file_exists("CACHE/.plat") AND !file_exists("CACHE/$sousrep_cache")) {
 	@mkdir("CACHE/$sousrep_cache", 0777);
 	@chmod("CACHE/$sousrep_cache", 0777);
 	$ok = false;
@@ -42,7 +46,7 @@ if (!file_exists("CACHE/.plat") AND !file_exists("CACHE/$sousrep_cache")) {
 if (!file_exists("CACHE/.plat")) {
 	$fichier_cache = "$sousrep_cache/$fichier_cache";
 }
-
+*/
 $chemin_cache = "CACHE/$fichier_cache";
 
 
diff --git a/spip_image.php3 b/spip_image.php3
index 122e9a86c6e12017fe3620c3977b6ad41655d105..e5b5769067d8ddb011a4bad2cea72fc8dbeb8f01 100644
--- a/spip_image.php3
+++ b/spip_image.php3
@@ -5,6 +5,7 @@ include ("ecrire/inc_version.php3");
 include_ecrire("inc_connect.php3");
 include_ecrire("inc_meta.php3");
 include_ecrire("inc_admin.php3");
+include_local("inc-cache.php3");
 
 if ($HTTP_POST_VARS) $vars = $HTTP_POST_VARS;
 else $vars = $HTTP_GET_VARS;
@@ -102,8 +103,6 @@ function ajout_doc($orig, $source, $dest, $mode, $id_document) {
 		$type_upload = $row['upload'];
 	}
 
-	echo "$orig<p>$source<p>";
-
 	// Ne pas accepter les types non autorises
 	if ($type_upload != 'oui') return;
 	if ($type_inclus == 'non' AND $mode == 'vignette') return;
@@ -132,22 +131,26 @@ function ajout_doc($orig, $source, $dest, $mode, $id_document) {
 		else
 			$dest = "doc-$id_document";
 	}
-	$dest = ereg_replace("\.([^.]+)$", "", $dest).".$ext";
-	$loc = "IMG/$dest";
+	$dest = ereg_replace("\.([^.]+)$", "", $dest) . ".$ext";
 
-	if (!deplacer_fichier_upload($source, $loc)) return;
+	if (creer_repertoire("IMG", $ext))
+		$dest_path = "IMG/$ext/$dest";
+	else
+		$dest_path = "IMG/$dest";
+
+	if (!deplacer_fichier_upload($source, $dest_path)) return;
 
 	//
 	// Recopier le fichier
 	//
 
-	$size_image = getimagesize($loc);
+	$size_image = getimagesize($dest_path);
 	$type_image = $size_image[2];
 	if ($type_image) {
 		$largeur = $size_image[0];
 		$hauteur = $size_image[1];
 	}
-	$taille = filesize($loc);
+	$taille = filesize($dest_path);
 
 	if ($nouveau) {
 		if (!$mode) $mode = $type_image ? 'vignette' : 'document';
@@ -155,7 +158,7 @@ function ajout_doc($orig, $source, $dest, $mode, $id_document) {
 		if ($largeur && $hauteur) $update .= "titre='image $largeur x $hauteur', ";
 	}
 
-	$query = "UPDATE spip_documents SET $update taille='$taille', largeur='$largeur', hauteur='$hauteur', fichier='$loc' ".
+	$query = "UPDATE spip_documents SET $update taille='$taille', largeur='$largeur', hauteur='$hauteur', fichier='$dest_path' ".
 		"WHERE id_document=$id_document";
 	mysql_query($query);
 	if ($id_document_lie) {