diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/Module.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/Module.java
index 28649a0..9f53bee 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/Module.java
@@ -39,6 +39,8 @@
 import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventFactory;
 import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventMapper;
 import com.googlesource.gerrit.plugins.eventseiffel.mq.RabbitMqPublisher;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParser;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingExecutor;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue;
 import com.googlesource.gerrit.plugins.eventseiffel.rest.RestModule;
@@ -98,6 +100,7 @@
         .in(Scopes.SINGLETON);
     bind(EiffelEventParsingExecutor.Scheduled.class).in(Scopes.SINGLETON);
     bind(EiffelEventParsingExecutor.class).to(EiffelEventParsingExecutor.Scheduled.class);
+    bind(EiffelEventParserIf.class).to(EiffelEventParser.class);
     bind(EiffelEventParsingQueue.class).in(Scopes.SINGLETON);
     bind(EiffelEventHubImpl.class).in(Scopes.SINGLETON);
     bind(EiffelEventHub.class).to(EiffelEventHubImpl.class);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
index 34ac69e..df82291 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
@@ -59,7 +59,7 @@
 import org.eclipse.jgit.revwalk.RevCommit;
 
 /** Creates and pushes missing Eiffel events to the Eiffel event queue. */
-public class EiffelEventParser {
+public class EiffelEventParser implements EiffelEventParserIf {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private static final int NBR_RETRIES = 3;
@@ -81,6 +81,10 @@
     this.mapper = mapper;
   }
 
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleSccFromEvent(com.google.gerrit.extensions.events.RevisionCreatedListener.Event)
+   */
+  @Override
   public void createAndScheduleSccFromEvent(Event event) {
     CommitInfo commit = event.getRevision().commit;
     SourceChangeEventKey scc =
@@ -118,31 +122,25 @@
     }
   }
 
-  /**
-   * Creates SCC events for all commits reachable from branch. I.e. create SCCs for already merged
-   * commit that are missing SCCs.
-   *
-   * @param repoName - the repository containing the commits to create events from.
-   * @param targetBranch - used to populate data.gitIdentifier.branch.
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleSccFromBranch(java.lang.String, java.lang.String)
    */
-  public void createAndScheduleSccFromBranch(String repoName, String targetBranch) {
-    ObjectId tip = getTipOf(repoName, targetBranch);
+  @Override
+  public void createAndScheduleSccFromBranch(String repoName, String branchRef) {
+    ObjectId tip = getTipOf(repoName, branchRef);
     if (tip == null) {
       return;
     }
-    createAndScheduleSccFromCommit(repoName, targetBranch, tip.getName());
+    createAndScheduleSccFromCommit(repoName, branchRef, tip.getName());
   }
 
-  /**
-   * Creates SCC events for all commits reachable from commit.
-   *
-   * @param repoName - the repository containing the commits to create events from.
-   * @param targetBranch  - used to populate data.gitIdentifier.branch.
-   * @param commit - create events from commits reachable from commit.
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleSccFromCommit(java.lang.String, java.lang.String, java.lang.String)
    */
-  public void createAndScheduleSccFromCommit(String repoName, String targetBranch, String commit) {
+  @Override
+  public void createAndScheduleSccFromCommit(String repoName, String branchRef, String commit) {
 
-    SourceChangeEventKey scc = SourceChangeEventKey.sccKey(repoName, targetBranch, commit);
+    SourceChangeEventKey scc = SourceChangeEventKey.sccKey(repoName, branchRef, commit);
     try {
       createAndScheduleMissingSccs(scc);
     } catch (IOException
@@ -154,15 +152,23 @@
     }
   }
 
-  public void createAndScheduleMissingScssFromBranch(String repoName, String branch) {
-    ObjectId tip = getTipOf(repoName, branch);
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleMissingScssFromBranch(java.lang.String, java.lang.String)
+   */
+  @Override
+  public void createAndScheduleMissingScssFromBranch(String repoName, String branchRef) {
+    ObjectId tip = getTipOf(repoName, branchRef);
     if (tip == null) {
       return;
     }
-    SourceChangeEventKey scs = SourceChangeEventKey.scsKey(repoName, branch, tip.getName());
+    SourceChangeEventKey scs = SourceChangeEventKey.scsKey(repoName, branchRef, tip.getName());
     createAndScheduleMissingScss(scs, null, null, null);
   }
 
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleMissingScss(com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey, java.lang.String, com.google.gerrit.extensions.common.AccountInfo, java.lang.Long)
+   */
+  @Override
   public void createAndScheduleMissingScss(
       SourceChangeEventKey scs,
       String commitSha1TransactionEnd,
@@ -224,32 +230,36 @@
     }
   }
 
+  /* (non-Javadoc)
+   * @see com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf#createAndScheduleArtc(java.lang.String, java.lang.String, java.lang.Long, boolean)
+   */
+  @Override
   public void createAndScheduleArtc(
-      String projectName, String tagName, Long creationTime, boolean force) {
+      String repoName, String tagName, Long creationTime, boolean force) {
     try {
       CompositionDefinedEventKey cd =
-          CompositionDefinedEventKey.create(mapper.tagCompositionName(projectName), tagName);
+          CompositionDefinedEventKey.create(mapper.tagCompositionName(repoName), tagName);
       Optional<UUID> oldCdId = eventHub.getExistingId(cd);
       if (oldCdId.isEmpty() || force) {
-        createAndScheduleCd(projectName, tagName, creationTime, force);
+        createAndScheduleCd(repoName, tagName, creationTime, force);
         Optional<UUID> cdId = eventHub.getExistingId(cd);
         if (cdId.isPresent() && !cdId.equals(oldCdId)) {
-          pushToHub(mapper.toArtc(projectName, tagName, creationTime, cdId.get()), force);
+          pushToHub(mapper.toArtc(repoName, tagName, creationTime, cdId.get()), force);
           if (oldCdId.isPresent()) {
             logger.atInfo().log(
-                "Event Artc has been forcibly created for: %s, %s", projectName, tagName);
+                "Event Artc has been forcibly created for: %s, %s", repoName, tagName);
           } else {
-            logger.atFine().log("Event Artc has been created for: %s, %s", projectName, tagName);
+            logger.atFine().log("Event Artc has been created for: %s, %s", repoName, tagName);
           }
         }
       } else {
         /* Artc event has already been created */
         logger.atWarning().log(
-            "Event Artc has already been created for: %s, %s", projectName, tagName);
+            "Event Artc has already been created for: %s, %s", repoName, tagName);
       }
     } catch (EiffelEventIdLookupException | InterruptedException e) {
       logger.atSevere().withCause(e).log(
-          "Event creation failed for: %s, %s to Artc", projectName, tagName);
+          "Event creation failed for: %s, %s to Artc", repoName, tagName);
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIf.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIf.java
new file mode 100644
index 0000000..94aa921
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIf.java
@@ -0,0 +1,74 @@
+// Copyright (C) 2022 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package com.googlesource.gerrit.plugins.eventseiffel.parsing;
+
+import com.google.gerrit.extensions.common.AccountInfo;
+import com.google.gerrit.extensions.events.RevisionCreatedListener.Event;
+import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey;
+
+public interface EiffelEventParserIf {
+
+  void createAndScheduleSccFromEvent(Event event);
+
+  /**
+   * Creates SCC events for all commits reachable from branchRef. I.e. create SCCs for already
+   * merged commit that are missing SCCs.
+   *
+   * @param repoName - Name of the repository where the branch exists.
+   * @param branchRef - Creates missing events for all commits reachable from branch.
+   */
+  void createAndScheduleSccFromBranch(String repoName, String branchRef);
+
+  /**
+   * Creates SCC events for all commits reachable from commit.
+   *
+   * @param repoName - Name of the repository were the commits exists.
+   * @param branchRef - Ref of the branch to create events for.
+   * @param commit - Creates missing events for all commits reachable from commit.
+   */
+  void createAndScheduleSccFromCommit(String repoName, String branchRef, String commit);
+
+  /**
+   * Creates missing SCS events for repoName, branch.
+   *
+   * @param repoName - Name of the repository where the branch exists.
+   * @param branchRef - Creates missing events for all commits reachable from branchRef.
+   */
+  void createAndScheduleMissingScssFromBranch(String repoName, String branchRef);
+
+  /**
+   * Creates missing SCS events for a submit transaction. submitter and submittedAt is set for all
+   * events created within the submit transaction, i.e. not reachable from commitSha1TransactionEnd.
+   *
+   * @param scs - key for the event that shuold be created, together with parents.
+   * @param commitSha1TransactionEnd - tip before submit transaction.
+   * @param submitter - The submitter
+   * @param submittedAt - When the commit was submitted.
+   */
+  void createAndScheduleMissingScss(
+      SourceChangeEventKey scs,
+      String commitSha1TransactionEnd,
+      AccountInfo submitter,
+      Long submittedAt);
+
+  /**
+   * Creates missing ARTC for a tag, together with CD and (if missing) SCS for referenced commit.
+   *
+   * @param repoName - Name of the repository were the tag exists.
+   * @param tagName - The name of the tag.
+   * @param creationTime - The time at which the tag was created.
+   * @param force - Whether existing events should be replaced or not.
+   */
+  void createAndScheduleArtc(String repoName, String tagName, Long creationTime, boolean force);
+}
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 c5d10b8..b457b6f 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
@@ -36,12 +36,12 @@
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private volatile EiffelEventParsingExecutor pool;
-  private final EiffelEventParser eventParser;
+  private final EiffelEventParserIf eventParser;
   private final ConcurrentHashMap<EventParsingWorker, ScheduledFuture<?>> pending =
       new ConcurrentHashMap<>();
 
   @Inject
-  public EiffelEventParsingQueue(EiffelEventParsingExecutor pool, EiffelEventParser eventParser) {
+  public EiffelEventParsingQueue(EiffelEventParsingExecutor pool, EiffelEventParserIf eventParser) {
     this.pool = pool;
     this.eventParser = eventParser;
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java
index 3b839dc..579f3b6 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/EiffelEventsTestModule.java
@@ -25,6 +25,8 @@
 import com.googlesource.gerrit.plugins.eventseiffel.config.EventMappingConfig;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.api.EventStorage;
 import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventFactory;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParser;
+import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIf;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingExecutor;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue;
 import org.junit.Ignore;
@@ -42,7 +44,7 @@
     bind(EiffelEventParsingExecutor.class).to(EiffelEventParsingExecutor.Direct.class);
     bind(TestEventPublisher.class).in(Scopes.SINGLETON);
     bind(EiffelEventHub.Consumer.class).to(TestEventPublisher.class);
-
+    bind(EiffelEventParserIf.class).to(EiffelEventParser.class);
     bind(EiffelEventParsingQueue.class);
     bind(EiffelEventFactory.class).toProvider(TestEventFactoryProvider.class);
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
index 0c6a3fd..d2d87eb 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
@@ -342,7 +342,7 @@
       bind(EiffelEventHub.class).to(TestEventHub.class);
       bind(EventMappingConfig.class).toProvider(EventMappingConfig.Provider.class);
       bind(EiffelEventMapper.class);
-      bind(EiffelEventParser.class);
+      bind(EiffelEventParserIf.class).to(EiffelEventParser.class);
       bind(EiffelConfig.class).toProvider(EiffelConfig.Provider.class).in(Scopes.SINGLETON);
       bind(EiffelEventFactory.class)
           .toProvider(EiffelEventFactory.Provider.class)
