diff --git a/web/components/visualization/results-detaileds.js b/web/components/visualization/results-detaileds.js
new file mode 100644
index 0000000000000000000000000000000000000000..249dbf5b054a4d4019d7669d333fc4ff4c209fe2
--- /dev/null
+++ b/web/components/visualization/results-detaileds.js
@@ -0,0 +1,213 @@
+// Imports
+import * as Auth from "/services/auth/auth.js";
+import * as PartyModel from "/services/model/party-model.js";
+import * as CandidateListModel from "/services/model/candidateList-model.js";
+import * as AreaModel from "/services/model/area-model.js";
+import * as Common from "/services/common/common.js";
+
+export async function mount(parent) {
+  const detailedsResultsComponent = new DetailedsResultsComponent(parent);
+  return detailedsResultsComponent;
+}
+
+class DetailedsResultsComponent {
+  constructor(parent) {
+    this.parent = parent;
+    this.PartyModel = PartyModel.getPartyModel();
+    this.CandidateListModel = CandidateListModel.getCandidateListModel();
+
+    let resultHandler = this;
+    document.addEventListener(
+      "input",
+      function __listener(event) {
+        if (event.target.id == "select-areas") {
+          if (event.target.value != 0) {
+            let area = resultHandler.parent.parent.results.areasResults.find(
+              (areaFind) => areaFind.ID == event.target.value
+            );
+
+            if (resultHandler.parent.parent.zone === "areas") {
+              resultHandler.displayZoneResults(area);
+              resultHandler.parent.areaDisplayed = area;
+            } else if (resultHandler.parent.parent.zone === "sections") {
+              resultHandler.parent.refreshSections(area);
+              resultHandler.displayZoneResults(area.Sections[0]);
+              resultHandler.parent.areaDisplayed = area;
+              resultHandler.parent.sectionDisplayed = area.Sections[0];
+            }
+          }
+        } else if (event.target.id == "select-sections") {
+          let area = resultHandler.parent.parent.results.areasResults.find(
+            (areaFind) =>
+              areaFind.ID == document.getElementById("select-areas").value
+          );
+          let section = area.Sections.find(
+            (sectionFind) => sectionFind.ID == event.target.value
+          );
+          resultHandler.displayZoneResults(section);
+          resultHandler.parent.sectionDisplayed = section;
+        }
+      },
+      false
+    );
+  }
+
+  displayAreasResults() {
+    this.parent.refreshAreas();
+    document.getElementById("select-sections").parentNode.style.display =
+      "none";
+
+    if (
+      this.parent.parent.zone == "areas" &&
+      this.parent.areaDisplayed != undefined
+    ) {
+      document.getElementById(
+        "select-areas"
+      ).value = this.parent.areaDisplayed.ID;
+    } else this.displayZoneResults(this.parent.parent.results.areasResults[0]);
+  }
+
+  displaySectionsResults() {
+    this.parent.refreshAreas();
+    document.getElementById("select-sections").parentNode.style.display =
+      "block";
+    this.parent.refreshSections(this.parent.parent.results.areasResults[0]);
+
+    if (
+      this.parent.parent.zone == "sections" &&
+      this.parent.sectionDisplayed != undefined
+    ) {
+      document.getElementById(
+        "select-areas"
+      ).value = this.parent.areaDisplayed.ID;
+      this.parent.refreshSections(this.parent.areaDisplayed);
+      document.getElementById(
+        "select-sections"
+      ).value = this.parent.sectionDisplayed.ID;
+    } else {
+      this.displayZoneResults(
+        this.parent.parent.results.areasResults[0].Sections[0]
+      );
+    }
+  }
+
+  async displayZoneResults(zone) {
+    if (zone.status !== this.parent.parent.filter) {
+      if (zone.status == "no_results") {
+        document.getElementById(
+          "zone-results"
+        ).innerHTML = Common.warningMessage(
+          "Pas de résultats",
+          "Aucun résultats n'ont étaient saisis sur cette zone"
+        );
+      } else if (zone.status == "incompleted") {
+        document.getElementById(
+          "zone-results"
+        ).innerHTML = Common.warningMessage(
+          "Pas complets",
+          "Les résultats pour cette zone ne sont pas complets"
+        );
+      } else if (zone.status == "not validated") {
+        document.getElementById(
+          "zone-results"
+        ).innerHTML = Common.warningMessage(
+          "Non validé",
+          "Les résultats pour cette zone n'ont pas étaient validés"
+        );
+      }
+      document.getElementById("zone-detaileds-results").innerHTML = "";
+    } else {
+      document.getElementById("zone-results").innerHTML =
+        '<br/><h5 class="title is-5">Résultats</h5>';
+      for (let i in zone.candidateLists) {
+        let electedsNumber = null;
+        if (
+          this.parent.parent.zone === "areas" &&
+          zone.candidateLists[i].SeatsAttributed > 0 &&
+          zone.stats.PercentageConsiderated == 100
+        ) {
+          electedsNumber = zone.candidateLists[i].SeatsAttributed;
+        }
+        let party = await this.PartyModel.getParty(
+          zone.candidateLists[i].PartyID
+        );
+        document.getElementById(
+          "zone-results"
+        ).innerHTML += this.parent.parent.progressBarTemplate(
+          zone.candidateLists[i],
+          party.Color,
+          electedsNumber
+        );
+      }
+      this.displayZoneDetailedResults(zone);
+    }
+    document.getElementById(
+      "detailed-results"
+    ).scrollTop = document.getElementById("zone-results").offsetTop;
+  }
+
+  async displayZoneDetailedResults(zone) {
+    document.getElementById("zone-detaileds-results").innerHTML =
+      '<br/><h5 class="title is-5">Statistiques</h5>';
+
+    if (this.parent.parent.filter === "partial")
+      document.getElementById(
+        "zone-detaileds-results"
+      ).innerHTML += this.parent.parent.progressBarTemplate(
+        {
+          Name: "Pourcentage de saisie",
+          Percentage: zone.stats.PercentageConsiderated,
+          VoiceNumber: null,
+        },
+        "grey",
+        null
+      );
+    document.getElementById(
+      "zone-detaileds-results"
+    ).innerHTML += this.parent.parent.progressBarTemplate(
+      {
+        Name: "Abstention",
+        Percentage: zone.stats.Abstention,
+        VoiceNumber: null,
+      },
+      "grey",
+      null
+    );
+    document.getElementById(
+      "zone-detaileds-results"
+    ).innerHTML += this.parent.parent.progressBarTemplate(
+      {
+        Name: "Votes blancs",
+        Percentage: zone.stats.BlankPercentage,
+        VoiceNumber: zone.stats.BlankVoiceNumber,
+      },
+      "grey",
+      null
+    );
+    document.getElementById(
+      "zone-detaileds-results"
+    ).innerHTML += this.parent.parent.progressBarTemplate(
+      {
+        Name: "Votes nuls",
+        Percentage: zone.stats.NullVotePercentage,
+        VoiceNumber: zone.stats.NullVoteVoiceNumber,
+      },
+      "grey",
+      null
+    );
+    if (
+      this.parent.parent.zone === "areas" &&
+      zone.stats.PercentageConsiderated == 100
+    ) {
+      document.getElementById("zone-detaileds-results").innerHTML +=
+        '<br/><h5 class="title is-5">Élus</h5>';
+      for (let i in zone.Electeds) {
+        let candidateList = await this.CandidateListModel.getCandidateList(
+          zone.Electeds[i].CandidateListID
+        );
+        document.getElementById("zone-detaileds-results").innerHTML +=
+          zone.Electeds[i].FullName + " (" + candidateList.Name + ")<br/>";
+      }
+    }
+  }
+}
diff --git a/web/components/visualization/results-zone.js b/web/components/visualization/results-zone.js
index 563fb2ac8d9a485ab4d1ab760c394d6281d0684f..37e1b69081642c02ed681fbccfcca32601b3c710 100644
--- a/web/components/visualization/results-zone.js
+++ b/web/components/visualization/results-zone.js
@@ -4,8 +4,8 @@ import * as PartyModel from "/services/model/party-model.js";
 import * as CandidateListModel from "/services/model/candidateList-model.js";
 import * as AreaModel from "/services/model/area-model.js";
 import * as Scroller from "/services/common/scroller.js";
-import * as Common from "/services/common/common.js";
 import * as ResultsFlow from "/components/visualization/results-flow.js";
+import * as ResultsDetaileds from "/components/visualization/results-detaileds.js";
 
 export async function mount(where, parent) {
   const resultZoneComponent = new ResultZoneComponent(parent);
@@ -90,6 +90,7 @@ class ResultZoneComponent {
       </div>
     `;
     this.ResultsFlow = await ResultsFlow.mount(this);
+    this.ResultsDetaileds = await ResultsDetaileds.mount(this);
     this.scroller = Scroller.scrollInit(
       "news-flow",
       document.getElementById("auto-scroll")
@@ -120,40 +121,6 @@ class ResultZoneComponent {
         this.displayResults();
       });
     }
-
-    document.addEventListener(
-      "input",
-      function __listener(event) {
-        if (event.target.id == "select-areas") {
-          if (event.target.value != 0) {
-            let area = resultHandler.parent.results.areasResults.find(
-              (areaFind) => areaFind.ID == event.target.value
-            );
-
-            if (resultHandler.parent.zone === "areas") {
-              resultHandler.displayZoneResults(area);
-              resultHandler.areaDisplayed = area;
-            } else if (resultHandler.parent.zone === "sections") {
-              resultHandler.refreshSections(area);
-              resultHandler.displayZoneResults(area.Sections[0]);
-              resultHandler.areaDisplayed = area;
-              resultHandler.sectionDisplayed = area.Sections[0];
-            }
-          }
-        } else if (event.target.id == "select-sections") {
-          let area = resultHandler.parent.results.areasResults.find(
-            (areaFind) =>
-              areaFind.ID == document.getElementById("select-areas").value
-          );
-          let section = area.Sections.find(
-            (sectionFind) => sectionFind.ID == event.target.value
-          );
-          resultHandler.displayZoneResults(section);
-          resultHandler.sectionDisplayed = section;
-        }
-      },
-      false
-    );
   }
 
   zoomMap() {
@@ -246,157 +213,10 @@ class ResultZoneComponent {
     document.getElementById("news-flow").innerHTML = "";
     if (this.parent.zone === "areas") {
       await this.ResultsFlow.displayFlowAreas();
-      this.displayAreasResults();
+      this.ResultsDetaileds.displayAreasResults();
     } else if (this.parent.zone === "sections") {
       await this.ResultsFlow.displayFlowSections();
-      this.displaySectionsResults();
-    }
-  }
-
-  displayAreasResults() {
-    this.refreshAreas();
-    document.getElementById("select-sections").parentNode.style.display =
-      "none";
-
-    if (this.parent.zone == "areas" && this.areaDisplayed != undefined) {
-      document.getElementById("select-areas").value = this.areaDisplayed.ID;
-    } else this.displayZoneResults(this.parent.results.areasResults[0]);
-  }
-
-  displaySectionsResults() {
-    this.refreshAreas();
-    document.getElementById("select-sections").parentNode.style.display =
-      "block";
-    this.refreshSections(this.parent.results.areasResults[0]);
-
-    if (this.parent.zone == "sections" && this.sectionDisplayed != undefined) {
-      document.getElementById("select-areas").value = this.areaDisplayed.ID;
-      this.refreshSections(this.areaDisplayed);
-      document.getElementById(
-        "select-sections"
-      ).value = this.sectionDisplayed.ID;
-    } else {
-      this.displayZoneResults(this.parent.results.areasResults[0].Sections[0]);
-    }
-  }
-
-  async displayZoneResults(zone) {
-    if (zone.status !== this.parent.filter) {
-      if (zone.status == "no_results") {
-        document.getElementById(
-          "zone-results"
-        ).innerHTML = Common.warningMessage(
-          "Pas de résultats",
-          "Aucun résultats n'ont étaient saisis sur cette zone"
-        );
-      } else if (zone.status == "incompleted") {
-        document.getElementById(
-          "zone-results"
-        ).innerHTML = Common.warningMessage(
-          "Pas complets",
-          "Les résultats pour cette zone ne sont pas complets"
-        );
-      } else if (zone.status == "not validated") {
-        document.getElementById(
-          "zone-results"
-        ).innerHTML = Common.warningMessage(
-          "Non validé",
-          "Les résultats pour cette zone n'ont pas étaient validés"
-        );
-      }
-      document.getElementById("zone-detaileds-results").innerHTML = "";
-    } else {
-      document.getElementById("zone-results").innerHTML =
-        '<br/><h5 class="title is-5">Résultats</h5>';
-      for (let i in zone.candidateLists) {
-        let electedsNumber = null;
-        if (
-          this.parent.zone === "areas" &&
-          zone.candidateLists[i].SeatsAttributed > 0 &&
-          zone.stats.PercentageConsiderated == 100
-        ) {
-          electedsNumber = zone.candidateLists[i].SeatsAttributed;
-        }
-        let party = await this.PartyModel.getParty(
-          zone.candidateLists[i].PartyID
-        );
-        document.getElementById(
-          "zone-results"
-        ).innerHTML += this.parent.progressBarTemplate(
-          zone.candidateLists[i],
-          party.Color,
-          electedsNumber
-        );
-      }
-      this.displayZoneDetailedResults(zone);
-    }
-    document.getElementById(
-      "detailed-results"
-    ).scrollTop = document.getElementById("zone-results").offsetTop;
-  }
-
-  async displayZoneDetailedResults(zone) {
-    document.getElementById("zone-detaileds-results").innerHTML =
-      '<br/><h5 class="title is-5">Statistiques</h5>';
-
-    if (this.parent.filter === "partial")
-      document.getElementById(
-        "zone-detaileds-results"
-      ).innerHTML += this.parent.progressBarTemplate(
-        {
-          Name: "Pourcentage de saisie",
-          Percentage: zone.stats.PercentageConsiderated,
-          VoiceNumber: null,
-        },
-        "grey",
-        null
-      );
-    document.getElementById(
-      "zone-detaileds-results"
-    ).innerHTML += this.parent.progressBarTemplate(
-      {
-        Name: "Abstention",
-        Percentage: zone.stats.Abstention,
-        VoiceNumber: null,
-      },
-      "grey",
-      null
-    );
-    document.getElementById(
-      "zone-detaileds-results"
-    ).innerHTML += this.parent.progressBarTemplate(
-      {
-        Name: "Votes blancs",
-        Percentage: zone.stats.BlankPercentage,
-        VoiceNumber: zone.stats.BlankVoiceNumber,
-      },
-      "grey",
-      null
-    );
-    document.getElementById(
-      "zone-detaileds-results"
-    ).innerHTML += this.parent.progressBarTemplate(
-      {
-        Name: "Votes nuls",
-        Percentage: zone.stats.NullVotePercentage,
-        VoiceNumber: zone.stats.NullVoteVoiceNumber,
-      },
-      "grey",
-      null
-    );
-    if (
-      this.parent.zone === "areas" &&
-      zone.stats.PercentageConsiderated == 100
-    ) {
-      document.getElementById("zone-detaileds-results").innerHTML +=
-        '<br/><h5 class="title is-5">Élus</h5>';
-      for (let i in zone.Electeds) {
-        let candidateList = await this.CandidateListModel.getCandidateList(
-          zone.Electeds[i].CandidateListID
-        );
-        document.getElementById("zone-detaileds-results").innerHTML +=
-          zone.Electeds[i].FullName + " (" + candidateList.Name + ")<br/>";
-      }
+      this.ResultsDetaileds.displaySectionsResults();
     }
   }