diff --git a/application/modules/admin/controllers/AlbumController.php b/application/modules/admin/controllers/AlbumController.php
index 87934f3155e724be4bd8ede51f84f2c7a2a317b8..4691d823d5e85a595a241b39a3d37537f80481f2 100644
--- a/application/modules/admin/controllers/AlbumController.php
+++ b/application/modules/admin/controllers/AlbumController.php
@@ -226,25 +226,15 @@ class Admin_AlbumController extends Zend_Controller_Action {
 		}
 
 		$this->view->album = $album;
-		$ressource = Class_AlbumRessource::newInstance()
-				->setAlbum($album);
-		$form = $this->_ressourceForm($ressource);
-
-		if ($this->_request->isPost() && ($form->isValid($this->_request->getPost()))) {
-			$ressource->updateAttributes($this->_request->getPost());
-			if ($ressource->getAlbum()->save()
-				&& $ressource->save()
-				&& $ressource->receiveFile()) {
-				$this->_helper->notify(sprintf('Média %s sauvegardé', 
-																			 $ressource->getTitre()));
-				$this->_redirect('admin/album/edit_ressource/id/'
-												 . $ressource->getId());
-				return;
-			}
+		$ressource = Class_AlbumRessource::newInstance()->setAlbum($album);
+
+		if ($this->_setupRessourceFormAndSave($ressource)) {
+			$this->_helper->notify('Média "' . $ressource->getTitre() . '" sauvegardé');
+			$this->_redirect('admin/album/edit_ressource/id/' . $ressource->getId());
+			return;
 		}
 
 		$this->view->errors = $ressource->getErrors();
-		$this->view->form = $form;
 	}
 
 		
@@ -255,27 +245,40 @@ class Admin_AlbumController extends Zend_Controller_Action {
 			return;
 		}
 
-		$form = $this->_ressourceForm($ressource);
-
-		if ($this->_request->isPost() && ($form->isValid($this->_request->getPost()))) {
-			$ressource->updateAttributes($this->_request->getPost());
-			if ($ressource->getAlbum()->save() && $ressource->save() && $ressource->receiveFile()) {
-				$this->_helper->notify(sprintf('Média "%s" sauvegardé', 
-																			 $ressource->getTitre()));
-				$this->_redirect('admin/album/edit_ressource/id/'
-												 . $ressource->getId());
-				return;
-			}
+		if ($this->_setupRessourceFormAndSave($ressource)) {
+			$this->_helper->notify('Média "' . $ressource->getTitre() .  '" sauvegardé');
+			$this->_redirect('admin/album/edit_ressource/id/' . $ressource->getId());
+			return;
 		}
 
 		$this->view->errors = $ressource->getErrors();
-		$form->getElement('fichier')->setValue($ressource->getFichier());
+		$this->view->form->getElement('fichier')
+				->setValue($ressource->getFichier());
+		$this->view->form->getElement('poster')
+				->setValue($ressource->getPoster());
 
-		$this->view->form = $form;
 		$this->view->ressource	= $ressource;
 	}
 
 
+	protected function _setupRessourceFormAndSave($model) {
+		$form = $this->_ressourceForm($model);
+		
+		$this->view->form = $form;
+
+		if ($this->_request->isPost()) {
+			$model->updateAttributes($this->_request->getPost());
+			
+			return $form->isValid($model)
+				     && $model->save()
+					   && $model->receiveFiles()
+				     && $model->getAlbum()->save();
+		}
+
+		return false;
+  }
+		
+
 	public function sortressourcesAction() {
 		$album = Class_Album::getLoader()->find((int)$this->_getParam('id'));
 		$album->sortRessourceByFileName()->save();
diff --git a/application/modules/admin/views/scripts/album/edit-images.phtml b/application/modules/admin/views/scripts/album/edit-images.phtml
index 6b92545603f9e368f23d08599723a0d6db8c5421..60d0137078add5a2297c907cce3fd854370bef8a 100644
--- a/application/modules/admin/views/scripts/album/edit-images.phtml
+++ b/application/modules/admin/views/scripts/album/edit-images.phtml
@@ -64,12 +64,11 @@ echo $this->bouton('id=add_link',
 				<?php foreach ($this->ressources as $ressource) { ?>
 					<li class="ressource" id="<?php echo $ressource->getId();?>">
 						<div style="width:50px;"><?php
-						if ($ressource->isImage()) {
+					  if ($ressource->isImage() || $ressource->hasPoster()) {
 							echo sprintf('<a rel="prettyPhoto" href="%s" title="%s">%s</a>', 
-													 $ressource->getOriginalUrl(),
+								           ($ressource->isImage()) ? $ressource->getOriginalUrl() : $ressource->getPosterUrl(),
 													 $ressource->getTitre(),
-													 $this->tagImg(
-																				 $ressource->getThumbnailUrl(),
+													 $this->tagImg($ressource->getThumbnailUrl(),
 																				 array('style' => 'width:50px')
 																				 ));
 						}
diff --git a/library/Class/AlbumRessource.php b/library/Class/AlbumRessource.php
index 6b47016d437339e2829c6db1d3b5d18d34493245..7006091500ec25cc29cb160a06d92005126d9068 100644
--- a/library/Class/AlbumRessource.php
+++ b/library/Class/AlbumRessource.php
@@ -41,17 +41,27 @@ class AlbumRessourceLoader extends Storm_Model_Loader {
 
 
 class Class_AlbumRessource extends Storm_Model_Abstract {
+	use Trait_Translator;
+	
 	const BASE_PATH = 'media/';
-	protected static $THUMBNAILS_BY_EXT = array('swf' => 'flash-logo.jpg',
-																							'mov' => 'quicktime-logo.png',
-																							'unknown' => 'earth-logo.jpg');
+
+	const MEDIA_TYPE_IMAGE = 1;
+	const MEDIA_TYPE_FILE = 2;
+	const MEDIA_TYPE_URL = 3;
+
+	protected static $_image_extensions = ['png', 'jpg', 'jpeg', 'gif'];
+
+	protected static $THUMBNAILS_BY_EXT = ['swf' => 'flash-logo.jpg',
+																				 'mov' => 'quicktime-logo.png',
+																				 'unknown' => 'earth-logo.jpg'];
+
 	protected static $_thumbnail_dir_checked = false;
 
 	/** @var Class_MultiUpload */
 	protected $_multiUploadHandler;
 
-	/** @var Class_Upload */
-	protected $_uploadHandler;
+	/** @var array of Class_Upload */
+	protected $_uploadHandlers = [];
 
 	/** @var Class_Folder_Manager */
 	protected $_folderManager;
@@ -59,15 +69,17 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	/** @var Imagick */
 	protected $_image;
 
+	/** @var int used solely in validation */
+	protected $_media_type;
 
 	protected $_table_name		= 'album_ressources';
 	protected $_primary_key		= 'id';
 	protected $_loader_class	= 'AlbumRessourceLoader';
 
-	protected $_belongs_to = array('album' => array('model' => 'Class_Album',
-																									'referenced_in' => 'id_album'));
+	protected $_belongs_to = ['album' => ['model' => 'Class_Album',
+																				'referenced_in' => 'id_album']];
 
-	protected $_default_attribute_values = array(
+	protected $_default_attribute_values = [
 		'fichier' => '',
 		'folio' => null,
 		'titre' => '',
@@ -75,16 +87,9 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 		'ordre' => 0,
 		'link_to' => '',
 		'matiere' => '',
-		'vignette' => '',
+		'poster' => '',
 		'url' => ''
-	);
-
-	/**
-	 * @return AlbumRessourceLoader
-	 */
-	public static function getLoader() {
-		return self::getLoaderFor(__CLASS__);
-	}
+	];
 
 
 	public static function sortByFileName($r1, $r2) {
@@ -92,6 +97,11 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	}
 
 
+	public static function getImageExtensions() {
+		return self::$_image_extensions;
+	}
+
+
 	/**
 	 * Les fichiers sont formattés ID_NOM_DU_FICHIER.EXT
 	 * Retourne NOM_DU_FICHIER.EXT
@@ -152,16 +162,65 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	/**
 	 * @return bool
 	 */
-	public function receiveFile() {
+	public function receiveFiles() {
+		if ($this->receiveFile()
+			  && $this->receivePoster()) {
+			return $this->save();
+		}
+
+		return false;
+	}
+
+
+	public function receivePoster() {
+		$oldThumbnail	= $this->getThumbnailPath();
+		
 		// fichier non requis
-		if (!array_isset('fichier', $_FILES) or (0 == $_FILES['fichier']['size'])) {
+		if (!$this->isFileUploadedForName('poster')) {
+			if ($this->isImage()) {
+				if (file_exists($oldThumbnail))
+					@unlink($oldThumbnail);
+
+				return $this->createThumbnail();
+			}
+ 
 			return true;
 		}
+
+		$upload = $this->getUploadHandler('poster');
+		if (!$upload->receive()) {
+			$this->addAttributeError('poster', $upload->getError());
+			return false;
+		}
+
+		$fileName = $upload->getSavedFileName();
+		$oldPoster = $this->getPosterPath();
+		$this->setPoster($fileName);
+
+		if ('' != $oldPoster
+			  && $oldPoster != $this->getPosterPath()
+			  && file_exists($oldPoster))
+			@unlink($oldPoster);
+
+		if (file_exists($oldThumbnail))
+			@unlink($oldThumbnail);
+
+		return $this->createThumbnail();
+	}
+
+		
+	/**
+	 * @return bool
+	 */
+	public function receiveFile() {
+		// fichier non requis
+		if (!$this->isFileUploadedForName('fichier'))
+			return true;
 		
 		$upload = $this->getUploadHandler('fichier');
 
 		if (!$upload->receive()) {
-			$this->addError($upload->getError());
+			$this->addAttributeError('fichier', $upload->getError());
 			return false;
 		}
 
@@ -170,17 +229,24 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 		// store old file and thumb for future deletion
 		$oldFileName	= $this->getFichier();
 		$oldOriginal	= $this->getOriginalPath();
-		$oldThumbnail	= $this->getThumbnailPath();
 
 		if ($fileName != $oldFileName) {
-			$this->setFichier($fileName)->save();
-			unlink($oldOriginal);
+			$this->setFichier($fileName);
+			if (file_exists($oldOriginal))
+				@unlink($oldOriginal);
 		}
 
-		if (file_exists($oldThumbnail))
-			@unlink($oldThumbnail);
+		return true;
+	}
 
-		return $this->createThumbnail();
+
+	/**
+	 * @param $name string
+	 * @return bool
+	 */
+	public function isFileUploadedForName($name) {
+		return array_isset($name, $_FILES)
+				and (0 < $_FILES[$name]['size']);
 	}
 
 
@@ -188,12 +254,11 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	 * @return bool
 	 */
 	public function createThumbnail() {
-		if (!$this->isImage()) {
+		if (!$this->isImage() && !$this->hasPoster())
 			return true;
-		}
 
 		if (!$this->getFolderManager()->ensure($this->getThumbnailsPath())) {
-			$this->addError('Répertoire des vignettes non éditable');
+			$this->addError($this->_('Répertoire des vignettes non éditable'));
 			return false;
 		}
 
@@ -202,15 +267,15 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 			$image->thumbnailImage(160, 0);
 
 			if (!$image->writeImage($this->getThumbnailPath())) {
-				$this->addError('Erreur lors de l\'enregistrement de la vignette');
+				$this->addError($this->_('Erreur lors de l\'enregistrement de la vignette'));
 				return false;
 			}
 
 			return true;
 
 		} catch (Exception $e) {
-			$this->addError('Erreur lors de la création de la vignette '
-											. (string)$e->getMessage());
+			$this->addError(sprintf($this->_('Erreur lors de la création de la vignette %s'),
+					                    (string)$e->getMessage()));
 			return false;
 		}
 	}
@@ -222,7 +287,10 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	public function getImage() {
 		if (!isset($this->_image)) {
 			try {
-				$this->_image = new Imagick($this->getOriginalPath());
+				$this->_image = new Imagick(($this->isImage) ?
+					                             $this->getOriginalPath() :
+					                             $this->getPosterPath());
+
 			} catch (Exception $e) {
 				$this->_image = new Imagick();
 				$this->_image->newPseudoImage(50, 50, "gradient:black-black");
@@ -290,22 +358,24 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	 * @return Class_Upload
 	 */
 	public function getUploadHandler($name) {
-		if (null === $this->_uploadHandler) {
-			$this->_uploadHandler = Class_Upload::newInstanceFor($name)
+		if (!array_key_exists($name, $this->_uploadHandlers)) {
+			$this->_uploadHandlers[$name] = Class_Upload::newInstanceFor($name)
 				->setBaseName($this->getId())
 				->setBasePath($this->getOriginalsPath());
 		}
 
-		return $this->_uploadHandler;
+		return $this->_uploadHandlers[$name]->resetError();
 	}
 
 
 	/**
 	 * @category testing
 	 * @param Class_Upload $handler
+	 * @param $name input file name
+	 * @return Class_AlbumRessource
 	 */
-	public function setUploadHandler($handler) {
-		$this->_uploadHandler = $handler;
+	public function setUploadHandlerFor($handler, $name) {
+		$this->_uploadHandlers[$name] = $handler;
 		return $this;
 	}
 
@@ -350,6 +420,15 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	}
 
 
+	/**
+	 * @param $prefix string
+	 * @return string
+	 */
+	public function getLocatedPoster($prefix) {
+		return $prefix . $this->getPoster();
+	}
+
+
 	/**
 	 * @return string
 	 */
@@ -448,7 +527,10 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	 * @return string
 	 */
 	public function getThumbnailPath() {
-		return $this->getLocatedFile($this->getThumbnailsPath());
+		$thumbnailsPath = $this->getThumbnailsPath();
+		return ($this->isImage()) ?
+				$this->getLocatedFile($thumbnailsPath):
+				$this->getLocatedPoster($thumbnailsPath);
 	}
 
 
@@ -464,11 +546,12 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	 * @return string
 	 */
 	public function getThumbnailUrl() {
-		if ($this->hasVignette())
-			return $this->getThumbnailsUrl().$this->getVignette();
+		if ($this->hasPoster())
+			return $this->getLocatedPoster($this->getThumbnailsUrl());
 
 		if ($this->isImage())
 			return $this->getLocatedFile($this->getThumbnailsUrl());
+
 		return $this->_getDefaultThumbnailUrl();
 	}
 
@@ -519,6 +602,22 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	}
 
 
+	/**
+	 * @return string
+	 */
+	public function getPosterPath() {
+		return $this->getLocatedPoster($this->getOriginalsPath());
+	}
+
+
+	/**
+	 * @return string
+	 */
+	public function getPosterUrl() {
+		return $this->getLocatedPoster($this->getOriginalsUrl());
+	}
+
+
 	public function beforeDelete() {
 		parent::beforeDelete();
 		$this->deleteFiles();
@@ -528,12 +627,8 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	public function beforeSave() {
 		parent::beforeSave();
 
-		if ($this->isNew()) {
+		if ($this->isNew())
 			$this->setOrdre($this->getNextOrder());
-		}
-
-		if ($this->hasAlbum())
-			$this->getAlbum()->updateDateMaj();
 	}
 
 
@@ -555,7 +650,7 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	 * @return bool
 	 */ 	
 	public function isImage() {
-		return $this->isFileExtensionIn(array('png', 'jpg', 'jpeg', 'gif'));
+		return $this->isFileExtensionIn($this->getImageExtensions());
 	}
 
 
@@ -563,7 +658,7 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	 * @return bool
 	 */ 	
 	public function isFlash() {
-		return $this->isFileExtensionIn(array('swf'));
+		return $this->isFileExtensionIn(['swf']);
 	}
 
 
@@ -571,7 +666,7 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 	 * @return bool
 	 */ 	
 	public function isVideo() {
-		return $this->isFileExtensionIn(array('mov'));
+		return $this->isFileExtensionIn(['mov']);
 	}
 
 
@@ -626,6 +721,66 @@ class Class_AlbumRessource extends Storm_Model_Abstract {
 			$folio = $this->getFolioFromFilename();
 		return $folio;
 	}
+
+
+	
+	public function setMediaType($type) {
+		$this->_media_type = $type;
+		return $this;
+	}
+
+
+	public function getMediaType() {
+		return $this->_media_type;
+	}
+		
+
+	public function validate() {
+		$media_type = $this->getMediaType();
+		if (!$media_type)
+			return;
+		
+		if (self::MEDIA_TYPE_URL == $media_type) {
+			$this
+				->validateAttribute('url', 'Zend_Validate_NotEmpty', 'Url du média requise')
+				->validateAttribute('url', 'ZendAfi_Validate_Url', 'Url du média non valide');
+			return;
+		}
+
+		if (self::MEDIA_TYPE_IMAGE == $media_type) {
+			$this->validateMediaIsImage();
+			return;
+		}
+
+		$this->validateMediaIsOtherFile();
+	}
+
+
+	public function validateMediaIsImage() {
+		$this->validateMediaIsFileWithExtensions($this->getImageExtensions());
+	}
+
+
+	public function validateMediaIsOtherFile() {
+		$this->validateMediaIsFileWithExtensions();
+	}
+
+
+	public function validateMediaIsFileWithExtensions($extensions = []) {
+	// en édition et fichier inchangé
+		if (!$this->isNew() && !$this->isFileUploadedForName('fichier'))
+			return;
+
+		$handler = $this->getUploadHandler('fichier')
+				->setAllowedExtensions($extensions);
+
+		$this->checkAttribute('fichier', $handler->validate(), $handler->getError());
+	}
+
+
+	public function toArray() {
+		return parent::toArray() + ['media_type' => $this->getMediaType()];
+	}
 }
 
 ?>
\ No newline at end of file
diff --git a/library/Class/Upload.php b/library/Class/Upload.php
index bbb2efad29589dcca9ac964f101e698ca741531f..cb6220540660f213a497ca67309ed12f4c369953 100644
--- a/library/Class/Upload.php
+++ b/library/Class/Upload.php
@@ -20,6 +20,8 @@
  */
 
 class Class_Upload {
+	use Trait_Translator;
+	
 	/** @var string */
 	protected $_name;
 
@@ -45,7 +47,7 @@ class Class_Upload {
 	protected $_required = false;
 
 	/** @var array */
-	protected $_allowedExtensions = array();
+	protected $_allowedExtensions = [];
 	
 
 	/**
@@ -105,7 +107,7 @@ class Class_Upload {
 	 * @return bool
 	 */
 	public function receive() {
-		if (!$this->_validate()) {
+		if (!$this->validate()) {
 			return false;
 		}
 
@@ -177,6 +179,15 @@ class Class_Upload {
 	}
 
 
+	/**
+	 * @return Class_Upload
+	 */
+	public function resetError() {
+		$this->_error = null;
+		return $this;
+	}
+
+
 	/**
 	 * @category testing
 	 * @param UploadMover $mover
@@ -252,19 +263,19 @@ class Class_Upload {
 
 
 	/** @return bool */
-	protected function _validate() {
+	public function validate() {
 		if ('' == $this->_name) {
-			$this->setError('Transfert impossible, ce formulaire est mal configuré');
+			$this->setError($this->_('Transfert impossible, ce formulaire est mal configuré'));
 			return false;
 		}
 
 		if (!array_key_exists($this->_name, $_FILES)) {
-			$this->setError('Transfert impossible, champ de fichier introuvable');
+			$this->setError($this->_('Transfert impossible, champ de fichier introuvable'));
 			return false;
 		}
 
 		if (0 == (int)$_FILES[$this->_name]['size']) {
-			$this->setError('Le fichier était vide ou un problème réseau est survenu');
+			$this->setError($this->_('Le fichier était vide ou un problème réseau est survenu'));
 			return false;
 		}
 
@@ -276,9 +287,10 @@ class Class_Upload {
 		$parts = explode('.', $_FILES[$this->_name]['name']);
 		$ext = end($parts);
 
-		if ((0 < count($this->getAllowedExtensions()))
-				&& (!in_array($ext, $this->getAllowedExtensions()))) {
-			$this->setError('Type de fichier non permis');
+		$allowedExtensions = $this->getAllowedExtensions();
+		if ((0 < count($allowedExtensions))
+				&& (!in_array($ext, $allowedExtensions))) {
+			$this->setError(sprintf($this->_('Le fichier n\'est pas de type %s'), implode(', ', $allowedExtensions)));
 			return false;
 		}
 
@@ -292,6 +304,8 @@ class Class_Upload {
  * @category testing
  */
 class UploadMover {
+	use Trait_Translator;
+	
 	/** @var string */
 	protected $_error;
 
@@ -304,7 +318,7 @@ class UploadMover {
 	 */
 	public function moveTo($source, $destination) {
 		if (!move_uploaded_file($source, $destination)) {
-			$this->setError('Impossible d\'écrire le fichier sur le serveur au chemin [' . $destination . ']');
+			$this->setError(sprintf($this->_('Impossible d\'écrire le fichier sur le serveur au chemin [%s]'),  $destination));
 			return false;
 		}
 
diff --git a/library/ZendAfi/Form/Album/Ressource.php b/library/ZendAfi/Form/Album/Ressource.php
index 111f78b39a437ce82b10e358955ab1a98a88524c..e1513cf5fbe09065ec01866468803100a394e6e5 100644
--- a/library/ZendAfi/Form/Album/Ressource.php
+++ b/library/ZendAfi/Form/Album/Ressource.php
@@ -32,15 +32,26 @@ class ZendAfi_Form_Album_Ressource extends ZendAfi_Form {
 		$form
 			->populate($model->toArray())
 			->addFileFor($model)
+			->addPosterFor($model)
+			->detectMediaType($model)
+			->addDisplayGroup(['media_type', 'fichier', 'url', 'poster', 'link_to'],
+				                 'file',
+				                 ['legend' => 'Fichier'])
 
-			->addDisplayGroup(array('titre', 'folio', 'fichier', 'link_to', 'matiere'),
+			->addDisplayGroup(['titre', 'folio', 'matiere'],
 												'ressource',
-												array('legend' => 'Media'))
+												['legend' => 'Media'])
 
-			->addDisplayGroup(array('description'),
+			->addDisplayGroup(['description'],
 												'ressource_desc',
-												array('legend' => 'Description'));
+												['legend' => 'Description'])
+			->addJs();
 
+		if ($album = $model->getAlbum()
+			  and !$album->isLivreNumerique())
+			$form->removeElement('folio');
+
+		
 		return $form;
 	}
 
@@ -51,15 +62,19 @@ class ZendAfi_Form_Album_Ressource extends ZendAfi_Form {
 			->setAttrib('id', 'ressourcesForm')
 			->setAttrib('enctype', self::ENCTYPE_MULTIPART)
 
-			->addElement('text', 'titre', ['label' => 'Titre',
-					                           'size' => '80'])
+			->addElement('text', 'titre', ['label' => 'Titre', 'size' => '80'])
 
-			->addElement('text', 'folio', ['label' => 'Folio',
-																		 'size' => '20'])
+			->addElement('text', 'folio', ['label' => 'Folio', 'size' => '20'])
 
-
-			->addElement('url', 'link_to', ['label' => 'Lien vers',
-																			'size' => '80'])
+			->addElement('radio', 'media_type',
+					['label' => 'Type de média',
+					 'separator' => '',
+					 'multioptions' => [1 => 'Image', 2 => 'Autre fichier', 3 => 'Média en ligne'],
+					 'value' => 1])
+				
+			->addElement('url', 'url', ['label' => 'Url *', 'size' => '80'])
+				
+			->addElement('url', 'link_to', ['label' => 'Lien vers', 'size' => '80'])
 
 			->addElement('ckeditor', 'description')
 
@@ -75,7 +90,7 @@ class ZendAfi_Form_Album_Ressource extends ZendAfi_Form {
 	 * @return ZendAfi_Form_Album_Ressource
 	 */
 	public function addFileFor($model) {
-		$element = new ZendAfi_Form_Element_Image('fichier', ['label' => 'Fichier']);
+		$element = new ZendAfi_Form_Element_Image('fichier', ['label' => 'Fichier *']);
 		if ($model) {
 			$element
 				->setBasePath($model->getOriginalsPath())
@@ -84,6 +99,94 @@ class ZendAfi_Form_Album_Ressource extends ZendAfi_Form {
 		}
 		return $this->addElement($element);
 	}
+
+
+	/**
+	 * @param $album Class_AlbumRessource
+	 * @return ZendAfi_Form_Album_Ressource
+	 */
+	public function addPosterFor($model) {
+		$element = new ZendAfi_Form_Element_Image('poster', ['label' => 'Affiche / Jacquette']);
+		if ($model) {
+			$element
+				->setBasePath($model->getOriginalsPath())
+				->setBaseUrl($model->getThumbnailsUrl())
+				->setThumbnailUrl($model->getThumbnailUrl());
+		}
+		return $this->addElement($element);
+	}
+
+		
+
+	public function addJs() {
+		Class_ScriptLoader::getInstance()
+				->addInlineScript('
+				 function showMediaInputRowWithId(id) {
+					 getMediaRowOfInputId(id).show();
+				 }
+
+				 function hideMediaInputRowWithId(id) {
+					 getMediaRowOfInputId(id).hide();
+				 }
+
+				 function changeMediaInputLabelWithId(id, label) {
+					 getMediaRowOfInputId(id).find("label").first().html(label);
+				 }
+
+				 function getMediaRowOfInputId(id) {
+					 return $("#" + id).parent("td").parent("tr");
+				 }
+
+				 function toggleMediaType() {
+					 var currentVal = $("input:radio[name=media_type]:checked").val();
+					 if (1 == currentVal) {
+						 hideMediaInputRowWithId("url");
+						 hideMediaInputRowWithId("poster");
+						 changeMediaInputLabelWithId("fichier", "Image *");
+						 showMediaInputRowWithId("fichier");
+ 						 showMediaInputRowWithId("link_to");
+						 return;
+					 }
+
+					 if (2 == currentVal) {
+						 hideMediaInputRowWithId("url");
+						 hideMediaInputRowWithId("link_to");
+						 changeMediaInputLabelWithId("fichier", "Fichier *");
+						 showMediaInputRowWithId("fichier");
+						 showMediaInputRowWithId("poster");
+						 return;
+					 }
+
+					 hideMediaInputRowWithId("fichier");
+					 hideMediaInputRowWithId("link_to");
+					 showMediaInputRowWithId("url");
+					 showMediaInputRowWithId("poster");
+				}')
+
+				->addJQueryReady('$("input:radio[name=media_type]").change(function(){toggleMediaType();});
+													toggleMediaType();');
+		return $this;
+	}
+
+
+	/**
+	 * @param $model Class_AlbumRessource
+	 * @return Zendafi_Form_Album_Ressource
+	 */
+	public function detectMediaType($model) {
+		if ($model->isImage()) {
+			$this->getElement('media_type')->setValue(1);
+			return $this;
+		}
+
+		if ($model->getFichier()) {
+			$this->getElement('media_type')->setValue(2);
+			return $this;
+		}
+
+		$this->getElement('media_type')->setValue(3);
+		return $this;
+	}
 }
 
 ?>
\ No newline at end of file
diff --git a/tests/application/modules/admin/controllers/AlbumControllerTest.php b/tests/application/modules/admin/controllers/AlbumControllerTest.php
index cd0c86ce05753750c652d7e3fa37fb8fddfa872c..0f3df3bbf21ba3fd5f25596c8281f09d05fd3477 100644
--- a/tests/application/modules/admin/controllers/AlbumControllerTest.php
+++ b/tests/application/modules/admin/controllers/AlbumControllerTest.php
@@ -1249,8 +1249,8 @@ class Admin_AlbumControllerAlbumHarlockEditRessourceOneActionTest extends Admin_
 
 
 	/** @test */
-	public function inputFolioShouldContainsOne() {
-		$this->assertXPath('//input[@name="folio"][@value="1"]', $this->_response->getBody());
+	public function inputFolioShouldNotBePresent() {
+		$this->assertNotXPath('//input[@name="folio"]');
 	}
 
 
@@ -1324,12 +1324,13 @@ class Admin_AlbumControllerAlbumHarlocPostRessourceOneActionTest extends Admin_A
 			->answers(true);
 
 		$this->postDispatch('/admin/album/edit_ressource/id/1',
-												array('titre' => 'Atlantis',
-															'description' => 'autre vaisseau',
-															'link_to' => 'http://www.atlantis.com',
-															'matiere' => '666',
-															'folio' => '3R'));
-		$this->ressource = Class_AlbumRessource::getLoader()->find(1);
+												['titre' => 'Atlantis',
+												 'description' => 'autre vaisseau',
+												 'link_to' => 'http://www.atlantis.com',
+												 'matiere' => '666',
+												 'folio' => '3R']);
+		
+		$this->ressource = Class_AlbumRessource::find(1);
 	}
 
 
diff --git a/tests/application/modules/opac/controllers/BibNumeriqueControllerTest.php b/tests/application/modules/opac/controllers/BibNumeriqueControllerTest.php
index af666afd225a054e3bc0fa928ad497b6fdc96d30..2d550adb028c3cdfae2114e125e73bf988ada55d 100644
--- a/tests/application/modules/opac/controllers/BibNumeriqueControllerTest.php
+++ b/tests/application/modules/opac/controllers/BibNumeriqueControllerTest.php
@@ -529,12 +529,12 @@ abstract class BibNumeriqueControllerAlbumMultiMediasTestCase extends AbstractCo
 											 ->setFichier('mimi_jolie.mp3')
 											 ->setTitre('Emilie jolie')
 											 ->setOrdre(1)
-											 ->setVignette('mimi_jolie.png'),
+											 ->setPoster('mimi_jolie.png'),
 											 
 											 Class_AlbumRessource::newInstanceWithId(4)
 											 ->setFichier('dark_night.mp4')
 											 ->setTitre('Batman Dark Knight')
-											 ->setVignette('batman.jpg')
+											 ->setPoster('batman.jpg')
 											 ->setOrdre(2)
 											 ->setDescription('Une nouvelle aventure du justicier noir'),
 
@@ -542,13 +542,13 @@ abstract class BibNumeriqueControllerAlbumMultiMediasTestCase extends AbstractCo
 											 ->setUrl('http://progressive.totaleclips.com.edgesuite.net/107/e107950_227.mp4')
 											 ->setTitre('Hunger Games')
 											 ->setOrdre(3)
-											 ->setVignette('hunger.jpg'),
+											 ->setPoster('hunger.jpg'),
 
 											 Class_AlbumRessource::newInstanceWithId(6)
 											 ->setFichier('Monsieur l\'escargot.mp3')
 											 ->setTitre('Monsieur l\'escargot')
 											 ->setOrdre(4)
-											 ->setVignette('l\'escargot.jpg')]);
+											 ->setPoster('l\'escargot.jpg')]);
 	}
 }
 
diff --git a/tests/library/Class/AlbumRessourceTest.php b/tests/library/Class/AlbumRessourceTest.php
index cf235831cf601e622551817c5850847d17a33593..b8e014b867574defa623777a2f803803334cd839 100644
--- a/tests/library/Class/AlbumRessourceTest.php
+++ b/tests/library/Class/AlbumRessourceTest.php
@@ -156,7 +156,13 @@ class AlbumRessourceReceivingFileTest extends AlbumRessourceFileUploadTestCase {
 			->method('receive')
 			->will($this->returnValue(false));
 
-		$this->assertFalse($this->_resource->setUploadHandler($this->_handler)->receiveFile());
+		$this->_handler
+			->expects($this->once())
+			->method('resetError')
+			->will($this->returnValue($this->_handler));
+
+		$this->assertFalse($this->_resource->setUploadHandlerFor($this->_handler, 'fichier')
+			                                 ->receiveFile());
 	}
 }
 
diff --git a/tests/library/Class/UploadTest.php b/tests/library/Class/UploadTest.php
index c0511819fa8ba422875804d94cbe0e689656831d..279eea35b85fe1aa93965cce8f9087665d7c3788 100644
--- a/tests/library/Class/UploadTest.php
+++ b/tests/library/Class/UploadTest.php
@@ -106,7 +106,7 @@ class UploadFichierTest extends PHPUnit_Framework_TestCase {
 													'name' => 'test.xml'
 												);
 
-		$this->_assertError('Type de fichier non permis');
+		$this->_assertError('Le fichier n\'est pas de type gif');
 	}