diff --git a/FEATURES/203399 b/FEATURES/203399
new file mode 100644
index 0000000000000000000000000000000000000000..8fe8a5f10e5806550df91ebf440efcbba945151f
--- /dev/null
+++ b/FEATURES/203399
@@ -0,0 +1,10 @@
+        '203399' =>
+            ['Label' => $this->_('Filtrage bibliothèques à choix multiples pour les profils et les groupes utilisateur'),
+             'Desc' => '',
+             'Image' => '',
+             'Video' => '',
+             'Category' => '',
+             'Right' => function($feature_description, $user) {return true;},
+             'Wiki' => '',
+             'Test' => '',
+             'Date' => '2024-06-19'],
\ No newline at end of file
diff --git a/VERSIONS_WIP/203399 b/VERSIONS_WIP/203399
new file mode 100644
index 0000000000000000000000000000000000000000..f14f22db7086c893042bfbd107650da0d036a3e9
--- /dev/null
+++ b/VERSIONS_WIP/203399
@@ -0,0 +1 @@
+ - fonctionnalité #203399 : [Ariège] Filtrage bibliothèques à choix multiples pour les profils et les groupes utilisateur
\ No newline at end of file
diff --git a/application/modules/admin/controllers/ModulesController.php b/application/modules/admin/controllers/ModulesController.php
index eafcea23679b62535f475a539f9769225ffd705f..104ac585cd58b702d1dabad168093cf49be29f4b 100644
--- a/application/modules/admin/controllers/ModulesController.php
+++ b/application/modules/admin/controllers/ModulesController.php
@@ -60,7 +60,7 @@ class Admin_ModulesController extends ZendAfi_Controller_Action {
       ZendAfi_View_Helper_Accueil_Base::getComboTemplates($this->preferences['boite'],
                                                           $this->profil);
     $this->view->id_profil = $this->profil->getId();
-    $this->view->id_bib = $this->profil->getIdSite();
+    $this->view->id_bibs = $this->profil->getLibraryIds();
     $this->view->action = $this->_getParam('type_module').'_'.$this->_getParam('action1');
   }
 
diff --git a/application/modules/admin/controllers/ProfilController.php b/application/modules/admin/controllers/ProfilController.php
index 6af21eee7c78c297a907c357704a26547b62d9f8..9e1ab4fba97571b4207495caf9a1d34d31e8883c 100644
--- a/application/modules/admin/controllers/ProfilController.php
+++ b/application/modules/admin/controllers/ProfilController.php
@@ -58,12 +58,8 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
 
   public function indexAction() {
     $user = Class_Users::getIdentity();
-
-    $profils = ($user->isModoPortailOrMore())
-      ? Class_Profil::findAllByZoneAndBib($this->id_zone,
-                                          $this->id_bib)
-      : Class_Profil::findByZoneAndBibs($this->id_zone,
-                                        $user->managedLibraryIds());
+    $profils = Class_Profil::findAllByZoneAndBib($this->id_zone,
+                                                 $this->id_bib);
 
     $profils_by_bib = [];
     foreach ($profils as $profil) {
@@ -71,8 +67,11 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
       if ($profil->hasParentProfil())
         continue;
 
-      if (($user->getRoleLevel() <= ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL)
-          && !$user->canManageLibrary($profil->getBib()))
+      if ($user->isModo())
+        continue;
+
+      if ($user->isAdminBib()
+          && !$profil->hasOneOfManagedLibraries($user->managedLibraryIds()))
         continue;
 
       $libelle = $profil->isInPortail() ? 'Portail' : $profil->getBibLibelle();
@@ -417,6 +416,9 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
   public function editAction() {
     $profil = Class_Profil::find($this->id_profil);
 
+    if (!$this->_canEdit($profil))
+      $this->_doOnCannotEdit($profil);
+
     $params = array_merge($profil->toArray(),
                           $profil->getCfgSiteAsArray());
 
@@ -503,4 +505,19 @@ class Admin_ProfilController extends ZendAfi_Controller_Action {
     $export = new Class_Profil_Export($this->_profil);
     $this->_response->setBody($export->toString());
   }
+
+
+  protected function _canEdit($profil): bool
+  {
+    return ($user = Class_Users::getIdentity()) && $user->isAdminBib()
+      ? $profil->hasOneOfManagedLibraries($user->managedLibraryIds())
+      : true;
+  }
+
+
+  protected function _doOnCannotEdit($profil) {
+    $this->_helper->notify($this->_('Vous n\'avez pas la permission pour le profil "%s"',
+                                    $profil->getLibelle()));
+    return $this->_redirectClose('/admin');
+  }
 }
diff --git a/cosmogramme/sql/patch/patch_473.php b/cosmogramme/sql/patch/patch_473.php
new file mode 100644
index 0000000000000000000000000000000000000000..9897b924c88a1638f410151ca74985c6839cd083
--- /dev/null
+++ b/cosmogramme/sql/patch/patch_473.php
@@ -0,0 +1,6 @@
+<?php
+$adapter = Zend_Db_Table_Abstract::getDefaultAdapter();
+
+try {
+  $adapter->query('ALTER TABLE `bib_admin_profil` CHANGE `ID_SITE` `ID_SITE` mediumtext NOT NULL');
+} catch(Exception $e) {}
diff --git a/library/Class/Article/Select.php b/library/Class/Article/Select.php
index 3acae0aa9ac7892ac283259774c7645626db62d0..079ed89b1679fe5946e9204b8719d2a6cf7926a9 100644
--- a/library/Class/Article/Select.php
+++ b/library/Class/Article/Select.php
@@ -380,15 +380,20 @@ class Class_Article_Select {
    * @param array $preferences
    * @return array
    */
-  protected function _byIdBib($id_bib) {
-    if (0 === $id_bib || null === $id_bib)
+  protected function _byIdBib($id_bibs) {
+    if (!is_array($id_bibs))
+      $id_bibs = [$id_bibs];
+
+    $id_bibs = $id_bibs ? array_filter($id_bibs) : [];
+    if ( ! $id_bibs)
       return $this;
 
     $this->_select
       ->join('cms_categorie',
              'cms_categorie.ID_CAT = cms_article.ID_CAT',
-             [])
-      ->where('cms_categorie.ID_SITE=?', $id_bib);
+             array())
+      ->where('cms_categorie.ID_SITE IN ('
+              . "'" . implode("','", $id_bibs) . "')");
     return $this;
   }
 
diff --git a/library/Class/Calendar.php b/library/Class/Calendar.php
index 08622f0b7459c00187b5ca30c474519c1d5d5977..9d8bc3210977a34a554c5141b4461da77a9baf71 100644
--- a/library/Class/Calendar.php
+++ b/library/Class/Calendar.php
@@ -50,7 +50,7 @@ class Class_Calendar {
     $this->year = (int)substr($this->year_month, 0, 4);
     $this->month = (int)substr($this->year_month, -2);
 
-    $this->id_bib = Class_Profil::getCurrentProfil()->getIdSite();
+    $this->id_bib = Class_Profil::getCurrentProfil()->getLibraryIds();
 
     if (!array_isset('display_cat_select', $this->preferences))
       $this->preferences['display_cat_select'] = false;
diff --git a/library/Class/CriteresRecherche.php b/library/Class/CriteresRecherche.php
index 17f6f8cecffd80bf17eb162fac3ebd7a78fd0c57..868cebed8cd9a45bed13e6e59acf364d82b23e49 100644
--- a/library/Class/CriteresRecherche.php
+++ b/library/Class/CriteresRecherche.php
@@ -982,8 +982,8 @@ class Class_CriteresRecherche extends Class_CriteresRecherche_Abstract {
   public function getBibs() : array {
     $bibs = explode(',', $this->getParam('bib_select',''));
     if ($this->_profil
-        && ($selection_bib = $this->_profil->getIdSite()))
-      $bibs [] = $selection_bib;
+        && ($selection_bibs = $this->_profil->getLibraryIds()))
+      $bibs = array_merge($bibs,$selection_bibs);
 
     return array_filter($bibs);
   }
diff --git a/library/Class/Profil.php b/library/Class/Profil.php
index db3496feed5ef346e1cdcade5d8b443491a24cf4..5361ff85ebf749e5b9ba4b58be050c03b8c9114b 100644
--- a/library/Class/Profil.php
+++ b/library/Class/Profil.php
@@ -55,36 +55,70 @@ class ProfilLoader extends Storm_Model_Loader {
 
 
   public function findAllByZoneAndBib($id_zone = 0, $id_bib = 0) {
-    $conditions = ['order' => 'libelle'];
-    if ($id_zone && $id_zone !="ALL")
-      $conditions["ID_SITE"] = $id_zone=="PORTAIL" ? 0 : ["select ID_SITE from bib_c_site where ID_ZONE=$id_zone"];
+    $by_zone = null;
+    if ($id_zone && $id_zone !="ALL" && $id_zone != 'PORTAIL')
+      $by_zone = $id_zone;
 
-    if($id_bib && $id_bib!="ALL") {
+    $by_idbib = null;
+    if($id_bib and $id_bib!="ALL") {
       if($id_bib=="PORTAIL")
         $id_bib=0;
-      $conditions["ID_SITE"] = $id_bib;
+      $by_idbib = $id_bib;
     }
 
-    return Class_Profil::findAllBy($conditions);
+    $profils = Class_Profil::findAllBy(['order' => 'libelle']);
+
+    if (isset($by_zone))
+      $profils = $this->_filterOnIdZone($profils, $by_zone);
+
+    if (isset($by_idbib))
+      $profils = $this->_filterOnIdBib($profils, $by_idbib);
+
+    if (Class_Users::getIdentity()->isAdminBib())
+      $profils = $this->_filterByManagedLibraries($profils);
+
+    return $profils;
+  }
+
+
+  protected function _filterOnIdZone(array $profils, int $id_zone): array
+  {
+    $filtered = [];
+    $bibs = array_map(fn($bib) => $bib->getId(),
+                      Class_Bib::findAllBy(['id_zone' => $id_zone]));
+
+    foreach ($profils as $profil)
+      if ($profil->hasOneOfManagedLibraries($bibs))
+        $filtered[] = $profil;
+
+    return $filtered;
+
+  }
+
+
+  protected function _filterOnIdBib(array $profils, int $id_bib): array
+  {
+    $filtered = [];
+
+    foreach ($profils as $profil)
+      if (in_array($id_bib, $profil->getLibraryIds()))
+        $filtered[] = $profil;
+
+    return $filtered;
   }
 
 
-  public function findByZoneAndBibs(string $id_zone = '',
-                                    array $bibs = [0]): array
+  protected function _filterByManagedLibraries(array $profils): array
   {
-    if ($id_zone && 'ALL' !== $id_zone && 'PORTAIL' !== $id_zone)
-      $bibs = array_merge($bibs, array_map(fn($elt) => $elt->getId(),
-                                           Class_Bib::query()
-                                           ->eq('id_zone', $id_zone)
-                                           ->fetchAll()));
+    $filtered = [];
+    $managed_libraries = array_filter(Class_Users::getIdentity()
+                                      ->managedLibraryIds());
 
-    $query = Class_Profil::query();
-    if (count($bibs) >= 1)
-      $query = $query->in('id_site', $bibs);
+    foreach ($profils as $profil)
+      if ($profil->hasOneOfManagedLibraries($managed_libraries))
+        $filtered[] = $profil;
 
-    return $query
-      ->order('libelle')
-      ->fetchAll();
+    return $filtered;
   }
 
 
@@ -403,7 +437,7 @@ class Class_Profil extends Storm_Model_Abstract {
          'display_current_profil_on_breadcrumb' => false,
          'ref_description' => '',
          'ref_tags' => '',
-         'id_site' => 0,
+         'id_site' => '',
          'sel_section' => '',
          'sel_annexe' => '',
          'sel_type_doc' => '',
@@ -2555,6 +2589,29 @@ class Class_Profil extends Storm_Model_Abstract {
   }
 
 
+  public function hasOneOfManagedLibraries(array $managed_library_ids): bool
+  {
+    foreach ($this->getLibraryIds() as $library_id)
+      if (in_array($library_id, $managed_library_ids))
+        return true;
+
+    return false;
+  }
+
+
+  public function setLibraryIds($ids): self
+  {
+    $this->setIdSite(implode(' ', explode(';', $ids)));
+    return $this;
+  }
+
+
+  public function getLibraryIds(): array
+  {
+    return explode(' ', $this->getIdSite());
+  }
+
+
   public function getAlienLoginPage() {
     return ($login_page = $this->getLoginPage())
       && !$this->isMyselfMyOwnLoginPage()
diff --git a/library/Class/Profil/ItemsFilter.php b/library/Class/Profil/ItemsFilter.php
index 8bc57c361cc75d2d762211033a8755d30d05eac8..3dc810a395314c876e04f4db1520a5171f51e4e5 100644
--- a/library/Class/Profil/ItemsFilter.php
+++ b/library/Class/Profil/ItemsFilter.php
@@ -22,7 +22,7 @@
 
 class Class_Profil_ItemsFilter {
   public function select($profil, $items) : array {
-    $filter_item_from_profil = ['id_bib' => array_filter([$profil->getIdSite()]),
+    $filter_item_from_profil = ['id_bib' => array_filter($profil->getLibraryIds()),
                                 'annexe' => $profil->getSelAnnexCodes(),
                                 'section' => $profil->getSelSectionIds()];
 
@@ -46,4 +46,4 @@ class Class_Profil_ItemsFilter {
                         fn($item) => in_array($item->callGetterByAttributeName($item_attribute),
                                         $values));
   }
-}
\ No newline at end of file
+}
diff --git a/library/Class/User/SearchCriteria.php b/library/Class/User/SearchCriteria.php
index c3703687f227650457ac06989f0d889c8fd6a3c0..b4ec4de14df9f8a5714de99c6cf8e813b2b70d1c 100644
--- a/library/Class/User/SearchCriteria.php
+++ b/library/Class/User/SearchCriteria.php
@@ -100,6 +100,37 @@ class Class_User_SearchCriteriaLibrary extends Class_SearchCriteria_Select {
 
 
 
+class Class_User_SearchCriteriaMultiLibraries extends Class_User_SearchCriteriaLibrary
+{
+
+  public function buildElement(): ?Zend_Form_Element
+  {
+    return new ZendAfi_Form_Element_CochesSuggestion($this->getName(),
+                                                     ['label' => $this->_('Bibliothèques'),
+                                                      'rubrique' => 'libraries',
+                                                      'value' => $this->_value]);
+  }
+
+
+  public function acceptSearchVisitor($visitor): Class_SearchCriteria_Abstract
+  {
+    if ( ! $this->_isAllValues())
+      $visitor->addQueryClause(fn($query) => $query
+                               ->in($this->_name, explode(';', $this->_value)));
+
+    return $this;
+  }
+
+
+  public function modelMatch(Storm_Model_Abstract $user): bool
+  {
+    return $this->_isAllValues() || in_array($user->getIdSite(), explode(';', $this->_value));
+  }
+}
+
+
+
+
 class Class_User_SearchCriteriaSearchFor extends Class_SearchCriteria_Abstract {
 
   protected string $_name = 'search_for';
diff --git a/library/Class/UserGroup/Filter.php b/library/Class/UserGroup/Filter.php
index 8ffe3340d87386157adfa94834a8289b211d34fc..b1584d625a6742a02bae2c2b76d1787dc2ad9bb3 100644
--- a/library/Class/UserGroup/Filter.php
+++ b/library/Class/UserGroup/Filter.php
@@ -24,6 +24,8 @@ class Class_UserGroup_Filter extends Class_User_SearchCriteria {
   public function __construct($params) {
     parent::__construct($params);
     $this->replaceCriteria(Class_User_SearchCriteria_RoleLevelLimited::class,
-                           new Class_User_SearchCriteria_RequiredRoleLevel($params));
+                           new Class_User_SearchCriteria_RequiredRoleLevel($params))
+         ->replaceCriteria(Class_User_SearchCriteriaLibrary::class,
+                           new Class_User_SearchCriteriaMultiLibraries($params));
   }
 }
diff --git a/library/Class/Users.php b/library/Class/Users.php
index 982f28025266186b0e58703a69c511a90da4b7d9..4a6e184632c7e23087e74f2068859ffbcdb094ea 100644
--- a/library/Class/Users.php
+++ b/library/Class/Users.php
@@ -672,6 +672,13 @@ class Class_Users extends Storm_Model_Abstract {
   }
 
 
+  public function isModo(): bool
+  {
+    return $this->getRoleLevel() == ZendAfi_Acl_AdminControllerRoles::MODO_BIB
+      || $this->getRoleLevel() == ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL;
+  }
+
+
   /**
    * @return bool
    */
@@ -708,6 +715,12 @@ class Class_Users extends Storm_Model_Abstract {
   }
 
 
+  public function isAdminBibOrMore(): bool
+  {
+    return $this->getRoleLevel() >= ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB;
+  }
+
+
   public function isRedacteurBib(): bool
   {
     return $this->getRoleLevel() == ZendAfi_Acl_AdminControllerRoles::MODO_BIB;
@@ -2109,7 +2122,7 @@ class Class_Users extends Storm_Model_Abstract {
       return true;
 
     return $this->isAdminBib()
-      ? ($this->getIdSite() === $profile->getIdSite())
+      ? $profile->hasOneOfManagedLibraries($this->managedLibraryIds())
       : $this->hasRightConfigFront() ;
   }
 
diff --git a/library/ZendAfi/Controller/Plugin/DefineURLs.php b/library/ZendAfi/Controller/Plugin/DefineURLs.php
index 138c052c8dace69c3295e0d9e77f877809f976ce..1bfc490dc2b53698052e230a362b3fcfdf2f2ba6 100644
--- a/library/ZendAfi/Controller/Plugin/DefineURLs.php
+++ b/library/ZendAfi/Controller/Plugin/DefineURLs.php
@@ -190,7 +190,7 @@ class ZendAfi_Controller_Plugin_DefineURLs extends Zend_Controller_Plugin_Abstra
       // Si role admin_site on force la zone et la bib
       if ((null !== ($user = Class_Users::getLoader()->getIdentity()))
           && (null !== ($bib = $user->getBib()))
-          && (!$user->isModoPortailOrMore())
+          && (!$user->isAdminBibOrMore())
       ) {
         $id_bib = $bib->getId();
         $id_zone = $bib->getIdZone();
diff --git a/library/ZendAfi/Form/Configuration/Profile.php b/library/ZendAfi/Form/Configuration/Profile.php
index c1e210080224a60af391ea9879d29952d692a545..c1885adb69d63a8477d6bbd0d0aeeb522bc54fd3 100644
--- a/library/ZendAfi/Form/Configuration/Profile.php
+++ b/library/ZendAfi/Form/Configuration/Profile.php
@@ -303,9 +303,12 @@ class ZendAfi_Form_Configuration_Profile extends ZendAfi_Form {
                    'tags_info',
                    ['value' => $this->_('Entrez la liste des mots-clef et expressions qui caractérisent votre site séparés par des virgules.')])
 
-      ->addElement('comboLibraries',
-                   'id_site',
-                   ['label' => $this->_('Bibliothèque')])
+      ->addElement('cochesSuggestion',
+                   'library_ids',
+                   ['label' => $this->_('Bibliothèque(s)'),
+                    'name' => 'library_ids',
+                    'rubrique' => 'libraries',
+                    'selected_all_means_nothing' => false])
 
       ->addElement('cochesSuggestion',
                    'sel_annexe',
@@ -378,7 +381,7 @@ class ZendAfi_Form_Configuration_Profile extends ZendAfi_Form {
                         'referencement_group',
                         ['legend' => $this->_('Référencement')])
 
-      ->addDisplayGroup(['id_site',
+      ->addDisplayGroup(['library_ids',
                          'sel_annexe',
                          'sel_section',
                          'sel_type_doc',
@@ -406,4 +409,11 @@ class ZendAfi_Form_Configuration_Profile extends ZendAfi_Form {
       $datas[$domain->getId()] = $domain->getLibelle();
     return $datas;
   }
-}
\ No newline at end of file
+
+  public function populate(array $values) : self {
+    $values['library_ids'] = implode(';', explode(' ', $values['id_site'] ?? ''));
+    parent::populate($values);
+
+    return $this;
+  }
+}
diff --git a/tests/application/modules/admin/controllers/BibControllerTest.php b/tests/application/modules/admin/controllers/BibControllerTest.php
index c2548059e88899a71f6e07e56d7e976acf86d25e..f6075c3322089be4c2e2a4fab4888cb8756f938c 100644
--- a/tests/application/modules/admin/controllers/BibControllerTest.php
+++ b/tests/application/modules/admin/controllers/BibControllerTest.php
@@ -37,6 +37,7 @@ abstract class BibControllerTestCase extends Admin_AbstractControllerTestCase {
 
     $profil_cran = $this->fixture(Class_Profil::class,
                                   ['id' => 34,
+                                   'id_site' => '2',
                                    'libelle' => 'Cran/Accueil']);
 
     $this->fixture(Class_CosmoVar::class,
diff --git a/tests/application/modules/admin/controllers/NewsletterControllerTest.php b/tests/application/modules/admin/controllers/NewsletterControllerTest.php
index 7270c0a5d8cc90ddd0269f26e4039c52032c0e68..883738502d9c999c969d36fab3dc219ccd5ea0e0 100644
--- a/tests/application/modules/admin/controllers/NewsletterControllerTest.php
+++ b/tests/application/modules/admin/controllers/NewsletterControllerTest.php
@@ -96,7 +96,7 @@ class Admin_NewsletterControllerIndexActionTest extends Admin_NewsletterControll
 
   /** @test */
   public function requestsShouldExists() {
-    $this->assertSql("SELECT `bib_admin_users`.`id_user` AS `id` FROM `bib_admin_users` WHERE (`bib_admin_users`.`id_site` = 1 AND `bib_admin_users`.`role_level` = 2) ORDER BY `bib_admin_users`.`nom` ASC");
+    $this->assertSql("SELECT `bib_admin_users`.`id_user` AS `id` FROM `bib_admin_users` WHERE (`bib_admin_users`.`id_site` IN ('1') AND `bib_admin_users`.`role_level` = 2) ORDER BY `bib_admin_users`.`nom` ASC");
   }
 
 
diff --git a/tests/application/modules/admin/controllers/ProfilControllerManagedLibrariesTest.php b/tests/application/modules/admin/controllers/ProfilControllerManagedLibrariesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1ad49dfe8966fdac31f281c68a1add33b3544d4b
--- /dev/null
+++ b/tests/application/modules/admin/controllers/ProfilControllerManagedLibrariesTest.php
@@ -0,0 +1,531 @@
+<?php
+/**
+ * Copyright (c) 2012-2024, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * 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
+ */
+
+
+abstract class ProfilControllerManagedLibrariesTestCase extends Admin_AbstractControllerTestCase
+{
+  public function setUp()
+  {
+    parent::setUp();
+
+    $this->fixture(Class_Bib::class, ['id' => 21,
+                                      'libelle' => 'One']);
+
+    $this->fixture(Class_Bib::class, ['id' => 22,
+                                      'libelle' => 'Two']);
+
+    $this->fixture(Class_Bib::class, ['id' => 23,
+                                      'libelle' => 'Three']);
+
+    $this->fixture(Class_Profil::class,
+                   ['id' => 428,
+                    'libelle' => 'Accueil MyBibApp',
+                    'id_site' => '21']);
+
+    $this->fixture(Class_Profil::class,
+                   ['id' => 429,
+                    'libelle' => 'Ressources numériques',
+                    'id_site' => '22']);
+
+    $this->fixture(Class_Profil::class,
+                   ['id' => 430,
+                    'libelle' => 'Accueil principal',
+                    'id_site' => '21 23']);
+
+
+    ZendAfi_Auth::getInstance()->logUser($this->_getLoggedUser());
+  }
+
+
+  protected function _createLoggedUser(): Class_Users
+  {
+    return $this->fixture(Class_Users::class,
+                          ['id' => 1,
+                           'login' => 'logged_in',
+                           'password' => 'secret',
+                           'id_site' => 1,
+                           'managed_libraries' => '',
+                           'role_level' => ZendAfi_Acl_AdminControllerRoles::SUPER_ADMIN,
+                           'last_login' => 0])
+                ->addUserGroup($this->_group);
+  }
+
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser();
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesEditAsSuperAdminTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+    $this->dispatch('/admin/profil/edit/id_profil/428');
+  }
+
+
+  /** @test */
+  public function multiInputLibraryIdsShouldExist()
+  {
+    $this->assertXPath('//input[@name="library_ids"]');
+  }
+
+
+  /** @test */
+  public function libraryOneShouldBeInLibraryIdsElement()
+  {
+    $this->assertxpath('//input[@data-clef="21"]');
+  }
+
+
+  /** @test */
+  public function libraryTwoShouldBeInLibraryIdsElement()
+  {
+    $this->assertxpath('//input[@data-clef="22"]');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesPostEditAsSuperAdminTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+    $this->postDispatch('/admin/profil/edit/id_profil/428',
+                        ['libelle' => 'Accueil MyBibApp',
+                         'library_ids' => '21;22']);
+  }
+
+
+  /** @test */
+  public function profileAccueilMybibappShouldHaveLibrayOneAndTwoSpaceSeparated()
+  {
+    $this->assertEquals('21 22', Class_Profil::find(428)->getIdSite());
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesIndexAsSuperAdminTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+    $this->dispatch('/admin/profil/index');
+  }
+
+
+  /** @test */
+  public function libraryOneShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/h2', 'One');
+  }
+
+
+  /** @test */
+  public function libraryTwoShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/h2', 'Two');
+  }
+
+
+  /** @test */
+  public function profilAccueilMybibappShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Accueil MyBibApp');
+  }
+
+
+  /** @test */
+  public function profilRessourcesNumeriquesShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Ressources numériques');
+  }
+
+
+  /** @test */
+  public function profilAccueilPrincipalShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Accueil principal');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesIndexAsModoBibTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+
+    $this->dispatch('/admin/profil/index?z=ALL&b=ALL');
+  }
+
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser()
+                ->setManagedLibraries('21;22;23')
+                ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_BIB);
+  }
+
+
+  /** @test */
+  public function modoBibShouldNotAccessProfilIndex()
+  {
+    $this->assertRedirect('/opac/index');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesIndexAsModoPortailTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+
+    $this->dispatch('/admin/profil/index?z=ALL&b=ALL');
+  }
+
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser()
+                ->setManagedLibraries('21;22;23')
+                ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);
+  }
+
+
+  /** @test */
+  public function modoPortalShouldNotAccessProfilIndex()
+  {
+    $this->assertRedirect('/opac/index');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesIndexAsAdminBibTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+
+    $this->dispatch('/admin/profil/index?z=ALL&b=ALL');
+  }
+
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser()
+                ->setManagedLibraries('22;23')
+                ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB);
+  }
+
+
+  /** @test */
+  public function libraryOneShouldNotBePresent()
+  {
+    $this->assertNotXPathContentContains('//div[@class="profils"]/h2', 'One');
+  }
+
+
+  /** @test */
+  public function libraryTwoShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/h2', 'Two');
+  }
+
+
+  /** @test */
+  public function libraryThreeShouldNotBePresent()
+  {
+    $this->assertNotXPathContentContains('//div[@class="profils"]/h2', 'Three');
+  }
+
+
+  /** @test */
+  public function profilAccueilMybibappShouldNotBePresent()
+  {
+    $this->assertNotXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Accueil MyBibApp');
+  }
+
+
+  /** @test */
+  public function profilRessourcesNumeriquesShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Ressources numériques');
+  }
+
+
+  /** @test */
+  public function profilAccueilPrincipalShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Accueil principal');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesIndexAsAdminPortailTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+
+    $this->dispatch('/admin/profil/index?z=ALL&b=ALL');
+  }
+
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser()
+                ->setManagedLibraries('')
+                ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL);
+  }
+
+
+  /** @test */
+  public function libraryOneShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/h2', 'One');
+  }
+
+
+  /** @test */
+  public function libraryTwoShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/h2', 'Two');
+  }
+
+
+  /** @test */
+  public function profilAccueilMybibappShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Accueil MyBibApp');
+  }
+
+
+  /** @test */
+  public function profilRessourcesNumeriquesShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Ressources numériques');
+  }
+
+
+  /** @test */
+  public function profilAccueilPrincipalShouldBePresent()
+  {
+    $this->assertXPathContentContains('//div[@class="profils"]/ul/li/div',
+                                      'Accueil principal');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesEditAsModoBibTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser()
+                ->setManagedLibraries('21;22;23')
+                ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_BIB);
+  }
+
+
+  /** @test */
+  public function userShouldEditAccueilMybibapp()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/428');
+    $this->assertRedirect('/opac/index');
+  }
+
+
+  /** @test */
+  public function userShouldEditRessourceNumerique()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/429');
+    $this->assertRedirect('/opac/index');
+  }
+
+
+  /** @test */
+  public function userShouldEditAccueilPrincipal()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/430');
+    $this->assertRedirect('/opac/index');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesEditAsAdminBibTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser()
+                ->setManagedLibraries('21;23')
+                ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB);
+  }
+
+
+  /** @test */
+  public function userShouldEditAccueilMybibapp()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/428');
+    $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/428"]');
+  }
+
+
+  /** @test */
+  public function userShouldEditRessourceNumerique()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/429');
+    $this->assertRedirect('/opac/index');
+  }
+
+
+  /** @test */
+  public function userShouldEditAccueilPrincipal()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/430');
+    $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/430"]');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesEditAsModoPortailTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser()
+                ->setManagedLibraries('21;22;23')
+                ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::MODO_PORTAIL);
+  }
+
+
+  /** @test */
+  public function userShouldEditAccueilMybibapp()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/428');
+    $this->assertRedirect('/opac/index');
+  }
+
+
+  /** @test */
+  public function userShouldEditRessourceNumerique()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/429');
+    $this->assertRedirect('/opac/index');
+  }
+
+
+  /** @test */
+  public function userShouldEditAccueilPrincipal()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/430');
+    $this->assertRedirect('/opac/index');
+  }
+}
+
+
+
+
+class ProfilControllerManagedLibrariesEditAsAdminPortailTest
+  extends ProfilControllerManagedLibrariesTestCase
+{
+
+  protected function _getLoggedUser(): Class_Users
+  {
+    return $this->_createLoggedUser()
+                ->setManagedLibraries('21;22;23')
+                ->setRoleLevel(ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL);
+  }
+
+
+  /** @test */
+  public function userShouldEditAccueilMybibapp()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/428');
+    $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/428"]');
+  }
+
+
+  /** @test */
+  public function userShouldEditRessourceNumerique()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/429');
+    $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/429"]');
+  }
+
+
+  /** @test */
+  public function userShouldEditAccueilPrincipal()
+  {
+    $this->dispatch('/admin/profil/edit/id_profil/430');
+    $this->assertXPath('//form[@action="/admin/profil/edit/id_profil/430"]');
+  }
+}
diff --git a/tests/application/modules/admin/controllers/ProfilControllerTest.php b/tests/application/modules/admin/controllers/ProfilControllerTest.php
index 54a91eb543e3d01b0bd045d89d302da55369e1d7..9b8194b76e7f0a18a95d77cd42fe72351b8df891 100644
--- a/tests/application/modules/admin/controllers/ProfilControllerTest.php
+++ b/tests/application/modules/admin/controllers/ProfilControllerTest.php
@@ -174,7 +174,7 @@ class Admin_ProfilControllerEditProfilJeunesseTest extends Admin_ProfilControlle
 
   /** @test */
   public function shouldDisplayBibSelection() {
-    $this->assertXPath('//select[@name="id_site"]');
+    $this->assertXPath('//input[@name="library_ids"]');
   }
 
 
@@ -1577,13 +1577,15 @@ class Admin_ProfilControllerEditLibraryFilterTest extends Admin_AbstractControll
                                              ['id' => 12,
                                               'libelle' => 'Haute-Savoie'])]);
 
+    Class_Profil::find(1)->setIdSite('9')->assertSave();
+
     $this->dispatch('/admin/profil/edit/id_profil/1', true);
   }
 
 
   /** @test */
   public function annecyFilterShouldBePresent() {
-    $this->assertXPathContentContains('//select[@name="id_site"]//option[@value="9"]',
+    $this->assertXPathContentContains('//div[@id="library_ids_aff"]/span[@class="selected"]',
                                       'Annecy');
   }
 }
diff --git a/tests/application/modules/admin/controllers/UserGroupControllerTest.php b/tests/application/modules/admin/controllers/UserGroupControllerTest.php
index 3d13fa3979ca20537cdc0660846499806d018fb7..2573205d318f5555d550d1643ab1ea2672b99c3c 100644
--- a/tests/application/modules/admin/controllers/UserGroupControllerTest.php
+++ b/tests/application/modules/admin/controllers/UserGroupControllerTest.php
@@ -258,7 +258,7 @@ class Admin_UserGroupControllerIndexTest extends Admin_UserGroupControllerTestCa
   public function requestShouldExists() {
     $this->assertSqlEquals(["SELECT `int_bib`.`sigb`, `int_bib`.`comm_params` FROM `int_bib` WHERE (`int_bib`.`sigb` != 0) GROUP BY `int_bib`.`sigb`, `int_bib`.`comm_params`",
                             "SELECT COUNT(*) AS `numberof` FROM `bib_admin_users`",
-                            "SELECT COUNT(*) AS `numberof` FROM `bib_admin_users` WHERE (`bib_admin_users`.`id_site` = '9' AND `bib_admin_users`.`role_level` = '3')"]);
+                            "SELECT COUNT(*) AS `numberof` FROM `bib_admin_users` WHERE (`bib_admin_users`.`id_site` IN ('9') AND `bib_admin_users`.`role_level` = '3')"]);
   }
 
 
@@ -753,13 +753,13 @@ class Admin_UserGroupControllerEditGroupModerateursBibTest
 
   /** @test */
   public function librarySelectShouldBePresent() {
-    $this->assertXPath('//select[@name="search_id_site"]');
+    $this->assertXPath('//input[@name="search_id_site"]');
   }
 
 
   /** @test */
   public function librarySelectShouldHaveAnnecySelected() {
-    $this->assertXPath('//select[@name="search_id_site"]//option[@value="9"][@selected="selected"]');
+    $this->assertXPathContentContains('//div[@id="search_id_site_aff"]/span', 'Annecy');
   }
 }
 
@@ -1645,6 +1645,102 @@ class Admin_UserGroupControllerEditMembersWithPaginationAsAutomaticUserGroupTest
 
 
 
+class Admin_UserGroupControllerEditMembersWithMultiLibrariesDynamicUserGroupTest
+  extends Admin_AbstractControllerTestCase {
+
+  public function setup() {
+    parent::setup();
+
+    $this->fixture(Class_Users::class,
+                   ['id' => 10001,
+                    'idabon' => 10001,
+                    'nom' => 'User 10001',
+                    'login' => 'user10001',
+                    'last_login' => '',
+                    'password' => 'secret',
+                    'id_site' => 20001,
+                    'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB]);
+
+    $this->fixture(Class_Users::class,
+                   ['id' => 10002,
+                    'idabon' => 10002,
+                    'nom' => 'User 10002',
+                    'login' => 'user10002',
+                    'last_login' => '',
+                    'password' => 'secret',
+                    'id_site' => 20002,
+                    'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB]);
+
+    $this->fixture(Class_Users::class,
+                   ['id' => 10003,
+                    'idabon' => 10003,
+                    'nom' => 'User 10003',
+                    'login' => 'user10003',
+                    'last_login' => '',
+                    'password' => 'secret',
+                    'id_site' => 20001,
+                    'role_level' => ZendAfi_Acl_AdminControllerRoles::MODO_BIB]);
+
+    $this->fixture(Class_Users::class,
+                   ['id' => 10004,
+                    'idabon' => 10004,
+                    'nom' => 'User 10004',
+                    'login' => 'user10004',
+                    'last_login' => '',
+                    'password' => 'secret',
+                    'id_site' => 20003,
+                    'role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB]);
+
+    $this->fixture(Class_UserGroup::class,
+                   ['id' => 1,
+                    'protected' => false,
+                    'libelle' => "Group",
+                    'group_type' => Class_UserGroup::TYPE_DYNAMIC,
+                    'filters' => json_encode(['search_role_level' => ZendAfi_Acl_AdminControllerRoles::ABONNE_SIGB,
+                                              'search_id_site' => '20001;20002'])]);
+
+    $this->dispatch('admin/usergroup/editmembers/id/1');
+  }
+
+
+  /** @test */
+  public function nb2UsersShouldBeDisplay() {
+    $this->assertXPathContentContains('//div','2 utilisateurs');
+  }
+
+
+  /** @test */
+  public function user10001ShouldBeDisplayed()
+  {
+    $this->assertXPathContentContains('//tbody/tr/td', 'User 10001');
+  }
+
+
+  /** @test */
+  public function user10002ShouldBeDisplayed()
+  {
+    $this->assertXPathContentContains('//tbody/tr/td', 'User 10002');
+  }
+
+
+  /** @test */
+  public function user10003ShouldNotBeDisplayed()
+  {
+    $this->assertNotXPathContentContains('//tbody/tr/td', 'User 10003');
+  }
+
+
+  /** @test */
+  public function user10004ShouldNotBeDisplayed()
+  {
+    $this->assertNotXPathContentContains('//tbody/tr/td', 'User 10004');
+  }
+}
+
+
+
+
+
 class Admin_UserGroupControllerEditMembersNewsletterDedicatedUserGroupTest
   extends Admin_AbstractControllerTestCase {
 
diff --git a/tests/application/modules/admin/controllers/UsersControllerDynamicGroupsTest.php b/tests/application/modules/admin/controllers/UsersControllerDynamicGroupsTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..adb9d0a29503cf405e37ffb018f2bfc75036bc58
--- /dev/null
+++ b/tests/application/modules/admin/controllers/UsersControllerDynamicGroupsTest.php
@@ -0,0 +1,109 @@
+<?php
+/**
+ * Copyright (c) 2012-2024, Agence Française Informatique (AFI). All rights reserved.
+ *
+ * BOKEH is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE as published by
+ * the Free Software Foundation.
+ *
+ * There are special exceptions to the terms and conditions of the AGPL as it
+ * is applied to this software (see README file).
+ *
+ * BOKEH is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * 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
+ */
+
+
+abstract class UsersControllerDynamicGroupsTestCase extends Admin_AbstractControllerTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+
+    $this->fixture(Class_UserGroupCategorie::class,
+                   ['id' => 1001,
+                    'libelle' => 'Etablissement',
+                    'parent_id' => 0]);
+
+    $this->fixture(Class_UserGroup::class,
+                   ['id' => 101,
+                    'id_cat' => 1001,
+                    'protected' => false,
+                    'libelle' => 'Admin portail',
+                    'group_type' => Class_UserGroup::TYPE_DYNAMIC,
+                    'users' => [],
+                    'rights' => [],
+                    'filters' => json_encode(['search_role_level' => '6',
+                                              'search_id_site' => '1;2'])]);
+
+    $this->fixture(Class_UserGroup::class,
+                   ['id' => 102,
+                    'id_cat' => 1001,
+                    'protected' => false,
+                    'libelle' => 'Admin bibliothèque',
+                    'group_type' => Class_UserGroup::TYPE_DYNAMIC,
+                    'users' => [],
+                    'rights' => [],
+                    'filters' => json_encode(['search_role_level' => '4',
+                                              'search_id_site' => '3'])]);
+
+    $this->fixture(Class_UserGroup::class,
+                   ['id' => 103,
+                    'id_cat' => 1001,
+                    'protected' => false,
+                    'libelle' => 'Contributeurs',
+                    'group_type' => Class_UserGroup::TYPE_DYNAMIC,
+                    'users' => [],
+                    'rights' => [],
+                    'filters' => json_encode(['search_id_site' => '1'])]);
+  }
+
+
+  protected function _jsonContainsGroup(string $group_name): bool
+  {
+    $response = json_decode($this->_response->getBody());
+    foreach ($response[0]->categories[0]->items as $group)
+      if ($group->label == $group_name)
+        return true;
+
+    return false;
+  }
+}
+
+
+
+
+class UsersControllerDynamicGroupsAdminPortailTest extends UsersControllerDynamicGroupsTestCase
+{
+
+  public function setUp()
+  {
+    parent::setUp();
+
+    $this->fixture(Class_Users::class,
+                   ['id' => 201,
+                    'nom' => 'User 201',
+                    'last_login' => '',
+                    'idabon' => 201,
+                    'login' => 'user201',
+                    'password' => 'secret',
+                    'id_site' => 1,
+                    'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_PORTAIL]);
+
+    $this->dispatch('/admin/users/edit/id/201');
+  }
+
+
+  /** @test */
+  public function user201ShouldBeMemberOfGroupAdminPortailAndContributeurs()
+  {
+    $this->assertXPath('//input[@id="user_group_ids"][@value="101-103"]');
+  }
+}
diff --git a/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php b/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php
index 3d184848dace299a7aca0c9cde121c90bc5ad2be..ccc3aa881895d73c7d175db9675c7267447bac50 100644
--- a/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php
+++ b/tests/application/modules/opac/controllers/CmsControllerCalendarActionTest.php
@@ -48,6 +48,7 @@ abstract class CmsControllerCalendarActionTestCase
                    ['id' => 3,
                     'browser' => 'opac',
                     'libelle' => 'Rendez-vous',
+                    'id_site' => '1 2',
                     'cfg_accueil' => $this->cfg_accueil]);
 
     Class_AdminVar::newInstanceWithId('CACHE_ACTIF',
@@ -236,7 +237,7 @@ class CmsControllerCalendarActionWithMultipleFiltersTest
     $common_preferences = ['display_order' => 'EventDebut',
                            'id_categorie' => '12-2',
                            'events_only' => true,
-                           'id_bib' => 0,
+                           'id_bib' => [1, 2],
                            'id_lieu' => '',
                            'published' =>true,
     ];
@@ -258,6 +259,7 @@ class CmsControllerCalendarActionWithMultipleFiltersTest
       ->answers([$this->_permaculture])
       ->whenCalled('getArticlesByPreferences')
       ->with(array_merge($common_preferences, ['event_date' => '',
+                                               'id_categorie' => '12-2',
                                                'custom_fields' => [2 => [0 => 'culture'],
                                                                    20 => [0 => 'jardinage']],
                                                'event_start_after' => '2014-07',
@@ -321,7 +323,7 @@ abstract class CmsControllerCalendarActionWithFiltersTestCase
     $this->_common_preferences = ['display_order' => 'EventDebut',
                                   'id_categorie' => '12-2',
                                   'events_only' => true,
-                                  'id_bib' => 0,
+                                  'id_bib' => [1, 2],
                                   'id_lieu' => '',
                                   'custom_fields' => [2 =>[0 => $this->getSetupValueIdForString('opac')]],
                                   'published' => true];
@@ -592,7 +594,7 @@ class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '2014-09',
-                 'id_bib' => 0,
+                 'id_bib' => [1, 2],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true])
@@ -603,7 +605,7 @@ class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '2014-09',
-                 'id_bib' => 0,
+                 'id_bib' => [1, 2],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -615,7 +617,7 @@ class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '',
-                 'id_bib' => 0,
+                 'id_bib' => [1, 2],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -629,7 +631,7 @@ class CmsControllerCalendarActionWithDayTest extends AbstractControllerTestCase
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '2014-09-30',
-                 'id_bib' => 0,
+                 'id_bib' => [1, 2],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true])
@@ -1471,7 +1473,7 @@ class CmsControllerCalendarActionWithOutDateTest extends AbstractControllerTestC
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '2014-09',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -1483,7 +1485,7 @@ class CmsControllerCalendarActionWithOutDateTest extends AbstractControllerTestC
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -1496,7 +1498,7 @@ class CmsControllerCalendarActionWithOutDateTest extends AbstractControllerTestC
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '2014-09',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true])
@@ -1613,7 +1615,7 @@ class CmsControllerCalenderWithAllCatSelectedAndIdCategorieSetTest
                  'id_categorie' => '12-2',
                  'events_only' => true,
                  'event_date' => '2018-09',
-                 'id_bib' => 0,
+                 'id_bib' => [1, 2],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -1673,7 +1675,7 @@ class CmsControllerCalenderWithAllCatSelectedAndIdCategorieEmptyTest
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '2018-09',
-                 'id_bib' => 0,
+                 'id_bib' => [1, 2],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -1713,7 +1715,7 @@ class CmsControllerCalendarActionWithFiltersTagTest
               'id_categorie' => '12-2',
               'events_only' => true,
               'event_date' => '2011-02',
-              'id_bib' => 0,
+              'id_bib' => [1, 2],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => false])
@@ -1725,7 +1727,7 @@ class CmsControllerCalendarActionWithFiltersTagTest
               'id_categorie' => '12-2',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [1, 2],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => false,
diff --git a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
index ae741d95df5f2c459e7e062e275810b035c70736..1e8cd2fab290a61c6e38c92d7a8bf085c1532ad6 100644
--- a/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
+++ b/tests/application/modules/opac/controllers/ProfilOptionsControllerTest.php
@@ -2569,7 +2569,7 @@ class ProfilOptionsControllerProfilBoiteCalendarWithFilterOnMonthsTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2050-03',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
@@ -2617,7 +2617,7 @@ class ProfilOptionsControllerProfilBoiteCalendarWithNoFilterTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2050-03',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -2629,7 +2629,7 @@ class ProfilOptionsControllerProfilBoiteCalendarWithNoFilterTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -2687,7 +2687,7 @@ class ProfilOptionsControllerWidgetCalendarWithDisplayFullPageDeactivateShouldUs
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2050-03',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -2699,7 +2699,7 @@ class ProfilOptionsControllerWidgetCalendarWithDisplayFullPageDeactivateShouldUs
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -2712,7 +2712,7 @@ class ProfilOptionsControllerWidgetCalendarWithDisplayFullPageDeactivateShouldUs
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2050-03',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
diff --git a/tests/library/Class/ArticleLoaderTest.php b/tests/library/Class/ArticleLoaderTest.php
index f9b2a94a6af3fd97929526b3204d4d27084c283f..72c10b746a6823d163d535f094976ee7c8b8390f 100644
--- a/tests/library/Class/ArticleLoaderTest.php
+++ b/tests/library/Class/ArticleLoaderTest.php
@@ -253,9 +253,9 @@ class ArticleLoaderGetArticlesByPreferencesTest
                         'id_items' => '',
                         'id_categorie' => '',
                         'event_date' => '2011-03',
-                        'id_bib' => 5]);
+                        'id_bib' => ['5']]);
 
-    $this->assertSelect(sprintf("INNER JOIN `cms_categorie` ON cms_categorie.ID_CAT = cms_article.ID_CAT WHERE %s AND (cms_categorie.ID_SITE=5) AND (left(EVENTS_DEBUT,7) <= '2011-03') AND (left(EVENTS_FIN,7) >= '2011-03') AND (PARENT_ID=0) ORDER BY `DATE_CREATION` DESC",
+    $this->assertSelect(sprintf("INNER JOIN `cms_categorie` ON cms_categorie.ID_CAT = cms_article.ID_CAT WHERE %s AND (cms_categorie.ID_SITE IN ('5')) AND (left(EVENTS_DEBUT,7) <= '2011-03') AND (left(EVENTS_FIN,7) >= '2011-03') AND (PARENT_ID=0) ORDER BY `DATE_CREATION` DESC",
                                 self::WHERE_VISIBLE_CLAUSE));
   }
 
@@ -314,6 +314,14 @@ class ArticleLoaderGetArticlesByPreferencesTest
 
     $this->assertSelect('WHERE (PARENT_ID=0) ORDER BY `DATE_CREATION` DESC');
   }
+
+
+  /** @test */
+  public function withIdSiteOneAndTwoShouldFilterWithIn()
+  {
+    $this->getArticles(['id_bib' => ['1', '2']]);
+    $this->assertSelect("INNER JOIN `cms_categorie` ON cms_categorie.ID_CAT = cms_article.ID_CAT WHERE ((DEBUT IS NULL) OR (DEBUT <= CURDATE())) AND ((FIN IS NULL) OR (FIN >= CURDATE())) AND (cms_categorie.ID_SITE IN ('1','2')) AND (PARENT_ID=0) ORDER BY `DATE_CREATION` DESC");
+  }
 }
 
 
diff --git a/tests/library/Class/ProfilTest.php b/tests/library/Class/ProfilTest.php
index 4990f7956179b6fe634618fb52989d606015401f..88ea6f23d333778d5bad2d0eb12489cc62f00d09 100644
--- a/tests/library/Class/ProfilTest.php
+++ b/tests/library/Class/ProfilTest.php
@@ -1828,36 +1828,46 @@ class ProfilfindByZoneAndBibsTest extends ModelTestCase {
                     'libelle' => 'BaskerVille',
                     'id_zone' => 1
                    ]);
+
+    $abon = $this->fixture(Class_Users::class,
+                           ['id' => 1826,
+                            'login' => 'huguette',
+                            'password' => 'secret',
+                            'id_site' => 1,
+                            'managed_libraries' => '1;3;4',
+                            'role_level' => ZendAfi_Acl_AdminControllerRoles::ADMIN_BIB]);
+
+    ZendAfi_Auth::getInstance()->logUser($abon);
   }
 
 
   /** @test */
-  public function withBibs2And3FindByZoneAndBibsCountshouldEquals2() {
-    $profils = Class_Profil::findByZoneAndBibs(0, [2,3]);
-    $this->assertEquals(2, count($profils));
+  public function withManagedLibrariesOneThreeAndFourShouldGetThreeProfiles() {
+    $profils = Class_Profil::findAllByZoneAndBib(0, 0);
+    $this->assertEquals(3, count($profils));
     return $profils;
   }
 
 
   /** @test
-   *  @depends withBibs2And3FindByZoneAndBibsCountshouldEquals2
+   *  @depends withManagedLibrariesOneThreeAndFourShouldGetThreeProfiles
    */
   public function firstProfilReturnedIdShouldBe5($profils) {
-    $this->assertEquals(5, $profils[0]->getId());
+    $this->assertEquals(3, $profils[0]->getId());
   }
 
 
   /** @test
-   *  @depends withBibs2And3FindByZoneAndBibsCountshouldEquals2
+   *  @depends withManagedLibrariesOneThreeAndFourShouldGetThreeProfiles
    */
   public function secondProfilReturnedIdShouldBe3($profils) {
-    $this->assertEquals(3, $profils[1]->getId());
+    $this->assertEquals(2, $profils[1]->getId());
   }
 
 
   /** @test */
   public function withIdZone1FindByZoneAndBibsCountshouldEquals2() {
-    $profils = Class_Profil::findByZoneAndBibs(1, []);
+    $profils = Class_Profil::findAllByZoneAndBib(1, 0);
     $this->assertEquals(2, count($profils));
     return $profils;
   }
diff --git a/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php b/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php
index d950d359270c312e0573425a681989e8ffb57eac..8d0ab772360f9a0cca457adf07cee7acf5f9b5c4 100644
--- a/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php
+++ b/tests/library/ZendAfi/View/Helper/Accueil/CalendarTest.php
@@ -146,7 +146,7 @@ abstract class CalendarViewTodayTestCase extends CalendarWithEmptyPreferencesTes
                  'event_date' => '2013-08',
                  'event_end_after' => '2013-08-19',
                  'events_only' => true,
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true])
@@ -158,7 +158,7 @@ abstract class CalendarViewTodayTestCase extends CalendarWithEmptyPreferencesTes
                  'id_categorie' => '',
                  'event_date' => '2013-08',
                  'events_only' => true,
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true])
@@ -405,7 +405,7 @@ class CalendarWithPreferencesNbEventsOneTest extends CalendarWithEmptyPreference
                  'id_categorie' => '',
                  'event_end_after' => '2013-08-19',
                  'event_date' => '2013-08',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'events_only' => true,
@@ -416,7 +416,7 @@ class CalendarWithPreferencesNbEventsOneTest extends CalendarWithEmptyPreference
       ->with(['display_order' => 'EventDebut',
               'id_categorie' => '',
               'event_date' => '2013-08',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'events_only' => true,
@@ -470,7 +470,7 @@ class CalendarWithEmptyParamsLocaleEnAndOnlyTwoArticlesReturnedTest
                  'id_categorie' => '',
                  'event_date' => '2013-08',
                  'event_end_after' => '2013-08-19',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'events_only' => true,
@@ -481,7 +481,7 @@ class CalendarWithEmptyParamsLocaleEnAndOnlyTwoArticlesReturnedTest
          ->with(['display_order' => 'EventDebut',
                  'id_categorie' => '',
                  'event_start_after' => '2013-09',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'events_only' => true,
@@ -540,7 +540,7 @@ class CalendarWithCategoryLimitAndBibPreferencesTest extends CalendarViewHelperT
               'display_order' => 'DebutPublicationDesc',
               'id_categorie' => '12-3',
               'event_date' => '2011-03',
-              'id_bib' => 5,
+              'id_bib' => ['5'],
               'id_lieu' => '',
               'custom_fields' => [],
               'events_only' => true,
@@ -553,7 +553,7 @@ class CalendarWithCategoryLimitAndBibPreferencesTest extends CalendarViewHelperT
               'id_categorie' => '12-3',
               'events_only' => true,
               'event_date' => '2011-03-17',
-              'id_bib' => 5,
+              'id_bib' => ['5'],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => false
@@ -661,7 +661,7 @@ class CalendarWithWorkFlowStatusTest extends CalendarWithEmptyPreferencesTestCas
                  'id_categorie' => '',
                  'event_end_after' => '2013-08-19',
                  'event_date' => '2013-08',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'events_only' => true,
@@ -674,7 +674,7 @@ class CalendarWithWorkFlowStatusTest extends CalendarWithEmptyPreferencesTestCas
                  'display_order' => 'EventDebut',
                  'id_categorie' => '',
                  'event_date' => '2013-08',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'events_only' => true,
@@ -690,7 +690,7 @@ class CalendarWithWorkFlowStatusTest extends CalendarWithEmptyPreferencesTestCas
                  'event_date' => '',
                  'event_end_after' => '',
                  'events_only' => true,
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true
@@ -749,7 +749,7 @@ class CalendarWithCategorySelectorAndRssAndICalPreferencesTest extends CalendarV
          ->with(['display_order' => 'EventDebut',
                  'id_categorie' => '12',
                  'event_date' => '2011-12',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'events_only' => true,
@@ -762,7 +762,7 @@ class CalendarWithCategorySelectorAndRssAndICalPreferencesTest extends CalendarV
          ->with(['display_order' => 'EventDebut',
                  'id_categorie' => '12',
                  'event_date' => '2011-12-25',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'events_only' => true,
@@ -859,7 +859,7 @@ class CalendarWithCategorySelectorButNoSelectedCategoriesTest
       ->with(['display_order' => 'EventDebut',
               'id_categorie' => '',
               'event_date' => '2011-12',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'events_only' => true,
@@ -872,7 +872,7 @@ class CalendarWithCategorySelectorButNoSelectedCategoriesTest
               'display_order' => 'EventDebut',
               'id_categorie' => '',
               'event_date' => '2011-12-25',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'events_only' => true,
@@ -960,7 +960,7 @@ class CalendarOnJanuaryWithDisplayNextEventTrueTest extends CalendarViewHelperTe
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2012-01',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => false
@@ -1029,7 +1029,7 @@ class CalendarOnJanuaryWithDisplayNextEventFalseTest extends CalendarViewHelperT
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2012-01',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => false
diff --git a/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsCalendarTest.php b/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsCalendarTest.php
index 8b33f8208a6f2e31728c57879b6d688aa4d783db..ad04af098c3d3f912a59a1ddc7f84ed59afd3979 100644
--- a/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsCalendarTest.php
+++ b/tests/scenarios/ArticlesMultipleTimings/ArticlesMultipleTimingsCalendarTest.php
@@ -95,7 +95,7 @@ abstract class ArticlesMultipleTimingsCalendarTestCase extends AbstractControlle
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '2021-06',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -108,7 +108,7 @@ abstract class ArticlesMultipleTimingsCalendarTestCase extends AbstractControlle
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -125,7 +125,7 @@ abstract class ArticlesMultipleTimingsCalendarTestCase extends AbstractControlle
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true,
@@ -143,7 +143,7 @@ abstract class ArticlesMultipleTimingsCalendarTestCase extends AbstractControlle
                  'id_categorie' => '',
                  'events_only' => true,
                  'event_date' => '2021-06',
-                 'id_bib' => 0,
+                 'id_bib' => [''],
                  'id_lieu' => '',
                  'custom_fields' => [],
                  'published' => true])
diff --git a/tests/scenarios/Templates/TemplatesAgendaTest.php b/tests/scenarios/Templates/TemplatesAgendaTest.php
index 3f1c9fb33412b07670a1bfab4b0eb20a7bd6b6e4..ea1485c527f4e4554083971035f1561246776199 100644
--- a/tests/scenarios/Templates/TemplatesAgendaTest.php
+++ b/tests/scenarios/Templates/TemplatesAgendaTest.php
@@ -313,7 +313,7 @@ class TemplatesAgendaWallModeNoDateFilterTestCase
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -325,7 +325,7 @@ class TemplatesAgendaWallModeNoDateFilterTestCase
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -338,7 +338,7 @@ class TemplatesAgendaWallModeNoDateFilterTestCase
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
@@ -382,7 +382,7 @@ class TemplatesAgendaWallModeNoDateFilterAndNoEventTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -394,7 +394,7 @@ class TemplatesAgendaWallModeNoDateFilterAndNoEventTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -407,7 +407,7 @@ class TemplatesAgendaWallModeNoDateFilterAndNoEventTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
@@ -440,7 +440,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
@@ -487,7 +487,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthNoEventsTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
@@ -498,7 +498,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthNoEventsTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -534,7 +534,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthEventsInNextMonthTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
@@ -545,7 +545,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthEventsInNextMonthTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -580,7 +580,7 @@ class TemplatesAgendaWallModeSelectedMonthNextMonthTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-12',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
@@ -626,7 +626,7 @@ class TemplatesAgendaWallModeSelectedMonthNextMonthNoEventTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-12',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
@@ -637,7 +637,7 @@ class TemplatesAgendaWallModeSelectedMonthNextMonthNoEventTest
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -678,7 +678,7 @@ class TemplatesAgendaWallModeSelectedMonthIsCurrentMonthArticleWithoutEndDateTes
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2021-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])
diff --git a/tests/scenarios/Templates/TemplatesSearchItemsTest.php b/tests/scenarios/Templates/TemplatesSearchItemsTest.php
index 969ed306da804fb9b7b763d8c9161ed84ef5d864..fb00108ae1663e445e431b086c6167ef2ebeb49e 100644
--- a/tests/scenarios/Templates/TemplatesSearchItemsTest.php
+++ b/tests/scenarios/Templates/TemplatesSearchItemsTest.php
@@ -156,7 +156,7 @@ class TemplatesSearchItemsViewNoticeInSectionDocumentItemsTest
     Class_Profil::find(1)->setIdSite(23)->assertSave();
 
     ZendAfi_Auth::getInstance()->logUser(Class_Users::newInstanceWithId(54)
-                                         ->setIdSite(23)
+                                         ->setManagedLibraries(23)
                                          ->beAdminBib());
     $this->dispatch('/opac/recherche/viewnotice/id/456/id_profil/1');
     $this->assertXPath('//div[contains(@class, "wrapper_document_items")]/a[@href="/admin/modulesnotice/exemplaires/id_profil/1"]');
diff --git a/tests/scenarios/Templates/TemplatesWidgetTest.php b/tests/scenarios/Templates/TemplatesWidgetTest.php
index c7bd71e46abc8b89a0678e7ec124c03272a83958..29f6383c2e202e67ecee1a71bd4c8456dd77dc6f 100644
--- a/tests/scenarios/Templates/TemplatesWidgetTest.php
+++ b/tests/scenarios/Templates/TemplatesWidgetTest.php
@@ -288,7 +288,7 @@ class TemplatesWidgetFilterTest extends TemplatesWidgetRenderAllTestCase {
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2020-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -300,7 +300,7 @@ class TemplatesWidgetFilterTest extends TemplatesWidgetRenderAllTestCase {
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'place_town' => 'Grand Annecy',
               'custom_fields' => [],
@@ -316,7 +316,7 @@ class TemplatesWidgetFilterTest extends TemplatesWidgetRenderAllTestCase {
               'id_categorie' => '',
               'events_only' => true,
               'event_date' => '2020-11',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true
@@ -1011,7 +1011,7 @@ class TemplatesWidgetCalendarTest extends TemplatesIntonationTestCase {
               'id_categorie' => '22',
               'events_only' => true,
               'event_date' => '2020-04',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -1023,7 +1023,7 @@ class TemplatesWidgetCalendarTest extends TemplatesIntonationTestCase {
               'id_categorie' => '22',
               'events_only' => true,
               'event_date' => '',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true,
@@ -1036,7 +1036,7 @@ class TemplatesWidgetCalendarTest extends TemplatesIntonationTestCase {
               'id_categorie' => '22',
               'events_only' => true,
               'event_date' => '2020-04',
-              'id_bib' => 0,
+              'id_bib' => [''],
               'id_lieu' => '',
               'custom_fields' => [],
               'published' => true])