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 d20034b..509beba 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
@@ -23,27 +23,12 @@
 import com.google.gerrit.acceptance.UseLocalDisk;
 import com.google.gerrit.acceptance.config.GlobalPluginConfig;
 import com.google.gerrit.extensions.common.AccountInfo;
-import com.google.inject.AbstractModule;
-import com.google.inject.Scopes;
-import com.google.inject.Singleton;
-import com.googlesource.gerrit.plugins.eventseiffel.EiffelEventHub;
-import com.googlesource.gerrit.plugins.eventseiffel.EiffelEventsTest;
 import com.googlesource.gerrit.plugins.eventseiffel.TestEventHub;
 import com.googlesource.gerrit.plugins.eventseiffel.TestEventStorage;
-import com.googlesource.gerrit.plugins.eventseiffel.cache.EiffelEventIdCacheImpl;
-import com.googlesource.gerrit.plugins.eventseiffel.config.EiffelConfig;
-import com.googlesource.gerrit.plugins.eventseiffel.config.EventIdCacheConfig;
-import com.googlesource.gerrit.plugins.eventseiffel.config.EventMappingConfig;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.ArtifactEventKey;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.CompositionDefinedEventKey;
-import com.googlesource.gerrit.plugins.eventseiffel.eiffel.EventKey;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey;
-import com.googlesource.gerrit.plugins.eventseiffel.eiffel.api.EventStorage;
 import com.googlesource.gerrit.plugins.eventseiffel.eiffel.dto.EiffelSourceChangeSubmittedEventInfo;
-import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventFactory;
-import com.googlesource.gerrit.plugins.eventseiffel.mapping.EiffelEventMapper;
-import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
 import java.time.Instant;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.revwalk.RevCommit;
@@ -52,10 +37,8 @@
 
 @TestPlugin(
     name = "events-eiffel",
-    sysModule =
-        "com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParserIT$TestModule")
-public class EiffelEventParserIT extends EiffelEventsTest {
-  private static final Long EPOCH_MILLIS = 978307261000l;
+    sysModule = "com.googlesource.gerrit.plugins.eventseiffel.parsing.ParsingTestModule")
+public class EiffelEventParserIT extends EiffelEventParsingTest {
 
   private EiffelEventParserImpl eventParser;
 
@@ -239,12 +222,6 @@
     return ref;
   }
 
-  private void setScsHandled() throws Exception {
-    SourceChangeEventKey scs =
-        SourceChangeEventKey.scsKey(project.get(), getHead(), getHeadRevision());
-    markAsHandled(scs, getHead(repo(), "HEAD"));
-  }
-
   @Test
   public void artcQueued() throws Exception {
     eventParser.createAndScheduleArtc(project.get(), TAG_NAME, EPOCH_MILLIS, false);
@@ -297,56 +274,4 @@
   private void assertNbrQueriesFor(SourceChangeEventKey key, int nbrQueries) {
     assertEquals(nbrQueries, TestEventStorage.INSTANCE.queriesFor(key));
   }
-
-  private String getHead() throws Exception {
-    return gApi.projects().name(project.get()).head();
-  }
-
-  private String getHeadRevision() throws Exception {
-    return getHead(repo(), "HEAD").getName();
-  }
-
-  private void assertCorrectEvent(int order, EventKey expected) {
-    EventKey actual = EventKey.fromEvent(TestEventHub.EVENTS.get(order));
-    assertEquals(expected, actual);
-  }
-
-  protected static String tagCompositionName(String projectName) {
-    return tagCompositionName(projectName, "localhost");
-  }
-
-  protected static String tagCompositionName(String projectName, String namespace) {
-    return "scmtag/git/" + namespace + "/" + URLEncoder.encode(projectName, StandardCharsets.UTF_8);
-  }
-
-  protected static String tagPURL(String projectName, String tagName) {
-    return tagPURL(projectName, tagName, "localhost");
-  }
-
-  protected static String tagPURL(String projectName, String tagName, String namespace) {
-    return String.format(
-        TAG_PURL_TEMPLATE,
-        namespace,
-        projectName,
-        tagName,
-        String.format("ssh://%s/%s", HOST_NAME, projectName),
-        tagName);
-  }
-
-  public static class TestModule extends AbstractModule {
-    @Override
-    protected void configure() {
-      bind(EventStorage.class).toProvider(TestEventStorage.Provider.class).in(Singleton.class);
-      bind(EventIdCacheConfig.class).toProvider(EventIdCacheConfig.Provider.class);
-      install(EiffelEventIdCacheImpl.module());
-      bind(EiffelEventHub.class).to(TestEventHub.class);
-      bind(EventMappingConfig.class).toProvider(EventMappingConfig.Provider.class);
-      bind(EiffelEventMapper.class);
-      bind(EiffelEventParser.class).to(EiffelEventParserImpl.class);
-      bind(EiffelConfig.class).toProvider(EiffelConfig.Provider.class).in(Scopes.SINGLETON);
-      bind(EiffelEventFactory.class)
-          .toProvider(EiffelEventFactory.Provider.class)
-          .in(Scopes.SINGLETON);
-    }
-  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingTest.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingTest.java
new file mode 100644
index 0000000..7d8c926
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingTest.java
@@ -0,0 +1,57 @@
+package com.googlesource.gerrit.plugins.eventseiffel.parsing;
+
+import static org.junit.Assert.assertEquals;
+
+import com.googlesource.gerrit.plugins.eventseiffel.EiffelEventsTest;
+import com.googlesource.gerrit.plugins.eventseiffel.TestEventHub;
+import com.googlesource.gerrit.plugins.eventseiffel.eiffel.EventKey;
+import com.googlesource.gerrit.plugins.eventseiffel.eiffel.SourceChangeEventKey;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import org.junit.Ignore;
+
+@Ignore
+public class EiffelEventParsingTest extends EiffelEventsTest {
+  protected static final Long EPOCH_MILLIS = 978307261000l;
+
+  protected static String tagCompositionName(String projectName) {
+    return tagCompositionName(projectName, "localhost");
+  }
+
+  protected static String tagCompositionName(String projectName, String namespace) {
+    return "scmtag/git/" + namespace + "/" + URLEncoder.encode(projectName, StandardCharsets.UTF_8);
+  }
+
+  protected static String tagPURL(String projectName, String tagName) {
+    return tagPURL(projectName, tagName, "localhost");
+  }
+
+  protected static String tagPURL(String projectName, String tagName, String namespace) {
+    return String.format(
+        TAG_PURL_TEMPLATE,
+        namespace,
+        projectName,
+        tagName,
+        String.format("ssh://%s/%s", HOST_NAME, projectName),
+        tagName);
+  }
+
+  protected void assertCorrectEvent(int order, EventKey expected) {
+    EventKey actual = EventKey.fromEvent(TestEventHub.EVENTS.get(order));
+    assertEquals(expected, actual);
+  }
+
+  protected void setScsHandled() throws Exception {
+    SourceChangeEventKey scs =
+        SourceChangeEventKey.scsKey(project.get(), getHead(), getHeadRevision());
+    markAsHandled(scs, getHead(repo(), "HEAD"));
+  }
+
+  protected String getHead() throws Exception {
+    return gApi.projects().name(project.get()).head();
+  }
+
+  protected String getHeadRevision() throws Exception {
+    return getHead(repo(), "HEAD").getName();
+  }
+}
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingTestModule.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingTestModule.java
new file mode 100644
index 0000000..f3fe7e5
--- /dev/null
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/ParsingTestModule.java
@@ -0,0 +1,34 @@
+package com.googlesource.gerrit.plugins.eventseiffel.parsing;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Scopes;
+import com.google.inject.Singleton;
+import com.googlesource.gerrit.plugins.eventseiffel.EiffelEventHub;
+import com.googlesource.gerrit.plugins.eventseiffel.TestEventHub;
+import com.googlesource.gerrit.plugins.eventseiffel.TestEventStorage;
+import com.googlesource.gerrit.plugins.eventseiffel.cache.EiffelEventIdCacheImpl;
+import com.googlesource.gerrit.plugins.eventseiffel.config.EiffelConfig;
+import com.googlesource.gerrit.plugins.eventseiffel.config.EventIdCacheConfig;
+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.mapping.EiffelEventMapper;
+import org.junit.Ignore;
+
+@Ignore
+public class ParsingTestModule extends AbstractModule {
+  @Override
+  protected void configure() {
+    bind(EventStorage.class).toProvider(TestEventStorage.Provider.class).in(Singleton.class);
+    bind(EventIdCacheConfig.class).toProvider(EventIdCacheConfig.Provider.class);
+    install(EiffelEventIdCacheImpl.module());
+    bind(EiffelEventHub.class).to(TestEventHub.class);
+    bind(EventMappingConfig.class).toProvider(EventMappingConfig.Provider.class);
+    bind(EiffelEventMapper.class);
+    bind(EiffelEventParser.class).to(EiffelEventParserImpl.class);
+    bind(EiffelConfig.class).toProvider(EiffelConfig.Provider.class).in(Scopes.SINGLETON);
+    bind(EiffelEventFactory.class)
+        .toProvider(EiffelEventFactory.Provider.class)
+        .in(Scopes.SINGLETON);
+  }
+}
