diff --git a/library/Class/WebService/ArteVOD/Vignette.php b/library/Class/WebService/ArteVOD/Vignette.php
index 3adf699a38a636168d3f8262bc560e1d4b0f6265..f6933c45bbe130febc8dbd0df68ff2d9c37954d4 100644
--- a/library/Class/WebService/ArteVOD/Vignette.php
+++ b/library/Class/WebService/ArteVOD/Vignette.php
@@ -20,23 +20,54 @@
  */
 
 class Class_WebService_ArteVOD_Vignette  extends Class_WebService_Abstract {
+	protected static $_instance;
 	protected $_file_writer;
+	protected $_updload_mover;
+	protected $_url_validator;
+
+
+	public static function getInstance() {
+		if (!isset(static::$_instance))
+			static::$_instance = new static();
+		return static::$_instance;
+	}
+
+
+	public static function resetInstance() {
+		static::$_instance = null;
+	}
+
+
+	public function __construct() {
+		$this->_upload_mover = new Class_UploadMover_LocalFile();
+		$this->_url_validator = new ZendAfi_Validate_Url();
+	}
+
 
 	public function updateAlbum($album) {
-		$parts = explode('/', $album->getPoster());
+		$url_poster = $album->getPoster();
+		if (!($url_poster && $this->_url_validator->isValid($url_poster)))
+			return $this;
+
+		if (!$image = static::getHttpClient()->open_url($url_poster))
+			return $this;
+
+		$parts = explode('/', $url_poster);
 		$filename = array_pop($parts);
 		$temp_name = PATH_TEMP.$filename;
-
-		$image = static::getHttpClient()->open_url($album->getPoster());
-		$this->getFileWriter()->putContents($temp_name, $image);
+		if (false === $this->getFileWriter()->putContents($temp_name, $image))
+			return $this;
 
 		$_FILES['fichier'] = ['name' => $filename,
 													'tmp_name' => $temp_name,
 													'size' => strlen($image)];
 
-		$album->setUploadMover('fichier', new Class_UploadMover_LocalFile());
+		$album->setUploadMover('fichier', $this->_upload_mover);
 
+		$album->receiveFile();
 		$album->save();
+
+		return $this;
 	}
 
 
@@ -46,6 +77,8 @@ class Class_WebService_ArteVOD_Vignette  extends Class_WebService_Abstract {
 
 
 	public function getFileWriter() {
+		if (!isset($this->_file_writer))
+			$this->_file_writer = new Class_FileWriter();
 		return $this->_file_writer;
 	}
 }
diff --git a/tests/library/Class/WebService/ArteVOD/VignetteTest.php b/tests/library/Class/WebService/ArteVOD/VignetteTest.php
index a8363450b26c0925ce8827c0eeafe364d5cbd8a4..21bd1c769225e226a6d9ec8d57ee0cb61e8feab8 100644
--- a/tests/library/Class/WebService/ArteVOD/VignetteTest.php
+++ b/tests/library/Class/WebService/ArteVOD/VignetteTest.php
@@ -19,9 +19,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
  */
 
-class Class_WebService_ArteVOD_VignetteBlancheNeigeTest extends Storm_Test_ModelTestCase {
-	protected $_album;
-	protected $_file_writer;
+abstract class Class_WebService_ArteVOD_VignetteTestCase extends Storm_Test_ModelTestCase {
+	protected $_vignette, $_http_client;
 
 	public function setUp() {
 		parent::setup();
@@ -30,35 +29,85 @@ class Class_WebService_ArteVOD_VignetteBlancheNeigeTest extends Storm_Test_Model
 			->whenCalled('save')
 			->answers(true);
 
+		Class_WebService_ArteVOD_Vignette::resetInstance();
+		$this->_vignette = Class_WebService_ArteVOD_Vignette::getInstance();
+
+		$this->_http_client = Storm_Test_ObjectWrapper::mock();
+		Class_WebService_ArteVOD_Vignette::setDefaultHttpClient($this->_http_client);
+	}
+
+
+	public function tearDown() {
+		Class_WebService_ArteVOD_Vignette::setDefaultHttpClient(null);
+		parent::tearDown();
+	}
+}
+
 
-		$this->_album = Class_Album::newInstanceWithId(45)
+
+
+class Class_WebService_ArteVOD_VignetteInitializationTest extends Class_WebService_ArteVOD_VignetteTestCase {
+	/** @test */
+	public function defaultFileWriterShouldBeAnInstanceOfRealFileWriter() {
+		$this->assertInstanceOf('Class_FileWriter', $this->_vignette->getFileWriter());
+	}
+}
+
+
+
+
+abstract class Class_WebService_ArteVOD_VignetteBlancheNeigeTestCase extends Class_WebService_ArteVOD_VignetteTestCase {
+	protected $_album;
+	protected $_file_writer;
+
+
+	public function setUp() {
+		parent::setup();
+
+		$this->_album = Storm_Test_ObjectWrapper::on(
+			Class_Album::newInstanceWithId(45)
 			->setTitre('Blanche Neige')
 			->beArteVOD()
 			->setNotes([['field' => '856', 
 									 'data' => ['x' => 'poster', 
-															'a' => 'http://mediatheque.com/blanche_neige.jpg']]]);
+															'a' => 'http://mediatheque.com/blanche_neige.jpg']]]));
+
+
 
-		$this->_http_client = Storm_Test_ObjectWrapper::mock();
-		Class_WebService_ArteVOD_Vignette::setDefaultHttpClient($this->_http_client);
 		$this->_http_client
 			->whenCalled('open_url')
 			->with('http://mediatheque.com/blanche_neige.jpg')
 			->answers('an image');
 
-		$vignette = new Class_WebService_ArteVOD_Vignette();
-		$vignette->setFileWriter($this->_file_writer = Storm_Test_ObjectWrapper::mock()
-														 ->whenCalled('putContents')
-														 ->with(PATH_TEMP.'blanche_neige.jpg', 'an image')
-														 ->answers(8)
-														 ->beStrict());
-		$vignette->updateAlbum($this->_album);
-
+		$this->_vignette->setFileWriter($this->_file_writer = Storm_Test_ObjectWrapper::mock());
+		$this->_file_writer
+			->whenCalled('putContents')
+			->answers('');
 	}
+}
 
 
-	public function tearDown() {
-		Class_WebService_ArteVOD_Vignette::setDefaultHttpClient(null);
-		parent::tearDown();
+
+
+class Class_WebService_ArteVOD_VignetteBlancheNeigeTest extends Class_WebService_ArteVOD_VignetteBlancheNeigeTestCase {
+	public function setUp() {
+		parent::setup();
+
+		$this->_album
+			->whenCalled('receiveFile')
+			->willDo(function() {
+					$this->_album->setFichier('blanche_neige.jpg');
+					return true;
+				});
+
+
+		$this->_file_writer
+			->whenCalled('putContents')
+			->with(PATH_TEMP.'blanche_neige.jpg', 'an image')
+			->answers(8)
+			->beStrict();
+
+		$this->_vignette->updateAlbum($this->_album);
 	}
 
 
@@ -111,4 +160,43 @@ class Class_WebService_ArteVOD_VignetteBlancheNeigeTest extends Storm_Test_Model
 	}
 }
 
+
+
+
+class Class_WebService_ArteVOD_VignetteBlancheNeigeErrorsTest extends Class_WebService_ArteVOD_VignetteBlancheNeigeTestCase {
+	/** @test */
+	public function withoutValidUrlShouldNotDownloadImage() {
+		$this->_album
+			->setNotes([['field' => '856', 
+									 'data' => ['x' => 'poster', 
+															'a' => 'zork']]]);
+		$this->_vignette->updateAlbum($this->_album);
+		$this->assertFalse($this->_http_client->methodHasBeenCalled('open_url'));
+	}
+
+
+	/** @test */
+	public function withoutDataShouldNotSaveImage() {
+		$this->_http_client
+			->whenCalled('open_url')
+			->with($this->_album->getPoster())
+			->answers('');
+
+		$this->_vignette->updateAlbum($this->_album);
+		$this->assertFalse($this->_file_writer->methodHasBeenCalled('putContents'));
+	}
+
+
+
+	/** @test */
+	public function withFailedWriteFileShouldNotMoveIt() {
+		$this->_file_writer
+			->whenCalled('putContents')
+			->answers(false);
+
+		$this->_vignette->updateAlbum($this->_album);
+		$this->assertFalse($this->_album->methodHasBeenCalled('receiveFile'));
+	}
+}
+
 ?>
\ No newline at end of file