diff --git a/VERSIONS_HOTLINE/115655 b/VERSIONS_HOTLINE/115655
new file mode 100644
index 0000000000000000000000000000000000000000..d7c46144a660d9e9458808f748f94792b467a525
--- /dev/null
+++ b/VERSIONS_HOTLINE/115655
@@ -0,0 +1 @@
+ - ticket #115655 : Magasin thèmes : correction de la régression sur le paramètre d'affichage du lien "dissémination"
\ No newline at end of file
diff --git a/library/Class/Template.php b/library/Class/Template.php
index 63ff1ce679915654230f651af79069036e2ca946..736c97097867f566b89ac2fbd5f31404720e09a4 100644
--- a/library/Class/Template.php
+++ b/library/Class/Template.php
@@ -40,7 +40,7 @@ class Class_Template {
 
   public function __call($name, $params) {
     if (!$settings = $this->getSettings())
-      return parent::__call($name, $params);
+      return $this;
 
     if (preg_match('/(set)(\w+)/', $name, $matches)) {
       call_user_func([$settings, $name], $params[0]);
diff --git a/library/templates/Intonation/Library/Widget/Carousel/View.php b/library/templates/Intonation/Library/Widget/Carousel/View.php
index f0abc6b7df79e50c3b8e2254ceb0e924ff07d387..e261b25be35eed4c1d3e02d13ecae3a0801dac7f 100644
--- a/library/templates/Intonation/Library/Widget/Carousel/View.php
+++ b/library/templates/Intonation/Library/Widget/Carousel/View.php
@@ -28,6 +28,7 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help
      Intonation_Library_Widget_Carousel_Definition::LISTING => 'Intonation_View_RenderList',
      Intonation_Library_Widget_Carousel_Definition::LISTING_WITH_OPTIONS => 'Intonation_View_RenderTruncateList',
      Intonation_Library_Widget_Carousel_Definition::HORIZONTAL_LISTING => 'Intonation_View_RenderHorizontalList',
+     Intonation_Library_Widget_Carousel_Definition::MULTIPLE_CAROUSEL => 'Intonation_View_RenderMultipleCarousel',
      Intonation_Library_Widget_Carousel_Definition::MULTIPLE_CAROUSEL_PLUS => 'Intonation_View_RenderMultipleCarousel',
      Intonation_Library_Widget_Carousel_Definition::GRID => 'Intonation_View_RenderWallGrid',
      Intonation_Library_Widget_Carousel_Definition::MAP => 'Intonation_View_RenderMap',
@@ -59,7 +60,8 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help
 
 
   protected function _renderHeadScriptsOn($script_loader) {
-    $this->_getLayoutHelper()->renderHeadScriptsOn($script_loader);
+    $this->_getLayoutHelper($this->_settings->getLayout())
+         ->renderHeadScriptsOn($script_loader);
   }
 
 
@@ -197,9 +199,7 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help
   }
 
 
-  protected function _getLayoutHelperClass() {
-    $layout = $this->_settings->getLayout();
-
+  protected function _getLayoutHelperClass($layout) {
     if ($renderer = Class_Template::current()->getCarouselRenderer($layout))
       return $renderer;
 
@@ -210,28 +210,32 @@ abstract class Intonation_Library_Widget_Carousel_View extends Zendafi_View_Help
   }
 
 
-  protected function _getLayoutHelper() {
+  protected function _getLayoutHelper($layout) {
     if ($this->_layout_helper)
       return $this->_layout_helper;
 
-    $helper_class = $this->_getLayoutHelperClass();
+    $helper_class = $this->_getLayoutHelperClass($layout);
 
     $this->_layout_helper = new $helper_class();
     $this->_layout_helper->setView($this->view);
 
-    if (in_array($this->_settings->getLayout(),
+    if (in_array($layout,
                  [Intonation_Library_Widget_Carousel_Definition::MAP,
                   Intonation_Library_Widget_Carousel_Definition::WALL,
                   Intonation_Library_Widget_Carousel_Definition::GRID]))
       $this->_layout_helper->setIdModule($this->id_module);
 
+    if ($layout === Intonation_Library_Widget_Carousel_Definition::MULTIPLE_CAROUSEL)
+      $this->_layout_helper->setNumberOfColumns(3);
+
     return $this->_layout_helper;
   }
 
 
   protected function _renderLayout($layout, $elements, $content_callback) {
-    $helper_func = array_reverse(explode('_', get_class($this->_getLayoutHelper())))[0];
-    return call_user_func_array([$this->_getLayoutHelper(),
+    $layout_helper = $this->_getLayoutHelper($layout);
+    $helper_func = array_reverse(explode('_', get_class($layout_helper)))[0];
+    return call_user_func_array([$layout_helper,
                                  $helper_func],
 
                                 [new Storm_Collection($elements),
diff --git a/library/templates/Intonation/View/LibrariesWidget.php b/library/templates/Intonation/View/LibrariesWidget.php
index b34538ecfb9d18135549dea2bd3349d0952c250f..28db3f621871e0f944dc58b06e9181dfdbdf6562 100644
--- a/library/templates/Intonation/View/LibrariesWidget.php
+++ b/library/templates/Intonation/View/LibrariesWidget.php
@@ -100,7 +100,7 @@ class Intonation_View_LibrariesWidget extends ZendAfi_View_Helper_BaseHelper {
 
     $order = ($order == Class_Systeme_ModulesAccueil_Library::ORDER_ALPHA)
       ? 'libelle'
-      : 'FIELD (id_site, ' . implode($id_libraries, ',') . ')';
+      : 'FIELD (id_site, ' . implode(',', $id_libraries) . ')';
 
     return Class_Bib::findAllBy(['id_site' => $id_libraries,
                                  'order' => $order]);
diff --git a/library/templates/Intonation/View/RenderList.php b/library/templates/Intonation/View/RenderList.php
index 79ec4479bd553f0b41a6a1bc76d7140206875e49..570656ddf9e870c8010e1627c7fba3832c25b7bc 100644
--- a/library/templates/Intonation/View/RenderList.php
+++ b/library/templates/Intonation/View/RenderList.php
@@ -22,6 +22,11 @@
 
 class Intonation_View_RenderList extends ZendAfi_View_Helper_BaseHelper {
 
+  public function setIdModule() {
+    return $this;
+  }
+
+
   public function renderList($collection, $callback) {
     if ($collection->isEmpty())
       return '';
diff --git a/library/templates/Intonation/View/RenderMultipleCarousel.php b/library/templates/Intonation/View/RenderMultipleCarousel.php
index a55633d7dbc23a1167194fc2e2dadaecc9cd9988..7202862ce650b9ff259fc2b1a01fe3a355fe9b5d 100644
--- a/library/templates/Intonation/View/RenderMultipleCarousel.php
+++ b/library/templates/Intonation/View/RenderMultipleCarousel.php
@@ -21,12 +21,16 @@
 
 
 class Intonation_View_RenderMultipleCarousel extends Intonation_View_Abstract_Carousel {
+  protected $_columns = 5;
 
-  protected $_columns;
+  public function renderMultipleCarousel($collection, $callback) {
+    return $this->_renderCarousel($collection, $callback);
+  }
 
-  public function renderMultipleCarousel($collection, $callback, $columns = 5) {
+
+  public function setNumberOfColumns($columns) {
     $this->_columns = $columns;
-    return $this->_renderCarousel($collection, $callback);
+    return $this;
   }
 
 
diff --git a/tests/scenarios/Templates/TemplatesArticlesTest.php b/tests/scenarios/Templates/TemplatesArticlesTest.php
index 189316d3a43303ee6351773100acf297d9f8edc4..d430f8ed19ad61e9dd9c5f67a9e03c54cdbe8546 100644
--- a/tests/scenarios/Templates/TemplatesArticlesTest.php
+++ b/tests/scenarios/Templates/TemplatesArticlesTest.php
@@ -21,20 +21,82 @@
 
 require_once('TemplatesTest.php');
 
-class TemplatesArticlesWidgetTest extends TemplatesIntonationTestCase {
+
+abstract class TemplatesArticlesWidgetTestCase extends Admin_AbstractControllerTestCase {
+  protected $_storm_default_to_volatile = true;
+
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->_buildTemplateProfil(['id' => 1,
+                                 'libelle' => 'My page'])
+         ->setBoiteOfTypeInDivision(2,
+                                    Intonation_Library_Widget_Carousel_Article_Definition::CODE,
+                                    ['all_layout' => Intonation_Library_Widget_Carousel_Definition::LISTING])
+         ->assertSave();
+
+    $this->fixture('Class_Article',
+                   ['id' => 4,
+                    'titre' => 'Winter',
+                    'contenu' => '<p>is ...</p>']);
+
+    $this->fixture('Class_Article',
+                   ['id' => 6,
+                    'titre' => 'Sprechen Sie Deutsch ?',
+                    'contenu' => '<p>Ich ...</p>']);
+
+    $this->fixture('Class_Article',
+                   ['id' => 7,
+                    'titre' => 'Parlez-vous français ?',
+                    'contenu' => '<p>Une b...</p>',
+                    'events_debut' => '2020-03-13 00:00:00',
+                    'events_fin' => '2020-07-31 00:00:00',
+                    'all_day' => 1]);
+  }
+}
+
+
+
+
+class TemplatesArticlesRenderAllTest extends TemplatesArticlesWidgetTestCase {
+  public function setUp() {
+    parent::setUp();
+    $this->dispatch('/widget/render-all/profile_id/1/widget_id/1');
+  }
+
+
+  /** @test */
+  public function pageShouldContainsWinterInListGroup() {
+    $this->assertXPathContentContains('//div[contains(@class, "list-group")]//div[contains(@class, "card-title")]', 'Winter', $this->_response->getBody());
+  }
+}
+
+
+
+
+class TemplatesArticlesEditWidgetTest extends TemplatesArticlesWidgetTestCase {
+  public function setUp() {
+    parent::setUp();
+    $this->dispatch('/admin/widget/edit-widget/id/1/id_profil/1');
+  }
+
 
   /** @test */
   public function editArticlesWidgetShouldContainsSelection() {
-    $this->dispatch('/admin/widget/edit-widget/id/18/id_profil/72', true);
     $this->assertXpath('//select[@name="order"]//option[@value="Selection"]');
   }
+}
 
 
-  /** @test */
-  public function dispatchFrontShouldContainsSprechenSieDeutsh() {
+
+
+class TemplatesArticlesWidgetTest extends TemplatesArticlesWidgetTestCase {
+  public function setUp() {
+    parent::setUp();
     $widget = ((new Class_Systeme_Widget_Widget)
-               ->setId(18)
-               ->setProfileId(72)
+               ->setId(1)
+               ->setProfileId(1)
                ->load());
     $widget
       ->setNewDatas(['order' => 'Selection',
@@ -46,50 +108,29 @@ class TemplatesArticlesWidgetTest extends TemplatesIntonationTestCase {
                      'layout' => 'multiple_carousel'])
       ->updateProfile();
 
-    $winter = $this->fixture('Class_Article',
-                             ['id' => 4,
-                              'titre' => 'Winter',
-                              'contenu' => '<p>is ...</p>']);
-
-    $deutsch = $this->fixture('Class_Article',
-                              ['id' => 6,
-                               'titre' => 'Sprechen Sie Deutsch ?',
-                               'contenu' => '<p>Ich ...</p>']);
-
-    $bar = $this->fixture('Class_Article',
-                          ['id' => 7,
-                           'titre' => 'Bar',
-                           'contenu' => '<p>Une b...</p>']);
-
     $this
       ->onLoaderOfModel('Class_Article')
 
       ->whenCalled('getArticlesByPreferences')
-      ->answers([$winter,
-                 $deutsch,
-                 $bar]);
+      ->answers(Class_Article::findAllBy(['id_article' => [4, 6, 7]]));
 
-    $this->dispatch('/opac/index/index/id_profil/72', true);
+    $this->dispatch('/opac/index/index/id_profil/1', true);
+  }
+
+
+  /** @test */
+  public function dispatchFrontShouldContainsSprechenSieDeutsh() {
     $this->assertXPathContentContains('//div', 'Sprechen Sie Deutsch ?');
   }
 }
 
 
 
-class TemplatesArticlesCmsListActionTest extends TemplatesIntonationTestCase {
+
+class TemplatesArticlesCmsListActionTest extends TemplatesArticlesWidgetTestCase {
   /** @test */
   public function dispatchShouldRenderSprechenSieDeutsh() {
-    $this->fixture('Class_Article',
-                   ['id' => 6,
-                    'titre' => 'Sprechen Sie Deutsch ?',
-                    'contenu' => '<p>Ich ...</p>']);
-
-    $this->fixture('Class_Article',
-                   ['id' => 7,
-                    'titre' => 'Parlez-vous français ?',
-                    'contenu' => '<p>Une b...</p>']);
-
-    $this->dispatch('/opac/cms/list/title/language/articles/7-6/id_profil/72', true);
+    $this->dispatch('/opac/cms/list/title/language/articles/7-6/id_profil/1', true);
     $this->assertXPathContentContains('//main//div', 'Parlez-vous français ?');
   }
 }
@@ -97,18 +138,10 @@ class TemplatesArticlesCmsListActionTest extends TemplatesIntonationTestCase {
 
 
 
-class TemplatesArticlesCmsArticleViewTest extends TemplatesIntonationTestCase {
+class TemplatesArticlesCmsArticleViewTest extends TemplatesArticlesWidgetTestCase {
   public function setUp() {
     parent::setUp();
-    $this->fixture('Class_Article',
-                   ['id' => 7,
-                    'titre' => 'Parlez-vous français ?',
-                    'contenu' => '<p>Une b...</p>',
-                    'events_debut' => '2020-03-13 00:00:00',
-                    'events_fin' => '2020-07-31 00:00:00',
-                    'all_day' => 1]);
-
-    $this->dispatch('/opac/cms/articleview/id/7/id_profil/72');
+    $this->dispatch('/opac/cms/articleview/id/7/id_profil/1');
   }
 
 
@@ -139,23 +172,17 @@ class TemplatesArticlesCmsArticleViewTest extends TemplatesIntonationTestCase {
 
 
 
-class TemplatesArticlesCmsArticleViewWithHiddenTitleTest extends TemplatesIntonationTestCase {
+class TemplatesArticlesCmsArticleViewWithHiddenTitleTest extends TemplatesArticlesWidgetTestCase {
   public function setUp() {
     parent::setUp();
-    $this->fixture('Class_Article',
-                   ['id' => 7,
-                    'titre' => 'Parlez-vous français ?',
-                    'cacher_titre' => 1,
-                    'contenu' => '<p>Une b...</p>',
-                    'events_debut' => '2020-03-13 00:00:00',
-                    'events_fin' => '2020-07-31 00:00:00',
-                    'all_day' => 1,
-                    'auteur' => $this->fixture('Class_Users',
-                                               ['id' => 88393,
-                                                'login' => 'Harlock',
-                                                'password' => 'Arc4di4 for 3v3r'])]);
-
-    $this->dispatch('/opac/cms/articleview/id/7/id_profil/72');
+    Class_Article::find(7)
+      ->setCacherTitre(1)
+      ->setAuteur($this->fixture('Class_Users',
+                                 ['id' => 88393,
+                                  'login' => 'Harlock',
+                                  'password' => 'Arc4di4 for 3v3r']));
+
+    $this->dispatch('/opac/cms/articleview/id/7/id_profil/1');
   }
 
 
@@ -174,7 +201,7 @@ class TemplatesArticlesCmsArticleViewWithHiddenTitleTest extends TemplatesIntona
 
 
 
-abstract class TemplatesArticlesWithLocationTestCase extends TemplatesIntonationTestCase {
+abstract class TemplatesArticlesWithLocationTestCase extends TemplatesArticlesWidgetTestCase {
   public function setUp() {
     parent::setUp();
     $annecy = $this->fixture('Class_Lieu',
@@ -188,15 +215,8 @@ abstract class TemplatesArticlesWithLocationTestCase extends TemplatesIntonation
                               'longitude' => '6.1459837']);
 
 
-    $this->fixture('Class_Article',
-                   ['id' => 7,
-                    'titre' => 'Parlez-vous français ?',
-                    'contenu' => '<p>Une b...</p>',
-                    'events_debut' => '2020-03-13 00:00:00',
-                    'events_fin' => '2020-07-31 00:00:00',
-                    'lieu' => $annecy,
-                    'all_day' => 1]);
-
+    Class_Article::find(7)
+      ->setLieu($annecy);
 
     $lost_location = $this->fixture('Class_Lieu',
                                     ['id' => '9283',
@@ -210,9 +230,6 @@ abstract class TemplatesArticlesWithLocationTestCase extends TemplatesIntonation
                     'titre' => 'Lost in translation',
                     'contenu' => 'with Bill',
                     'lieu' => $lost_location]);
-
-
-    $this->dispatch('/opac/cms/articleview/id/7/id_profil/72');
   }
 }
 
@@ -222,7 +239,7 @@ abstract class TemplatesArticlesWithLocationTestCase extends TemplatesIntonation
 class TemplatesArticlesWithLocationViewTest extends TemplatesArticlesWithLocationTestCase {
   public function setUp() {
     parent::setUp();
-    $this->dispatch('/opac/cms/articleview/id/7/id_profil/72');
+    $this->dispatch('/opac/cms/articleview/id/7/id_profil/1');
   }
 
 
@@ -264,15 +281,15 @@ class TemplatesArticlesMapTest extends TemplatesArticlesWithLocationTestCase {
     Storm_Test_ObjectWrapper::onLoaderOfModel('Class_Article')
                        ->whenCalled('getArticlesByPreferences')
                        ->answers([Class_Article::find(7), Class_Article::find(8)]);
-    $this->_buildTemplateProfil(['id' => 3,
-                                 'libelle' => 'Explore'])
-         ->setBoiteOfTypeInDivision(2,
+
+    Class_Profil::find(1)
+         ->setBoiteOfTypeInDivision(3,
                                     Intonation_Library_Widget_Carousel_Article_Definition::CODE,
                                     ['layout' => Intonation_Library_Widget_Carousel_Definition::MAP,
                                      'titre' => 'event map',
                                      'id_items' => '7;8'])
          ->assertSave();
-    $this->dispatch('/opac/index/index/id_profil/3');
+    $this->dispatch('/opac/index/index/id_profil/1');
   }
 
 
diff --git a/tests/scenarios/Templates/TemplatesLibraryTest.php b/tests/scenarios/Templates/TemplatesLibraryTest.php
index 1a63e59b03caf15c44b7f13070382c50a1a2eedc..65d13e3507e69979322580f3d506b1b895771363 100644
--- a/tests/scenarios/Templates/TemplatesLibraryTest.php
+++ b/tests/scenarios/Templates/TemplatesLibraryTest.php
@@ -21,9 +21,20 @@
 
 require_once('TemplatesTest.php');
 
-class TemplatesLibraryReadMoreTest extends TemplatesIntonationTestCase {
+abstract class TemplatesLibraryTestCase extends Admin_AbstractControllerTestCase {
+    protected $_storm_default_to_volatile = true;
+
+
   public function setUp() {
     parent::setUp();
+    Class_AdminVar::set('FEATURES_TRACKING_ENABLE', 0);
+
+    $this->_buildTemplateProfil(['id' => 1,
+                                 'libelle' => 'My page'])
+         ->setBoiteOfTypeInDivision(2,
+                                    Intonation_Library_Widget_Carousel_Library_Definition::CODE,
+                                    ['layout' => Intonation_Library_Widget_Carousel_Definition::MULTIPLE_CAROUSEL])
+         ->assertSave();
 
     $this->fixture('Class_Bib',
                    ['id' => 1,
@@ -40,7 +51,67 @@ class TemplatesLibraryReadMoreTest extends TemplatesIntonationTestCase {
                     'libelle' => 'Seynod',
                     'visibilite' => Class_Bib::V_NODATA]);
 
-    $this->dispatch('/opac/bib/en-lire-plus/id/1/id_profil/72', true);
+
+    $this->fixture('Class_Bib',
+                   ['id' => 4,
+                    'libelle' => 'Meythet',
+                    'visibilite' => Class_Bib::V_DATA]);
+
+
+    $this->fixture('Class_Bib',
+                   ['id' => 5,
+                    'libelle' => 'Pringy',
+                    'visibilite' => Class_Bib::V_DATA]);
+  }
+}
+
+
+
+
+class TemplatesLibraryWidgetWithCarouselThreeColumnsTest extends TemplatesLibraryTestCase {
+  public function setUp() {
+    parent::setUp();
+
+    $this->dispatch('/opac/index/index/id_profil/1', true);
+  }
+
+
+  /** @test */
+  public function cardGridShouldContainsThreeCard() {
+    $this->assertXPathCount('//div[contains(@class, "carousel-item active")]//div[contains(@class, "card text-center")]', 3);
+  }
+}
+
+
+
+
+class TemplatesLibraryWidgetWithCarouselFiveColumnsTest extends TemplatesLibraryTestCase {
+  public function setUp() {
+    parent::setUp();
+    Class_Profil::find(1)
+      ->updateModuleConfigAccueil(1,
+                                  ['division' => 2,
+                                   'type_module' => Intonation_Library_Widget_Carousel_Library_Definition::CODE,
+                                   'preferences' => ['layout' => Intonation_Library_Widget_Carousel_Definition::MULTIPLE_CAROUSEL_PLUS]]);
+
+    $this->dispatch('/opac/index/index/id_profil/1', true);
+  }
+
+
+  /** @test */
+  public function cardGridShouldContainsFiveCards() {
+    $this->assertXPathCount('//div[contains(@class, "carousel-item active")]//div[contains(@class, "card text-center")]', 5);
+  }
+}
+
+
+
+
+class TemplatesLibraryReadMoreTest extends TemplatesLibraryTestCase {
+  public function setUp() {
+    parent::setUp();
+
+    $this->dispatch('/opac/bib/en-lire-plus/id/1/id_profil/1', true);
   }
 
 
@@ -57,7 +128,7 @@ class TemplatesLibraryReadMoreTest extends TemplatesIntonationTestCase {
 
 
   /** @test */
-  public function pageShouldContainsLinkToReadMoreSeynod() {
-    $this->assertXPath('//a[contains(@class, "next")][contains(@href, "/bib/en-lire-plus/id/3")]', $this->_response->getBody());
+  public function pageShouldContainsLinkToReadMoreMeythet() {
+    $this->assertXPath('//a[contains(@class, "next")][contains(@href, "/bib/en-lire-plus/id/4")]');
   }
 }