diff --git a/BUCK b/BUCK
index b7fea48..7b55bc0 100644
--- a/BUCK
+++ b/BUCK
@@ -1,5 +1,6 @@
 include_defs('//bucklets/gerrit_plugin.bucklet')
 include_defs('//bucklets/java_sources.bucklet')
+include_defs('//bucklets/maven_jar.bucklet')
 
 SOURCES = glob(['src/main/java/**/*.java'])
 RESOURCES = glob(['src/main/resources/**/*'])
@@ -7,11 +8,9 @@
   '//lib:gson',
   '//lib/commons:dbcp',
 ]
-TEST_DEPS = GERRIT_PLUGIN_API + [
+TEST_DEPS = GERRIT_PLUGIN_API + DEPS + GERRIT_TESTS + [
   ':events-log__plugin',
-  '//lib/easymock:easymock',
-  '//lib:gson',
-  '//lib:truth',
+  ':mockito',
 ]
 
 gerrit_plugin(
@@ -30,7 +29,7 @@
 
 java_library(
   name = 'classpath',
-  deps = list(set(DEPS) | set(TEST_DEPS))
+  deps = TEST_DEPS,
 )
 
 java_test(
@@ -44,3 +43,30 @@
   name = 'events-log-sources',
   srcs = SOURCES + RESOURCES,
 )
+
+maven_jar(
+  name = 'mockito',
+  id = 'org.mockito:mockito-core:2.5.0',
+  sha1 = 'be28d46a52c7f2563580adeca350145e9ce916f8',
+  license = 'MIT',
+  deps = [
+    ':byte-buddy',
+    ':objenesis',
+  ],
+)
+
+maven_jar(
+  name = 'byte-buddy',
+  id = 'net.bytebuddy:byte-buddy:1.5.12',
+  sha1 = 'b1ba1d15f102b36ed43b826488114678d6d413da',
+  license = 'DO_NOT_DISTRIBUTE',
+  attach_source = False,
+)
+
+maven_jar(
+  name = 'objenesis',
+  id = 'org.objenesis:objenesis:2.4',
+  sha1 = '2916b6c96b50c5b3ec4452ed99401db745aabb27',
+  license = 'DO_NOT_DISTRIBUTE',
+  attach_source = False,
+)
diff --git a/lib/BUCK b/lib/BUCK
index 190d931..06f7c02 100644
--- a/lib/BUCK
+++ b/lib/BUCK
@@ -6,37 +6,3 @@
   sha1 = 'ecb6e1f8e4b0e84c4b886c2f14a1500caf309757',
   license = 'Apache2.0',
 )
-
-maven_jar(
-  name = 'guava',
-  id = 'com.google.guava:guava:19.0-rc1',
-  sha1 = '0364538ac107b8943a1f4d68ac50f1b0421bb983',
-  license = 'Apache2.0',
-)
-
-maven_jar(
-  name = 'junit',
-  id = 'junit:junit:4.11',
-  sha1 = '4e031bb61df09069aeb2bffb4019e7a5034a4ee0',
-  license = 'DO_NOT_DISTRIBUTE',
-  exported_deps = [':hamcrest-core'],
-)
-
-maven_jar(
-  name = 'hamcrest-core',
-  id = 'org.hamcrest:hamcrest-core:1.3',
-  sha1 = '42a25dc3219429f0e5d060061f71acb49bf010a0',
-  license = 'DO_NOT_DISTRIBUTE',
-  visibility = ['//lib:junit'],
-)
-
-maven_jar(
-  name = 'truth',
-  id = 'com.google.truth:truth:0.27',
-  sha1 = 'bd17774d2dc0fffa884d42c07d2537e86c67acd6',
-  license = 'DO_NOT_DISTRIBUTE',
-  exported_deps = [
-    ':guava',
-    ':junit',
-  ],
-)
diff --git a/lib/easymock/BUCK b/lib/easymock/BUCK
deleted file mode 100644
index 11d95a4..0000000
--- a/lib/easymock/BUCK
+++ /dev/null
@@ -1,29 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-maven_jar(
-  name = 'easymock',
-  id = 'org.easymock:easymock:3.3.1',
-  sha1 = 'a497d7f00c9af78b72b6d8f24762d9210309148a',
-  license = 'DO_NOT_DISTRIBUTE',
-  deps = [
-    ':cglib-2_2',
-    ':objenesis',
-  ],
-)
-
-maven_jar(
-  name = 'cglib-2_2',
-  id = 'cglib:cglib-nodep:2.2.2',
-  sha1 = '00d456bb230c70c0b95c76fb28e429d42f275941',
-  license = 'DO_NOT_DISTRIBUTE',
-  attach_source = False,
-)
-
-maven_jar(
-  name = 'objenesis',
-  id = 'org.objenesis:objenesis:2.1',
-  sha1 = '87c0ea803b69252868d09308b4618f766f135a96',
-  license = 'DO_NOT_DISTRIBUTE',
-  visibility = ['//lib/powermock:powermock-reflect'],
-  attach_source = False,
-)
diff --git a/lib/gerrit/BUCK b/lib/gerrit/BUCK
index 0a0b2bc..f83d917 100644
--- a/lib/gerrit/BUCK
+++ b/lib/gerrit/BUCK
@@ -1,12 +1,21 @@
 include_defs('//bucklets/maven_jar.bucklet')
 
-VER = '2.12'
+VER = '2.13'
 REPO = MAVEN_CENTRAL
 
 maven_jar(
+  name = 'acceptance-framework',
+  id = 'com.google.gerrit:gerrit-acceptance-framework:' + VER,
+  sha1 = 'a6913a61196a8fccdb45e761f43a0b7e21867c90',
+  license = 'Apache2.0',
+  attach_source = False,
+  repository = REPO,
+)
+
+maven_jar(
   name = 'plugin-api',
   id = 'com.google.gerrit:gerrit-plugin-api:' + VER,
-  sha1 = '8ce1f6e65078bbcf03a1758f96b3ebca19b7fe3c',
+  sha1 = 'e25d55b8f41627c4ae6b9d2069ec398638b219a3',
   license = 'Apache2.0',
   attach_source = False,
   repository = REPO,
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
index 7619a82..6148522 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
@@ -24,6 +24,7 @@
 
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 
+/** Configures handling for an event queue while providing its pool. */
 public class EventModule extends AbstractModule {
 
   @Override
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java
index c51ac02..97324df 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java
@@ -20,6 +20,9 @@
 
 import java.lang.annotation.Retention;
 
+/**
+ * Annotation applied to a ScheduledThreadPoolExecutor.
+ */
 @Retention(RUNTIME)
 @BindingAnnotation
 public @interface EventPool {
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
index 22287e6..8432be4 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
@@ -132,6 +132,7 @@
     return maxTries;
   }
 
+  /** @return the local-store (database) driver which happens to be h2 */
   public String getLocalStoreDriver() {
     return DEFAULT_DRIVER;
   }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java
index 2137a95..8227d22 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java
@@ -14,6 +14,7 @@
 
 package com.ericsson.gerrit.plugins.eventslog;
 
+/** Custom exception for events log. */
 public class EventsLogException extends Exception {
   private static final long serialVersionUID = 1L;
 
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/HttpModule.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/HttpModule.java
index a75eb73..c1db514 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/HttpModule.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/HttpModule.java
@@ -16,7 +16,7 @@
 
 import com.google.gerrit.httpd.plugins.HttpPluginModule;
 
-public class HttpModule extends HttpPluginModule {
+class HttpModule extends HttpPluginModule {
   @Override
   protected void configureServlets() {
     serve("/events/").with(EventsRestApiServlet.class);
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java
index 56c0c73..17caa1a 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java
@@ -14,6 +14,7 @@
 
 package com.ericsson.gerrit.plugins.eventslog;
 
+/** Custom exception for malformed queries. */
 public class MalformedQueryException extends EventsLogException {
   private static final long serialVersionUID = 1L;
   private static final String MESSAGE =
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java
index 0fdf74c..bd55dbc 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java
@@ -16,6 +16,7 @@
 
 import java.util.Map;
 
+/** Helps build well-formed database query strings. */
 public interface QueryMaker {
 
   /**
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
index 6286f50..9242ab3 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLClient.java
@@ -24,11 +24,14 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
+import com.google.common.base.Supplier;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
 import com.google.inject.Inject;
+import com.google.gerrit.server.events.SupplierSerializer;
 
 import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
 import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
@@ -47,6 +50,7 @@
 
 class SQLClient {
   private static final Logger log = LoggerFactory.getLogger(SQLClient.class);
+  private final Gson gson;
   private BasicDataSource ds;
 
   @Inject
@@ -55,6 +59,8 @@
     ds.setDriverClassName(storeDriver);
     ds.setUrl(storeUrl);
     ds.setConnectionProperties(urlOptions);
+    gson = new GsonBuilder()
+        .registerTypeAdapter(Supplier.class, new SupplierSerializer()).create();
   }
 
   /**
@@ -145,8 +151,7 @@
   void storeEvent(ProjectEvent event) throws SQLException {
     storeEvent(event.getProjectNameKey().get(),
         new Timestamp(SECONDS.toMillis(event.eventCreatedOn)),
-        new Gson().toJson(event));
-
+        gson.toJson(event));
   }
 
   /**
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLQueryMaker.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLQueryMaker.java
index 93c6569..8ad81be 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLQueryMaker.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLQueryMaker.java
@@ -86,15 +86,14 @@
 
   private Date[] parseDates(String dateOne, String dateTwo)
       throws MalformedQueryException, ParseException {
-    Calendar cal = Calendar.getInstance();
-    if (dateOne == null & dateTwo == null) {
+    if (dateOne == null && dateTwo == null) {
       throw new MalformedQueryException();
     }
+    Calendar cal = Calendar.getInstance();
+    Date dOne = dateOne == null ? cal.getTime() : parseDate(dateOne);
+    Date dTwo = dateTwo == null ? cal.getTime() : parseDate(dateTwo);
     Date[] dates = new Date[TWO];
-    Date dOne =
-        dateOne == null && dateTwo != null ? cal.getTime() : parseDate(dateOne);
-    Date dTwo =
-        dateTwo == null && dateOne != null ? cal.getTime() : parseDate(dateTwo);
+
     dates[0] = dOne.compareTo(dTwo) < 0 ? dOne : dTwo;
     dates[1] = dOne.compareTo(dTwo) < 0 ? dTwo : dOne;
     return dates;
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStore.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStore.java
index 0699160..b7beda8 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStore.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStore.java
@@ -114,21 +114,21 @@
       throw new ServiceUnavailableException();
     }
     List<SQLEntry> entries = new ArrayList<>();
-    Project.NameKey project = null;
+
     for (Entry<String, Collection<SQLEntry>> entry
         : eventsDb.getEvents(query).asMap().entrySet()) {
+      String projectName = entry.getKey();
       try {
-        project = new Project.NameKey(entry.getKey());
-        if (projectControlFactory.controlFor(project,
+        if (projectControlFactory.controlFor(new Project.NameKey(projectName),
             userProvider.get()).isVisible()) {
           entries.addAll(entry.getValue());
         }
       } catch (NoSuchProjectException e) {
-        log.warn("Database contains a non-existing project, " + project.get()
+        log.warn("Database contains a non-existing project, " + projectName
             + ", removing project from database");
-        eventsDb.removeProjectEvents(project.get());
+        eventsDb.removeProjectEvents(projectName);
       } catch (IOException e) {
-        log.warn("Cannot get project visibility info for " + project.get()
+        log.warn("Cannot get project visibility info for " + projectName
             + " from cache", e);
       }
     }
@@ -167,21 +167,25 @@
         if (e.getCause() instanceof ConnectException
             || e.getMessage().contains("terminating connection")) {
           done = false;
-          retryIfAllowed(failedConnections);
+          try {
+            retryIfAllowed(failedConnections);
+          } catch (InterruptedException e1) {
+            log.warn("Cannot store ChangeEvent for: " + projectName.get()
+                + ": Interrupted");
+            Thread.currentThread().interrupt();
+            return;
+          }
           failedConnections++;
         }
       }
     }
   }
 
-  private void retryIfAllowed(int failedConnections) {
+  private void retryIfAllowed(int failedConnections)
+      throws InterruptedException {
     if (failedConnections < maxTries - 1) {
       log.info("Retrying store event");
-      try {
-        Thread.sleep(waitTime);
-      } catch (InterruptedException e1) {
-        return;
-      }
+      Thread.sleep(waitTime);
     } else {
       log.error("Failed to store event " + maxTries + " times");
       setOnline(false);
@@ -270,12 +274,12 @@
     }
 
     private boolean checkConnection() {
-      log.info("Checking database connection...");
+      log.debug("Checking database connection...");
       try {
         eventsDb.queryOne();
         return true;
       } catch (SQLException e) {
-        log.debug("Problem checking database connection", e);
+        log.error("Problem checking database connection", e);
         return false;
       }
     }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
index 67ff28b..b6c773b 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
@@ -15,55 +15,50 @@
 package com.ericsson.gerrit.plugins.eventslog;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.expectLastCall;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
 
-import com.google.gerrit.common.EventListener;
 import com.google.gerrit.server.events.ChangeEvent;
 import com.google.gerrit.server.events.Event;
 
-import org.easymock.EasyMockSupport;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 
+@RunWith(MockitoJUnitRunner.class)
 public class EventHandlerTest {
-  private EasyMockSupport easyMock = new EasyMockSupport();
+  @Mock
   private EventStore storeMock;
-  private EventListener listener;
-  private ScheduledThreadPoolExecutor poolMock;
+  private EventHandler eventHandler;
 
   @Before
   public void setUp() {
-    storeMock = easyMock.createMock(EventStore.class);
+    ScheduledThreadPoolExecutor poolMock = new PoolMock();
+    eventHandler = new EventHandler(storeMock, poolMock);
   }
 
   @Test
   public void passEventToStore() {
-    ChangeEvent eventMock = easyMock.createNiceMock(ChangeEvent.class);
-    easyMock.resetAll();
-    storeMock.storeEvent(eventMock);
-    expectLastCall().once();
-    easyMock.replayAll();
-    poolMock = new PoolMock(1);
-    listener = new EventHandler(storeMock, poolMock);
-    listener.onEvent(eventMock);
-    easyMock.verifyAll();
+    ChangeEvent eventMock = mock(ChangeEvent.class);
+    eventHandler.onEvent(eventMock);
+    verify(storeMock).storeEvent(eventMock);
   }
 
   @Test
   public void nonProjectEvent() {
-    poolMock = easyMock.createMock(ScheduledThreadPoolExecutor.class);
-    Event eventMock = easyMock.createMock(Event.class);
-    easyMock.replayAll();
-    listener = new EventHandler(storeMock, poolMock);
-    listener.onEvent(eventMock);
-    easyMock.verifyAll();
+    Event eventMock = mock(Event.class);
+    eventHandler.onEvent(eventMock);
+    verifyZeroInteractions(storeMock);
   }
 
   class PoolMock extends ScheduledThreadPoolExecutor {
-    PoolMock(int corePoolSize) {
-      super(corePoolSize);
+    PoolMock() {
+      super(1);
     }
     @Override
     public void execute(Runnable command) {
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
index 9388319..f4cd273 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
@@ -13,6 +13,7 @@
 // limitations under the License.
 
 package com.ericsson.gerrit.plugins.eventslog;
+
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_CONN_TIME;
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_COPY_LOCAL;
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.CONFIG_DRIVER;
@@ -36,91 +37,108 @@
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_URL;
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_WAIT_TIME;
 import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.when;
 
 import com.google.common.base.Joiner;
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.config.SitePaths;
 
-import org.easymock.EasyMock;
-import org.easymock.EasyMockSupport;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
 import java.io.IOException;
 import java.nio.file.Files;
 
+@RunWith(MockitoJUnitRunner.class)
 public class EventsLogConfigTest {
+  private static final String PLUGIN_NAME = "eventsLog";
+  private static final int CUSTOM_EVICT_IDLE_TIME = 10000;
+
   private SitePaths site;
   private EventsLogConfig config;
-  private PluginConfigFactory cfgFactoryMock;
-  private PluginConfig configMock;
-  private EasyMockSupport easyMock;
   private String defaultLocalStorePath;
   private String localStorePath;
-  private String [] urlOptions = new String[]{"a=b", "c=d"};
+  private String[] urlOptions = new String[] {"DB_CLOSE_DELAY=10"};
 
-  private static final int CUSTOM_EVICT_IDLE_TIME = 10000;
+  @Mock
+  private PluginConfigFactory cfgFactoryMock;
+  @Mock
+  private PluginConfig configMock;
 
   @Rule
   public TemporaryFolder gerrit_site = new TemporaryFolder();
 
   @Before
   public void setUp() throws IOException {
-    easyMock = new EasyMockSupport();
     site = new SitePaths(gerrit_site.getRoot().toPath());
     Files.createDirectories(site.etc_dir);
     defaultLocalStorePath = site.site_path.toString() + "/events-db/";
-    configMock = easyMock.createMock(PluginConfig.class);
-    cfgFactoryMock = easyMock.createMock(PluginConfigFactory.class);
-    expect(cfgFactoryMock.getFromGerritConfig(EasyMock.anyString(),
-        EasyMock.anyBoolean())).andStubReturn(configMock);
+    when(cfgFactoryMock.getFromGerritConfig(PLUGIN_NAME, true))
+        .thenReturn(configMock);
   }
 
   private void setUpDefaults() {
-    expect(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL)).andReturn(DEFAULT_COPY_LOCAL);
-    expect(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE)).andReturn(DEFAULT_MAX_AGE);
-    expect(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES)).andReturn(DEFAULT_MAX_TRIES);
-    expect(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT)).andReturn(DEFAULT_RETURN_LIMIT);
-    expect(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME)).andReturn(DEFAULT_CONN_TIME);
-    expect(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME)).andReturn(DEFAULT_WAIT_TIME);
-    expect(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER)).andReturn(DEFAULT_DRIVER);
-    expect(configMock.getString(CONFIG_URL, DEFAULT_URL)).andReturn(DEFAULT_URL);
-    expect(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath)).andReturn(defaultLocalStorePath);
-    expect(configMock.getStringList(CONFIG_URL_OPTIONS)).andReturn(new String[0]);
-    expect(configMock.getString(CONFIG_USERNAME)).andReturn(null);
-    expect(configMock.getString(CONFIG_PASSWORD)).andReturn(null);
-    expect(configMock.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME)).andReturn(DEFAULT_EVICT_IDLE_TIME);
-
-    easyMock.replayAll();
+    when(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL))
+        .thenReturn(DEFAULT_COPY_LOCAL);
+    when(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE))
+        .thenReturn(DEFAULT_MAX_AGE);
+    when(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES))
+        .thenReturn(DEFAULT_MAX_TRIES);
+    when(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT))
+        .thenReturn(DEFAULT_RETURN_LIMIT);
+    when(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME))
+        .thenReturn(DEFAULT_CONN_TIME);
+    when(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME))
+        .thenReturn(DEFAULT_WAIT_TIME);
+    when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
+        .thenReturn(DEFAULT_DRIVER);
+    when(configMock.getString(CONFIG_URL, DEFAULT_URL)).thenReturn(DEFAULT_URL);
+    when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
+        .thenReturn(defaultLocalStorePath);
+    when(configMock.getStringList(CONFIG_URL_OPTIONS))
+        .thenReturn(new String[] {});
+    when(configMock.getString(CONFIG_USERNAME)).thenReturn(null);
+    when(configMock.getString(CONFIG_PASSWORD)).thenReturn(null);
+    when(configMock.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME))
+        .thenReturn(DEFAULT_EVICT_IDLE_TIME);
   }
 
   private void setUpCustom() {
     localStorePath = "~/gerrit/events-db/";
-    expect(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL)).andReturn(true);
-    expect(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE)).andReturn(20);
-    expect(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES)).andReturn(5);
-    expect(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT)).andReturn(10000);
-    expect(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME)).andReturn(5000);
-    expect(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME)).andReturn(5000);
-    expect(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER)).andReturn("org.h2.Driver2");
-    expect(configMock.getString(CONFIG_URL, DEFAULT_URL)).andReturn("jdbc:h2:~/gerrit/db");
-    expect(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath)).andReturn(localStorePath);
-    expect(configMock.getStringList(CONFIG_URL_OPTIONS)).andReturn(urlOptions);
-    expect(configMock.getString(CONFIG_USERNAME)).andReturn("testUsername");
-    expect(configMock.getString(CONFIG_PASSWORD)).andReturn("testPassword");
-    expect(configMock.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME)).andReturn(CUSTOM_EVICT_IDLE_TIME);
+    when(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL))
+        .thenReturn(true);
+    when(configMock.getInt(CONFIG_MAX_AGE, DEFAULT_MAX_AGE)).thenReturn(20);
+    when(configMock.getInt(CONFIG_MAX_TRIES, DEFAULT_MAX_TRIES)).thenReturn(5);
+    when(configMock.getInt(CONFIG_RETURN_LIMIT, DEFAULT_RETURN_LIMIT))
+        .thenReturn(10000);
+    when(configMock.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME))
+        .thenReturn(5000);
+    when(configMock.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME))
+        .thenReturn(5000);
+    when(configMock.getString(CONFIG_DRIVER, DEFAULT_DRIVER))
+        .thenReturn("org.h2.Driver2");
+    when(configMock.getString(CONFIG_URL, DEFAULT_URL))
+        .thenReturn("jdbc:h2:~/gerrit/db");
+    when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
+        .thenReturn(localStorePath);
+    when(configMock.getStringList(CONFIG_URL_OPTIONS)).thenReturn(urlOptions);
+    when(configMock.getString(CONFIG_USERNAME)).thenReturn("testUsername");
+    when(configMock.getString(CONFIG_PASSWORD)).thenReturn("testPassword");
+    when(configMock.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME))
+        .thenReturn(CUSTOM_EVICT_IDLE_TIME);
 
-    easyMock.replayAll();
   }
 
   @Test
   public void shouldReturnDefaultsWhenMissingConfig() {
     setUpDefaults();
-    config = new EventsLogConfig(cfgFactoryMock, site, null);
+    config = new EventsLogConfig(cfgFactoryMock, site, PLUGIN_NAME);
     assertThat(config.getCopyLocal()).isFalse();
     assertThat(config.getMaxAge()).isEqualTo(30);
     assertThat(config.getMaxTries()).isEqualTo(3);
@@ -128,7 +146,8 @@
     assertThat(config.getConnectTime()).isEqualTo(1000);
     assertThat(config.getWaitTime()).isEqualTo(1000);
     assertThat(config.getLocalStoreDriver()).isEqualTo(DEFAULT_DRIVER);
-    assertThat(config.getLocalStorePath().toString() + "/").isEqualTo(defaultLocalStorePath);
+    assertThat(config.getLocalStorePath().toString() + "/")
+        .isEqualTo(defaultLocalStorePath);
     assertThat(config.getStoreDriver()).isEqualTo(DEFAULT_DRIVER);
     assertThat(config.getStoreUrl()).isEqualTo(DEFAULT_URL);
     assertThat(config.getUrlOptions()).isEmpty();
@@ -140,7 +159,7 @@
   @Test
   public void shouldReturnConfigValues() {
     setUpCustom();
-    config = new EventsLogConfig(cfgFactoryMock, site, null);
+    config = new EventsLogConfig(cfgFactoryMock, site, PLUGIN_NAME);
     assertThat(config.getCopyLocal()).isTrue();
     assertThat(config.getMaxAge()).isEqualTo(20);
     assertThat(config.getMaxTries()).isEqualTo(5);
@@ -148,10 +167,12 @@
     assertThat(config.getConnectTime()).isEqualTo(5000);
     assertThat(config.getWaitTime()).isEqualTo(5000);
     assertThat(config.getLocalStoreDriver()).isEqualTo(DEFAULT_DRIVER);
-    assertThat(config.getLocalStorePath().toString() + "/").isEqualTo(localStorePath);
+    assertThat(config.getLocalStorePath().toString() + "/")
+        .isEqualTo(localStorePath);
     assertThat(config.getStoreDriver()).isEqualTo("org.h2.Driver2");
     assertThat(config.getStoreUrl()).isEqualTo("jdbc:h2:~/gerrit/db");
-    assertThat(config.getUrlOptions()).isEqualTo(Joiner.on(";").join(urlOptions));
+    assertThat(config.getUrlOptions())
+        .isEqualTo(Joiner.on(";").join(urlOptions));
     assertThat(config.getStoreUsername()).isEqualTo("testUsername");
     assertThat(config.getStorePassword()).isEqualTo("testPassword");
     assertThat(config.getEvictIdleTime()).isEqualTo(CUSTOM_EVICT_IDLE_TIME);
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java
new file mode 100644
index 0000000..cfb1cce
--- /dev/null
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java
@@ -0,0 +1,41 @@
+// Copyright (C) 2015 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.ericsson.gerrit.plugins.eventslog;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.gerrit.acceptance.GerritConfig;
+import com.google.gerrit.acceptance.PluginDaemonTest;
+
+import org.junit.Test;
+
+public class EventsLogIT extends PluginDaemonTest {
+
+  @Test
+  @GerritConfig(name = "plugin.events-log.storeUrl", value = "jdbc:h2:mem:db")
+  public void getEventsShallBeConsistent() throws Exception {
+    String events = "/plugins/events-log/events/?t1=1970-01-01;t2=2999-01-01";
+    String change1 = "refs/changes/01/1/1";
+
+    createChange();
+    String response = adminRestSession.get(events).getEntityContent();
+    assertThat(response).contains(change1);
+
+    createChange();
+    response = adminRestSession.get(events).getEntityContent();
+    assertThat(response).contains(change1);
+    assertThat(response).contains("refs/changes/02/2/1");
+  }
+}
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
index 2e51106..bcccd07 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
@@ -15,143 +15,112 @@
 package com.ericsson.gerrit.plugins.eventslog;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.newCapture;
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.gerrit.server.CurrentUser;
+import com.google.inject.Provider;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Captor;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
 import java.io.PrintWriter;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
-import org.easymock.Capture;
-import org.easymock.EasyMock;
-import org.easymock.EasyMockSupport;
-import org.junit.Before;
-import org.junit.Test;
-
-import com.google.gerrit.server.CurrentUser;
-import com.google.inject.Provider;
-
-import com.ericsson.gerrit.plugins.eventslog.EventsRestApiServlet;
-import com.ericsson.gerrit.plugins.eventslog.EventStore;
-import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
-import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
-
+@RunWith(MockitoJUnitRunner.class)
 public class EventsRestApiServletTest {
-  private EasyMockSupport easyMock;
+  private static final String RANDOM_QUERY = "random query";
+
+  @Mock
   private EventStore storeMock;
+  @Mock
   private QueryMaker queryMakerMock;
+  @Mock
   private Provider<CurrentUser> userProviderMock;
+  @Mock
   private CurrentUser userMock;
+  @Mock
   private HttpServletRequest reqMock;
+  @Mock
   private HttpServletResponse rspMock;
+  @Captor
+  private ArgumentCaptor<Map<String, String>> captor;
+
   private EventsRestApiServlet eventServlet;
 
-  @SuppressWarnings("unchecked")
   @Before
   public void setUp() {
-    easyMock = new EasyMockSupport();
-    storeMock = easyMock.createNiceMock(EventStore.class);
-    queryMakerMock = easyMock.createNiceMock(QueryMaker.class);
-    userProviderMock = easyMock.createNiceMock(Provider.class);
-    userMock = easyMock.createNiceMock(CurrentUser.class);
-    reqMock = easyMock.createNiceMock(HttpServletRequest.class);
-    rspMock = easyMock.createNiceMock(HttpServletResponse.class);
-    easyMock.replayAll();
-    eventServlet = new EventsRestApiServlet(storeMock, queryMakerMock,
-        userProviderMock);
+    eventServlet =
+        new EventsRestApiServlet(storeMock, queryMakerMock, userProviderMock);
+
+    when(userProviderMock.get()).thenReturn(userMock);
+    when(userMock.isIdentifiedUser()).thenReturn(true);
   }
 
   @Test
   public void queryStringSplitting() throws Exception {
-    String queryStringMock = "a=1;b=2";
-    Map<String, String> paramMock = new HashMap<>();
-    paramMock.put("a", "1");
-    paramMock.put("b", "2");
-    Capture<Map<String, String>> catcher = newCapture();
-    easyMock.resetAll();
-    expect(userProviderMock.get()).andStubReturn(userMock);
-    expect(userMock.isIdentifiedUser()).andStubReturn(true);
-    expect(reqMock.getQueryString()).andStubReturn(queryStringMock);
-    expect(queryMakerMock.formQueryFromRequestParameters(capture(catcher)))
-      .andStubReturn("random query");
-    expect(storeMock.queryChangeEvents("random query")).andStubReturn(
-        new ArrayList<String>());
-    easyMock.replayAll();
+    when(reqMock.getQueryString()).thenReturn("a=1;b=2");
+    when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
+        .thenReturn(RANDOM_QUERY);
+    when(storeMock.queryChangeEvents(RANDOM_QUERY))
+        .thenReturn(new ArrayList<String>());
     eventServlet.doGet(reqMock, rspMock);
-    Map<String, String> capturedParam = catcher.getValue();
-    assertThat(paramMock).isEqualTo(capturedParam);
+    assertThat(ImmutableMap.of("a", "1", "b", "2"))
+        .isEqualTo(captor.getValue());
   }
 
   @Test
   public void badQueryString() throws Exception {
-    String queryStringMock = "a;b";
-    Capture<Map<String, String>> catcher = newCapture();
-    easyMock.resetAll();
-    expect(userProviderMock.get()).andStubReturn(userMock);
-    expect(userMock.isIdentifiedUser()).andStubReturn(true);
-    expect(reqMock.getQueryString()).andStubReturn(queryStringMock);
-    expect(queryMakerMock.formQueryFromRequestParameters(capture(catcher)))
-      .andStubReturn("random query");
-    expect(storeMock.queryChangeEvents("random query")).andStubReturn(
-        new ArrayList<String>());
-    easyMock.replayAll();
+    when(reqMock.getQueryString()).thenReturn("a;b");
+    when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
+        .thenReturn(RANDOM_QUERY);
+    when(storeMock.queryChangeEvents(RANDOM_QUERY))
+        .thenReturn(new ArrayList<String>());
     eventServlet.doGet(reqMock, rspMock);
-    Map<String, String> capturedParam = catcher.getValue();
-    assertThat(capturedParam).isEmpty();
+    assertThat(captor.getValue()).isEmpty();
   }
 
   @Test
   public void testUnAuthorizedCode() throws Exception {
-    easyMock.resetAll();
-    expect(userProviderMock.get()).andStubReturn(userMock);
-    expect(userMock.isIdentifiedUser()).andStubReturn(false);
-    rspMock.sendError(HttpServletResponse.SC_UNAUTHORIZED);
-    expectLastCall().once();
-    easyMock.replayAll();
+    when(userMock.isIdentifiedUser()).thenReturn(false);
     eventServlet.doGet(reqMock, rspMock);
-    easyMock.verifyAll();
+    verify(rspMock).sendError(HttpServletResponse.SC_UNAUTHORIZED);
   }
 
   @Test
   public void testBadRequestCode() throws Exception {
-    easyMock.resetAll();
-    expect(userProviderMock.get()).andStubReturn(userMock);
-    expect(userMock.isIdentifiedUser()).andStubReturn(true);
-    expect(queryMakerMock.formQueryFromRequestParameters(
-        EasyMock.<Map<String, String>> anyObject())).andStubThrow(
-            new MalformedQueryException());
-    rspMock.sendError(HttpServletResponse.SC_BAD_REQUEST);
-    expectLastCall().once();
-    easyMock.replayAll();
+    when(reqMock.getQueryString()).thenReturn("@@");
+    Map<String, String> emptyParams = ImmutableMap.of();
+    when(queryMakerMock.formQueryFromRequestParameters(emptyParams))
+        .thenThrow(new MalformedQueryException());
     eventServlet.doGet(reqMock, rspMock);
-    easyMock.verifyAll();
+    verify(rspMock).sendError(HttpServletResponse.SC_BAD_REQUEST);
   }
 
   @Test
   public void queryDatabaseAndWrite() throws Exception {
-    PrintWriter outMock = easyMock.createMock(PrintWriter.class);
-    List<String> listMock = new ArrayList<>();
-    listMock.add("event one");
-    listMock.add("event two");
-    easyMock.resetAll();
-    expect(userProviderMock.get()).andStubReturn(userMock);
-    expect(userMock.isIdentifiedUser()).andStubReturn(true);
-    expect(rspMock.getWriter()).andStubReturn(outMock);
-    expect(storeMock.queryChangeEvents(EasyMock.anyString())).andReturn(
-        listMock);
-    outMock.write(listMock.get(0) + "\n");
-    expectLastCall().once();
-    outMock.write(listMock.get(1) + "\n");
-    expectLastCall().once();
-    easyMock.replayAll();
+    when(reqMock.getQueryString()).thenReturn("@@");
+    PrintWriter outMock = mock(PrintWriter.class);
+    List<String> listMock = ImmutableList.of("event one", "event two");
+    when(rspMock.getWriter()).thenReturn(outMock);
+    when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
+        .thenReturn(RANDOM_QUERY);
+    when(storeMock.queryChangeEvents(RANDOM_QUERY)).thenReturn(listMock);
     eventServlet.doGet(reqMock, rspMock);
-    easyMock.verifyAll();
+    verify(outMock).write(listMock.get(0) + "\n");
+    verify(outMock).write(listMock.get(1) + "\n");
   }
 }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
index bad6ccf..c7ec5d3 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/QueryMakerTest.java
@@ -15,106 +15,98 @@
 package com.ericsson.gerrit.plugins.eventslog.sql;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.expect;
+import static org.mockito.Mockito.when;
+
+import com.google.common.collect.ImmutableMap;
 
 import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
 import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
 import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
-import com.ericsson.gerrit.plugins.eventslog.sql.SQLQueryMaker;
 
-import org.easymock.EasyMockSupport;
-import org.junit.BeforeClass;
+import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 
-import java.util.HashMap;
-import java.util.Map;
-
+@RunWith(MockitoJUnitRunner.class)
 public class QueryMakerTest {
-  private static QueryMaker queryMaker;
-  private static String defaultQuery;
+  private static final String T2 = "t2";
+  private static final String T1 = "t1";
+  private static final String OLD_DATE = "2013-10-10 10:00:00";
+  private static final String NEW_DATE = "2014-10-10 10:00:00";
 
-  @BeforeClass
-  public static void setUp() throws Exception {
-    EasyMockSupport easyMock = new EasyMockSupport();
-    EventsLogConfig cfgMock = easyMock.createMock(EventsLogConfig.class);
-    expect(cfgMock.getReturnLimit()).andReturn(10);
-    easyMock.replayAll();
+  private QueryMaker queryMaker;
+  private String defaultQuery;
+
+  @Mock
+  private EventsLogConfig cfgMock;
+
+  private String query;
+
+  @Before
+  public void setUp() throws Exception {
+    when(cfgMock.getReturnLimit()).thenReturn(10);
     queryMaker = new SQLQueryMaker(cfgMock);
     defaultQuery = queryMaker.getDefaultQuery();
   }
 
   @Test
-  public void returnDefaultforNullMap() throws Exception {
-    assertThat(queryMaker.formQueryFromRequestParameters(null)).isEqualTo(defaultQuery);
+  public void returnDefaultQueryforNullMap() throws Exception {
+    assertThat(queryMaker.formQueryFromRequestParameters(null))
+        .isEqualTo(defaultQuery);
   }
 
   @Test(expected = MalformedQueryException.class)
   public void badParameters() throws Exception {
-    Map<String, String> params = new HashMap<>();
-    params.put("t1", "bad format");
-    params.put("t2", "bad format");
-    queryMaker.formQueryFromRequestParameters(params);
+    queryMaker.formQueryFromRequestParameters(
+        ImmutableMap.of(T1, "13/13/32", T2, "14/10/10"));
   }
 
   @Test
   public void dateOneOnly() throws Exception {
-    Map<String, String> params = new HashMap<>();
-    String oldDate = "1990-10-10 10:00:00";
-    params.put("t1", oldDate);
-    String query = queryMaker.formQueryFromRequestParameters(params);
-    assertThat(query).contains(String.format("'%s' and ", oldDate));
+    query = queryMaker
+        .formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE));
+    assertThat(query).contains(String.format("'%s' and ", OLD_DATE));
   }
 
   @Test
   public void dateTwoOnly() throws Exception {
-    Map<String, String> params = new HashMap<>();
-    String oldDate = "1990-10-10 10:00:00";
-    params.put("t2", oldDate);
-    String query = queryMaker.formQueryFromRequestParameters(params);
-    assertThat(query).contains(String.format("'%s' and ", oldDate));
+    query = queryMaker
+        .formQueryFromRequestParameters(ImmutableMap.of(T2, OLD_DATE));
+    assertThat(query).contains(String.format("'%s' and ", OLD_DATE));
   }
 
   @Test(expected = MalformedQueryException.class)
   public void noDate() throws Exception {
-    Map<String, String> params = new HashMap<>();
-    queryMaker.formQueryFromRequestParameters(params);
+    queryMaker
+        .formQueryFromRequestParameters(ImmutableMap.<String, String> of());
   }
 
   @Test
   public void dateOrdering() throws Exception {
-    String query;
-    Map<String, String> params = new HashMap<>();
-    String olderDate = "2013-10-10 10:00:00";
-    String newerDate = "2014-10-10 10:00:00";
+    query = queryMaker.formQueryFromRequestParameters(
+        ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
+    assertThat(query)
+        .contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
 
-    params.put("t1", olderDate);
-    params.put("t2", newerDate);
-    query = queryMaker.formQueryFromRequestParameters(params);
-    assertThat(query).contains(String.format("'%s' and '%s'",
-        olderDate, newerDate));
-
-    params.put("t1", newerDate);
-    params.put("t2", olderDate);
-    query = queryMaker.formQueryFromRequestParameters(params);
-    assertThat(query).contains(String.format("'%s' and '%s'",
-        olderDate, newerDate));
+    query = queryMaker.formQueryFromRequestParameters(
+        ImmutableMap.of(T1, NEW_DATE, T2, OLD_DATE));
+    assertThat(query)
+        .contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
   }
 
   @Test
   public void bothDateTime() throws Exception {
-    Map<String, String> params = new HashMap<>();
-    params.put("t1", "2013-10-10 10:00:00");
-    params.put("t2", "2014-10-10 10:00:00");
-    String query = queryMaker.formQueryFromRequestParameters(params);
+    query = queryMaker.formQueryFromRequestParameters(
+        ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
     assertThat(query).isNotEqualTo(defaultQuery);
   }
 
   @Test
   public void onlyDateNoTime() throws Exception {
-    Map<String, String> params = new HashMap<>();
-    params.put("t1", "2013-10-10");
-    params.put("t2", "2014-10-10");
-    String query = queryMaker.formQueryFromRequestParameters(params);
+    String query = queryMaker.formQueryFromRequestParameters(
+        ImmutableMap.of(T1, "2013-10-10", T2, "2014-10-10"));
     assertThat(query).isNotEqualTo(defaultQuery);
   }
 }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
index ebc18e4..4b674d5 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLStoreTest.java
@@ -16,13 +16,18 @@
 
 import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.TABLE_NAME;
 import static com.google.common.truth.Truth.assertThat;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
 
-import com.google.gerrit.reviewdb.client.Change.Key;
+import com.google.common.collect.ImmutableList;
 import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
 import com.google.gerrit.server.CurrentUser;
-import com.google.gerrit.server.events.ChangeEvent;
+import com.google.gerrit.server.events.ProjectEvent;
 import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gson.Gson;
@@ -31,16 +36,14 @@
 import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
 import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
 import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
-import com.ericsson.gerrit.plugins.eventslog.sql.SQLClient;
-import com.ericsson.gerrit.plugins.eventslog.sql.SQLEntry;
-import com.ericsson.gerrit.plugins.eventslog.sql.SQLStore;
 
-import org.easymock.EasyMock;
-import org.easymock.EasyMockSupport;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,52 +54,50 @@
 import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Timestamp;
-import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 
+@RunWith(MockitoJUnitRunner.class)
 public class SQLStoreTest {
   private static final Logger log = LoggerFactory.getLogger(SQLStoreTest.class);
   private static final String TEST_URL = "jdbc:h2:mem:" + TABLE_NAME;
-  private static final String TEST_LOCAL_URL = "jdbc:h2:mem:test:";
+  private static final String TEST_LOCAL_URL = "jdbc:h2:mem:test";
   private static final String TEST_DRIVER = "org.h2.Driver";
-  private static final String TEST_OPTIONS = "DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false";
+  private static final String TEST_OPTIONS =
+      "DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false";
   private static final String TERM_CONN_MSG = "terminating connection";
   private static final String MSG = "message";
   private static final String GENERIC_QUERY = "SELECT * FROM " + TABLE_NAME;
+  private static final boolean PROJECT_VISIBLE_TO_USER = true;
+  private static final boolean PROJECT_NOT_VISIBLE_TO_USER = false;
 
-  private EasyMockSupport easyMock;
+  @Mock
   private ProjectControl.GenericFactory pcFactoryMock;
+  @Mock
   private Provider<CurrentUser> userProviderMock;
+  @Mock
   private EventsLogConfig cfgMock;
   private SQLClient eventsDb;
   private SQLClient localEventsDb;
   private SQLStore store;
   private ScheduledThreadPoolExecutor poolMock;
 
-  private String path = TEST_URL + ";" + TEST_OPTIONS;
-  private Connection conn;
   private Statement stat;
-  private List<SQLEntry> results;
 
   @Rule
   public TemporaryFolder testFolder = new TemporaryFolder();
 
-  @SuppressWarnings("unchecked")
   @Before
   public void setUp() throws SQLException {
-    conn = DriverManager.getConnection(path);
+    Connection conn =
+        DriverManager.getConnection(TEST_URL + ";" + TEST_OPTIONS);
     stat = conn.createStatement();
-    results = new ArrayList<>();
-    poolMock = new PoolMock(1);
-    easyMock = new EasyMockSupport();
-    pcFactoryMock = easyMock.createNiceMock(ProjectControl.GenericFactory.class);
-    userProviderMock = easyMock.createNiceMock(Provider.class);
-    cfgMock = easyMock.createNiceMock(EventsLogConfig.class);
-    expect(cfgMock.getMaxAge()).andReturn(5);
-    expect(cfgMock.getLocalStorePath()).andReturn(testFolder.getRoot().toPath()).atLeastOnce();
+    poolMock = new PoolMock();
+    when(cfgMock.getMaxAge()).thenReturn(5);
+    when(cfgMock.getLocalStorePath()).thenReturn(testFolder.getRoot().toPath());
   }
 
   public void tearDown() throws Exception {
@@ -107,76 +108,65 @@
   private void setUpClient() {
     eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
     localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
   }
 
-  private void setUpClientMock(boolean reset) throws SQLException {
-    eventsDb = easyMock.createNiceMock(SQLClient.class);
-    localEventsDb = easyMock.createNiceMock(SQLClient.class);
-    expect(localEventsDb.dbExists()).andReturn(true).anyTimes();
-    if (reset) {
-      easyMock.resetAll();
-    }
+  private void setUpClientMock() throws SQLException {
+    eventsDb = mock(SQLClient.class);
+    localEventsDb = mock(SQLClient.class);
+    when(localEventsDb.dbExists()).thenReturn(true);
   }
 
   @Test
   public void storeThenQueryVisible() throws Exception {
-    MockEvent mockEvent = new MockEvent();
-    ProjectControl pcMock = easyMock.createNiceMock(ProjectControl.class);
-    CurrentUser userMock = easyMock.createNiceMock(CurrentUser.class);
-    expect(userProviderMock.get()).andStubReturn(userMock);
-    expect(pcFactoryMock.controlFor(mockEvent.getProjectNameKey(), userMock))
-        .andStubReturn(pcMock);
-    expect(pcMock.isVisible()).andStubReturn(true);
-    easyMock.replayAll();
-    setUpClient();
+    MockEvent mockEvent = setUpMocks(PROJECT_VISIBLE_TO_USER);
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
-    Gson gson = new Gson();
-    String json = gson.toJson(mockEvent);
+    String json = new Gson().toJson(mockEvent);
     assertThat(events).containsExactly(json);
     tearDown();
   }
 
   @Test
   public void storeThenQueryNotVisible() throws Exception {
-    MockEvent mockEvent = new MockEvent();
-    ProjectControl pcMock = easyMock.createNiceMock(ProjectControl.class);
-    CurrentUser userMock = easyMock.createNiceMock(CurrentUser.class);
-    expect(userProviderMock.get()).andStubReturn(userMock);
-    expect(pcFactoryMock.controlFor(mockEvent.getProjectNameKey(), userMock))
-        .andStubReturn(pcMock);
-    expect(pcMock.isVisible()).andStubReturn(false);
-    easyMock.replayAll();
-    setUpClient();
+    MockEvent mockEvent = setUpMocks(PROJECT_NOT_VISIBLE_TO_USER);
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
     assertThat(events).isEmpty();
     tearDown();
   }
 
+  private MockEvent setUpMocks(boolean isVisible)
+      throws NoSuchProjectException, IOException {
+    MockEvent mockEvent = new MockEvent();
+    ProjectControl pcMock = mock(ProjectControl.class);
+    CurrentUser userMock = mock(CurrentUser.class);
+    when(userProviderMock.get()).thenReturn(userMock);
+    when(pcFactoryMock.controlFor(mockEvent.getProjectNameKey(), userMock))
+        .thenReturn(pcMock);
+    when(pcMock.isVisible()).thenReturn(isVisible);
+    setUpClient();
+    return mockEvent;
+  }
+
   @Test(expected = MalformedQueryException.class)
   public void throwBadRequestTriggerOnBadQuery() throws Exception {
-    easyMock.replayAll();
     setUpClient();
     String badQuery = "bad query";
     store.queryChangeEvents(badQuery);
-    easyMock.verifyAll();
   }
 
   @Test
   public void notReturnEventOfNonExistingProject() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    Project.NameKey projectMock = easyMock.createMock(Project.NameKey.class);
-    expect(projectMock.get()).andStubReturn(" ");
-    expect(
-        pcFactoryMock.controlFor(EasyMock.anyObject(Project.NameKey.class),
-            EasyMock.anyObject(CurrentUser.class)))
-              .andThrow(new NoSuchProjectException(projectMock));
-    easyMock.replayAll();
+    Project.NameKey projectMock = mock(Project.NameKey.class);
+    CurrentUser userMock = mock(CurrentUser.class);
+    when(userProviderMock.get()).thenReturn(userMock);
+    NameKey projectNameKey = mockEvent.getProjectNameKey();
+    doThrow(new NoSuchProjectException(projectMock)).when(pcFactoryMock)
+        .controlFor(projectNameKey, userMock);
     setUpClient();
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
@@ -187,12 +177,11 @@
   @Test
   public void notReturnEventWithNoVisibilityInfo() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    Project.NameKey projectMock = easyMock.createMock(Project.NameKey.class);
-    expect(projectMock.get()).andStubReturn(" ");
-    expect(
-        pcFactoryMock.controlFor(EasyMock.anyObject(Project.NameKey.class),
-            EasyMock.anyObject(CurrentUser.class))).andThrow(new IOException());
-    easyMock.replayAll();
+    CurrentUser userMock = mock(CurrentUser.class);
+    when(userProviderMock.get()).thenReturn(userMock);
+    NameKey projectNameKey = mockEvent.getProjectNameKey();
+    doThrow(new IOException()).when(pcFactoryMock).controlFor(projectNameKey,
+        userMock);
     setUpClient();
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
@@ -203,93 +192,78 @@
   @Test
   public void retryOnConnectException() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    setUpClientMock(false);
-    EasyMock.reset(eventsDb, localEventsDb);
-    expect(cfgMock.getMaxTries()).andReturn(3).once();
-    eventsDb.storeEvent(mockEvent);
-    expectLastCall().andThrow(new SQLException(new ConnectException()))
-        .times(3);
-    expect(localEventsDb.getAll()).andStubReturn(results);
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    when(cfgMock.getMaxTries()).thenReturn(3);
+    Throwable[] exceptions = new Throwable[3];
+    Arrays.fill(exceptions, new SQLException(new ConnectException()));
+    setUpClientMock();
+    doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
+    doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
-
     store.storeEvent(mockEvent);
-    easyMock.verifyAll();
+    verify(eventsDb, times(3)).storeEvent(mockEvent);
+    verify(localEventsDb).storeEvent(mockEvent);
   }
 
   @Test
   public void retryOnMessage() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    setUpClientMock(false);
-    expect(cfgMock.getMaxTries()).andReturn(3).once();
-    eventsDb.storeEvent(mockEvent);
-    expectLastCall().andThrow(new SQLException(TERM_CONN_MSG)).times(3);
-    expect(localEventsDb.getAll()).andStubReturn(results);
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    when(cfgMock.getMaxTries()).thenReturn(3);
+    Throwable[] exceptions = new Throwable[3];
+    Arrays.fill(exceptions, new SQLException(TERM_CONN_MSG));
+    setUpClientMock();
+    doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
+    doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
-
     store.storeEvent(mockEvent);
-    easyMock.verifyAll();
+    verify(eventsDb, times(3)).storeEvent(mockEvent);
+    verify(localEventsDb).storeEvent(mockEvent);
   }
 
   @Test
   public void noRetryOnMessage() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    setUpClientMock(false);
-    expect(cfgMock.getMaxTries()).andReturn(3).once();
-    eventsDb.storeEvent(mockEvent);
-    expectLastCall().andThrow(new SQLException(MSG)).once();
-    expect(localEventsDb.getAll()).andReturn(results);
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    when(cfgMock.getMaxTries()).thenReturn(3);
+    setUpClientMock();
+    doThrow(new SQLException(MSG)).when(eventsDb).storeEvent(mockEvent);
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
-
     store.storeEvent(mockEvent);
-    easyMock.verifyAll();
+    verify(eventsDb, times(1)).storeEvent(mockEvent);
   }
 
   @Test
   public void noRetryOnZeroMaxTries() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    setUpClientMock(false);
-    expect(cfgMock.getMaxTries()).andReturn(0).once();
-    eventsDb.storeEvent(mockEvent);
-    expectLastCall().andThrow(new SQLException(new ConnectException())).once();
-    expect(localEventsDb.getAll()).andStubReturn(results);
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    when(cfgMock.getMaxTries()).thenReturn(0);
+    Throwable[] exceptions = new Throwable[3];
+    Arrays.fill(exceptions, new SQLException(new ConnectException()));
+    setUpClientMock();
+    doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
+    doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
-
     store.storeEvent(mockEvent);
-    easyMock.verifyAll();
+    verify(eventsDb, times(1)).storeEvent(mockEvent);
   }
 
-  @Test (expected = ServiceUnavailableException.class)
+  @Test(expected = ServiceUnavailableException.class)
   public void throwSQLExceptionIfNotOnline() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    setUpClientMock(true);
-    eventsDb.createDBIfNotCreated();
-    expectLastCall().andThrow(new SQLException(new ConnectException())).once();
-    eventsDb.queryOne();
-    expectLastCall().andThrow(new SQLException());
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    setUpClientMock();
+    doThrow(new SQLException(new ConnectException())).when(eventsDb)
+        .createDBIfNotCreated();
+    doThrow(new SQLException()).when(eventsDb).queryOne();
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
     store.storeEvent(mockEvent);
     store.queryChangeEvents(GENERIC_QUERY);
-    easyMock.verifyAll();
   }
 
   @Test
@@ -298,26 +272,22 @@
     MockEvent mockEvent2 = new MockEvent("proj");
     MockEvent mockEvent3 = new MockEvent("unfound");
 
-    ProjectControl pc = easyMock.createNiceMock(ProjectControl.class);
-    NoSuchProjectException e =
-        easyMock.createNiceMock(NoSuchProjectException.class);
-    expect(
-        pcFactoryMock.controlFor(EasyMock.eq(mockEvent.getProjectNameKey()),
-            EasyMock.anyObject(CurrentUser.class))).andReturn(pc).once();
-    expect(
-        pcFactoryMock.controlFor(EasyMock.eq(mockEvent2.getProjectNameKey()),
-            EasyMock.anyObject(CurrentUser.class))).andReturn(pc).once();
-    expect(pc.isVisible()).andReturn(true).times(2);
-    expect(
-        pcFactoryMock.controlFor(EasyMock.eq(mockEvent3.getProjectNameKey()),
-            EasyMock.anyObject(CurrentUser.class))).andThrow(e);
-    easyMock.replayAll();
+    ProjectControl pc = mock(ProjectControl.class);
+    NoSuchProjectException e = mock(NoSuchProjectException.class);
+    CurrentUser userMock = mock(CurrentUser.class);
+    when(userProviderMock.get()).thenReturn(userMock);
+    when(pcFactoryMock.controlFor((mockEvent.getProjectNameKey()), userMock))
+        .thenReturn(pc);
+    when(pcFactoryMock.controlFor((mockEvent2.getProjectNameKey()), userMock))
+        .thenReturn(pc);
+    when(pc.isVisible()).thenReturn(true);
+    doThrow(e).when(pcFactoryMock).controlFor((mockEvent3.getProjectNameKey()),
+        userMock);
 
     eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
     localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
 
     localEventsDb.createDBIfNotCreated();
     localEventsDb.storeEvent(mockEvent);
@@ -329,61 +299,48 @@
     String json = gson.toJson(mockEvent);
     String json2 = gson.toJson(mockEvent2);
     assertThat(events).containsExactly(json, json2);
-    easyMock.verifyAll();
     tearDown();
   }
 
   @Test
   public void offlineUponStart() throws Exception {
-    setUpClientMock(true);
-    eventsDb.createDBIfNotCreated();
-    expectLastCall().andThrow(new SQLException(new ConnectException())).once();
-    eventsDb.queryOne();
-    expectLastCall().andThrow(new SQLException());
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    setUpClientMock();
+    doThrow(new SQLException(new ConnectException())).when(eventsDb)
+        .createDBIfNotCreated();
+    doThrow(new SQLException()).when(eventsDb).queryOne();
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
-    easyMock.verifyAll();
+    verify(localEventsDb).createDBIfNotCreated();
   }
 
   @Test
   public void storeLocalOffline() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    setUpClientMock(true);
-    eventsDb.createDBIfNotCreated();
-    expectLastCall().andThrow(new SQLException(new ConnectException())).once();
-    localEventsDb.storeEvent(mockEvent);
-    expectLastCall().once();
-    eventsDb.queryOne();
-    expectLastCall().andThrow(new SQLException());
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    setUpClientMock();
+    doThrow(new SQLException(new ConnectException())).when(eventsDb)
+        .createDBIfNotCreated();
+    doThrow(new SQLException()).when(eventsDb).queryOne();
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
-
     store.storeEvent(mockEvent);
-    easyMock.verifyAll();
+    verify(localEventsDb).storeEvent(mockEvent);
   }
 
   @Test
   public void storeLocalOfflineAfterNoRetry() throws Exception {
     MockEvent mockEvent = new MockEvent();
-    setUpClientMock(false);
-    expect(cfgMock.getMaxTries()).andReturn(0).once();
-    eventsDb.storeEvent(mockEvent);
-    expectLastCall().andThrow(new SQLException(new ConnectException())).once();
-    expect(localEventsDb.getAll()).andStubReturn(results);
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    setUpClientMock();
+    when(cfgMock.getMaxTries()).thenReturn(0);
+    doThrow(new SQLException(new ConnectException())).when(eventsDb)
+        .createDBIfNotCreated();
+    doThrow(new SQLException()).when(eventsDb).queryOne();
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
-
     store.storeEvent(mockEvent);
-    easyMock.verifyAll();
+    verify(localEventsDb).storeEvent(mockEvent);
   }
 
   /**
@@ -395,17 +352,16 @@
   @Test
   public void testConnectionTask() throws Exception {
     eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
-    localEventsDb = easyMock.createMock(SQLClient.class);
-    expect(localEventsDb.dbExists()).andReturn(true).once();
-    expect(localEventsDb.getAll()).andReturn(new ArrayList<SQLEntry>());
-    easyMock.replayAll();
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
-    eventsDb.createDBIfNotCreated();
+    localEventsDb = mock(SQLClient.class);
+    when(localEventsDb.dbExists()).thenReturn(true);
+    when(localEventsDb.getAll())
+        .thenReturn(ImmutableList.of(mock(SQLEntry.class)));
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
+    store.start();
     poolMock.scheduleWithFixedDelay(store.new CheckConnectionTask(), 0, 0,
         TimeUnit.MILLISECONDS);
-    easyMock.verifyAll();
+    verify(localEventsDb, times(2)).removeOldEvents(0);
   }
 
   @Test
@@ -420,37 +376,28 @@
 
   private void checkConnectionAndRestore(boolean copy) throws Exception {
     MockEvent mockEvent = new MockEvent();
-    eventsDb = easyMock.createNiceMock(SQLClient.class);
+    eventsDb = mock(SQLClient.class);
     localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
     localEventsDb.createDBIfNotCreated();
     localEventsDb.storeEvent(mockEvent);
-    eventsDb.createDBIfNotCreated();
-    expectLastCall().andThrow(new SQLException(new ConnectException())).once();
-    eventsDb.queryOne();
-    expectLastCall().once();
-    eventsDb.storeEvent(EasyMock.anyString(),
-        EasyMock.anyObject(Timestamp.class), EasyMock.anyString());
-    expectLastCall().once();
+    doThrow(new SQLException(new ConnectException())).doNothing().when(eventsDb)
+        .createDBIfNotCreated();
 
     if (copy) {
-      testCopyLocal();
+      when(cfgMock.getCopyLocal()).thenReturn(true);
     }
-    easyMock.replayAll();
 
-    store =
-        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-            localEventsDb, poolMock);
+    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
+        localEventsDb, poolMock);
     store.start();
+    verify(eventsDb).queryOne();
+    verify(eventsDb).storeEvent(any(String.class), any(Timestamp.class),
+        any(String.class));
     List<SQLEntry> entries = localEventsDb.getAll();
     assertThat(entries).isEmpty();
-    easyMock.verifyAll();
   }
 
-  private void testCopyLocal() {
-    expect(cfgMock.getCopyLocal()).andReturn(true).once();
-  }
-
-  public class MockEvent extends ChangeEvent {
+  public class MockEvent extends ProjectEvent {
     public String project = "mock project";
 
     MockEvent() {
@@ -466,21 +413,11 @@
     public Project.NameKey getProjectNameKey() {
       return new Project.NameKey(project);
     }
-
-    @Override
-    public Key getChangeKey() {
-      return null;
-    }
-
-    @Override
-    public String getRefName() {
-      return null;
-    }
   }
 
   class PoolMock extends ScheduledThreadPoolExecutor {
-    PoolMock(int corePoolSize) {
-      super(corePoolSize);
+    PoolMock() {
+      super(1);
     }
 
     @Override
