diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserImpl.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserImpl.java
index 4e71eb1..f4db832 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserImpl.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserImpl.java
@@ -214,15 +214,6 @@
             throw new EiffelEventIdLookupException(
                 "Unable to find SCC event id: %s", create.key.copy(SCC));
           }
-          List<UUID> scsParentEventIds = Lists.newArrayList();
-          for (RevCommit parent : create.commit.getParents()) {
-            Optional<UUID> parentUuid = eventHub.getExistingId(create.key.copy(parent.getName()));
-            if (parentUuid.isPresent()) {
-              scsParentEventIds.add(parentUuid.get());
-            } else {
-              exceptionForMissingParent(create, parent);
-            }
-          }
           pushToHub(
               mapper.toScs(
                   create.commit,
@@ -230,7 +221,7 @@
                   create.key.branch(),
                   create.submitter,
                   create.submittedAt,
-                  scsParentEventIds,
+                  getParentUuids(create.key, create.commit),
                   sccId.get()));
         }
       }
@@ -445,18 +436,10 @@
     while (commitFinder.hasNext()) {
       EventCreate job = commitFinder.next();
       logger.atFine().log("Processing event-creation for: %s", job.key);
-      List<UUID> parentIds = Lists.newArrayList();
-      for (RevCommit parent : job.commit.getParents()) {
-        SourceChangeEventKey parentKey = scc.copy(parent.getName());
-        Optional<UUID> parentId = eventHub.getExistingId(parentKey);
-        if (parentId.isPresent()) {
-          parentIds.add(parentId.get());
-        } else {
-          exceptionForMissingParent(job, parent);
-        }
-      }
       try {
-        pushToHub(mapper.toScc(job.commit, job.key.repo(), job.key.branch(), parentIds));
+        pushToHub(
+            mapper.toScc(
+                job.commit, job.key.repo(), job.key.branch(), getParentUuids(job.key, job.commit)));
       } catch (InterruptedException e) {
         logger.atSevere().log("Interrupted while pushing %s to EventHub.", job.key);
         throw e;
@@ -478,11 +461,26 @@
     }
   }
 
-  private void exceptionForMissingParent(EventCreate create, RevCommit parent)
+  private List<UUID> getParentUuids(SourceChangeEventKey key, RevCommit commit)
+      throws NoSuchEntityException, EiffelEventIdLookupException {
+    List<UUID> parentIds = Lists.newArrayList();
+    for (RevCommit parent : commit.getParents()) {
+      SourceChangeEventKey parentKey = key.copy(parent.getName());
+      Optional<UUID> parentId = eventHub.getExistingId(parentKey);
+      if (parentId.isPresent()) {
+        parentIds.add(parentId.get());
+      } else {
+        exceptionForMissingParent(key, parent);
+      }
+    }
+    return parentIds;
+  }
+
+  private void exceptionForMissingParent(SourceChangeEventKey key, RevCommit parent)
       throws NoSuchEntityException {
     throw new NoSuchEntityException(
         String.format(
             "Unable to lookup parent (%s) event UUID for %s even though it should exist.",
-            parent.abbreviate(7).name(), create.key));
+            parent.abbreviate(7).name(), key));
   }
 }
