diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
index b394add..b4cd29c 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
@@ -64,7 +64,7 @@
   @Before
   public void before() {
     publisher = plugin.getSysInjector().getInstance(TestEventPublisher.class);
-    TestEventListenerConfigProvider.reset();
+    TestEventListenersConfigProvider.reset();
   }
 
   @After
@@ -111,13 +111,13 @@
     UUID masterSccEventId = markMasterAsHandled(SCC);
     RevCommit previousMaster = getMaster();
 
-    TestEventListenerConfigProvider.disable();
+    TestEventListenersConfigProvider.disable();
 
     PushOneCommit.Result res1 = createChange();
     SourceChangeEventKey sccKey1 = toSccKey(res1);
     merge(res1);
 
-    TestEventListenerConfigProvider.enable();
+    TestEventListenersConfigProvider.enable();
 
     PushOneCommit.Result res2 = createChange();
     SourceChangeEventKey sccKey2 = toSccKey(res2);
@@ -163,7 +163,7 @@
 
   @Test
   public void noEventsCreatedWhenDisabled() throws Exception {
-    TestEventListenerConfigProvider.disable();
+    TestEventListenersConfigProvider.disable();
     PushOneCommit.Result res = createChange();
     SourceChangeEventKey sccKey = toSccKey(res);
     EiffelEvent sccEvent = publisher.getPublished(sccKey);
@@ -175,7 +175,7 @@
 
   @Test
   public void noEventsCreatedWhenRefIsBlocked() throws Exception {
-    TestEventListenerConfigProvider.setBlockedRefPatterns("refs/heads/master");
+    TestEventListenersConfigProvider.setBlockedRefPatterns("refs/heads/master");
     PushOneCommit.Result res = createChange();
     SourceChangeEventKey sccKey = toSccKey(res);
     EiffelEvent sccEvent = publisher.getPublished(sccKey);
@@ -188,7 +188,7 @@
 
   @Test
   public void noEventsCreatedWhenProjectIsBlocked() throws Exception {
-    TestEventListenerConfigProvider.setBlockedProjectPatterns(project.get());
+    TestEventListenersConfigProvider.setBlockedProjectPatterns(project.get());
     PushOneCommit.Result res = createChange();
     SourceChangeEventKey sccKey = toSccKey(res);
     EiffelEvent sccEvent = publisher.getPublished(sccKey);
@@ -232,7 +232,7 @@
 
   @Test
   public void tagCreatedResultsInNoEventWhenBranchIsBlocked() throws Exception {
-    TestEventListenerConfigProvider.setBlockedRefPatterns("refs/heads/master");
+    TestEventListenersConfigProvider.setBlockedRefPatterns("refs/heads/master");
     String tagName = createTagRef(true).substring(RefNames.REFS_TAGS.length());
 
     EventKey artcKey = ArtifactEventKey.create(tagPURL(project.get(), tagName));
@@ -251,7 +251,7 @@
   @Test
   public void tagCreatedResultsInNoEventWhenBranchIsBlockedSCSHandled() throws Exception {
     UUID parentEventId = markMasterAsHandled(SCS);
-    TestEventListenerConfigProvider.setBlockedRefPatterns("refs/heads/master");
+    TestEventListenersConfigProvider.setBlockedRefPatterns("refs/heads/master");
     String tagName = createTagRef(true).substring(RefNames.REFS_TAGS.length());
 
     EventKey artcKey = ArtifactEventKey.create(tagPURL(project.get(), tagName));
@@ -307,7 +307,7 @@
     return originMaster;
   }
 
-  public static class TestEventListenerConfigProvider implements Provider<EventListenersConfig> {
+  public static class TestEventListenersConfigProvider implements Provider<EventListenersConfig> {
     private static boolean enabled;
     private static String[] refPatterns;
     private static String[] projectPatterns;
@@ -349,7 +349,7 @@
     @Override
     protected void configure() {
       install(new EiffelEventsTestModule());
-      bind(EventListenersConfig.class).toProvider(TestEventListenerConfigProvider.class);
+      bind(EventListenersConfig.class).toProvider(TestEventListenersConfigProvider.class);
       DynamicSet.bind(binder(), RevisionCreatedListener.class).to(PatchsetCreatedListener.class);
       DynamicSet.bind(binder(), GitReferenceUpdatedListener.class).to(RefUpdateListener.class);
       bind(EiffelConfig.class).toProvider(EiffelConfig.Provider.class).in(Scopes.SINGLETON);
