diff --git a/web/components/vote/votes.js b/web/components/vote/votes.js
index f1a63dfced0c879bfda37ce72c57a534d892e399..ed5c48d33a4f20a25ec54bbe9b1e5151cfa2c07b 100644
--- a/web/components/vote/votes.js
+++ b/web/components/vote/votes.js
@@ -101,6 +101,11 @@ class Vote {
       .addEventListener("click", function () {
         voteHandler.loadVotes();
       });
+    document
+      .getElementById(`votes-save`)
+      .addEventListener("click", function () {
+        voteHandler.saveVotes();
+      });
   }
 
   async refreshBreadCrumb() {
@@ -156,7 +161,10 @@ class Vote {
     });
     let candidateLists = await this.CandidateListModel.getCandidateLists();
     candidateLists = candidateLists.filter((candidateList) => {
-      return candidateList.AreaID == voteHandler.AreaID;
+      return (
+        candidateList.AreaID == voteHandler.AreaID &&
+        candidateList.RoundID == voteHandler.RoundID
+      );
     });
 
     const markup = candidateLists
@@ -195,4 +203,54 @@ class Vote {
       }
     });
   }
+
+  async saveVotes() {
+    let voteHandler = this;
+    let candidateLists = await this.CandidateListModel.getCandidateLists();
+    candidateLists = candidateLists.filter((candidateList) => {
+      return (
+        candidateList.AreaID == voteHandler.AreaID &&
+        candidateList.RoundID == voteHandler.RoundID
+      );
+    });
+
+    let votes = await this.VoteModel.getVotes();
+    votes = votes.filter((vote) => {
+      return vote.DeskRoundID == voteHandler.DeskRoundID;
+    });
+
+    let method;
+    if (votes.length == 0) method = "POST";
+    else method = "PUT";
+
+    candidateLists.forEach((candidateList) => {
+      voteHandler.VoteModel.saveVote(
+        method,
+        voteHandler.DeskRoundID,
+        candidateList.ID,
+        parseInt(
+          document.getElementById(candidateList.ID + "-vote-voice").value
+        ),
+        false,
+        false
+      );
+    });
+
+    this.VoteModel.saveVote(
+      method,
+      this.DeskRoundID,
+      null,
+      parseInt(document.getElementById("blank-vote-voice").value),
+      true,
+      false
+    );
+    this.VoteModel.saveVote(
+      method,
+      this.DeskRoundID,
+      null,
+      parseInt(document.getElementById("null-vote-voice").value),
+      false,
+      true
+    );
+  }
 }
diff --git a/web/services/model/vote-model.js b/web/services/model/vote-model.js
index ff95c026a82c0a003e43c934b2cbc37bcce019f8..cffb3617aa52c85f884a0e27b822aa15aeec04af 100644
--- a/web/services/model/vote-model.js
+++ b/web/services/model/vote-model.js
@@ -46,7 +46,6 @@ class VoteModel {
 
   async saveVote(
     method,
-    ID,
     DeskRoundID,
     CandidateListID,
     VoiceNumber,
@@ -54,13 +53,12 @@ class VoteModel {
     NullVote
   ) {
     try {
-      const response = await fetch("/api/Vote/" + ID, {
+      const response = await fetch("/api/Vote/", {
         method: method,
         headers: new Headers({
           "XSRF-Token": this.current_user.xsrftoken,
         }),
         body: JSON.stringify({
-          ID: ID,
           DeskRoundID: DeskRoundID,
           CandidateListID: CandidateListID,
           VoiceNumber: VoiceNumber,