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 6f23236..720cec1 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
@@ -39,7 +39,7 @@
 
   private volatile EiffelEventParsingExecutor pool;
   private final EiffelEventParser eventParser;
-  private final ParsingQueuePersistance persistance;
+  private final ParsingQueuePersistence persistence;
   private final ConcurrentHashMap<EventParsingWorker, ScheduledFuture<?>> pending =
       new ConcurrentHashMap<>();
 
@@ -47,10 +47,10 @@
   public EiffelEventParsingQueue(
       EiffelEventParsingExecutor pool,
       EiffelEventParser eventParser,
-      ParsingQueuePersistance persistance) {
+      ParsingQueuePersistence persistence) {
     this.pool = pool;
     this.eventParser = eventParser;
-    this.persistance = persistance;
+    this.persistence = persistence;
   }
 
   public void scheduleSccCreation(RevisionCreatedListener.Event event) {
@@ -111,12 +111,12 @@
       e.getValue().cancel(true);
       tasks.add(e.getKey().task);
     }
-    persistance.persist(tasks);
+    persistence.persist(tasks);
     pool.shutDown();
   }
 
   public void init() {
-    for (ParsingQueueTask task : persistance.getPersistedTasks()) {
+    for (ParsingQueueTask task : persistence.getPersistedTasks()) {
       schedule(task);
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistance.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistence.java
similarity index 83%
rename from src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistance.java
rename to src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistence.java
index afe7ca2..b62206b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistance.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistence.java
@@ -28,24 +28,24 @@
 import java.nio.file.Path;
 import java.util.List;
 
-public class ParsingQueuePersistance {
+public class ParsingQueuePersistence {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
   private static final Gson GSON = new Gson();
   private static final String PERSISTED_FILE_NAME = "persisted-queue.json";
 
-  private final Path persistanceFile;
+  private final Path persistenceFile;
   private final Path pluginDataDir;
 
   @Inject
-  public ParsingQueuePersistance(SitePaths sitePaths, @PluginName String pluginName) {
+  public ParsingQueuePersistence(SitePaths sitePaths, @PluginName String pluginName) {
     this.pluginDataDir = sitePaths.data_dir.resolve(pluginName);
-    this.persistanceFile = pluginDataDir.resolve(PERSISTED_FILE_NAME);
+    this.persistenceFile = pluginDataDir.resolve(PERSISTED_FILE_NAME);
   }
 
   public void persist(List<ParsingQueueTask> tasks) {
     try {
-      if (Files.isRegularFile(persistanceFile)) {
-        Files.delete(persistanceFile);
+      if (Files.isRegularFile(persistenceFile)) {
+        Files.delete(persistenceFile);
       }
       if (tasks == null || tasks.isEmpty()) {
         return;
@@ -53,7 +53,7 @@
       if (!Files.isDirectory(pluginDataDir)) {
         Files.createDirectory(pluginDataDir);
       }
-      Files.write(persistanceFile, GSON.toJson(tasks).getBytes(UTF_8));
+      Files.write(persistenceFile, GSON.toJson(tasks).getBytes(UTF_8));
     } catch (IOException e) {
       logger.atSevere().withCause(e).log("Failed to persist parsing queue");
     }
@@ -62,10 +62,10 @@
   public List<ParsingQueueTask> getPersistedTasks() {
     List<ParsingQueueTask> persistedTasks = null;
     try {
-      if (Files.isRegularFile(persistanceFile)) {
+      if (Files.isRegularFile(persistenceFile)) {
         persistedTasks =
             GSON.fromJson(
-                Files.newBufferedReader(persistanceFile, UTF_8),
+                Files.newBufferedReader(persistenceFile, UTF_8),
                 new TypeToken<List<ParsingQueueTask>>() {
 
                   private static final long serialVersionUID = 1L;
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 6bb1f16..ec9e0c5 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
@@ -34,19 +34,19 @@
         "com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueueIT$TestModule")
 public class EiffelEventParsingQueueIT extends EiffelEventParsingTest {
 
-  private ParsingQueuePersistance queuePersistance;
+  private ParsingQueuePersistence queuePersistence;
   private EiffelEventParsingQueue parsingQueue;
 
   @Before
   public void setUp() throws Exception {
-    queuePersistance = plugin.getSysInjector().getInstance(ParsingQueuePersistance.class);
+    queuePersistence = plugin.getSysInjector().getInstance(ParsingQueuePersistence.class);
     parsingQueue = plugin.getSysInjector().getInstance(EiffelEventParsingQueue.class);
     TestEventHub.EVENTS.clear();
   }
 
   @Test
   public void persistedScsFromBranchIsScheduledAndPushed() throws Exception {
-    queuePersistance.persist(
+    queuePersistence.persist(
         List.of(ParsingQueueTask.builder(EiffelEventType.SCS, project.get(), getHead()).build()));
     parsingQueue.init();
     assertCorrectEvent(0, eventForHead(EiffelEventType.SCC));
@@ -58,7 +58,7 @@
     setScsHandled();
     PushOneCommit.Result res = createChange();
     merge(res);
-    queuePersistance.persist(
+    queuePersistence.persist(
         List.of(
             ParsingQueueTask.builder(EiffelEventType.SCS, project.get(), "refs/heads/master")
                 .commit(res.getCommit().name())
@@ -72,7 +72,7 @@
   public void persistedSccFromCommitIsScheduledAndPushed() throws Exception {
     setScsHandled();
     PushOneCommit.Result res = createChange();
-    queuePersistance.persist(
+    queuePersistence.persist(
         List.of(
             ParsingQueueTask.builder(EiffelEventType.SCC, project.get(), "refs/heads/master")
                 .commit(res.getCommit().name())
@@ -86,7 +86,7 @@
     setScsHandled();
     PushOneCommit.Result res = createChange();
     merge(res);
-    queuePersistance.persist(
+    queuePersistence.persist(
         List.of(
             ParsingQueueTask.builder(EiffelEventType.SCS, project.get(), "refs/heads/master")
                 .build()));
@@ -102,7 +102,7 @@
     ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), tag, "localhost"));
     CompositionDefinedEventKey cd =
         CompositionDefinedEventKey.create(tagCompositionName(project.get(), "localhost"), tag);
-    queuePersistance.persist(
+    queuePersistence.persist(
         List.of(
             ParsingQueueTask.builder(EiffelEventType.ARTC, project.get(), tag)
                 .updateTime(EPOCH_MILLIS)
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistanceIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
similarity index 88%
rename from src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistanceIT.java
rename to src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
index 977e457..7fa9bb5 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistanceIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingQueuePersistenceIT.java
@@ -43,43 +43,43 @@
 @TestPlugin(
     name = "events-eiffel",
     sysModule =
-        "com.googlesource.gerrit.plugins.eventseiffel.parsing.ParsingQueuePersistanceIT$TestModule")
-public class ParsingQueuePersistanceIT extends LightweightPluginDaemonTest {
+        "com.googlesource.gerrit.plugins.eventseiffel.parsing.ParsingQueuePersistenceIT$TestModule")
+public class ParsingQueuePersistenceIT extends LightweightPluginDaemonTest {
 
-  private ParsingQueuePersistance queuePersistance;
+  private ParsingQueuePersistence queuePersistence;
   private EiffelEventParsingQueue parsingQueue;
 
   @Before
   public void setUp() throws Exception {
-    queuePersistance = plugin.getSysInjector().getInstance(ParsingQueuePersistance.class);
+    queuePersistence = plugin.getSysInjector().getInstance(ParsingQueuePersistence.class);
     parsingQueue = plugin.getSysInjector().getInstance(EiffelEventParsingQueue.class);
   }
 
   @Test
   public void tasksArePersisted() throws Exception {
     List<ParsingQueueTask> original = createTasks(1, 5);
-    queuePersistance.persist(original);
-    List<ParsingQueueTask> deserialized = queuePersistance.getPersistedTasks();
+    queuePersistence.persist(original);
+    List<ParsingQueueTask> deserialized = queuePersistence.getPersistedTasks();
     assertEquals(original, deserialized);
   }
 
   @Test
-  public void multiplePersistanceRuns() throws Exception {
+  public void multiplePersistenceRuns() throws Exception {
     List<ParsingQueueTask> original = createTasks(1, 6);
-    queuePersistance.persist(original);
-    List<ParsingQueueTask> deserialized = queuePersistance.getPersistedTasks();
+    queuePersistence.persist(original);
+    List<ParsingQueueTask> deserialized = queuePersistence.getPersistedTasks();
     assertEquals(original, deserialized);
 
     original = createTasks(6, 10);
-    queuePersistance.persist(original);
-    deserialized = queuePersistance.getPersistedTasks();
+    queuePersistence.persist(original);
+    deserialized = queuePersistence.getPersistedTasks();
     assertEquals(original, deserialized);
   }
 
   @Test
   public void persistedTasksAreScheduledOnInit() throws Exception {
     List<ParsingQueueTask> tasks = createTasks(1, 6);
-    queuePersistance.persist(tasks);
+    queuePersistence.persist(tasks);
     parsingQueue.init();
     assertThat(
             TestExecutor.scheduledItems().stream()
@@ -91,7 +91,7 @@
 
   private List<ParsingQueueTask> createTasks(int start, int end) {
     return IntStream.range(start, end)
-        .mapToObj(ParsingQueuePersistanceIT::createTask)
+        .mapToObj(ParsingQueuePersistenceIT::createTask)
         .collect(Collectors.toList());
   }
 
@@ -195,7 +195,7 @@
   public static class TestModule extends AbstractModule {
     @Override
     protected void configure() {
-      bind(ParsingQueuePersistance.class);
+      bind(ParsingQueuePersistence.class);
       bind(EiffelEventParser.class).to(NoOpEventParser.class);
       bind(EiffelEventParsingExecutor.class).toProvider(TestExecutor.class);
     }
