diff --git a/web/components/visualization/results-section.js b/web/components/visualization/results-section.js
index 78f51e6bcfd05cc3bff86e4c0e79e0e4edf4f491..cbe67306df5580fb0b4b93ac6203dc032177fd69 100644
--- a/web/components/visualization/results-section.js
+++ b/web/components/visualization/results-section.js
@@ -2,23 +2,24 @@
 import * as Auth from "/services/auth/auth.js";
 import * as results from "/services/election/calculate-election-generic.js";
 import * as PartyModel from "/services/model/party-model.js";
+import * as CandidateListModel from "/services/model/candidateList-model.js";
 import * as Scroller from "/services/common/scroller.js";
 
 export async function mount(where, round) {
   const resultComponent = new ResultComponent(round);
   await resultComponent.mount(where);
-  await resultComponent.calculateResults();
-  resultComponent.displayResults();
 }
 
 class ResultComponent {
   constructor(round) {
     this.round = round;
     this.PartyModel = PartyModel.getPartyModel();
+    this.CandidateListModel = CandidateListModel.getCandidateListModel();
   }
 
   async mount(where) {
     this.PartyModel.current_user = await Auth.GetUser();
+    this.CandidateListModel.current_user = await Auth.GetUser();
     const mountpoint = where;
     document.getElementById(mountpoint).innerHTML = /* HTML */ `
       <div class="tabs is-boxed is-toggle is-fullwidth">
@@ -128,7 +129,7 @@ class ResultComponent {
     </div>`;
   }
 
-  progressBarTemplate(candidateList, color) {
+  progressBarTemplate(candidateList, color, electedsNumber) {
     return /* HTML */ `<div class="progressBar">
       <div
         class="progressBarValue"
@@ -140,7 +141,8 @@ class ResultComponent {
           ? candidateList.VoiceNumber + " votes soit : "
           : "") +
         candidateList.Percentage +
-        "%)"}
+        "%" +
+        (electedsNumber != null ? ", " + electedsNumber + " élus" : "")})
       </div>
     </div>`;
   }
@@ -159,20 +161,24 @@ class ResultComponent {
 
   handleDom() {
     let resultHandler = this;
-    document.getElementById("areas").addEventListener("click", function () {
-      resultHandler.zone = "areas";
-      resultHandler.calculateResults();
-      resultHandler.displayResults();
-      document.getElementById("sections").setAttribute("class", "");
-      document.getElementById("areas").setAttribute("class", "is-active");
-    });
-    document.getElementById("sections").addEventListener("click", function () {
-      resultHandler.zone = "sections";
-      resultHandler.calculateResults();
-      resultHandler.displayResults();
-      document.getElementById("areas").setAttribute("class", "");
-      document.getElementById("sections").setAttribute("class", "is-active");
-    });
+    document
+      .getElementById("areas")
+      .addEventListener("click", async function () {
+        resultHandler.zone = "areas";
+        await resultHandler.calculateResults();
+        resultHandler.displayResults();
+        document.getElementById("sections").setAttribute("class", "");
+        document.getElementById("areas").setAttribute("class", "is-active");
+      });
+    document
+      .getElementById("sections")
+      .addEventListener("click", async function () {
+        resultHandler.zone = "sections";
+        await resultHandler.calculateResults();
+        resultHandler.displayResults();
+        document.getElementById("areas").setAttribute("class", "");
+        document.getElementById("sections").setAttribute("class", "is-active");
+      });
 
     document.getElementById("zoom-map").addEventListener("click", function () {
       resultHandler.zoomMap();
@@ -414,7 +420,6 @@ class ResultComponent {
 
   async displayZoneResults(zone) {
     if (zone.status !== this.filter) {
-      console.log(zone);
       if (zone.status == "no_results") {
         document.getElementById(
           "zone-results"
@@ -439,6 +444,14 @@ class ResultComponent {
       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.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
         );
@@ -446,14 +459,15 @@ class ResultComponent {
           "zone-results"
         ).innerHTML += this.progressBarTemplate(
           zone.candidateLists[i],
-          party.Color
+          party.Color,
+          electedsNumber
         );
       }
       this.displayZoneDetailedResults(zone);
     }
   }
 
-  displayZoneDetailedResults(zone) {
+  async displayZoneDetailedResults(zone) {
     document.getElementById("zone-detaileds-results").innerHTML =
       '<br/><h5 class="title is-5">Statistiques</h5>';
 
@@ -466,7 +480,8 @@ class ResultComponent {
           Percentage: zone.stats.PercentageConsiderated,
           VoiceNumber: null,
         },
-        "grey"
+        "grey",
+        null
       );
     document.getElementById(
       "zone-detaileds-results"
@@ -476,7 +491,8 @@ class ResultComponent {
         Percentage: zone.stats.Abstention,
         VoiceNumber: null,
       },
-      "grey"
+      "grey",
+      null
     );
     document.getElementById(
       "zone-detaileds-results"
@@ -486,7 +502,8 @@ class ResultComponent {
         Percentage: zone.stats.BlankPercentage,
         VoiceNumber: zone.stats.BlankVoiceNumber,
       },
-      "grey"
+      "grey",
+      null
     );
     document.getElementById(
       "zone-detaileds-results"
@@ -496,8 +513,20 @@ class ResultComponent {
         Percentage: zone.stats.NullVotePercentage,
         VoiceNumber: zone.stats.NullVoteVoiceNumber,
       },
-      "grey"
+      "grey",
+      null
     );
+    if (this.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/>";
+      }
+    }
   }
 
   refreshSections(area) {
diff --git a/web/services/election/calculate-election-generic.js b/web/services/election/calculate-election-generic.js
index a6aa96c60bd9872c2de964983016d6c99ebcc327..eed1675625e11f967b3d2e4d12defc0d8f5c9357 100644
--- a/web/services/election/calculate-election-generic.js
+++ b/web/services/election/calculate-election-generic.js
@@ -16,7 +16,7 @@ export async function mountCalculator(round) {
 }
 
 class DirectMetropolitanCalculator {
-  constructor(round, filter) {
+  constructor(round) {
     this.round = round;
     this.ElectionModel = ElectionModel.getElectionModel();
     this.RoundModel = RoundModel.getRoundModel();
@@ -150,8 +150,7 @@ class DirectMetropolitanCalculator {
     for (let i in areas) {
       areasCalculated.push(await this.calculateAreaResults(areas[i]));
     }
-    areas = areasCalculated;
-    return areas;
+    return areasCalculated;
   }
 
   async calculateAreaResults(area) {
@@ -337,7 +336,6 @@ class DirectMetropolitanCalculator {
       subscribed += desk.Subscribed;
       if (deskRounds[i].Completed) {
         completed += desk.Subscribed;
-        console.log("test")
       }
       deskRounds[i].Votes.forEach((vote) => {
         totalVotes += vote.VoiceNumber;
@@ -364,6 +362,7 @@ class DirectMetropolitanCalculator {
 
     // order candidates by rank and remove refused or removed candidates
     area.candidateLists.forEach((candidateList) => {
+      candidateList.seatNumber = 0;
       candidateList.Candidates.sort(function (a, b) {
         return a.Rank - b.Rank;
       });
@@ -448,6 +447,11 @@ class DirectMetropolitanCalculator {
       leftSeats -= 1;
     }
 
+    area.candidateLists.sort((a, b) => {
+      return b.VoiceNumber - a.VoiceNumber;
+    });
+    area.candidateLists[0].SeatsAttributed += seatForFirst;
+
     return electeds;
   }
 }