diff --git a/VERSIONS b/VERSIONS
index 552d69d3469c451d489fb4a14e57c1bbaf4575e1..9f62729f83776346411c0f5780d30b6c1b256e04 100644
--- a/VERSIONS
+++ b/VERSIONS
@@ -1,3 +1,27 @@
+30/07/2015 - v7.3.1
+
+ - tickets #27656, 27657 : Bibliothèque numérique 1DTouch : Prise en charge de l'authentification SSO
+
+ - ticket #27194 : Gestion des boîtes : l'ajout et la suppression de boîtes sont possibles en front
+
+ - ticket #27067 : Koha : Webservice de création des suggestions
+
+- ticket #22209 : les utilisateurs peuvent s'abonner à un résultat de recherche via un flux atom
+
+- ticket #27816 : "Mot de passe perdu" : Ajout d'un message indiquant à l'abonné de se rapprocher de la médiathèque si celui ci n'a pas de mail spécifié.
+
+- ticket #27726: Empèche l'indexation des articles avec une date de fin dépassées ou un statut autre que validé
+
+- ticket #27582: correction de la récuparation des résumés d'article de périodique.
+
+- ticket #26977 : correction de l'url dans le titre des boites critiques et newsletters
+
+- ticket #26909 : Visualitions des critiques : possibilité de configurer le nombre de critiques à afficher par page + ajout d'un pager
+
+- ticket #15721 : affichage du lecteur audio dans la boite bibliotheque numerique si les ressources ne sont pas des images
+
+
+
 20/07/2015 - v7.3.0
 
 - ticket #24821: notification de l'abonné à la connexion sur l'expiration de son abonnement, les prêts en retard et les réservations en attente de retrait
diff --git a/VERSIONS_DEV.md b/VERSIONS_DEV.md
index 4d85a1def1b29c8db5714b409e5083fde45ace07..c62d133c92859be307a9ef2753e3110f16313289 100644
--- a/VERSIONS_DEV.md
+++ b/VERSIONS_DEV.md
@@ -1,3 +1,70 @@
+# Class_Entity
+
+## Description
+
+In PHP we have StdClass on which we can set and get any direct property
+
+```php
+$o = new StdClass();
+$o->title = 'my title';
+echo $o->title; // -> my title
+```
+
+_Class_Entity_ provides same functionality with getter and setter methods
+
+
+```php
+$o = new Class_Entity();
+$o->setTitle('my title');
+echo $o->getTitle(); // -> my title
+```
+
+## Implementation
+
+Any call to set*() will be catched to populate an internal key => value array, it will return $this to chain calls.
+Any call to get*() will look for an existing key in internal array and will return its value or null if not found.
+
+Keys of internal array are not transformed in any way
+* setMyValue will produce a 'MyValue' key
+* set_my_value will produce a '_my_value' key
+* setmyvalue will produce a 'myvalue' key
+
+You can define default values by setting
+
+```php
+protected $_attribs = ['MyValue' => ''];
+```
+
+Then a getMyValue() call will return an empty string instead of null if not set.
+
+## Use cases
+
+### In tests
+
+When you have an API relying on getter and setter methods you can provide a _Class_Entity_ as a mock and easily verify that an attribute has been set or prepare it with attributes needed by tested code.
+
+### In general
+
+When you are modeling an object and don't want to write all those standard getters and setters just extend Class_Entity.
+
+
+
+# ticket #22209
+
+## Search result
+
+Reification of the array returned by _Class_MoteurRecherche_ that contained queries for facets & record fetch. Now we have _Class_MoteurRecherche_Result_ that depends on search engine & search criterias. Noticeable methods:
+
+* _recordsCollect($closure)_: for parsing all records. $closure must accept a record (_Class_Notice_).
+* _acceptCriteresVisitor($visitor)_: for parsing search criterias
+
+
+## Atom search feed generation
+
+Add _ZendAfi_Feed_SearchResult_ as a _Class_MoteurRecherche_Result_ visitor that renders a search result as Atom feed.
+
+
+
 # ticket #24821 
 
 ## Notifications
diff --git a/VERSIONS_DEV/22209.md b/VERSIONS_DEV/22209.md
deleted file mode 100644
index 2709d51aba5ebf8fa969357c7372f51cb14a877e..0000000000000000000000000000000000000000
--- a/VERSIONS_DEV/22209.md
+++ /dev/null
@@ -1,13 +0,0 @@
-# ticket #22209
-
-## Search result
-
-Reification of the array returned by _Class_MoteurRecherche_ that contained queries for facets & record fetch. Now we have _Class_MoteurRecherche_Result_ that depends on search engine & search criterias. Noticeable methods:
-
-* _recordsCollect($closure)_: for parsing all records. $closure must accept a record (_Class_Notice_).
-* _acceptCriteresVisitor($visitor)_: for parsing search criterias
-
-
-## Atom search feed generation
-
-Add _ZendAfi_Feed_SearchResult_ as a _Class_MoteurRecherche_Result_ visitor that renders a search result as Atom feed.
\ No newline at end of file
diff --git a/VERSIONS_DEV/Class_Entity.md b/VERSIONS_DEV/Class_Entity.md
deleted file mode 100644
index 44f57ced8883a4a6fe0d90020ce7a4a2ac362a12..0000000000000000000000000000000000000000
--- a/VERSIONS_DEV/Class_Entity.md
+++ /dev/null
@@ -1,48 +0,0 @@
-# Class_Entity
-
-## Description
-
-In PHP we have StdClass on which we can set and get any direct property
-
-```php
-$o = new StdClass();
-$o->title = 'my title';
-echo $o->title; // -> my title
-```
-
-_Class_Entity_ provides same functionality with getter and setter methods
-
-
-```php
-$o = new Class_Entity();
-$o->setTitle('my title');
-echo $o->getTitle(); // -> my title
-```
-
-## Implementation
-
-Any call to set*() will be catched to populate an internal key => value array, it will return $this to chain calls.
-Any call to get*() will look for an existing key in internal array and will return its value or null if not found.
-
-Keys of internal array are not transformed in any way
-* setMyValue will produce a 'MyValue' key
-* set_my_value will produce a '_my_value' key
-* setmyvalue will produce a 'myvalue' key
-
-You can define default values by setting
-
-```php
-protected $_attribs = ['MyValue' => ''];
-```
-
-Then a getMyValue() call will return an empty string instead of null if not set.
-
-## Use cases
-
-### In tests
-
-When you have an API relying on getter and setter methods you can provide a _Class_Entity_ as a mock and easily verify that an attribute has been set or prepare it with attributes needed by tested code.
-
-### In general
-
-When you are modeling an object and don't want to write all those standard getters and setters just extend Class_Entity.
\ No newline at end of file
diff --git a/VERSIONS_WIP/22209 b/VERSIONS_WIP/22209
deleted file mode 100644
index f48b7f13cc0f4827e86c7bf00497f82c13123056..0000000000000000000000000000000000000000
--- a/VERSIONS_WIP/22209
+++ /dev/null
@@ -1 +0,0 @@
-- ticket #22209 : les utilisateurs peuvent s'abonner à un résultat de recherche via un flux atom
\ No newline at end of file
diff --git a/VERSIONS_WIP/27067 b/VERSIONS_WIP/27067
deleted file mode 100644
index 4266f52e993875e5655677aa4ab02090c27eff40..0000000000000000000000000000000000000000
--- a/VERSIONS_WIP/27067
+++ /dev/null
@@ -1 +0,0 @@
- - ticket #27067 : Koha : Webservice de création des suggestions
\ No newline at end of file
diff --git a/VERSIONS_WIP/27194 b/VERSIONS_WIP/27194
deleted file mode 100644
index 4072067a437a4bf555cbe2045be0060980b7b80c..0000000000000000000000000000000000000000
--- a/VERSIONS_WIP/27194
+++ /dev/null
@@ -1 +0,0 @@
- - ticket #27194 : Gestion des boîtes : l'ajout et la suppression de boîtes sont possibles en front
\ No newline at end of file
diff --git a/VERSIONS_WIP/27656 b/VERSIONS_WIP/27656
deleted file mode 100644
index 94e54a63c175b1507077d99b67cbb3ac7a1b026c..0000000000000000000000000000000000000000
--- a/VERSIONS_WIP/27656
+++ /dev/null
@@ -1 +0,0 @@
- - tickets #27656, 27657 : Bibliothèque numérique 1DTouch : Prise en charge de l'authentification SSO
\ No newline at end of file
diff --git a/application/modules/admin/views/scripts/modules/blog_all.phtml b/application/modules/admin/views/scripts/modules/blog_all.phtml
index 5c8ab78edfe6e488862ef996eba555736980a4a0..1d9ec7f6545769e850ba54ae0b384c1a9641b19b 100644
--- a/application/modules/admin/views/scripts/modules/blog_all.phtml
+++ b/application/modules/admin/views/scripts/modules/blog_all.phtml
@@ -1,2 +1,11 @@
 <?php echo $this->render('modules/_debut.phtml');?>
+
+<table>
+        <tr>
+
+          <td class="droite"><?php echo $this->_('Nombre affichés par page:'); ?>&nbsp;</td>
+          <td class="gauche">          <input name="nb_display" value="<?php echo $this->preferences['nb_display']; ?>"  /></td>
+        </tr>
+</table>
+
 <?php echo $this->render('modules/_fin.phtml');?>
diff --git a/application/modules/opac/controllers/AuthController.php b/application/modules/opac/controllers/AuthController.php
index 886d8758dba91fc3fdb7ec27bded0d88ad2728a3..7d77d6b72fa501bfb639a3557cea2d7800564d02 100644
--- a/application/modules/opac/controllers/AuthController.php
+++ b/application/modules/opac/controllers/AuthController.php
@@ -20,6 +20,7 @@
  */
 
 class AuthController extends ZendAfi_Controller_Action {
+
   public function init()  {
     $this->view->locale = Zend_Registry::get('locale');
   }
@@ -44,7 +45,14 @@ class AuthController extends ZendAfi_Controller_Action {
     return $this->_request->getParam('service');
   }
 
-
+  public function getErrorMessages($error_code) {
+    $messages= [1 => $this->_('Veuillez saisir votre identifiant.'),
+                2 => $this->_('Identifiant inconnu.'),
+                4 => $this->_("Votre mail n'est pas renseigné dans votre compte lecteur. Merci de vous adresser à la bibliothèque pour connaître vos identifiants.")];
+    if (isset($messages[$error_code]))
+      return $messages[$error_code];
+    return '';
+  }
   public function notify($message) {
     $this->_helper->notify($message);
   }
@@ -167,7 +175,7 @@ class AuthController extends ZendAfi_Controller_Action {
       $user = ZendAfi_Filters_Post::filterStatic($this->_request->getPost('username'));
       $classe_user = new Class_Users();
       $ret = $classe_user->lostpass($user);
-      $this->view->message = $this->messages[$ret["error"]];
+      $this->view->message = $this->getErrorMessages($ret["error"]);
       $this->view->message_mail = $ret["message_mail"];
     }
     $this->view->username=$user;
@@ -188,8 +196,9 @@ class AuthController extends ZendAfi_Controller_Action {
       $user = ZendAfi_Filters_Post::filterStatic($this->_request->getPost('username'));
       $classe_user = new Class_Users();
       $ret=$classe_user->lostpass($user);
-      $this->view->message=$this->messages[$ret["error"]];
-      $this->view->message_mail=$ret["message_mail"];
+
+      $this->view->message=$this->getErrorMessages($ret["error"]);
+      $this->view->message_mail=isset($ret["message_mail"])?$ret["message_mail"] : '';
       $this->view->username=$user;
     }
   }
diff --git a/application/modules/opac/controllers/BlogController.php b/application/modules/opac/controllers/BlogController.php
index 4ec79a6e1677f84c68c8ac1b65599bc3242ba358..27a13c20daf03d821d4b14b73850af8189b80e21 100644
--- a/application/modules/opac/controllers/BlogController.php
+++ b/application/modules/opac/controllers/BlogController.php
@@ -37,6 +37,7 @@ class BlogController extends ZendAfi_Controller_Action {
   }
 
 
+
   public function viewauteurAction()  {
     $id_user = (int)$this->_getParam('id', $this->_user->ID_USER);
     if ($auteur = Class_Users::find($id_user)) {
@@ -90,13 +91,22 @@ class BlogController extends ZendAfi_Controller_Action {
 
 
   public function viewcritiquesAction() {
+    $this->view->page = $this->_getParam('page',1);
     $id_module = (int)$this->_getParam('id_module');
-    $preferences = Class_Profil::getCurrentProfil()
+    $profil = Class_Profil::getCurrentProfil();
+    $preferences =  $profil
       ->getModuleAccueilPreferences($id_module, 'CRITIQUES');
-    $avis = Class_AvisNotice::getAvisFromPreferences($preferences);
+    $this->view->config=$profil->getConfigurationOf('blog','viewcritiques','');
+
+    $avis = Class_AvisNotice::getAvisFromPreferences($preferences,[$this->view->page, $this->view->config['nb_display']]);
 
-    $this->view->nb_aff = 50;
     $this->view->liste_avis = $avis;
+
+    $params_url=$this->_request->getParams();
+    unset($params_url['page']);
+    unset($params_url['current_module']);
+    $this->view->params_url=$params_url;
+    $this->view->total=count(Class_AvisNotice::getAvisFromPreferences($preferences));
     $this->view->title = 'Dernières critiques';
     if (array_key_exists('titre', $preferences))
       $this->view->title = $preferences['titre'];
diff --git a/application/modules/opac/views/scripts/blog/viewcritiques.phtml b/application/modules/opac/views/scripts/blog/viewcritiques.phtml
index 54ceeb12fc778e0ce026514254df1d864beb2c5c..6370a79fa6844db0159fdf6423d227741bdd81ae 100644
--- a/application/modules/opac/views/scripts/blog/viewcritiques.phtml
+++ b/application/modules/opac/views/scripts/blog/viewcritiques.phtml
@@ -1,13 +1,15 @@
-<?php  
+<?php
 $this->openBoite($this->title);
-if(is_array($this->liste_avis)) 
+if(is_array($this->liste_avis))
 {
-  $avis_to_show = array_slice($this->liste_avis, 0, $this->nb_aff);
-  $html_avis = array();
-  foreach($avis_to_show as $avis)
+  $html_avis = [];
+  foreach($this->liste_avis as $avis)
     $html_avis []= $this->avis($avis);
   echo implode('<div class="separator"></div>', $html_avis);
 }
 
+
+echo BR.'<div align="center" style="width:100%">'.$this->pager($this->total,$this->config['nb_display'],$this->page,$this->params_url ).'</div>';
+
 $this->closeBoite();
 ?>
diff --git a/library/Class/Article.php b/library/Class/Article.php
index 9f7b283089b7c3ad93e01cb6220d3150a5ab59e9..e1a689518bc75272162685697647e7ade0b6bfa0 100644
--- a/library/Class/Article.php
+++ b/library/Class/Article.php
@@ -784,7 +784,8 @@ class Class_Article extends Storm_Model_Abstract {
 
 
   protected function hasToBeIndexed() {
-    return $this->_get('indexation') == 1;
+    return ($this->isVisible()
+      && $this->_get('indexation') == 1);
   }
 
 
diff --git a/library/Class/Newsletter.php b/library/Class/Newsletter.php
index 646f3803969f6208a3d81cfddace6ef21d0b50ac..acde6a8537c010d7137b2a083a045f2b62b859ba 100644
--- a/library/Class/Newsletter.php
+++ b/library/Class/Newsletter.php
@@ -229,15 +229,17 @@ class Class_Newsletter extends Storm_Model_Abstract {
       $vignette = $notice->fetchUrlVignette();
       $resume = $notice->getResume();
 
-      $anchor_notice = $view
-        ->getHelper('tagAnchor')
-        ->baseURL($view->tagImg($vignette,
-                                ['style' => 'float:left;width:50px;vertical-align:top;padding:5px',
-                                 'alt' => 'vignette']
-                                ) . $title,
-                  'recherche',
-                  'viewnotice',
-                  ['id' => $notice->getId()]);
+
+			$anchor_notice = $view
+				->tagAnchor($view->absoluteUrl(
+															 [ 'controller' => 'recherche',
+																'action' => 'viewnotice',
+																'id' => $notice->getId()]
+															 ),
+										$view->tagImg($vignette,
+																	['style' => 'float:left;width:50px;vertical-align:top;padding:5px',
+																	 'alt' => 'vignette']
+										) . $title);
 
       $html.=
         '<div style="padding:5px">' .
diff --git a/library/Class/Notice.php b/library/Class/Notice.php
index c8b59f76677f055d442baa3ac61f55c624a1c2bc..110ed7e45f93592fd1b59ac26ef6c731c68b0ac1 100644
--- a/library/Class/Notice.php
+++ b/library/Class/Notice.php
@@ -597,19 +597,20 @@ class Class_Notice extends Storm_Model_Abstract {
     foreach ($datas as $enreg) {
       if (!$enreg->getUnimarc()) continue;
 
-      $this->getNoticeUnimarc()->setNotice($enreg->getUnimarc(), 0);
+      $serial_article = new Class_Notice;
+      $serial_article->getNoticeUnimarc()->setNotice($enreg->getUnimarc(), 0);
 
-      $article = ["titre" => $this->getTitrePrincipal()];
-      if ($complement = $this->getComplementTitre())
+      $article = ["titre" => $serial_article->getTitrePrincipal()];
+      if ($complement = $serial_article->getComplementTitre())
         $article["titre"] .= " : " . $complement;
 
-      $auteurs = $this->getAuteursUnimarc(true);
+      $auteurs = $serial_article->getAuteursUnimarc(true);
       $article["auteur"] = isset($auteurs[0]) ? $auteurs[0] : '';
-      $article["pagination"] = $this->getCollation();
-      $note = $data = $this->get_subfield("300", "a");
+      $article["pagination"] = $serial_article->getCollation();
+      $note = $data = $serial_article->get_subfield("300", "a");
       $article["note"] = isset($note[0]) ? trim($note[0]) : '';
-      $article["resume"] = $this->getResume();
-      $article["matieres"] = $this->getMatieres();
+      $article["resume"] = $serial_article->getResume();
+      $article["matieres"] = $serial_article->getMatieres();
       $articles[] = $article;
     }
 
diff --git a/library/Class/Systeme/ModulesAppli.php b/library/Class/Systeme/ModulesAppli.php
index b94dd8c7bf9c38e859e55a9e36a402f0c94e8d01..63e5666bd44a3dc5826845e83d2058a05ed185d4 100644
--- a/library/Class/Systeme/ModulesAppli.php
+++ b/library/Class/Systeme/ModulesAppli.php
@@ -433,7 +433,8 @@ class Class_Systeme_ModulesAppli extends Class_Systeme_ModulesAbstract {
    * @return array
    */
   private function getDefautBlog($action) {
-    return array('barre_nav' => 'Critique');
+    return ['barre_nav' => 'Critique',
+            'nb_display' => 50];
   }
 
   /**
diff --git a/library/Class/Users.php b/library/Class/Users.php
index 0a7771683313855785a0446873ac9492d31bf5c3..ca90548493af896b2c2eab516a67ae9648cbcd4e 100644
--- a/library/Class/Users.php
+++ b/library/Class/Users.php
@@ -971,7 +971,7 @@ class Class_Users extends Storm_Model_Abstract {
 
   function lostpass($login) {
     if(!trim($login))
-      return array('error' => 1);
+      return ['error' => 1];
 
     if (!$user = Class_Users::getLoader()->findFirstBy(['login' => $login]))
       $user = Class_UsersNonValid::getLoader()->findFirstBy(['login' => $login]);
diff --git a/library/ZendAfi/View/Helper/Accueil/BibNumerique.php b/library/ZendAfi/View/Helper/Accueil/BibNumerique.php
index 3a22a64867dbd3f9ffe604d657270f86a0f5061f..2a4998620c5a46da107af1da7a9158c6d8eebbd0 100644
--- a/library/ZendAfi/View/Helper/Accueil/BibNumerique.php
+++ b/library/ZendAfi/View/Helper/Accueil/BibNumerique.php
@@ -16,17 +16,25 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with BOKEH; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class ZendAfi_View_Helper_Accueil_BibNumerique extends ZendAfi_View_Helper_Accueil_Base {
   protected $_slideshow;
-  
+
   public function __construct($id_module,$params) {
     parent::__construct($id_module,$params);
     $this->preferences = array_merge(array('id_albums' => ''),
                                      $this->preferences);
   }
 
+  public function displayNumericRessources() {
+    if (!$album = Class_Album::getLoader()->find((int)$this->preferences['id_albums']))
+      return false;
+    if ($album->getImages())
+      return false;
+    $html=$this->view->renderAlbum($album);
+    return $html;
+  }
 
   public function getSlideshow() {
     if (!isset($this->_slideshow)) {
@@ -75,15 +83,17 @@ class ZendAfi_View_Helper_Accueil_BibNumerique extends ZendAfi_View_Helper_Accue
     return $this->getHtmlArray();
   }
 
-  /**
-   * @return ZendAfi_View_Helper_Accueil_BibNumerique
-   */
-  public function _renderAlbumTeaser() {
-    if ($this->isDisplayDiaporama() or $this->isDisplayListe()) {
-      $this->contenu .= $this->getSlideshow()->renderAlbumMedias();
-    } else {
-      $this->contenu .= sprintf('<div id="booklet_%d" class="bib-num-album"></div>',
-                                $this->id_module);
+	/**
+	 * @return ZendAfi_View_Helper_Accueil_BibNumerique
+	 */
+	public function _renderAlbumTeaser() {
+    if ($this->contenu = $this->displayNumericRessources())
+      return $this;
+		if ($this->isDisplayDiaporama() or $this->isDisplayListe()) {
+			$this->contenu .= $this->getSlideshow()->renderAlbumMedias();
+		} else {
+			$this->contenu .= sprintf('<div id="booklet_%d" class="bib-num-album"></div>',
+																$this->id_module);
 
       $this->titre = $this->view->tagAnchor(array('controller' => 'bib-numerique',
                                                   'action' => 'booklet',
diff --git a/library/ZendAfi/View/Helper/Accueil/Critiques.php b/library/ZendAfi/View/Helper/Accueil/Critiques.php
index c55e19186aa24aca7a40d65bba5e2f01e241f9b1..fc8710fc050e40c82524ab8c47ddfd76ee330c0a 100644
--- a/library/ZendAfi/View/Helper/Accueil/Critiques.php
+++ b/library/ZendAfi/View/Helper/Accueil/Critiques.php
@@ -93,16 +93,17 @@ class ZendAfi_View_Helper_Accueil_Critiques extends ZendAfi_View_Helper_Accueil_
 
   protected function _getTitle() {
     return $this->view
-      ->getHelper('tagAnchor')
-      ->baseURL($this->preferences['titre'],
-                'blog',
-                'viewcritiques',
-                ['id_module' => $this->id_module,
-                 'id_menu' => $this->_id_menu]);
-  }
+			->tagAnchor(
+									$this->view->url(['controller' => 'blog',
+																		'action' => 'viewcritiques',
+																		'id_module'=> $this->id_module,
+																		'id_menu' => $this->_id_menu]),
+									$this->preferences['titre']);
+	}
 
 
-  protected function isHierarchicalDisplay() {
-    return '1' == $this->getPreference('hierarchical');
-  }
+	protected function isHierarchicalDisplay() {
+		return '1' == $this->getPreference('hierarchical');
+	}
+
 }
\ No newline at end of file
diff --git a/library/ZendAfi/View/Helper/TagAnchor.php b/library/ZendAfi/View/Helper/TagAnchor.php
index 9781c10b72859cdac4bd993eb462cc7682300d04..a2cab9aae584bf270a9b4b235e46226c0ee2385f 100644
--- a/library/ZendAfi/View/Helper/TagAnchor.php
+++ b/library/ZendAfi/View/Helper/TagAnchor.php
@@ -16,7 +16,7 @@
  *
  * You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
  * along with BOKEH; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA 
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301  USA
  */
 class ZendAfi_View_Helper_TagAnchor extends Zend_View_Helper_HtmlElement {
   /**
@@ -36,10 +36,6 @@ class ZendAfi_View_Helper_TagAnchor extends Zend_View_Helper_HtmlElement {
 
   }
 
-  public function baseURL($text, $controller, $action, $params) {
-    $url = 'http://' . $_SERVER['SERVER_NAME'] . BASE_URL . '/' . $controller . '/' . $action . '?' . http_build_query($params, '', '&amp;');
-    return $this->tagAnchor($url, $text);
-  }
 
 }
 ?>
\ No newline at end of file
diff --git a/library/startup.php b/library/startup.php
index 280388d75bfbd33fe72711df52d2a61078d568f3..6b88e9e3b61eb16111e7f3a591357b4473c55825 100644
--- a/library/startup.php
+++ b/library/startup.php
@@ -64,7 +64,7 @@ function defineConstant($name, $value) {
 
 function setupConstants() {
 	defineConstant('BOKEH_MAJOR_VERSION','7.3');
-	defineConstant('BOKEH_RELEASE_NUMBER', BOKEH_MAJOR_VERSION . '.0');
+	defineConstant('BOKEH_RELEASE_NUMBER', BOKEH_MAJOR_VERSION . '.1');
 
 	defineConstant('ROOT_PATH',  realpath(dirname(__FILE__).'/..').'/');
 
diff --git a/tests/application/modules/admin/controllers/CmsControllerTest.php b/tests/application/modules/admin/controllers/CmsControllerTest.php
index 95184211658d2b1fc9930cc31f1dde058bd1c7ca..7e2d0ee9d87ed394148dda54456058aa72a06ce2 100644
--- a/tests/application/modules/admin/controllers/CmsControllerTest.php
+++ b/tests/application/modules/admin/controllers/CmsControllerTest.php
@@ -840,6 +840,8 @@ class CmsControllerArticleConcertEditArticleWithQuotesActionTest extends CmsCont
 
 
 class CmsControllerArticleConcertEditActionPostTest extends CmsControllerWithPermissionTestCase {
+  protected $_tomorrow;
+
   public function setUp() {
     parent::setUp();
 
@@ -848,6 +850,8 @@ class CmsControllerArticleConcertEditActionPostTest extends CmsControllerWithPer
     Class_IntBib::beVolatile();
     Class_Exemplaire::beVolatile();
 
+    $this->_tomorrow = new DateTime('tomorrow');
+
     $this->fixture('Class_Article',
                    ['id' => 4,
                     'auteur' => null,
@@ -876,7 +880,7 @@ class CmsControllerArticleConcertEditActionPostTest extends CmsControllerWithPer
                   'indexation' => 1,
                   'id_cat' => 34,
                   'debut' => '01/03/2011',
-                  'fin' => '26/03/2011',
+                  'fin' => $this->_tomorrow->format('d-m-Y'),
                   'events_debut' => '02/03/2011 08:35',
                   'events_fin' => '05/03/2011  10:42',
                   'contenu' => 'Ici: <img src="../../images/bonlieu.jpg" />',
@@ -935,8 +939,8 @@ class CmsControllerArticleConcertEditActionPostTest extends CmsControllerWithPer
 
 
   /** @test */
-  function dateDebutShouldBe2011_03_26() {
-    $this->assertContains('2011-03-26', Class_Article::find(4)->getFin());
+  function dateFinShouldBe2011_03_26() {
+    $this->assertContains($this->_tomorrow->format('Y-m-d'), Class_Article::find(4)->getFin());
   }
 
 
diff --git a/tests/application/modules/admin/controllers/ModulesControllerTest.php b/tests/application/modules/admin/controllers/ModulesControllerTest.php
index 8cee70c2eb74c771035027c066107c29b8794509..744b5748ae0b0c3dd335d9aa65fa2d873c169cda 100644
--- a/tests/application/modules/admin/controllers/ModulesControllerTest.php
+++ b/tests/application/modules/admin/controllers/ModulesControllerTest.php
@@ -412,6 +412,22 @@ class ModulesControllerConfigRechercheResultatTest extends Admin_AbstractControl
 
 
 
+class ModulesControllerConfigViewCritiquesResultatTest extends Admin_AbstractControllerTestCase {
+
+  public function setUp() {
+    parent::setUp();
+    Class_Profil::getCurrentProfil()->setCfgModules([]);
+    $this->dispatch('/admin/modules/blog?config=site&type_module=blog&id_profil=2&action1=viewcritiques&action2=', true);
+  }
+
+  /** @test */
+  public function inputNumberOfCriticsDisplayOnPageShouldBe50() {
+    $this->assertXPath('//input[@name="nb_display"][@value="50"]');
+  }
+}
+
+
+
 
 class ModulesControllerRechercheSaisieTest extends Admin_AbstractControllerTestCase {
   public function setUp() {
diff --git a/tests/application/modules/opac/controllers/AbonneControllerAvisTest.php b/tests/application/modules/opac/controllers/AbonneControllerAvisTest.php
index e24a7e99dd9b7cda0f18412d4a9f83583d94c33e..1f2339cfd2f41140f962391cfd953732393c86f2 100644
--- a/tests/application/modules/opac/controllers/AbonneControllerAvisTest.php
+++ b/tests/application/modules/opac/controllers/AbonneControllerAvisTest.php
@@ -290,8 +290,8 @@ abstract class AvisControllersFixturesTestCase extends AbonneFlorenceIsLoggedCon
     $this->millenium_with_vignette->save();
 
 
-    $this->avis_millenium =  Class_AvisNotice::newInstanceWithId(13, [
-                                                                      'entete' => "J'adore",
+    $this->avis_millenium =  $this->fixture('Class_AvisNotice', ['id' => 13,
+                                                                 'entete' => "J'adore",
                                                                       'avis' => '<div><ul><li>Suspense Intense !</li><li>Suspense Intense !</li></ul></div>',
                                                                       'note' => 5,
                                                                       'date_avis' => '2011-03-18 13:00:00',
@@ -614,13 +614,15 @@ abstract class ModuleSelectionCritiquesTestCase extends AvisControllersFixturesT
 
     $preferences = array('modules' => array(3 => array('division' => 2,
                                                        'type_module' => 'CRITIQUES',
-                                                       'preferences' => array('titre' => 'Coups de coeur'))));
+                                                       'preferences' => array('titre' => 'Coups de coeur'
+                                                       ))));
     $profil = Class_Profil::getLoader()
       ->find(2)
+      ->setCfgModules( ['blog' =>  ['viewcritiques' => ['nb_display' => 2]]])
       ->setCfgAccueil($preferences);
 
-    $this->_generateLoaderFor('Class_AvisNotice', array('getAvisFromPreferences'))
-         ->expects($this->once())
+    $this->_generateLoaderFor('Class_AvisNotice', ['getAvisFromPreferences'])
+//         ->expects($this->once())
          ->method('getAvisFromPreferences')
          ->will($this->returnValue([$this->avis_millenium,
                                     $this->avis_potter,
@@ -645,6 +647,17 @@ class AbonneControllerAvisBlogControllerViewCritiquesTest extends ModuleSelectio
     $this->assertQueryContentContains('h2', 'Potter');
   }
 
+  /** @test */
+  public function pagerShouldBeDisplayed() {
+    $this->assertXPath('//a[@href="/blog/viewcritiques/id_profil/2/id_module/3/page/2"]', $this->_response->getBody());
+  }
+
+  /** @test */
+  public function pagerShouldNotContains3Pages() {
+    $this->assertNotXPath('//a[contains(@href,"/page/3")]', $this->_response->getBody());
+  }
+
+
   /** @test */
   public function titleShouldBeCoupsDeCoeur() {
     $this->assertXPathContentContains('//h1', 'Coups de coeur');
diff --git a/tests/application/modules/opac/controllers/AuthControllerTest.php b/tests/application/modules/opac/controllers/AuthControllerTest.php
index d182476324f94c9417fe2de7f75f69c5cc8cfdab..091501475cdb512946dde240c6243d9393742e51 100644
--- a/tests/application/modules/opac/controllers/AuthControllerTest.php
+++ b/tests/application/modules/opac/controllers/AuthControllerTest.php
@@ -1173,7 +1173,49 @@ class AuthControllerLoginActionWithDefaultPreferencesRenderTest extends AuthCont
   }
 }
 
+class AuthControllerLostPasswordUnknownPostTest extends AbstractControllerTestCase{
 
+  public function setUp() {
+    parent::setUp();
+
+  }
+
+  /** @test */
+  public function withUnknowUserShouldDisplayError() {
+    $this->postDispatch('/opac/auth/lostpass',['username' => 'unknown']);
+    $this->assertXPathContentContains('//div', 'Identifiant inconnu',$this->_response->getBody());
+  }
+
+
+/** @test */
+  public function withEmptyUserShouldDisplayError() {
+    $this->postDispatch('/opac/auth/lostpass',['username' => '']);
+    $this->assertXPathContentContains('//div', 'Veuillez saisir votre identifiant.',$this->_response->getBody());
+  }
+
+}
+
+class AuthControllerLostPasswordNoMailPostTest extends AbstractControllerTestCase{
+
+  public function setUp() {
+    parent::setUp();
+    $user = $this->fixture('Class_Users',
+                             ['id' => 1,
+                              'pseudo' => 'luddite',
+                              'login' => 'luddite',
+                              'password' => 'notech',
+                              'nom' => 'Lu',
+                              'prenom' => 'Dites']);
+
+    $this->postDispatch('/opac/auth/lostpass' , ['username' => 'luddite']);
+  }
+
+/** @test */
+  public function withoutEmailShouldReturnErrorMessage() {
+    $this->assertXPathContentContains('//div', "Votre mail n'est pas renseigné dans votre compte lecteur. Merci de vous adresser à la bibliothèque pour connaître vos identifiants.");
+  }
+
+}
 
 
 class AuthControllerLostPasswordTest extends AuthControllerNobodyLoggedTestCase {
diff --git a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
index 187d105bb7ee94147a51eaf66f74f8e3d5cd13de..b87bdc6d4b43d25eb881292c8d96b92e06f22434 100644
--- a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
+++ b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
@@ -629,11 +629,12 @@ class ProfilOptionsControllerViewProfilAdulteTest extends ProfilOptionsControlle
   }
 
 
-  /** @test */
-  public function menuHorizontalBoiteCritiquesShouldContainsIdMenuInTitleLink() {
-    $this->assertXPathContentContains('//div[@id="menu_horizontal"]//div[@class="boite critiques"]//a[contains(@href, "blog/viewcritiques?id_module=2&id_menu=H")]',
-                                      'Coup de coeur');
-  }
+
+	/** @test */
+	public function menuHorizontalBoiteCritiquesShouldContainsIdMenuInTitleLink() {
+		$this->assertXPathContentContains('//div[@id="menu_horizontal"]//div[@class="boite critiques"]//a[contains(@href, "/blog/viewcritiques/id_module/2/id_menu/H")]',
+																			'Coup de coeur');
+	}
 
 
   /** @test */
diff --git a/tests/library/Class/ArticleTest.php b/tests/library/Class/ArticleTest.php
index 0b26d2dc619c1817459636226e120540beb72d48..dbf8717828c716de088f3bacd175cec01cb66a4b 100644
--- a/tests/library/Class/ArticleTest.php
+++ b/tests/library/Class/ArticleTest.php
@@ -1075,18 +1075,22 @@ class EventsByMonthWithArticleNextYearTest extends EventsByMonthWithArticleTestC
 
 
 
-class ArticleIndexAllTest extends Storm_Test_ModelTestCase {
+class ArticleIndexAllTest extends ModelTestCase {
+  protected $_storm_default_to_volatile = true;
+
   public function setUp() {
     parent::setUp();
-    Class_Exemplaire::beVolatile();
-    Class_Notice::beVolatile();
-    Class_NoticeDomain::beVolatile();
 
     $user = $this->fixture('Class_Users',
                            ['id' => 1,
                             'login' => 'Tom',
                             'password' => 'pwd']);
 
+    $this->fixture('Class_AdminVar',
+                   ['clef' => 'WORKFLOW',
+                    'id' => 'WORKFLOW',
+                    'valeur' => 1]);
+
     $this->fixture('Class_Catalogue',
                    ['id' => 1,
                     'libelle' => 'My domain']);
@@ -1096,14 +1100,31 @@ class ArticleIndexAllTest extends Storm_Test_ModelTestCase {
                     'titre' => 'My Cms First Step',
                     'contenu' => 'My Cms First Step',
                     'auteur' => $user,
-                    'indexation' => 1]);
+                    'indexation' => 1,
+                    'status' => Class_Article::STATUS_VALIDATED]);
 
     $this->fixture('Class_Article',
                    ['id' => 2,
                     'titre' => 'My Cms article',
                     'indexation' => 1,
                     'contenu' => 'My Cms First Step',
-                    'domaine_ids' => '1']);
+                    'domaine_ids' => '1',
+                    'status' => Class_Article::STATUS_VALIDATED]);
+
+    $this->fixture('Class_Article',
+                   ['id' => 3,
+                    'titre' => 'Le circuit de la peur',
+                    'indexation' => 1,
+                    'contenu' => 'Le circuit de la peur',
+                    'debut' => '2014-10-09',
+                    'fin' => '2014-10-30',
+                    'status' => Class_Article::STATUS_VALIDATED]);
+
+    $this->fixture('Class_Article',
+                   ['id' => 4,
+                    'titre' => 'La fête de la Science',
+                    'contenu' => 'La fête de la Science',
+                    'status' => Class_Article::STATUS_DRAFT]);
 
     Class_Article::indexAll();
   }
@@ -1116,7 +1137,7 @@ class ArticleIndexAllTest extends Storm_Test_ModelTestCase {
 
 
   /** @test */
-  public function twoRecordsShouildBePresent() {
+  public function twoRecordsShouldBePresent() {
     $this->assertCount(2, Class_Notice::findAll());
   }
 
@@ -1131,6 +1152,18 @@ class ArticleIndexAllTest extends Storm_Test_ModelTestCase {
   public function myDomainShouldHaveANoticeLineked() {
     $this->assertEquals('My Cms article', Class_NoticeDomain::findFirstBy(['domain_id' => 1])->getNotice()->getTitrePrincipal());
   }
+
+
+  /** @test */
+  public function article3ShouldNotHaveANotice() {
+    $this->assertNull(Class_Article::find(3)->getNotice());
+  }
+
+
+  /** @test */
+  public function article4ShouldNotHaveANotice() {
+    $this->assertNull(Class_Article::find(4)->getNotice());
+  }
 }
 
 
diff --git a/tests/library/Class/NewsletterMailingTest.php b/tests/library/Class/NewsletterMailingTest.php
index 786effb8314e1e9707dcab4413dfb63d5ad27749..52b49cee6d3abfa2c06c93b43ae8a4fde3e0554f 100644
--- a/tests/library/Class/NewsletterMailingTest.php
+++ b/tests/library/Class/NewsletterMailingTest.php
@@ -407,10 +407,10 @@ class NewsletterMailingConcertsPanierHtmlTest extends NewsletterMailingTestCase
   }
 
 
-  /** @test */
-  public function shouldContainsLinkMillenium() {
-    $this->assertBodyHTMLContains('<a href="http://localhost' . BASE_URL . '/recherche/viewnotice?id=345"');
-  }
+	/** @test */
+	public function shouldContainsLinkMillenium() {
+		$this->assertBodyHTMLContains('<a href="http://localhost' . BASE_URL . '/recherche/viewnotice/id/345"');
+	}
 
 
   /** @test */
@@ -431,10 +431,12 @@ class NewsletterMailingConcertsPanierHtmlTest extends NewsletterMailingTestCase
   }
 
 
-  /** @test */
-  public function shouldContainsPotterLink() {
-    $this->assertBodyHTMLContains('<a href="http://localhost' . BASE_URL . '/recherche/viewnotice?id=987"');
-  }
+
+	/** @test */
+	public function shouldContainsPotterLink() {
+		$this->assertBodyHTMLContains('<a href="http://localhost' . BASE_URL . '/recherche/viewnotice/id/987"');
+	}
+
 }
 
 
diff --git a/tests/library/Class/NoticeTest.php b/tests/library/Class/NoticeTest.php
index af344d9a27de011e9d840f8084b0121873adbabc..e2b7392575439f6a2fc667f3a6ae8d90dd0a63f0 100644
--- a/tests/library/Class/NoticeTest.php
+++ b/tests/library/Class/NoticeTest.php
@@ -720,4 +720,67 @@ class NoticeStromaeTest extends Storm_Test_ModelTestCase {
   }
 }
 
+
+
+
+class NoticeWithSerialArticleTest extends AbstractControllerTestCase {
+
+   protected $_articles;
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->fixture('Class_Notice', ['id' => 66616,
+                                    'type_doc' => 2,
+                                    'alpha_titre' => 'CAHIERS PEDAGOGIQUES 478',
+                                    'clef_chapeau' => 'CAHIERS PEDAGOGIQUES',
+                                    'tome_alpha' => 478]);
+
+
+    $this->fixture('Class_Notice_SerialArticles', ['id' => 19015,
+                                                  'id_article' => 19015,
+                                                  'clef_chapeau' => 'CAHIERS PEDAGOGIQUES',
+                                                  'clef_numero' => 478,
+                                                  'unimarc' => "00901naa0 2200169   450 0010008000001000041000082000108000492150011001573300361001686000046005296060033005756100034006086100022006427000019006647010018006838010030007012660662  a20100127a2010    uu|y0frey0103    ba| aInventer une nouvelle maïeutique pour apprendre à apprendrebpériodiquefPatrice BridegNicole Priou  app.2-4  aFrançois Taddéi est l'auteur d'un rapport pour l'OCDE, \"Former des constructeurs de savoirs créatifs et collaboratifs\". Nous l'avons rencontré au Centre de recherches interdisciplinaires, lieu symbolique pour ce chercheur au parcours à la diversité atypique en France, actuellement directeur de recherche à l'Inserm à l'université Paris Descartes. 1aTaddéibFrançoisf19..-....xEntretiens| aEducationxRechercheyFrance| aTaddéi, Françoiseinterview| aécoleerecherche 1aBridebPatrice 1aPrioubNicole 0aFRbIndexpressec20100127"]);
+
+    $this->fixture('Class_Notice_SerialArticles', ['id' => 19016,
+                                                  'id_article' => 19016,
+                                                  'clef_chapeau' => 'CAHIERS PEDAGOGIQUES',
+                                                  'clef_numero' => 478,
+                                                  'unimarc' => "00851naa0 2200145   450 0010008000001000041000082000074000492150011001233300378001346060027005126060054005396100061005937000021006548010030006752660665  a20100127a2010    uu|y0frey0103    ba| aEducation, arme géostratégique ? (L')bpériodiquefPascal Bouchard  app.5-6  aTravailler ensemble pour réussir durablement : tel était le thème du premier Wise (World Innovation Summit for Education), initié par la Qatar Foundation sous le patronage de la sheikha Mozah Bint Nasser Al Missned, qui a réuni à Doha, au Qatar, du 16 au 18 novembre 2009 un millier de leaders d'opinion influents, de décideurs et d'universitaires venus de 120 pays.| aEducationxInnovations| aCongrès et conférencesyQataryAl-Dawha (Qatar)| aéducationeinnovationecongrèseAl-Dawha (Qatar)e2009 1aBouchardbPascal 0aFRbIndexpressec20100127"]);
+
+    $this->_articles = Class_Notice::find(66616)->getArticlesPeriodique(66616);
+  }
+
+
+  /** @test */
+  public function noticeShouldHaveTwoSerialArticles() {
+    $this->assertCount(2, $this->_articles);
+  }
+
+
+  /** @test */
+  public function firstSerialArticleTitleShouldBeInventerUneNouvelleMaieutiquePourApprendreAApprendre() {
+    $this->assertEquals('Inventer une nouvelle maïeutique pour apprendre à apprendre', $this->_articles[0]['titre']);
+  }
+
+
+  /** @test */
+  public function firstSerialArticleSummaryShouldBeAsExpected() {
+    $this->assertEquals('François Taddéi est l\'auteur d\'un rapport pour l\'OCDE, "Former des constructeurs de savoirs créatifs et collaboratifs". Nous l\'avons rencontré au Centre de recherches interdisciplinaires, lieu symbolique pour ce chercheur au parcours à la diversité atypique en France, actuellement directeur de recherche à l\'Inserm à l\'université Paris Descartes.', $this->_articles[0]['resume']);
+  }
+
+
+  /** @test */
+  public function secondSerialArticleTitleShouldBeEducationArmeGeostrategique() {
+    $this->assertEquals('Education, arme géostratégique ? (L\')', $this->_articles[1]['titre']);
+  }
+
+
+  /** @test */
+  public function secondSerialArticleSummaryShouldBeAsExpected() {
+    $this->assertEquals('Travailler ensemble pour réussir durablement : tel était le thème du premier Wise (World Innovation Summit for Education), initié par la Qatar Foundation sous le patronage de la sheikha Mozah Bint Nasser Al Missned, qui a réuni à Doha, au Qatar, du 16 au 18 novembre 2009 un millier de leaders d\'opinion influents, de décideurs et d\'universitaires venus de 120 pays.', $this->_articles[1]['resume']);
+  }
+}
+
 ?>
\ No newline at end of file
diff --git a/tests/library/ZendAfi/View/Helper/Accueil/BibNumeriqueTest.php b/tests/library/ZendAfi/View/Helper/Accueil/BibNumeriqueTest.php
index 789d3cbed72a167d083a3e20bfde1707e6055b8c..56c7f0f4b609ba07f56399b24e339037e8231d15 100644
--- a/tests/library/ZendAfi/View/Helper/Accueil/BibNumeriqueTest.php
+++ b/tests/library/ZendAfi/View/Helper/Accueil/BibNumeriqueTest.php
@@ -611,6 +611,49 @@ class BibNumeriqueAlbumHarlockAsListeTest extends AbstractBibNumeriqueViewHelper
 
 
 
+
+class BibNumeriqueAlbumWithMp3RessourcesTest extends BibNumeriqueViewCollectionTestCase {
+  protected $_storm_default_to_volatile = true;
+  protected $html;
+
+  public function setUp() {
+    parent::setUp();
+
+    $album = Class_Album::find(1);
+    $album->setTypeDocId(Class_TypeDoc::AUDIO_RECORD)->save();
+
+    $ressource1 = $this->fixture('Class_AlbumRessource', ['id' => 1,
+                                                          'titre' => 'Cartes',
+                                                          'fichier' => 'cartes.mp3']);
+
+    $preferences = ['boite' => '',
+                    'titre' => 'Harlock',
+                    'id_categories' => '',
+                    'id_albums' => '1',
+                    'nb_aff' => 2,
+                    'op_largeur_img' => 150,
+                    'op_hauteur_img' => 150,
+                    'type_aff' => Class_Systeme_ModulesAccueil_BibliothequeNumerique::DISPLAY_ALBUM_TEASER,
+                    'style_liste' => 'none'];
+
+    $album->setRessource([$ressource1->setAlbum($album)]);
+    $helper = new ZendAfi_View_Helper_Accueil_BibNumerique(12, ['division' => 1,
+                                                                'type_module' => 'BIB_NUMERIQUE',
+                                                                'preferences' => $preferences]);
+
+    $helper->setView(new ZendAfi_Controller_Action_Helper_View());
+    $this->html = $helper->getBoite();
+  }
+
+
+  /** @test */
+  public function audioPlayerShouldBeDisplayeOnBibNumericBox() {
+    $this->assertXpath($this->html, '//audio[@preload="preload"]', $this->html);
+  }
+}
+
+
+
 class BibNumeriqueFixture {
   /** @return array */
   public static function createOneCategorieTreePreference() {