diff --git a/config/merged/tableau-de-bord.config.php b/config/merged/tableau-de-bord.config.php
new file mode 100644
index 0000000000000000000000000000000000000000..312dfd9c80048d1ec635da0c8e367705f6b11a10
--- /dev/null
+++ b/config/merged/tableau-de-bord.config.php
@@ -0,0 +1,85 @@
+<?php
+
+use Laminas\Router\Http\Literal;
+use Laminas\Router\Http\Segment;
+use UnicaenIndicateur\Controller\TableauDeBordController;
+use UnicaenIndicateur\Controller\TableauDeBordControllerFactory;
+use UnicaenIndicateur\Form\TableauDeBord\TableauDeBordForm;
+use UnicaenIndicateur\Form\TableauDeBord\TableauDeBordFormFactory;
+use UnicaenIndicateur\Form\TableauDeBord\TableauDeBordHydrator;
+use UnicaenIndicateur\Form\TableauDeBord\TableauDeBordHydratorFactory;
+use UnicaenIndicateur\Provider\Privilege\IndicateurPrivileges;
+use UnicaenIndicateur\Service\TableauDeBord\TableauDeBordService;
+use UnicaenIndicateur\Service\TableauDeBord\TableauDeBordServiceFactory;
+use UnicaenPrivilege\Guard\PrivilegeController;
+
+return [
+    'bjyauthorize' => [
+        'guards' => [
+            PrivilegeController::class => [
+                [
+                    'controller' => TableauDeBordController::class,
+                    'action' => [
+                        'index',
+                        'afficher',
+                    ],
+                    'privileges' => [
+                        IndicateurPrivileges::AFFICHER,
+                    ],
+                ],
+            ],
+
+        ],
+    ],
+
+    'router'          => [
+        'routes' => [
+            'tableau-de-bord' => [
+                'type'  => Literal::class,
+                'options' => [
+                    'route'    => '/tableau-de-bord',
+                    'defaults' => [
+                        'controller' => TableauDeBordController::class,
+                        'action'     => 'index',
+                    ],
+                ],
+                'may_terminate' => true,
+                'child_routes' => [
+                    'afficher' => [
+                        'type'  => Segment::class,
+                        'options' => [
+                            'route'    => '/afficher/:tableau-de-bord',
+                            'defaults' => [
+                                'controller' => TableauDeBordController::class,
+                                'action'     => 'afficher',
+                            ],
+                        ],
+                        'may_terminate' => true,
+                    ],
+                ],
+            ],
+        ],
+    ],
+
+    'service_manager' => [
+        'factories' => [
+            TableauDeBordService::class => TableauDeBordServiceFactory::class,
+        ],
+    ],
+    'controllers'     => [
+        'factories' => [
+            TableauDeBordController::class => TableauDeBordControllerFactory::class,
+        ],
+    ],
+    'form_elements' => [
+        'factories' => [
+            TableauDeBordForm::class => TableauDeBordFormFactory::class,
+        ],
+    ],
+    'hydrators' => [
+        'factories' => [
+            TableauDeBordHydrator::class => TableauDeBordHydratorFactory::class,
+        ],
+    ]
+
+];
\ No newline at end of file
diff --git a/documentation/01_table.sql b/documentation/01_table.sql
index 3abb011d1c28fe8edb9283a305a93be672327722..c0c923839c396617b51a4b5e552c12464677b177 100644
--- a/documentation/01_table.sql
+++ b/documentation/01_table.sql
@@ -1,4 +1,4 @@
-create table unicaen_indicateur
+create table unicaen_indicateur_indicateur
 (
     id serial constraint indicateur_pk primary key,
     titre                    varchar(256)                                                   not null,
@@ -20,3 +20,26 @@ create table unicaen_indicateur_abonnement
 
 create unique index abonnement_id_uindex on unicaen_indicateur_abonnement (id);
 create unique index indicateur_id_uindex on unicaen_indicateur (id);
+
+create table unicaen_indicateur_tableaudebord
+(
+    id serial constraint unicaen_indicateur_tableaudebord_pk primary key,
+    titre varchar(1024) default 'Tableau de bord' not null,
+    description text,
+    nb_column   integer       default 1                 not null
+);
+
+create table unicaen_indicateur_tableau_indicateur
+(
+    tableau_id    integer not null
+        constraint unicaen_indicateur_tableau_indicateur_tableaudebord_null_fk
+            references unicaen_indicateur_tableaudebord (id)
+            on delete cascade,
+    indicateur_id integer not null
+        constraint unicaen_indicateur_tableau_indicateur_indicateur_null_fk
+            references unicaen_indicateur_indicateur (id)
+            on delete cascade,
+    constraint unicaen_indicateur_tableau_indicateur_pk
+        primary key (tableau_id, indicateur_id)
+);
+
diff --git a/src/UnicaenIndicateur/Controller/TableauDeBordController.php b/src/UnicaenIndicateur/Controller/TableauDeBordController.php
new file mode 100644
index 0000000000000000000000000000000000000000..9f8fe19db09eaf274197afd92a3133bf1b30b04a
--- /dev/null
+++ b/src/UnicaenIndicateur/Controller/TableauDeBordController.php
@@ -0,0 +1,30 @@
+<?php
+
+namespace UnicaenIndicateur\Controller;
+
+use Laminas\Mvc\Controller\AbstractActionController;
+use Laminas\View\Model\ViewModel;
+use UnicaenIndicateur\Service\TableauDeBord\TableauDeBordServiceAwareTrait;
+
+class TableauDeBordController extends AbstractActionController
+{
+    use TableauDeBordServiceAwareTrait;
+
+    public function indexAction() : ViewModel
+    {
+        $tableaux = $this->getTableauDeBordService()->getTableauxdeBord();
+
+        return new ViewModel([
+            'tableaux' => $tableaux,
+        ]);
+    }
+
+    public function afficherAction() : ViewModel
+    {
+        $tableau = $this->getTableauDeBordService()->getRequestedTableauDeBord($this);
+
+        return new ViewModel([
+            'tableau' => $tableau,
+        ]);
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Controller/TableauDeBordControllerFactory.php b/src/UnicaenIndicateur/Controller/TableauDeBordControllerFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..d76c8b9c1ff34be6a567f995a9388de9ce59a7a3
--- /dev/null
+++ b/src/UnicaenIndicateur/Controller/TableauDeBordControllerFactory.php
@@ -0,0 +1,29 @@
+<?php
+
+namespace UnicaenIndicateur\Controller;
+
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\ContainerInterface;
+use Psr\Container\NotFoundExceptionInterface;
+use UnicaenIndicateur\Entity\Db\TableauDeBord;
+use UnicaenIndicateur\Service\TableauDeBord\TableauDeBordService;
+
+class TableauDeBordControllerFactory {
+
+    /**
+     * @param ContainerInterface $container
+     * @return TableauDeBordController
+     * @throws ContainerExceptionInterface
+     * @throws NotFoundExceptionInterface
+     */
+    public function __invoke(ContainerInterface $container) : TableauDeBordController
+    {
+        /**
+         * @var TableauDeBordService $tableauService
+         */
+        $tableauService = $container->get(TableauDeBordService::class);
+
+        $controller = new TableauDeBordController();
+        return $controller;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Entity/Db/Indicateur.php b/src/UnicaenIndicateur/Entity/Db/Indicateur.php
index 0d1d9dbaf17376fa8fd779f506ac2e5b31e79559..2cd987bf7c8a529cdae8c57d734d0403fdd106ae 100644
--- a/src/UnicaenIndicateur/Entity/Db/Indicateur.php
+++ b/src/UnicaenIndicateur/Entity/Db/Indicateur.php
@@ -21,10 +21,12 @@ class Indicateur {
     private ?string $viewId = null;
     private ?string $entity = null;
     private Collection $abonnements;
+    private Collection $tableaux;
 
     public function __construct()
     {
         $this->abonnements = new ArrayCollection();
+        $this->tableaux = new ArrayCollection();
     }
 
     public function getId() : ?int
@@ -92,6 +94,8 @@ class Indicateur {
         $this->entity = $entity;
     }
 
+    /** Abonnements **************************************************************** */
+
     /**
      * @return Abonnement[]
      */
@@ -114,4 +118,15 @@ class Indicateur {
     {
         return $this->abonnements->contains($abonnement);
     }
+
+    /** Tableau *****************************************************************/
+
+    /**
+     * @return TableauDeBord[]
+     */
+    public function getTableauxDeBord() : array
+    {
+        return $this->tableaux->toArray();
+    }
+
 }
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Entity/Db/Mapping/UnicaenIndicateur.Entity.Db.Indicateur.dcm.xml b/src/UnicaenIndicateur/Entity/Db/Mapping/UnicaenIndicateur.Entity.Db.Indicateur.dcm.xml
index 84898edc9b91661d737dbe94ad3cb9852c3ae404..6fe35ca3089969270082a45e032d55bd18de9f57 100644
--- a/src/UnicaenIndicateur/Entity/Db/Mapping/UnicaenIndicateur.Entity.Db.Indicateur.dcm.xml
+++ b/src/UnicaenIndicateur/Entity/Db/Mapping/UnicaenIndicateur.Entity.Db.Indicateur.dcm.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
-    <entity name="UnicaenIndicateur\Entity\Db\Indicateur" table="unicaen_indicateur">
+    <entity name="UnicaenIndicateur\Entity\Db\Indicateur" table="unicaen_indicateur_indicateur">
 
         <id name="id" type="integer" column="id">
             <generator strategy="IDENTITY"/>
@@ -14,5 +14,16 @@
         <field name="entity"            type="string" length="255"      column="entity"                nullable="true"/>
 
         <one-to-many target-entity="UnicaenIndicateur\Entity\Db\Abonnement" field="abonnements" mapped-by="indicateur" />
+
+        <many-to-many field="tableaux" target-entity="UnicaenIndicateur\Entity\Db\TableauDeBord" inversed-by="tableau" fetch="LAZY">
+            <join-table name="unicaen_indicateur_tableau_indicateur">
+                <join-columns>
+                    <join-column name="indicateur_id" referenced-column-name="id"/>
+                </join-columns>
+                <inverse-join-columns>
+                    <join-column name="tableau_id" referenced-column-name="ID"/>
+                </inverse-join-columns>
+            </join-table>
+        </many-to-many>
     </entity>
 </doctrine-mapping>
diff --git a/src/UnicaenIndicateur/Entity/Db/Mapping/UnicaenIndicateur.Entity.Db.TableauDeBord.dcm.xml b/src/UnicaenIndicateur/Entity/Db/Mapping/UnicaenIndicateur.Entity.Db.TableauDeBord.dcm.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a666516383316457472ca23dc49473eb27aec7db
--- /dev/null
+++ b/src/UnicaenIndicateur/Entity/Db/Mapping/UnicaenIndicateur.Entity.Db.TableauDeBord.dcm.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<doctrine-mapping xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd">
+    <entity name="UnicaenIndicateur\Entity\Db\TableauDeBord" table="unicaen_indicateur_tableaudebord">
+
+        <id name="id" type="integer" column="id">
+            <generator strategy="IDENTITY"/>
+        </id>
+
+        <field name="titre"             type="string" length="255"      column="titre"                nullable="false"/>
+        <field name="description"       type="string" length="2047"     column="description"          nullable="false"/>
+        <field name="nbColumn"          type="integer"     column="nb_column"          nullable="false"/>
+
+        <many-to-many field="indicateurs" target-entity="UnicaenIndicateur\Entity\Db\Indicateur" inversed-by="indicateur" fetch="LAZY">
+            <join-table name="unicaen_indicateur_tableau_indicateur">
+                <join-columns>
+                    <join-column name="tableau_id" referenced-column-name="id"/>
+                </join-columns>
+                <inverse-join-columns>
+                    <join-column name="indicateur_id" referenced-column-name="ID"/>
+                </inverse-join-columns>
+            </join-table>
+        </many-to-many>
+
+    </entity>
+</doctrine-mapping>
diff --git a/src/UnicaenIndicateur/Entity/Db/TableauDeBord.php b/src/UnicaenIndicateur/Entity/Db/TableauDeBord.php
new file mode 100644
index 0000000000000000000000000000000000000000..36a730feb8bcf94a43656a734679b5be683c31a0
--- /dev/null
+++ b/src/UnicaenIndicateur/Entity/Db/TableauDeBord.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace UnicaenIndicateur\Entity\Db;
+
+
+use Doctrine\Common\Collections\ArrayCollection;
+use Doctrine\Common\Collections\Collection;
+
+class TableauDeBord {
+
+    private ?int $id = null;
+    private ?string $titre = null;
+    private ?string $description = null;
+    private ?int $nbColumn = 1;
+    private Collection $indicateurs;
+
+    public function __construct()
+    {
+        $this->indicateurs = new ArrayCollection();
+    }
+
+    public function getId(): ?int
+    {
+        return $this->id;
+    }
+
+    public function getTitre(): ?string
+    {
+        return $this->titre;
+    }
+
+    public function setTitre(?string $titre): void
+    {
+        $this->titre = $titre;
+    }
+
+    public function getDescription(): ?string
+    {
+        return $this->description;
+    }
+
+    public function setDescription(?string $description): void
+    {
+        $this->description = $description;
+    }
+
+    public function getNbColumn(): ?int
+    {
+        return $this->nbColumn;
+    }
+
+    public function setNbColumn(?int $nbColumn): void
+    {
+        $this->nbColumn = $nbColumn;
+    }
+
+    /**
+     * @return Indicateur[]
+     */
+    public function getIndicateurs(): array
+    {
+        $array = $this->indicateurs->toArray();
+        return $array;
+    }
+
+    public function addIndicateur(Indicateur $indicateur) : void
+    {
+        $this->indicateurs->add($indicateur);
+    }
+
+    public function removeIndicateur(Indicateur $indicateur) : void
+    {
+        $this->indicateurs->removeElement($indicateur);
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordForm.php b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordForm.php
new file mode 100644
index 0000000000000000000000000000000000000000..a0ce1d973a8f8352497d8500dbb10092f67319b1
--- /dev/null
+++ b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordForm.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace UnicaenIndicateur\Form\TableauDeBord;
+
+use Laminas\Form\Element\Button;
+use Laminas\Form\Element\Number;
+use Laminas\Form\Element\Text;
+use Laminas\Form\Form;
+use Laminas\InputFilter\Factory;
+
+class TableauDeBordForm extends Form {
+
+    public function init()
+    {
+        // libelle
+        $this->add([
+            'type' => Text::class,
+            'name' => 'libelle',
+            'options' => [
+                'label' => "Libelle* :",
+            ],
+            'attributes' => [
+                'id' => 'libelle',
+            ],
+        ]);
+        // description
+        $this->add([
+            'name' => 'description',
+            'type' => 'textarea',
+            'options' => [
+                'label' => 'Description : ',
+                'label_attributes' => [
+                    'class' => 'control-label',
+                ],
+            ],
+            'attributes' => [
+                'class' => 'type2 form-control',
+            ]
+        ]);
+        // nbCOlum
+        $this->add([
+            'name' => 'nb_colonne',
+            'type' => Number::class,
+            'options' => [
+                'label' => 'Nombre de colonne : ',
+                'label_attributes' => [
+                    'class' => 'control-label',
+                ],
+            ],
+            'attributes' => [
+                'id' => 'nb_colonne',
+                'min' => 1,
+                'max' => 3,
+            ],
+        ]);
+
+        // submit
+        $this->add([
+            'type' => Button::class,
+            'name' => 'creer',
+            'options' => [
+                'label' => '<i class="fas fa-save"></i> Enregistrer',
+                'label_options' => [
+                    'disable_html_escape' => true,
+                ],
+            ],
+            'attributes' => [
+                'type' => 'submit',
+                'class' => 'btn btn-primary',
+            ],
+        ]);
+
+
+        $this->setInputFilter((new Factory())->createInputFilter([
+            'libelle'               => [ 'required' => true,  ],
+            'description'           => [ 'required' => false,  ],
+            'nb_colonne'             => [ 'required' => true,  ],
+        ]));
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordFormAwareTrait.php b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordFormAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..f44281875ab523bce56aa0d7fac12214acc6ae7b
--- /dev/null
+++ b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordFormAwareTrait.php
@@ -0,0 +1,18 @@
+<?php
+
+namespace UnicaenIndicateur\Form\TableauDeBord;
+
+trait TableauDeBordFormAwareTrait {
+
+    private TableauDeBordForm $tableauDeBordForm;
+
+    public function getTableauDeBordForm(): TableauDeBordForm
+    {
+        return $this->tableauDeBordForm;
+    }
+
+    public function setTableauDeBordForm(TableauDeBordForm $tableauDeBordForm): void
+    {
+        $this->tableauDeBordForm = $tableauDeBordForm;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordFormFactory.php b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordFormFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..449d853f7c023a7e1bee03946ddc2f5ee8bf6b61
--- /dev/null
+++ b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordFormFactory.php
@@ -0,0 +1,28 @@
+<?php
+
+namespace UnicaenIndicateur\Form\TableauDeBord;
+
+use Psr\Container\ContainerExceptionInterface;
+use Psr\Container\ContainerInterface;
+use Psr\Container\NotFoundExceptionInterface;
+
+class TableauDeBordFormFactory {
+
+    /**
+     * @param ContainerInterface $container
+     * @return TableauDeBordForm
+     * @throws ContainerExceptionInterface
+     * @throws NotFoundExceptionInterface
+     */
+    public function __invoke(ContainerInterface $container) : TableauDeBordForm
+    {
+        /**
+         * @var TableauDeBordHydrator $hydrator
+         */
+        $hydrator = $container->get('HydratorManager')->get(TableauDeBordHydrator::class);
+
+        $form = new TableauDeBordForm();
+        $form->setHydrator($hydrator);
+        return $form;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordHydrator.php b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordHydrator.php
new file mode 100644
index 0000000000000000000000000000000000000000..48aff180dbe154fe33913dbc315f6904cd00fa94
--- /dev/null
+++ b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordHydrator.php
@@ -0,0 +1,43 @@
+<?php
+
+namespace UnicaenIndicateur\Form\TableauDeBord;
+
+use Laminas\Hydrator\HydratorInterface;
+use UnicaenIndicateur\Entity\Db\TableauDeBord;
+
+class TableauDeBordHydrator implements HydratorInterface {
+
+    /**
+     * @param TableauDeBord $object
+     * @return array
+     */
+    public function extract(object $object): array
+    {
+        $data = [
+            'libelle' => $object->getTitre(),
+            'description' => $object->getTitre(),
+            'nb_colonne' => $object->getTitre(),
+        ];
+        return $data;
+    }
+
+    /**
+     * @param array $data
+     * @param TableauDeBord $object
+     * @return TableauDeBord
+     */
+    public function hydrate(array $data, object $object) : object
+    {
+        $libelle = (isset($data['libelle']) AND trim($data['libelle']) !== '')?trim($data['libelle']):null;
+        $description = (isset($data['description']) AND trim($data['description']) !== '')?trim($data['description']):null;
+        $nbColonne = (isset($data['nb_colonne']))?$data['nb_colonne']:null;
+
+        $object->setTitre($libelle);
+        $object->setDescription($description);
+        $object->setNbColumn($nbColonne);
+
+        return $object;
+    }
+
+
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordHydratorFactory.php b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordHydratorFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..b1120f9010933a7ec87a073415e3324efe36460a
--- /dev/null
+++ b/src/UnicaenIndicateur/Form/TableauDeBord/TableauDeBordHydratorFactory.php
@@ -0,0 +1,14 @@
+<?php
+
+namespace UnicaenIndicateur\Form\TableauDeBord;
+
+use Psr\Container\ContainerInterface;
+
+class TableauDeBordHydratorFactory {
+
+    public function __invoke(ContainerInterface $container) : TableauDeBordHydrator
+    {
+        $hydrator = new TableauDeBordHydrator();
+        return $hydrator;
+    }
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordService.php b/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordService.php
new file mode 100644
index 0000000000000000000000000000000000000000..89bb5d1e59fc5e0bfed971c0ff98d7fedd37ac17
--- /dev/null
+++ b/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordService.php
@@ -0,0 +1,96 @@
+<?php
+
+namespace UnicaenIndicateur\Service\TableauDeBord;
+
+use Doctrine\ORM\EntityManager;
+use Doctrine\ORM\NonUniqueResultException;
+use Doctrine\ORM\ORMException;
+use Doctrine\ORM\QueryBuilder;
+use DoctrineModule\Persistence\ProvidesObjectManager;
+use Laminas\Mvc\Controller\AbstractActionController;
+use RuntimeException;
+use UnicaenIndicateur\Entity\Db\TableauDeBord;
+
+/**
+ * @property EntityManager $objectManager
+ */
+class TableauDeBordService {
+    use ProvidesObjectManager;
+
+    /** GESTION DES ENTITES *****************************************/
+
+    public function create(TableauDeBord $tableau) : TableauDeBord
+    {
+        try {
+            $this->getObjectManager()->persist($tableau);
+            $this->getObjectManager()->flush($tableau);
+        } catch (ORMException $e) {
+            throw new RuntimeException("Un problème est survenu en BD", 0 , $e);
+        }
+        return $tableau;
+    }
+
+    public function update(TableauDeBord $tableau) : TableauDeBord
+    {
+        try {
+            $this->getObjectManager()->flush($tableau);
+        } catch (ORMException $e) {
+            throw new RuntimeException("Un problème est survenu en BD", 0 , $e);
+        }
+        return $tableau;
+    }
+
+    public function delete(TableauDeBord $tableau) : TableauDeBord
+    {
+        try {
+            $this->getObjectManager()->remove($tableau);
+            $this->getObjectManager()->flush($tableau);
+        } catch (ORMException $e) {
+            throw new RuntimeException("Un problème est survenu en BD", 0 , $e);
+        }
+        return $tableau;
+    }
+
+    /** REQUETAGE ***************************************************/
+
+    public function createQueryBuilder() : QueryBuilder
+    {
+        $qb = $this->getObjectManager()->getRepository(TableauDeBord::class)->createQueryBuilder('tableau')
+            ->leftJoin('tableau.indicateurs', 'indicateur')->addSelect('indicateur');
+        return $qb;
+    }
+
+    /**
+     * @param string $champ
+     * @param string $ordre
+     * @return TableauDeBord[]
+     */
+    public function getTableauxdeBord(string $champ = 'id', string $ordre='ASC') : array
+    {
+        $qb = $this->createQueryBuilder()
+            ->orderBy('tableau.'.$champ, $ordre);
+        $result = $qb->getQuery()->getResult();
+        return $result;
+    }
+
+    public function getTableauDeBord(?int $id) : ?TableauDeBord
+    {
+        $qb = $this->createQueryBuilder()
+            ->andWhere('tableau.id = :id')->setParameter('id', $id);
+        try {
+            $result = $qb->getQuery()->getOneOrNullResult();
+        } catch (NonUniqueResultException $e) {
+            throw new RuntimeException("Plusieurs TableauDeBord partagent le même id [".$id."]");
+        }
+        return $result;
+    }
+
+    public function getRequestedTableauDeBord(AbstractActionController $controller, string $param='tableau-de-bord') : ?TableauDeBord
+    {
+        $id = $controller->params()->fromRoute($param);
+        $result = $this->getTableauDeBord($id);
+        return $result;
+    }
+
+    /** FACADE ******************************************************/
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordServiceAwareTrait.php b/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordServiceAwareTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..95eee6187eefb5a5e8c7b4718c4e3ed13493f69b
--- /dev/null
+++ b/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordServiceAwareTrait.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace UnicaenIndicateur\Service\TableauDeBord;
+
+trait TableauDeBordServiceAwareTrait {
+
+    private TableauDeBordService $tableauDeBordService;
+
+    public function getTableauDeBordService(): TableauDeBordService
+    {
+        return $this->tableauDeBordService;
+    }
+
+    public function setTableauDeBordService(TableauDeBordService $tableauDeBordService): void
+    {
+        $this->tableauDeBordService = $tableauDeBordService;
+    }
+
+}
\ No newline at end of file
diff --git a/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordServiceFactory.php b/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordServiceFactory.php
new file mode 100644
index 0000000000000000000000000000000000000000..92e7d77a015244f51b2416364d74e90b3c2ce234
--- /dev/null
+++ b/src/UnicaenIndicateur/Service/TableauDeBord/TableauDeBordServiceFactory.php
@@ -0,0 +1,19 @@
+<?php
+
+namespace UnicaenIndicateur\Service\TableauDeBord;
+
+use Doctrine\ORM\EntityManager;
+use Psr\Container\ContainerInterface;
+
+class TableauDeBordServiceFactory {
+
+    public function __invoke(ContainerInterface $container) : TableauDeBordService
+    {
+        /** @var EntityManager $entityManager */
+        $entityManager = $container->get('doctrine.entitymanager.orm_default');
+
+        $service = new TableauDeBordService();
+        $service->setObjectManager($entityManager);
+        return $service;
+    }
+}
\ No newline at end of file
diff --git a/view/unicaen-indicateur/tableau-de-bord/index.phtml b/view/unicaen-indicateur/tableau-de-bord/index.phtml
new file mode 100644
index 0000000000000000000000000000000000000000..5c013815e29abede3e1c945afbff27e0ab400e73
--- /dev/null
+++ b/view/unicaen-indicateur/tableau-de-bord/index.phtml
@@ -0,0 +1,71 @@
+<?php
+
+use UnicaenIndicateur\Entity\Db\TableauDeBord;
+
+/**
+ * @see \UnicaenIndicateur\Controller\TableauDeBordController::afficherAction()
+ * @var TableauDeBord[] $tableaux
+ */
+
+$this->headTitle("Index des tableaux de bords");
+
+?>
+
+<div class="row">
+    <div class="col-md-9">
+        <h1 class="page-header">
+            Gestion des tableaux de bord
+        </h1>
+    </div>
+    <div class="col-md-3">
+        <a href="<?php echo $this->url('indicateurs', [], [], true); ?>"
+            class="btn btn-secondary">
+            <span class="icon icon-lister"></span>
+            Accéder aux indicateurs
+        </a>
+    </div>
+</div>
+
+<a href=""
+    class="ajax-modal btn btn-primary">
+    <span class="icon icon-ajouter"></span>
+    Créer un tableau de bord
+</a>
+
+<?php if (empty($tableaux)) : ?>
+    <div class="alert alert-info">
+        <span class="icon icon-information"></span>
+        Aucun tableau de bord
+    </div>
+<?php else : ?>
+    <table class="table table-condensed table-hover">
+        <thead>
+        <tr>
+            <th>Titre</th>
+            <th>#indicateurs</th>
+            <th>Action</th>
+        </tr>
+        </thead>
+        <tbody>
+            <?php foreach ($tableaux as $tableau) : ?>
+                <tr>
+                    <td>
+                        <?php echo $tableau->getTitre(); ?>
+                        <?php if ($tableau->getDescription()) : ?>
+                            <span class="icon icon-information" data-bs-toggle="tooltip" data-bs-html="true"
+                                  title="<?php echo $tableau->getDescription(); ?>"></span>
+                        <?php endif; ?>
+                    </td>
+                    <td>
+                        <?php echo count($tableau->getIndicateurs()); ?>
+                    </td>
+                    <td>
+                        <span class="icon icon-voir"></span>
+                        <span class="icon icon-editer"></span>
+                        <span class="icon icon-unchecked text-danger"></span>
+                    </td>
+                </tr>
+            <?php endforeach; ?>
+        </tbody>
+    </table>
+<?php endif; ?>