diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
index 720cec1..4a378c7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
@@ -18,7 +18,7 @@
 import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCC;
 import static com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType.SCS;
 
-import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.entities.Project.NameKey;
@@ -29,8 +29,8 @@
 import com.google.gerrit.server.util.time.TimeUtil;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey;
-import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ScheduledFuture;
 
@@ -106,7 +106,7 @@
   }
 
   public void shutDown() {
-    List<ParsingQueueTask> tasks = Lists.newArrayListWithCapacity(pending.size());
+    Set<ParsingQueueTask> tasks = Sets.newHashSet();
     for (Map.Entry<EventParsingWorker, ScheduledFuture<?>> e : pending.entrySet()) {
       e.getValue().cancel(true);
       tasks.add(e.getKey().task);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistence.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistence.java
index b62206b..2852d4d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistence.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistence.java
@@ -26,7 +26,9 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.Collection;
 import java.util.List;
+import java.util.Set;
 
 public class ParsingQueuePersistence {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@@ -42,7 +44,7 @@
     this.persistenceFile = pluginDataDir.resolve(PERSISTED_FILE_NAME);
   }
 
-  public void persist(List<ParsingQueueTask> tasks) {
+  public void persist(Set<ParsingQueueTask> tasks) {
     try {
       if (Files.isRegularFile(persistenceFile)) {
         Files.delete(persistenceFile);
@@ -59,14 +61,14 @@
     }
   }
 
-  public List<ParsingQueueTask> getPersistedTasks() {
-    List<ParsingQueueTask> persistedTasks = null;
+  public Collection<ParsingQueueTask> getPersistedTasks() {
+    Set<ParsingQueueTask> persistedTasks = null;
     try {
       if (Files.isRegularFile(persistenceFile)) {
         persistedTasks =
             GSON.fromJson(
                 Files.newBufferedReader(persistenceFile, UTF_8),
-                new TypeToken<List<ParsingQueueTask>>() {
+                new TypeToken<Set<ParsingQueueTask>>() {
 
                   private static final long serialVersionUID = 1L;
                 }.getType());
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueueIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueueIT.java
index ec9e0c5..dc39eff 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueueIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueueIT.java
@@ -22,7 +22,7 @@
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.ArtifactEventKey;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.CompositionDefinedEventKey;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType;
-import java.util.List;
+import java.util.Set;
 import org.eclipse.jgit.lib.Constants;
 import org.junit.Before;
 import org.junit.Test;
@@ -47,7 +47,7 @@
   @Test
   public void persistedScsFromBranchIsScheduledAndPushed() throws Exception {
     queuePersistence.persist(
-        List.of(ParsingQueueTask.builder(EiffelEventType.SCS, project.get(), getHead()).build()));
+        Set.of(ParsingQueueTask.builder(EiffelEventType.SCS, project.get(), getHead()).build()));
     parsingQueue.init();
     assertCorrectEvent(0, eventForHead(EiffelEventType.SCC));
     assertCorrectEvent(1, eventForHead(EiffelEventType.SCS));
@@ -59,7 +59,7 @@
     PushOneCommit.Result res = createChange();
     merge(res);
     queuePersistence.persist(
-        List.of(
+        Set.of(
             ParsingQueueTask.builder(EiffelEventType.SCS, project.get(), "refs/heads/master")
                 .commit(res.getCommit().name())
                 .build()));
@@ -73,7 +73,7 @@
     setScsHandled();
     PushOneCommit.Result res = createChange();
     queuePersistence.persist(
-        List.of(
+        Set.of(
             ParsingQueueTask.builder(EiffelEventType.SCC, project.get(), "refs/heads/master")
                 .commit(res.getCommit().name())
                 .build()));
@@ -87,7 +87,7 @@
     PushOneCommit.Result res = createChange();
     merge(res);
     queuePersistence.persist(
-        List.of(
+        Set.of(
             ParsingQueueTask.builder(EiffelEventType.SCS, project.get(), "refs/heads/master")
                 .build()));
     parsingQueue.init();
@@ -103,7 +103,7 @@
     CompositionDefinedEventKey cd =
         CompositionDefinedEventKey.create(tagCompositionName(project.get(), "localhost"), tag);
     queuePersistence.persist(
-        List.of(
+        Set.of(
             ParsingQueueTask.builder(EiffelEventType.ARTC, project.get(), tag)
                 .updateTime(EPOCH_MILLIS)
                 .force(false)
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
index 7fa9bb5..c0f1457 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
@@ -14,7 +14,6 @@
 package com.googlesource.gerrit.plugins.eventseiffel.parsing;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import autovaluegson.factory.shaded.com.google.common.collect.Lists;
 import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
@@ -29,6 +28,7 @@
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelEventType;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.Delayed;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ScheduledFuture;
@@ -57,28 +57,25 @@
 
   @Test
   public void tasksArePersisted() throws Exception {
-    List<ParsingQueueTask> original = createTasks(1, 5);
+    Set<ParsingQueueTask> original = createTasks(1, 5);
     queuePersistence.persist(original);
-    List<ParsingQueueTask> deserialized = queuePersistence.getPersistedTasks();
-    assertEquals(original, deserialized);
+    assertThat(queuePersistence.getPersistedTasks()).containsExactlyElementsIn(original);
   }
 
   @Test
   public void multiplePersistenceRuns() throws Exception {
-    List<ParsingQueueTask> original = createTasks(1, 6);
+    Set<ParsingQueueTask> original = createTasks(1, 6);
     queuePersistence.persist(original);
-    List<ParsingQueueTask> deserialized = queuePersistence.getPersistedTasks();
-    assertEquals(original, deserialized);
+    assertThat(queuePersistence.getPersistedTasks()).containsExactlyElementsIn(original);
 
     original = createTasks(6, 10);
     queuePersistence.persist(original);
-    deserialized = queuePersistence.getPersistedTasks();
-    assertEquals(original, deserialized);
+    assertThat(queuePersistence.getPersistedTasks()).containsExactlyElementsIn(original);
   }
 
   @Test
   public void persistedTasksAreScheduledOnInit() throws Exception {
-    List<ParsingQueueTask> tasks = createTasks(1, 6);
+    Set<ParsingQueueTask> tasks = createTasks(1, 6);
     queuePersistence.persist(tasks);
     parsingQueue.init();
     assertThat(
@@ -89,10 +86,10 @@
             tasks.stream().map(t -> Project.nameKey(t.repoName)).collect(Collectors.toList()));
   }
 
-  private List<ParsingQueueTask> createTasks(int start, int end) {
+  private Set<ParsingQueueTask> createTasks(int start, int end) {
     return IntStream.range(start, end)
         .mapToObj(ParsingQueuePersistenceIT::createTask)
-        .collect(Collectors.toList());
+        .collect(Collectors.toSet());
   }
 
   public static ParsingQueueTask createTask(int id) {
