Merge branch 'stable-2.13' into stable-2.14

* stable-2.13:
  Change copyright to AOSP
  Build with API version 2.11.7

Change-Id: I2e93a8814059332f5348096565ebb2cf47860bdf
diff --git a/.buckconfig b/.buckconfig
deleted file mode 100644
index 1e032e5..0000000
--- a/.buckconfig
+++ /dev/null
@@ -1,15 +0,0 @@
-[alias]
-  events-log = //:events-log
-  plugin = //:events-log
-  src = //:events-log-sources
-
-[java]
-  src_roots = java, resources
-
-[project]
-  ignore = .git, eclipse-out
-
-[cache]
-  mode = dir
-  dir = buck-out/cache
-
diff --git a/.gitignore b/.gitignore
index 50ce7fd..0da307d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,13 +2,8 @@
 .project
 .settings
 bin
-/.buckconfig.local
-/.buckd
-/buck-cache
-/buck-out
 /local.properties
 *.pyc
-.buckversion
-.watchmanconfig
-/bucklets
 /eclipse-out
+/.primary_build_tool
+/bazel-*
diff --git a/BUCK b/BUCK
deleted file mode 100644
index 7b55bc0..0000000
--- a/BUCK
+++ /dev/null
@@ -1,72 +0,0 @@
-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/**/*'])
-DEPS = [
-  '//lib:gson',
-  '//lib/commons:dbcp',
-]
-TEST_DEPS = GERRIT_PLUGIN_API + DEPS + GERRIT_TESTS + [
-  ':events-log__plugin',
-  ':mockito',
-]
-
-gerrit_plugin(
-  name = 'events-log',
-  srcs = SOURCES,
-  resources = RESOURCES,
-  manifest_entries = [
-    'Gerrit-PluginName: events-log',
-    'Implementation-Vendor: Ericsson',
-    'Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/events-log',
-    'Gerrit-Module: com.ericsson.gerrit.plugins.eventslog.sql.SQLModule',
-    'Gerrit-HttpModule: com.ericsson.gerrit.plugins.eventslog.HttpModule',
-  ],
-  provided_deps = DEPS,
-)
-
-java_library(
-  name = 'classpath',
-  deps = TEST_DEPS,
-)
-
-java_test(
-  name = 'events-log_tests',
-  srcs = glob(['src/test/java/**/*.java']),
-  labels = ['events-log'],
-  deps = TEST_DEPS,
-)
-
-java_sources(
-  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/BUILD b/BUILD
new file mode 100644
index 0000000..da14708
--- /dev/null
+++ b/BUILD
@@ -0,0 +1,40 @@
+load("//tools/bzl:junit.bzl", "junit_tests")
+load(
+    "//tools/bzl:plugin.bzl",
+    "gerrit_plugin",
+    "PLUGIN_DEPS",
+    "PLUGIN_TEST_DEPS",
+)
+
+gerrit_plugin(
+    name = "events-log",
+    srcs = glob(["src/main/java/**/*.java"]),
+    manifest_entries = [
+        "Gerrit-PluginName: events-log",
+        "Implementation-URL: https://gerrit-review.googlesource.com/#/admin/projects/plugins/events-log",
+        "Implementation-Title: events-log plugin",
+        "Gerrit-Module: com.ericsson.gerrit.plugins.eventslog.sql.SQLModule",
+        "Gerrit-HttpModule: com.ericsson.gerrit.plugins.eventslog.HttpModule",
+    ],
+    resources = glob(["src/main/resources/**/*"]),
+)
+
+junit_tests(
+    name = "events_log_tests",
+    testonly = 1,
+    srcs = glob(["src/test/java/**/*.java"]),
+    tags = ["events-log"],
+    deps = [
+        ":events-log__plugin_test_deps",
+    ],
+)
+
+java_library(
+    name = "events-log__plugin_test_deps",
+    testonly = 1,
+    visibility = ["//visibility:public"],
+    exports = PLUGIN_DEPS + PLUGIN_TEST_DEPS + [
+        ":events-log__plugin",
+        "@mockito//jar",
+    ],
+)
diff --git a/WORKSPACE b/WORKSPACE
new file mode 100644
index 0000000..44dabc8
--- /dev/null
+++ b/WORKSPACE
@@ -0,0 +1,30 @@
+workspace(name = "events_log")
+
+load("//:bazlets.bzl", "load_bazlets")
+
+load_bazlets(
+    commit = "11ce7521051ca73598d099aa8a396c9ffe932a74",
+    #    local_path = "/home/<user>/projects/bazlets",
+)
+
+#Snapshot Plugin API
+#load(
+#    "@com_googlesource_gerrit_bazlets//:gerrit_api_maven_local.bzl",
+#    "gerrit_api_maven_local",
+#)
+
+# Load snapshot Plugin API
+#gerrit_api_maven_local()
+
+# Release Plugin API
+load(
+    "@com_googlesource_gerrit_bazlets//:gerrit_api.bzl",
+    "gerrit_api",
+)
+
+# Load release Plugin API
+gerrit_api()
+
+load("//:external_plugin_deps.bzl", "external_plugin_deps")
+
+external_plugin_deps()
diff --git a/bazlets.bzl b/bazlets.bzl
new file mode 100644
index 0000000..e14e488
--- /dev/null
+++ b/bazlets.bzl
@@ -0,0 +1,17 @@
+NAME = "com_googlesource_gerrit_bazlets"
+
+def load_bazlets(
+    commit,
+    local_path = None
+  ):
+  if not local_path:
+      native.git_repository(
+          name = NAME,
+          remote = "https://gerrit.googlesource.com/bazlets",
+          commit = commit,
+      )
+  else:
+      native.local_repository(
+          name = NAME,
+          path = local_path,
+      )
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
new file mode 100644
index 0000000..e26b362
--- /dev/null
+++ b/external_plugin_deps.bzl
@@ -0,0 +1,33 @@
+load("//tools/bzl:maven_jar.bzl", "maven_jar")
+
+def external_plugin_deps():
+  maven_jar(
+    name = "mockito",
+    artifact = "org.mockito:mockito-core:2.15.0",
+    sha1 = "b84bfbbc29cd22c9529409627af6ea2897f4fa85",
+    deps = [
+      "@byte_buddy//jar",
+      "@byte_buddy_agent//jar",
+      "@objenesis//jar",
+    ],
+  )
+
+  BYTE_BUDDY_VER = "1.7.9"
+
+  maven_jar(
+    name = "byte_buddy",
+    artifact = "net.bytebuddy:byte-buddy:" + BYTE_BUDDY_VER,
+    sha1 = "51218a01a882c04d0aba8c028179cce488bbcb58",
+  )
+
+  maven_jar(
+    name = "byte_buddy_agent",
+    artifact = "net.bytebuddy:byte-buddy-agent:" + BYTE_BUDDY_VER,
+    sha1 = "a6c65f9da7f467ee1f02ff2841ffd3155aee2fc9",
+  )
+
+  maven_jar(
+    name = "objenesis",
+    artifact = "org.objenesis:objenesis:2.6",
+    sha1 = "639033469776fd37c08358c6b92a4761feb2af4b",
+  )
diff --git a/lib/BUCK b/lib/BUCK
deleted file mode 100644
index 06f7c02..0000000
--- a/lib/BUCK
+++ /dev/null
@@ -1,8 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-maven_jar(
-  name = 'gson',
-  id = 'com.google.code.gson:gson:2.3.1',
-  sha1 = 'ecb6e1f8e4b0e84c4b886c2f14a1500caf309757',
-  license = 'Apache2.0',
-)
diff --git a/lib/commons/BUCK b/lib/commons/BUCK
deleted file mode 100644
index ee87715..0000000
--- a/lib/commons/BUCK
+++ /dev/null
@@ -1,23 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-maven_jar(
-  name = 'dbcp',
-  id = 'commons-dbcp:commons-dbcp:1.4',
-  sha1 = '30be73c965cc990b153a100aaaaafcf239f82d39',
-  license = 'Apache2.0',
-  deps = [':pool'],
-  exclude = [
-    'META-INF/LICENSE.txt',
-    'META-INF/NOTICE.txt',
-    'testpool.jocl'
-  ],
-)
-
-maven_jar(
-  name = 'pool',
-  id = 'commons-pool:commons-pool:1.5.5',
-  sha1 = '7d8ffbdc47aa0c5a8afe5dc2aaf512f369f1d19b',
-  license = 'Apache2.0',
-  attach_source = False,
-  exclude = ['META-INF/LICENSE.txt', 'META-INF/NOTICE.txt'],
-)
diff --git a/lib/gerrit/BUCK b/lib/gerrit/BUCK
deleted file mode 100644
index f83d917..0000000
--- a/lib/gerrit/BUCK
+++ /dev/null
@@ -1,22 +0,0 @@
-include_defs('//bucklets/maven_jar.bucklet')
-
-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 = 'e25d55b8f41627c4ae6b9d2069ec398638b219a3',
-  license = 'Apache2.0',
-  attach_source = False,
-  repository = REPO,
-)
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
index 3ba78bb..262316c 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
@@ -18,26 +18,22 @@
 import com.google.gerrit.server.events.Event;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.inject.Inject;
-
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 
-/**
- * Listen to Events and store them into the EventStore
- */
+/** Listen to Events and store them into the EventStore */
 class EventHandler implements EventListener {
   private final EventStore store;
   private final ScheduledThreadPoolExecutor pool;
 
   @Inject
-  EventHandler(EventStore store,
-      @EventPool ScheduledThreadPoolExecutor pool) {
+  EventHandler(EventStore store, @EventPool ScheduledThreadPoolExecutor pool) {
     this.store = store;
     this.pool = pool;
   }
 
   @Override
   public void onEvent(Event event) {
-    if(event instanceof ProjectEvent) {
+    if (event instanceof ProjectEvent) {
       pool.execute(new StoreEventTask((ProjectEvent) event));
     }
   }
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 6148522..906c0e8 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
@@ -21,7 +21,6 @@
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
 import com.google.inject.internal.UniqueAnnotations;
-
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 
 /** Configures handling for an event queue while providing its pool. */
@@ -31,9 +30,7 @@
   protected void configure() {
     bind(EventQueue.class).in(Scopes.SINGLETON);
     bind(EventHandler.class).in(Scopes.SINGLETON);
-    bind(LifecycleListener.class)
-        .annotatedWith(UniqueAnnotations.create())
-        .to(EventQueue.class);
+    bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(EventQueue.class);
     DynamicSet.bind(binder(), EventListener.class).to(EventHandler.class);
   }
 
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 97324df..32e9465 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventPool.java
@@ -17,13 +17,9 @@
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.inject.BindingAnnotation;
-
 import java.lang.annotation.Retention;
 
-/**
- * Annotation applied to a ScheduledThreadPoolExecutor.
- */
+/** Annotation applied to a ScheduledThreadPoolExecutor. */
 @Retention(RUNTIME)
 @BindingAnnotation
-public @interface EventPool {
-}
+public @interface EventPool {}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventQueue.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventQueue.java
index 07d5b41..eca051b 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventQueue.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventQueue.java
@@ -17,7 +17,6 @@
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.server.git.WorkQueue;
 import com.google.inject.Inject;
-
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 
 /** A queue for events to store. */
@@ -30,10 +29,7 @@
     this.workQueue = workQueue;
   }
 
-  /**
-   * {@inheritDoc}
-   * Create a new executor queue in WorkQueue for storing events.
-   */
+  /** {@inheritDoc} Create a new executor queue in WorkQueue for storing events. */
   @Override
   public void start() {
     pool = workQueue.createQueue(1, "Store events");
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventStore.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventStore.java
index a7785db..468404e 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventStore.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventStore.java
@@ -15,7 +15,6 @@
 package com.ericsson.gerrit.plugins.eventslog;
 
 import com.google.gerrit.server.events.ProjectEvent;
-
 import java.util.List;
 
 /** A store for change events to query. */
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 8432be4..e912faf 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfig.java
@@ -21,7 +21,6 @@
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
 import java.nio.file.Path;
 import java.nio.file.Paths;
 
@@ -49,7 +48,6 @@
   static final int DEFAULT_WAIT_TIME = 1000;
   static final int DEFAULT_CONN_TIME = 1000;
   static final String DEFAULT_DRIVER = "org.h2.Driver";
-  static final String DEFAULT_URL = "jdbc:h2:~/db/";
   static final int DEFAULT_EVICT_IDLE_TIME = 1000 * 60;
 
   private boolean copyLocal;
@@ -65,11 +63,10 @@
   private String storeUsername;
   private String storePassword;
   private int evictIdleTime;
+  private String defaultUrl;
 
   @Inject
-  EventsLogConfig(PluginConfigFactory cfgFactory,
-      SitePaths site,
-      @PluginName String pluginName) {
+  EventsLogConfig(PluginConfigFactory cfgFactory, SitePaths site, @PluginName String pluginName) {
     String defaultLocalPath = site.site_path.toString() + "/events-db/";
     PluginConfig cfg = cfgFactory.getFromGerritConfig(pluginName, true);
     copyLocal = cfg.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL);
@@ -79,19 +76,15 @@
     waitTime = cfg.getInt(CONFIG_WAIT_TIME, DEFAULT_WAIT_TIME);
     connectTime = cfg.getInt(CONFIG_CONN_TIME, DEFAULT_CONN_TIME);
     storeDriver = cfg.getString(CONFIG_DRIVER, DEFAULT_DRIVER);
-    storeUrl = cfg.getString(CONFIG_URL, DEFAULT_URL);
-    localStorePath = Paths.get(cfg.getString(CONFIG_LOCAL_PATH,
-        defaultLocalPath));
-    urlOptions = concatenate(cfg.getStringList(CONFIG_URL_OPTIONS));
+    defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
+    storeUrl = cfg.getString(CONFIG_URL, defaultUrl);
+    localStorePath = Paths.get(cfg.getString(CONFIG_LOCAL_PATH, defaultLocalPath));
+    urlOptions = Joiner.on(";").join(cfg.getStringList(CONFIG_URL_OPTIONS));
     storeUsername = cfg.getString(CONFIG_USERNAME);
     storePassword = cfg.getString(CONFIG_PASSWORD);
     evictIdleTime = cfg.getInt(CONFIG_EVICT_IDLE_TIME, DEFAULT_EVICT_IDLE_TIME);
   }
 
-  private String concatenate(String[] stringList) {
-    return Joiner.on(";").join(stringList);
-  }
-
   public int getMaxAge() {
     return maxAge;
   }
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 8227d22..70a8b74 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsLogException.java
@@ -19,8 +19,7 @@
   private static final long serialVersionUID = 1L;
 
   /**
-   * Constructs an <code>EventsLogException</code> object with a given
-   * <code>message</code>.
+   * Constructs an <code>EventsLogException</code> object with a given <code>message</code>.
    *
    * @param message a description of the exception
    */
@@ -29,12 +28,11 @@
   }
 
   /**
-   * Constructs an <code>EventsLogException</code> object with a given
-   * <code>message</code> and a given <code>cause</code>.
+   * Constructs an <code>EventsLogException</code> object with a given <code>message</code> and a
+   * given <code>cause</code>.
    *
    * @param message a description of the exception
-   * @param cause the underlying reason for this
-   *        <code>EventsLogException</code>
+   * @param cause the underlying reason for this <code>EventsLogException</code>
    */
   public EventsLogException(String message, Throwable cause) {
     super(message, cause);
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
index 121e2d8..f05e33d 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
@@ -19,24 +19,20 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.IOException;
 import java.io.Writer;
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
 class EventsRestApiServlet extends HttpServlet {
-  private static final Logger log =
-      LoggerFactory.getLogger(EventsRestApiServlet.class);
+  private static final Logger log = LoggerFactory.getLogger(EventsRestApiServlet.class);
   private static final long serialVersionUID = 1L;
 
   private final EventStore store;
@@ -44,9 +40,8 @@
   private final Provider<CurrentUser> userProvider;
 
   @Inject
-  EventsRestApiServlet(EventStore store,
-      QueryMaker queryMaker,
-      Provider<CurrentUser> userProvider) {
+  EventsRestApiServlet(
+      EventStore store, QueryMaker queryMaker, Provider<CurrentUser> userProvider) {
     this.store = store;
     this.queryMaker = queryMaker;
     this.userProvider = userProvider;
@@ -60,13 +55,10 @@
       return;
     }
     rsp.setContentType("text/html");
-    Map<String, String> params =
-        req.getQueryString() != null ? getParameters(req) : null;
-    Writer out = rsp.getWriter();
+    Map<String, String> params = req.getQueryString() != null ? getParameters(req) : null;
 
-    String query = null;
-    try {
-      query = queryMaker.formQueryFromRequestParameters(params);
+    try (Writer out = rsp.getWriter()) {
+      String query = queryMaker.formQueryFromRequestParameters(params);
       for (String event : store.queryChangeEvents(query)) {
         out.write(event + "\n");
       }
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 17caa1a..35f829d 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/MalformedQueryException.java
@@ -20,20 +20,16 @@
   private static final String MESSAGE =
       "Query doesn't conform with the format required by the database";
 
-  /**
-   * Constructs a <code>MalformedQueryException</code> object with the default
-   * message.
-   */
+  /** Constructs a <code>MalformedQueryException</code> object with the default message. */
   public MalformedQueryException() {
     super(MESSAGE);
   }
 
   /**
-   * Constructs a <code>MalformedQueryException</code> object with the default
-   * message and a given <code>cause</code>.
+   * Constructs a <code>MalformedQueryException</code> object with the default message and a given
+   * <code>cause</code>.
    *
-   * @param cause the underlying reason for this
-   *        <code>MalformedQueryException</code>
+   * @param cause the underlying reason for this <code>MalformedQueryException</code>
    */
   public MalformedQueryException(Throwable cause) {
     super(MESSAGE, cause);
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 bd55dbc..1969755 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/QueryMaker.java
@@ -23,13 +23,11 @@
    * Forms a String query based on the given parameters.
    *
    * @param params parameters which are used to form the query
-   * @return a query based on the given parameters. The query should conform to
-   *         the format required by the database.
-   * @throws MalformedQueryException if the given parameters do conform to
-   *         requirements
+   * @return a query based on the given parameters. The query should conform to the format required
+   *     by the database.
+   * @throws MalformedQueryException if the given parameters do conform to requirements
    */
-  String formQueryFromRequestParameters(Map<String, String> params)
-      throws MalformedQueryException;
+  String formQueryFromRequestParameters(Map<String, String> params) throws MalformedQueryException;
 
   /**
    * Get the query designated as the default when no parameters are given.
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/ServiceUnavailableException.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/ServiceUnavailableException.java
index 57656e3..8689eb8 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/ServiceUnavailableException.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/ServiceUnavailableException.java
@@ -17,13 +17,9 @@
 /** An exception type for when the events database cannot be queried. */
 public class ServiceUnavailableException extends EventsLogException {
   private static final long serialVersionUID = 1L;
-  private static final String MESSAGE =
-      "Database server disconnected, cannot query events";
+  private static final String MESSAGE = "Database server disconnected, cannot query events";
 
-  /**
-   * Constructs a <code>ServiceUnavailableException</code> object with the
-   * default message.
-   */
+  /** Constructs a <code>ServiceUnavailableException</code> object with the default message. */
   public ServiceUnavailableException() {
     super(MESSAGE);
   }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/EventsDb.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/EventsDb.java
index cf6d2d9..0016fde 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/EventsDb.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/EventsDb.java
@@ -17,13 +17,9 @@
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.inject.BindingAnnotation;
-
 import java.lang.annotation.Retention;
 
-/**
- * Annotation applied to the SQLClient connected to the main database
- */
+/** Annotation applied to the SQLClient connected to the main database */
 @Retention(RUNTIME)
 @BindingAnnotation
-public @interface EventsDb {
-}
+public @interface EventsDb {}
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/LocalEventsDb.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/LocalEventsDb.java
index 0590d6e..654d9e8 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/LocalEventsDb.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/LocalEventsDb.java
@@ -17,13 +17,9 @@
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 
 import com.google.inject.BindingAnnotation;
-
 import java.lang.annotation.Retention;
 
-/**
- * Annotation applied to the SQLClient connected to the local database
- */
+/** Annotation applied to the SQLClient connected to the local database */
 @Retention(RUNTIME)
 @BindingAnnotation
-@interface LocalEventsDb {
-}
+@interface LocalEventsDb {}
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 9242ab3..97f9dad 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,22 +24,16 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.SECONDS;
 
+import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
+import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
 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.gerrit.server.events.SupplierSerializer;
 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;
-
-import org.apache.commons.dbcp.BasicDataSource;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -47,6 +41,9 @@
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
+import org.apache.commons.dbcp.BasicDataSource;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 class SQLClient {
   private static final Logger log = LoggerFactory.getLogger(SQLClient.class);
@@ -59,8 +56,7 @@
     ds.setDriverClassName(storeDriver);
     ds.setUrl(storeUrl);
     ds.setConnectionProperties(urlOptions);
-    gson = new GsonBuilder()
-        .registerTypeAdapter(Supplier.class, new SupplierSerializer()).create();
+    gson = new GsonBuilder().registerTypeAdapter(Supplier.class, new SupplierSerializer()).create();
   }
 
   /**
@@ -82,8 +78,7 @@
   }
 
   /**
-   * Set the time before an idle connection is evicted as well as the
-   * time between eviction runs.
+   * Set the time before an idle connection is evicted as well as the time between eviction runs.
    *
    * @param evictIdleTime the time in milliseconds before eviction
    */
@@ -110,8 +105,7 @@
    */
   boolean dbExists() throws SQLException {
     try (Connection conn = ds.getConnection();
-        ResultSet tables =
-            conn.getMetaData().getTables(null, null, TABLE_NAME, null)) {
+        ResultSet tables = conn.getMetaData().getTables(null, null, TABLE_NAME, null)) {
       return tables.next();
     }
   }
@@ -125,15 +119,14 @@
   }
 
   /**
-   * Get events as a multimap list of Strings and SQLEntries. The String
-   * represents the project name, and the SQLEntry is the event information.
+   * Get events as a multimap list of Strings and SQLEntries. The String represents the project
+   * name, and the SQLEntry is the event information.
    *
    * @param query the query as a string
    * @return Multimap list of Strings (project names) and SQLEntries (events)
    * @throws EventsLogException If there was a problem with the database
    */
-  ListMultimap<String, SQLEntry> getEvents(String query)
-      throws EventsLogException {
+  ListMultimap<String, SQLEntry> getEvents(String query) throws EventsLogException {
     try (Connection conn = ds.getConnection();
         Statement stat = conn.createStatement()) {
       return listEvents(stat, query);
@@ -149,7 +142,8 @@
    * @throws SQLException If there was a problem with the database
    */
   void storeEvent(ProjectEvent event) throws SQLException {
-    storeEvent(event.getProjectNameKey().get(),
+    storeEvent(
+        event.getProjectNameKey().get(),
         new Timestamp(SECONDS.toMillis(event.eventCreatedOn)),
         gson.toJson(event));
   }
@@ -162,11 +156,10 @@
    * @param event The event as a string
    * @throws SQLException If there was a problem with the database
    */
-  void storeEvent(String projectName, Timestamp timestamp, String event)
-      throws SQLException {
-    execute(format("INSERT INTO %s(%s, %s, %s) ", TABLE_NAME, PROJECT_ENTRY,
-        DATE_ENTRY, EVENT_ENTRY)
-        + format("VALUES('%s', '%s', '%s')", projectName, timestamp, event));
+  void storeEvent(String projectName, Timestamp timestamp, String event) throws SQLException {
+    execute(
+        format("INSERT INTO %s(%s, %s, %s) ", TABLE_NAME, PROJECT_ENTRY, DATE_ENTRY, EVENT_ENTRY)
+            + format("VALUES('%s', '%s', '%s')", projectName, timestamp, event));
   }
 
   /**
@@ -176,12 +169,12 @@
    */
   void removeOldEvents(int maxAge) {
     try {
-      execute(format(
-          "DELETE FROM %s WHERE %s < '%s'",
-          TABLE_NAME,
-          DATE_ENTRY,
-          new Timestamp(System.currentTimeMillis()
-              - MILLISECONDS.convert(maxAge, DAYS))));
+      execute(
+          format(
+              "DELETE FROM %s WHERE %s < '%s'",
+              TABLE_NAME,
+              DATE_ENTRY,
+              new Timestamp(System.currentTimeMillis() - MILLISECONDS.convert(maxAge, DAYS))));
     } catch (SQLException e) {
       log.warn("Cannot remove old event entries from database", e);
     }
@@ -194,17 +187,15 @@
    */
   void removeProjectEvents(String project) {
     try {
-      execute(
-          format("DELETE FROM %s WHERE project = '%s'", TABLE_NAME, project));
+      execute(format("DELETE FROM %s WHERE project = '%s'", TABLE_NAME, project));
     } catch (SQLException e) {
-      log.warn(
-          "Cannot remove project " + project + " events from database", e);
+      log.warn("Cannot remove project " + project + " events from database", e);
     }
   }
 
   /**
-   * Do a simple query on the database. This is used to determine whether or
-   * not the main database is online.
+   * Do a simple query on the database. This is used to determine whether or not the main database
+   * is online.
    *
    * @throws SQLException If there was a problem with the database
    */
@@ -224,9 +215,12 @@
         Statement stat = conn.createStatement();
         ResultSet rs = stat.executeQuery("SELECT * FROM " + TABLE_NAME)) {
       while (rs.next()) {
-        entries.add(new SQLEntry(rs.getString(PROJECT_ENTRY), rs
-            .getTimestamp(DATE_ENTRY), rs.getString(EVENT_ENTRY), rs
-            .getInt(PRIMARY_ENTRY)));
+        entries.add(
+            new SQLEntry(
+                rs.getString(PROJECT_ENTRY),
+                rs.getTimestamp(DATE_ENTRY),
+                rs.getString(EVENT_ENTRY),
+                rs.getInt(PRIMARY_ENTRY)));
       }
       return entries;
     }
@@ -238,8 +232,10 @@
       ListMultimap<String, SQLEntry> result = ArrayListMultimap.create();
       while (rs.next()) {
         SQLEntry entry =
-            new SQLEntry(rs.getString(PROJECT_ENTRY),
-                rs.getTimestamp(DATE_ENTRY), rs.getString(EVENT_ENTRY),
+            new SQLEntry(
+                rs.getString(PROJECT_ENTRY),
+                rs.getTimestamp(DATE_ENTRY),
+                rs.getString(EVENT_ENTRY),
                 rs.getInt(PRIMARY_ENTRY));
         result.put(rs.getString(PROJECT_ENTRY), entry);
       }
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLModule.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLModule.java
index 32572e3..a75335b 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLModule.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLModule.java
@@ -14,17 +14,16 @@
 
 package com.ericsson.gerrit.plugins.eventslog.sql;
 
+import com.ericsson.gerrit.plugins.eventslog.EventModule;
+import com.ericsson.gerrit.plugins.eventslog.EventStore;
+import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
+import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 import com.google.inject.Singleton;
 import com.google.inject.internal.UniqueAnnotations;
 
-import com.ericsson.gerrit.plugins.eventslog.EventModule;
-import com.ericsson.gerrit.plugins.eventslog.EventStore;
-import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
-import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
-
 class SQLModule extends AbstractModule {
 
   private static final String H2_DB_PREFIX = "jdbc:h2:";
@@ -33,8 +32,7 @@
   protected void configure() {
     install(new EventModule());
     bind(EventStore.class).to(SQLStore.class);
-    bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(
-        SQLStore.class);
+    bind(LifecycleListener.class).annotatedWith(UniqueAnnotations.create()).to(SQLStore.class);
     bind(QueryMaker.class).to(SQLQueryMaker.class);
   }
 
@@ -42,8 +40,8 @@
   @Singleton
   @EventsDb
   SQLClient provideSqlClient(EventsLogConfig cfg) {
-    SQLClient sqlClient = new SQLClient(cfg.getStoreDriver(), cfg.getStoreUrl(),
-        cfg.getUrlOptions());
+    SQLClient sqlClient =
+        new SQLClient(cfg.getStoreDriver(), cfg.getStoreUrl(), cfg.getUrlOptions());
     sqlClient.setUsername(cfg.getStoreUsername());
     sqlClient.setPassword(cfg.getStorePassword());
     sqlClient.setEvictIdleTime(cfg.getEvictIdleTime());
@@ -56,8 +54,11 @@
   SQLClient provideLocalSqlClient(EventsLogConfig cfg) {
     String path = cfg.getLocalStorePath().toString();
     path = path.endsWith("/") ? path : path + "/";
-    SQLClient sqlClient = new SQLClient(cfg.getLocalStoreDriver(),
-        H2_DB_PREFIX + path + SQLTable.TABLE_NAME, cfg.getUrlOptions());
+    SQLClient sqlClient =
+        new SQLClient(
+            cfg.getLocalStoreDriver(),
+            H2_DB_PREFIX + path + SQLTable.TABLE_NAME,
+            cfg.getUrlOptions());
     sqlClient.setEvictIdleTime(cfg.getEvictIdleTime());
     return sqlClient;
   }
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 8ad81be..53e406c 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
@@ -18,18 +18,15 @@
 import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.PRIMARY_ENTRY;
 import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.TABLE_NAME;
 
-import com.google.inject.Inject;
-import com.google.inject.Singleton;
-
 import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
 import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
 import com.ericsson.gerrit.plugins.eventslog.QueryMaker;
-
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
+import com.google.inject.Inject;
+import com.google.inject.Singleton;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.Map;
 
 @Singleton
@@ -37,20 +34,10 @@
   private static final int TWO = 2;
   private static final String TIME_ONE = "t1";
   private static final String TIME_TWO = "t2";
-  private static final ThreadLocal<DateFormat> DATE_TIME_FORMAT =
-      new ThreadLocal<DateFormat>() {
-        @Override
-        protected DateFormat initialValue() {
-          return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        }
-      };
-  private static final ThreadLocal<DateFormat> DATE_ONLY_FORMAT =
-      new ThreadLocal<DateFormat>() {
-        @Override
-        protected DateFormat initialValue() {
-          return new SimpleDateFormat("yyyy-MM-dd");
-        }
-      };
+  private static final DateTimeFormatter DATE_TIME_FORMAT =
+      DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+  private static final DateTimeFormatter DATE_ONLY_FORMAT =
+      DateTimeFormatter.ofPattern("yyyy-MM-dd");
 
   private final int returnLimit;
 
@@ -65,46 +52,52 @@
     if (params == null) {
       return getDefaultQuery();
     }
-    Date[] dates;
+    String[] dates;
     try {
       dates = parseDates(params.get(TIME_ONE), params.get(TIME_TWO));
-    } catch (ParseException e) {
+    } catch (DateTimeParseException e) {
       throw new MalformedQueryException(e);
     }
     return String.format(
-        "SELECT * FROM %s WHERE %s BETWEEN '%s' and '%s' LIMIT %d", TABLE_NAME,
-        DATE_ENTRY, DATE_TIME_FORMAT.get().format(dates[0]),
-        DATE_TIME_FORMAT.get().format(dates[1]), returnLimit);
+        "SELECT * FROM %s WHERE %s BETWEEN '%s' and '%s' LIMIT %d",
+        TABLE_NAME, DATE_ENTRY, dates[0], dates[1], returnLimit);
   }
 
   @Override
   public String getDefaultQuery() {
-    return "SELECT * FROM(SELECT * FROM " + TABLE_NAME
-        + " ORDER BY " + PRIMARY_ENTRY + " DESC LIMIT " + returnLimit + ")"
-        + " a ORDER BY " + PRIMARY_ENTRY + " ASC";
+    return "SELECT * FROM(SELECT * FROM "
+        + TABLE_NAME
+        + " ORDER BY "
+        + PRIMARY_ENTRY
+        + " DESC LIMIT "
+        + returnLimit
+        + ")"
+        + " a ORDER BY "
+        + PRIMARY_ENTRY
+        + " ASC";
   }
 
-  private Date[] parseDates(String dateOne, String dateTwo)
-      throws MalformedQueryException, ParseException {
+  private String[] parseDates(String dateOne, String dateTwo)
+      throws MalformedQueryException, DateTimeParseException {
     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];
+    LocalDateTime dOne = dateOne == null ? LocalDateTime.now() : parseDate(dateOne);
+    LocalDateTime dTwo = dateTwo == null ? LocalDateTime.now() : parseDate(dateTwo);
+    LocalDateTime[] dates = new LocalDateTime[TWO];
 
-    dates[0] = dOne.compareTo(dTwo) < 0 ? dOne : dTwo;
-    dates[1] = dOne.compareTo(dTwo) < 0 ? dTwo : dOne;
-    return dates;
+    dates[0] = dOne.isBefore(dTwo) ? dOne : dTwo;
+    dates[1] = dOne.isBefore(dTwo) ? dTwo : dOne;
+    return new String[] {DATE_TIME_FORMAT.format(dates[0]), DATE_TIME_FORMAT.format(dates[1])};
   }
 
-  private Date parseDate(String date) throws ParseException {
-    Date parsedDate;
+  private LocalDateTime parseDate(String date) throws DateTimeParseException {
+    LocalDateTime parsedDate;
     try {
-      parsedDate = DATE_TIME_FORMAT.get().parse(date);
-    } catch (ParseException e) {
-      parsedDate = DATE_ONLY_FORMAT.get().parse(date);
+      parsedDate = LocalDateTime.parse(date, DATE_TIME_FORMAT);
+    } catch (DateTimeParseException e) {
+      LocalDate localDate = LocalDate.parse(date, DATE_ONLY_FORMAT);
+      parsedDate = localDate.atStartOfDay();
     }
     return parsedDate;
   }
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 b7beda8..d9445b5 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
@@ -16,6 +16,11 @@
 
 import static com.ericsson.gerrit.plugins.eventslog.sql.SQLTable.TABLE_NAME;
 
+import com.ericsson.gerrit.plugins.eventslog.EventPool;
+import com.ericsson.gerrit.plugins.eventslog.EventStore;
+import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
+import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
+import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
 import com.google.common.io.Files;
 import com.google.gerrit.common.TimeUtil;
 import com.google.gerrit.extensions.events.LifecycleListener;
@@ -27,16 +32,6 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 import com.google.inject.Singleton;
-
-import com.ericsson.gerrit.plugins.eventslog.EventPool;
-import com.ericsson.gerrit.plugins.eventslog.EventStore;
-import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
-import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
-import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.File;
 import java.io.IOException;
 import java.net.ConnectException;
@@ -50,6 +45,8 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 @Singleton
 class SQLStore implements EventStore, LifecycleListener {
@@ -71,7 +68,8 @@
   private Path localPath;
 
   @Inject
-  SQLStore(ProjectControl.GenericFactory projectControlFactory,
+  SQLStore(
+      ProjectControl.GenericFactory projectControlFactory,
       Provider<CurrentUser> userProvider,
       EventsLogConfig cfg,
       @EventsDb SQLClient eventsDb,
@@ -103,9 +101,8 @@
   }
 
   /**
-   * {@inheritDoc}
-   * The events returned are restricted to the projects which are visible to
-   * the user.
+   * {@inheritDoc} The events returned are restricted to the projects which are visible to the user.
+   *
    * @throws ServiceUnavailableException if working in offline mode
    */
   @Override
@@ -115,21 +112,22 @@
     }
     List<SQLEntry> entries = new ArrayList<>();
 
-    for (Entry<String, Collection<SQLEntry>> entry
-        : eventsDb.getEvents(query).asMap().entrySet()) {
+    for (Entry<String, Collection<SQLEntry>> entry : eventsDb.getEvents(query).asMap().entrySet()) {
       String projectName = entry.getKey();
       try {
-        if (projectControlFactory.controlFor(new Project.NameKey(projectName),
-            userProvider.get()).isVisible()) {
+        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, " + projectName
-            + ", removing project from database");
+        log.warn(
+            "Database contains a non-existing project, "
+                + projectName
+                + ", removing project from database");
         eventsDb.removeProjectEvents(projectName);
       } catch (IOException e) {
-        log.warn("Cannot get project visibility info for " + projectName
-            + " from cache", e);
+        log.warn("Cannot get project visibility info for " + projectName + " from cache", e);
       }
     }
     return sortedEventsFromEntries(entries);
@@ -145,10 +143,9 @@
   }
 
   /**
-   * {@inheritDoc}
-   * If storing the event fails due to a connection problem, storage will be
-   * re-attempted as specified in gerrit.config. After failing the maximum
-   * amount of times, the event will be stored in a local h2 database.
+   * {@inheritDoc} If storing the event fails due to a connection problem, storage will be
+   * re-attempted as specified in gerrit.config. After failing the maximum amount of times, the
+   * event will be stored in a local h2 database.
    */
   @Override
   public void storeEvent(ProjectEvent event) {
@@ -170,8 +167,7 @@
           try {
             retryIfAllowed(failedConnections);
           } catch (InterruptedException e1) {
-            log.warn("Cannot store ChangeEvent for: " + projectName.get()
-                + ": Interrupted");
+            log.warn("Cannot store ChangeEvent for: " + projectName.get() + ": Interrupted");
             Thread.currentThread().interrupt();
             return;
           }
@@ -181,8 +177,7 @@
     }
   }
 
-  private void retryIfAllowed(int failedConnections)
-      throws InterruptedException {
+  private void retryIfAllowed(int failedConnections) throws InterruptedException {
     if (failedConnections < maxTries - 1) {
       log.info("Retrying store event");
       Thread.sleep(waitTime);
@@ -196,8 +191,10 @@
     try {
       getEventsDb().createDBIfNotCreated();
     } catch (SQLException e) {
-      log.warn("Cannot start the database. Events will be stored locally"
-          + " until database connection can be established", e);
+      log.warn(
+          "Cannot start the database. Events will be stored locally"
+              + " until database connection can be established",
+          e);
       setOnline(false);
     }
     if (online) {
@@ -214,8 +211,9 @@
     this.online = online;
     setUp();
     if (!online) {
-      checkConnTask = pool.scheduleWithFixedDelay(
-          new CheckConnectionTask(), 0, connectTime, TimeUnit.MILLISECONDS);
+      checkConnTask =
+          pool.scheduleWithFixedDelay(
+              new CheckConnectionTask(), 0, connectTime, TimeUnit.MILLISECONDS);
     } else {
       cancelCheckConnectionTaskIfScheduled(false);
     }
@@ -249,16 +247,14 @@
 
   private void restoreEvent(SQLEntry entry) {
     try {
-      eventsDb.storeEvent(entry.getName(), entry.getTimestamp(),
-          entry.getEvent());
+      eventsDb.storeEvent(entry.getName(), entry.getTimestamp(), entry.getEvent());
     } catch (SQLException e) {
       log.warn("Could not restore events from local", e);
     }
   }
 
   class CheckConnectionTask implements Runnable {
-    CheckConnectionTask() {
-    }
+    CheckConnectionTask() {}
 
     @Override
     public void run() {
@@ -290,9 +286,7 @@
     try {
       exists = localEventsDb.dbExists();
     } catch (SQLException e) {
-      log.warn(
-          "Could not check existence of local database, assume that it doesn't exist",
-          e);
+      log.warn("Could not check existence of local database, assume that it doesn't exist", e);
     }
     return exists;
   }
@@ -302,9 +296,11 @@
       return;
     }
     File file = localPath.resolve(TABLE_NAME + H2_DB_SUFFIX).toFile();
-    File copyFile = localPath.resolve(TABLE_NAME
-        + (TimeUnit.MILLISECONDS.toSeconds(TimeUtil.nowMs()))
-        + H2_DB_SUFFIX).toFile();
+    File copyFile =
+        localPath
+            .resolve(
+                TABLE_NAME + (TimeUnit.MILLISECONDS.toSeconds(TimeUtil.nowMs())) + H2_DB_SUFFIX)
+            .toFile();
     try {
       Files.copy(file, copyFile);
     } catch (IOException e) {
diff --git a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLTable.java b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLTable.java
index 8102b1b..f25b618 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLTable.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLTable.java
@@ -23,8 +23,7 @@
   static final String DATE_ENTRY = "date_created";
   static final String EVENT_ENTRY = "event_info";
 
-  private SQLTable() {
-  }
+  private SQLTable() {}
 
   static String createTableQuery(boolean postgresql) {
     StringBuilder query = new StringBuilder();
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
index 3756aa6..41a69ca 100644
--- a/src/main/resources/Documentation/build.md
+++ b/src/main/resources/Documentation/build.md
@@ -1,82 +1,75 @@
 Build
 =====
 
-This plugin is built with Buck.
+This plugin is built with Bazel. Two build modes are supported:
+ * Standalone
+ * In Gerrit tree.
 
-Buck
-----
+Standalone build mode is recommended, as this mode doesn't require local Gerrit
+tree to exist. Moreover, there are some limitations and additional manual steps
+required when building in Gerrit tree mode (see corresponding sections).
 
-Two build modes are supported: Standalone and in Gerrit tree.
-The standalone build mode is recommended, as this mode doesn't require
-the Gerrit tree to exist locally.
+## Build standalone
 
-
-### Build standalone
-
-Clone bucklets library:
-
-```
-  git clone https://gerrit.googlesource.com/bucklets
-
-```
-and link it to events-log plugin directory:
-
-```
-  cd events-log && ln -s ../bucklets .
-```
-
-Add link to the .buckversion file:
-
-```
-  cd events-log && ln -s bucklets/buckversion .buckversion
-```
-
-Add link to the .watchmanconfig file:
-
-```
-  cd events-log && ln -s bucklets/watchmanconfig .watchmanconfig
-```
+### Bazel
 
 To build the plugin, issue the following command:
 
 ```
-  buck build plugin
+  bazel build @PLUGIN@
 ```
 
 The output is created in
 
 ```
-  buck-out/gen/events-log.jar
-```
-
-This project can be imported into the Eclipse IDE:
-
-```
-  ./bucklets/tools/eclipse.py
+  bazel-genfiles/@PLUGIN@.jar
 ```
 
 To execute the tests run:
 
 ```
-  buck test
+  bazel test //...
 ```
 
-### Build in Gerrit tree
-
-Clone or link this plugin to the plugins directory of Gerrit's source
-tree, and issue the command:
+This project can be imported into the Eclipse IDE:
 
 ```
-  buck build plugins/events-log
+  ./tools/eclipse/project.sh
 ```
 
+## Build in Gerrit tree
+
+### Bazel
+
+Clone (or link) this plugin to the `plugins` directory of Gerrit's source tree.
+
+Put the external dependency Bazel build file into the Gerrit /plugins directory,
+replacing the existing empty one.
+
+```
+  cd gerrit/plugins
+  rm external_plugin_deps.bzl
+  ln -s @PLUGIN@/external_plugin_deps.bzl .
+```
+
+Then issue
+
+```
+  bazel build plugins/@PLUGIN@
+```
+
+in the root of Gerrit's source tree to build
+
 The output is created in
 
 ```
-  buck-out/gen/plugins/events-log/events-log.jar
+  bazel-genfiles/plugins/@PLUGIN@/@PLUGIN@.jar
 ```
 
-This project can be imported into the Eclipse IDE:
+This project can be imported into the Eclipse IDE.
+Add the plugin name to the `CUSTOM_PLUGINS` and to the
+`CUSTOM_PLUGINS_TEST_DEPS` set in Gerrit core in
+`tools/bzl/plugins.bzl`, and execute:
 
 ```
   ./tools/eclipse/project.py
@@ -85,8 +78,8 @@
 To execute the tests run:
 
 ```
-  buck test --include events-log
+  bazel test plugins/@PLUGIN@:events_log_tests
 ```
 
 More information about Buck can be found in the [Gerrit
-documentation](../../../Documentation/dev-buck.html).
+documentation](../../../Documentation/dev-bazel.html).
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 749c600..4e29811 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -8,7 +8,7 @@
   [plugin "@PLUGIN@"]
     maxAge = 20
     returnLimit = 10000
-    storeUrl = jdbc:h2:~/gerrit/db/
+    storeUrl = jdbc:h2:<gerrit_site>/data/db
     urlOptions = loglevel=INFO
     urlOptions = logUnclosedConnections=true
     copyLocal = true
@@ -29,11 +29,11 @@
 
 plugin.@PLUGIN@.storeUrl
 :    Specify the path to the directory in which to keep the database. When not
-     specified, the default path is jdbc:h2:~/db/.
+     specified, the default path is jdbc:h2:\<gerrit_site>/data/db.
 
 plugin.@PLUGIN@.localStorePath
 :    Specify the path to the directory in which to keep the back up database.
-     When not specified, the default path is <gerrit_site>/events-db/.
+     When not specified, the default path is \<gerrit_site>/events-db/.
 
 plugin.@PLUGIN@.storeUsername
 :    Username to connect to the database, not defined by default. This value can
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 b6c773b..f3eb207 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventHandlerTest.java
@@ -21,19 +21,16 @@
 
 import com.google.gerrit.server.events.ChangeEvent;
 import com.google.gerrit.server.events.Event;
-
+import java.util.concurrent.ScheduledThreadPoolExecutor;
 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 {
-  @Mock
-  private EventStore storeMock;
+  @Mock private EventStore storeMock;
   private EventHandler eventHandler;
 
   @Before
@@ -60,6 +57,7 @@
     PoolMock() {
       super(1);
     }
+
     @Override
     public void execute(Runnable command) {
       assertThat(command.toString()).isEqualTo("(Events-log) Insert Event");
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 f4cd273..0d19579 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogConfigTest.java
@@ -34,7 +34,6 @@
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_MAX_AGE;
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_MAX_TRIES;
 import static com.ericsson.gerrit.plugins.eventslog.EventsLogConfig.DEFAULT_RETURN_LIMIT;
-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.mockito.Mockito.when;
@@ -43,7 +42,8 @@
 import com.google.gerrit.server.config.PluginConfig;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.config.SitePaths;
-
+import java.io.IOException;
+import java.nio.file.Files;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -52,9 +52,6 @@
 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";
@@ -63,46 +60,38 @@
   private SitePaths site;
   private EventsLogConfig config;
   private String defaultLocalStorePath;
+  private String defaultUrl;
   private String localStorePath;
   private String[] urlOptions = new String[] {"DB_CLOSE_DELAY=10"};
 
-  @Mock
-  private PluginConfigFactory cfgFactoryMock;
-  @Mock
-  private PluginConfig configMock;
+  @Mock private PluginConfigFactory cfgFactoryMock;
+  @Mock private PluginConfig configMock;
 
-  @Rule
-  public TemporaryFolder gerrit_site = new TemporaryFolder();
+  @Rule public TemporaryFolder gerrit_site = new TemporaryFolder();
 
   @Before
   public void setUp() throws IOException {
     site = new SitePaths(gerrit_site.getRoot().toPath());
     Files.createDirectories(site.etc_dir);
     defaultLocalStorePath = site.site_path.toString() + "/events-db/";
-    when(cfgFactoryMock.getFromGerritConfig(PLUGIN_NAME, true))
-        .thenReturn(configMock);
+    defaultUrl = "jdbc:h2:" + site.data_dir.toString() + "/db";
+    when(cfgFactoryMock.getFromGerritConfig(PLUGIN_NAME, true)).thenReturn(configMock);
   }
 
   private void setUpDefaults() {
     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_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.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, defaultUrl)).thenReturn(defaultUrl);
     when(configMock.getString(CONFIG_LOCAL_PATH, defaultLocalStorePath))
         .thenReturn(defaultLocalStorePath);
-    when(configMock.getStringList(CONFIG_URL_OPTIONS))
-        .thenReturn(new String[] {});
+    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))
@@ -111,28 +100,20 @@
 
   private void setUpCustom() {
     localStorePath = "~/gerrit/events-db/";
-    when(configMock.getBoolean(CONFIG_COPY_LOCAL, DEFAULT_COPY_LOCAL))
-        .thenReturn(true);
+    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.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, defaultUrl)).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);
-
   }
 
   @Test
@@ -146,10 +127,9 @@
     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.getStoreUrl()).isEqualTo(defaultUrl);
     assertThat(config.getUrlOptions()).isEmpty();
     assertThat(config.getStoreUsername()).isNull();
     assertThat(config.getStorePassword()).isNull();
@@ -167,12 +147,10 @@
     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
index cfb1cce..d87832a 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsLogIT.java
@@ -17,11 +17,16 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.gerrit.acceptance.GerritConfig;
-import com.google.gerrit.acceptance.PluginDaemonTest;
-
+import com.google.gerrit.acceptance.LightweightPluginDaemonTest;
+import com.google.gerrit.acceptance.TestPlugin;
 import org.junit.Test;
 
-public class EventsLogIT extends PluginDaemonTest {
+@TestPlugin(
+  name = "events-log",
+  sysModule = "com.ericsson.gerrit.plugins.eventslog.sql.SQLModule",
+  httpModule = "com.ericsson.gerrit.plugins.eventslog.HttpModule"
+)
+public class EventsLogIT extends LightweightPluginDaemonTest {
 
   @Test
   @GerritConfig(name = "plugin.events-log.storeUrl", value = "jdbc:h2:mem:db")
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 bcccd07..917d9d8 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServletTest.java
@@ -23,7 +23,12 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.gerrit.server.CurrentUser;
 import com.google.inject.Provider;
-
+import java.io.PrintWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -32,39 +37,23 @@
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
 @RunWith(MockitoJUnitRunner.class)
 public class EventsRestApiServletTest {
   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;
+  @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;
 
   @Before
   public void setUp() {
-    eventServlet =
-        new EventsRestApiServlet(storeMock, queryMakerMock, userProviderMock);
+    eventServlet = new EventsRestApiServlet(storeMock, queryMakerMock, userProviderMock);
 
     when(userProviderMock.get()).thenReturn(userMock);
     when(userMock.isIdentifiedUser()).thenReturn(true);
@@ -73,22 +62,17 @@
   @Test
   public void queryStringSplitting() throws Exception {
     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>());
+    when(queryMakerMock.formQueryFromRequestParameters(captor.capture())).thenReturn(RANDOM_QUERY);
+    when(storeMock.queryChangeEvents(RANDOM_QUERY)).thenReturn(new ArrayList<>());
     eventServlet.doGet(reqMock, rspMock);
-    assertThat(ImmutableMap.of("a", "1", "b", "2"))
-        .isEqualTo(captor.getValue());
+    assertThat(ImmutableMap.of("a", "1", "b", "2")).isEqualTo(captor.getValue());
   }
 
   @Test
   public void badQueryString() throws Exception {
     when(reqMock.getQueryString()).thenReturn("a;b");
-    when(queryMakerMock.formQueryFromRequestParameters(captor.capture()))
-        .thenReturn(RANDOM_QUERY);
-    when(storeMock.queryChangeEvents(RANDOM_QUERY))
-        .thenReturn(new ArrayList<String>());
+    when(queryMakerMock.formQueryFromRequestParameters(captor.capture())).thenReturn(RANDOM_QUERY);
+    when(storeMock.queryChangeEvents(RANDOM_QUERY)).thenReturn(new ArrayList<>());
     eventServlet.doGet(reqMock, rspMock);
     assertThat(captor.getValue()).isEmpty();
   }
@@ -116,8 +100,7 @@
     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(queryMakerMock.formQueryFromRequestParameters(captor.capture())).thenReturn(RANDOM_QUERY);
     when(storeMock.queryChangeEvents(RANDOM_QUERY)).thenReturn(listMock);
     eventServlet.doGet(reqMock, rspMock);
     verify(outMock).write(listMock.get(0) + "\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 c7ec5d3..cd2a61d 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
@@ -17,12 +17,10 @@
 import static com.google.common.truth.Truth.assertThat;
 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.google.common.collect.ImmutableMap;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -39,8 +37,7 @@
   private QueryMaker queryMaker;
   private String defaultQuery;
 
-  @Mock
-  private EventsLogConfig cfgMock;
+  @Mock private EventsLogConfig cfgMock;
 
   private String query;
 
@@ -53,60 +50,51 @@
 
   @Test
   public void returnDefaultQueryforNullMap() throws Exception {
-    assertThat(queryMaker.formQueryFromRequestParameters(null))
-        .isEqualTo(defaultQuery);
+    assertThat(queryMaker.formQueryFromRequestParameters(null)).isEqualTo(defaultQuery);
   }
 
   @Test(expected = MalformedQueryException.class)
   public void badParameters() throws Exception {
-    queryMaker.formQueryFromRequestParameters(
-        ImmutableMap.of(T1, "13/13/32", T2, "14/10/10"));
+    queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, "13/13/32", T2, "14/10/10"));
   }
 
   @Test
   public void dateOneOnly() throws Exception {
-    query = queryMaker
-        .formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE));
+    query = queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE));
     assertThat(query).contains(String.format("'%s' and ", OLD_DATE));
   }
 
   @Test
   public void dateTwoOnly() throws Exception {
-    query = queryMaker
-        .formQueryFromRequestParameters(ImmutableMap.of(T2, OLD_DATE));
+    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 {
-    queryMaker
-        .formQueryFromRequestParameters(ImmutableMap.<String, String> of());
+    queryMaker.formQueryFromRequestParameters(ImmutableMap.of());
   }
 
   @Test
   public void dateOrdering() throws Exception {
-    query = queryMaker.formQueryFromRequestParameters(
-        ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
-    assertThat(query)
-        .contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
+    query = queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
+    assertThat(query).contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
 
-    query = queryMaker.formQueryFromRequestParameters(
-        ImmutableMap.of(T1, NEW_DATE, T2, OLD_DATE));
-    assertThat(query)
-        .contains(String.format("'%s' and '%s'", OLD_DATE, NEW_DATE));
+    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 {
-    query = queryMaker.formQueryFromRequestParameters(
-        ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
+    query = queryMaker.formQueryFromRequestParameters(ImmutableMap.of(T1, OLD_DATE, T2, NEW_DATE));
     assertThat(query).isNotEqualTo(defaultQuery);
   }
 
   @Test
   public void onlyDateNoTime() throws Exception {
-    String query = queryMaker.formQueryFromRequestParameters(
-        ImmutableMap.of(T1, "2013-10-10", T2, "2014-10-10"));
+    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/SQLEntryTest.java b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
index eee066b..3fd3217 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/eventslog/sql/SQLEntryTest.java
@@ -16,11 +16,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
-import org.junit.Before;
-import org.junit.Test;
-
 import java.sql.Timestamp;
 import java.util.Calendar;
+import org.junit.Before;
+import org.junit.Test;
 
 public class SQLEntryTest {
 
@@ -67,11 +66,11 @@
     assertThat(entry2.compareTo(entry1)).isEqualTo(-1);
   }
 
+  @SuppressWarnings("unlikely-arg-type")
   @Test
   public void testEquals() throws Exception {
     assertThat(entry1.equals(null)).isFalse();
     assertThat(entry1.equals("String object")).isFalse();
-    assertThat(entry1.equals(entry1)).isTrue();
     assertThat(entry1.equals(entry2)).isFalse();
     assertThat(entry1.equals(entry4)).isTrue();
   }
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 4b674d5..7f3c81c 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
@@ -23,6 +23,9 @@
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
+import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
+import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
+import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.Project.NameKey;
@@ -32,21 +35,6 @@
 import com.google.gerrit.server.project.ProjectControl;
 import com.google.gson.Gson;
 import com.google.inject.Provider;
-
-import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
-import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
-import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
-
-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;
-
 import java.io.IOException;
 import java.net.ConnectException;
 import java.sql.Connection;
@@ -59,6 +47,15 @@
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+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;
 
 @RunWith(MockitoJUnitRunner.class)
 public class SQLStoreTest {
@@ -66,20 +63,16 @@
   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_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;
 
-  @Mock
-  private ProjectControl.GenericFactory pcFactoryMock;
-  @Mock
-  private Provider<CurrentUser> userProviderMock;
-  @Mock
-  private EventsLogConfig cfgMock;
+  @Mock private ProjectControl.GenericFactory pcFactoryMock;
+  @Mock private Provider<CurrentUser> userProviderMock;
+  @Mock private EventsLogConfig cfgMock;
   private SQLClient eventsDb;
   private SQLClient localEventsDb;
   private SQLStore store;
@@ -87,20 +80,18 @@
 
   private Statement stat;
 
-  @Rule
-  public TemporaryFolder testFolder = new TemporaryFolder();
+  @Rule public TemporaryFolder testFolder = new TemporaryFolder();
 
   @Before
   public void setUp() throws SQLException {
-    Connection conn =
-        DriverManager.getConnection(TEST_URL + ";" + TEST_OPTIONS);
+    Connection conn = DriverManager.getConnection(TEST_URL + ";" + TEST_OPTIONS);
     stat = conn.createStatement();
     poolMock = new PoolMock();
     when(cfgMock.getMaxAge()).thenReturn(5);
     when(cfgMock.getLocalStorePath()).thenReturn(testFolder.getRoot().toPath());
   }
 
-  public void tearDown() throws Exception {
+  private void tearDown() throws Exception {
     stat.execute("DROP TABLE " + TABLE_NAME);
     store.stop();
   }
@@ -108,8 +99,8 @@
   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();
   }
 
@@ -125,7 +116,7 @@
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
     String json = new Gson().toJson(mockEvent);
-    assertThat(events).containsExactly(json);
+    assertThat(events).containsExactly(json).inOrder();
     tearDown();
   }
 
@@ -138,14 +129,12 @@
     tearDown();
   }
 
-  private MockEvent setUpMocks(boolean isVisible)
-      throws NoSuchProjectException, IOException {
+  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(pcFactoryMock.controlFor(mockEvent.getProjectNameKey(), userMock)).thenReturn(pcMock);
     when(pcMock.isVisible()).thenReturn(isVisible);
     setUpClient();
     return mockEvent;
@@ -165,7 +154,8 @@
     CurrentUser userMock = mock(CurrentUser.class);
     when(userProviderMock.get()).thenReturn(userMock);
     NameKey projectNameKey = mockEvent.getProjectNameKey();
-    doThrow(new NoSuchProjectException(projectMock)).when(pcFactoryMock)
+    doThrow(new NoSuchProjectException(projectMock))
+        .when(pcFactoryMock)
         .controlFor(projectNameKey, userMock);
     setUpClient();
     store.storeEvent(mockEvent);
@@ -180,8 +170,7 @@
     CurrentUser userMock = mock(CurrentUser.class);
     when(userProviderMock.get()).thenReturn(userMock);
     NameKey projectNameKey = mockEvent.getProjectNameKey();
-    doThrow(new IOException()).when(pcFactoryMock).controlFor(projectNameKey,
-        userMock);
+    doThrow(new IOException()).when(pcFactoryMock).controlFor(projectNameKey, userMock);
     setUpClient();
     store.storeEvent(mockEvent);
     List<String> events = store.queryChangeEvents(GENERIC_QUERY);
@@ -198,8 +187,8 @@
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store =
+        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(eventsDb, times(3)).storeEvent(mockEvent);
@@ -215,8 +204,8 @@
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store =
+        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(eventsDb, times(3)).storeEvent(mockEvent);
@@ -229,8 +218,8 @@
     when(cfgMock.getMaxTries()).thenReturn(3);
     setUpClientMock();
     doThrow(new SQLException(MSG)).when(eventsDb).storeEvent(mockEvent);
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store =
+        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(eventsDb, times(1)).storeEvent(mockEvent);
@@ -245,8 +234,8 @@
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store =
+        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(eventsDb, times(1)).storeEvent(mockEvent);
@@ -256,11 +245,10 @@
   public void throwSQLExceptionIfNotOnline() throws Exception {
     MockEvent mockEvent = new MockEvent();
     setUpClientMock();
-    doThrow(new SQLException(new ConnectException())).when(eventsDb)
-        .createDBIfNotCreated();
+    doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store =
+        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
     store.start();
     store.storeEvent(mockEvent);
     store.queryChangeEvents(GENERIC_QUERY);
@@ -276,18 +264,15 @@
     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(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);
+    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);
@@ -298,18 +283,17 @@
     Gson gson = new Gson();
     String json = gson.toJson(mockEvent);
     String json2 = gson.toJson(mockEvent2);
-    assertThat(events).containsExactly(json, json2);
+    assertThat(events).containsExactly(json, json2).inOrder();
     tearDown();
   }
 
   @Test
   public void offlineUponStart() throws Exception {
     setUpClientMock();
-    doThrow(new SQLException(new ConnectException())).when(eventsDb)
-        .createDBIfNotCreated();
+    doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store =
+        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
     store.start();
     verify(localEventsDb).createDBIfNotCreated();
   }
@@ -318,11 +302,10 @@
   public void storeLocalOffline() throws Exception {
     MockEvent mockEvent = new MockEvent();
     setUpClientMock();
-    doThrow(new SQLException(new ConnectException())).when(eventsDb)
-        .createDBIfNotCreated();
+    doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store =
+        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(localEventsDb).storeEvent(mockEvent);
@@ -333,34 +316,30 @@
     MockEvent mockEvent = new MockEvent();
     setUpClientMock();
     when(cfgMock.getMaxTries()).thenReturn(0);
-    doThrow(new SQLException(new ConnectException())).when(eventsDb)
-        .createDBIfNotCreated();
+    doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
-    store = new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb,
-        localEventsDb, poolMock);
+    store =
+        new SQLStore(pcFactoryMock, userProviderMock, cfgMock, eventsDb, localEventsDb, poolMock);
     store.start();
     store.storeEvent(mockEvent);
     verify(localEventsDb).storeEvent(mockEvent);
   }
 
   /**
-   * For this test we expect that if we can connect to main database, then we
-   * should come back online and try setting up again. We just want to make sure
-   * that restoreEventsFromLocal gets called, so verifying that getLocalDBFile
-   * is called is sufficient.
+   * For this test we expect that if we can connect to main database, then we should come back
+   * online and try setting up again. We just want to make sure that restoreEventsFromLocal gets
+   * called, so verifying that getLocalDBFile is called is sufficient.
    */
   @Test
   public void testConnectionTask() throws Exception {
     eventsDb = new SQLClient(TEST_DRIVER, TEST_URL, TEST_OPTIONS);
     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);
+    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);
+    poolMock.scheduleWithFixedDelay(store.new CheckConnectionTask(), 0, 0, TimeUnit.MILLISECONDS);
     verify(localEventsDb, times(2)).removeOldEvents(0);
   }
 
@@ -380,19 +359,20 @@
     localEventsDb = new SQLClient(TEST_DRIVER, TEST_LOCAL_URL, TEST_OPTIONS);
     localEventsDb.createDBIfNotCreated();
     localEventsDb.storeEvent(mockEvent);
-    doThrow(new SQLException(new ConnectException())).doNothing().when(eventsDb)
+    doThrow(new SQLException(new ConnectException()))
+        .doNothing()
+        .when(eventsDb)
         .createDBIfNotCreated();
 
     if (copy) {
       when(cfgMock.getCopyLocal()).thenReturn(true);
     }
 
-    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));
+    verify(eventsDb).storeEvent(any(String.class), any(Timestamp.class), any(String.class));
     List<SQLEntry> entries = localEventsDb.getAll();
     assertThat(entries).isEmpty();
   }
@@ -421,8 +401,8 @@
     }
 
     @Override
-    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command,
-        long initialDelay, long delay, TimeUnit unit) {
+    public ScheduledFuture<?> scheduleWithFixedDelay(
+        Runnable command, long initialDelay, long delay, TimeUnit unit) {
       log.info(command.toString());
       command.run();
       return null;
diff --git a/tools/bazel.rc b/tools/bazel.rc
new file mode 100644
index 0000000..4ed16cf
--- /dev/null
+++ b/tools/bazel.rc
@@ -0,0 +1,2 @@
+build --workspace_status_command=./tools/workspace-status.sh
+test --build_tests_only
diff --git a/tools/bzl/BUILD b/tools/bzl/BUILD
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/tools/bzl/BUILD
diff --git a/tools/bzl/classpath.bzl b/tools/bzl/classpath.bzl
new file mode 100644
index 0000000..d5764f7
--- /dev/null
+++ b/tools/bzl/classpath.bzl
@@ -0,0 +1,4 @@
+load(
+    "@com_googlesource_gerrit_bazlets//tools:classpath.bzl",
+    "classpath_collector",
+)
diff --git a/tools/bzl/junit.bzl b/tools/bzl/junit.bzl
new file mode 100644
index 0000000..3af7e58
--- /dev/null
+++ b/tools/bzl/junit.bzl
@@ -0,0 +1,4 @@
+load(
+    "@com_googlesource_gerrit_bazlets//tools:junit.bzl",
+    "junit_tests",
+)
diff --git a/tools/bzl/maven_jar.bzl b/tools/bzl/maven_jar.bzl
new file mode 100644
index 0000000..2eabedb
--- /dev/null
+++ b/tools/bzl/maven_jar.bzl
@@ -0,0 +1 @@
+load("@com_googlesource_gerrit_bazlets//tools:maven_jar.bzl", "maven_jar")
diff --git a/tools/bzl/plugin.bzl b/tools/bzl/plugin.bzl
new file mode 100644
index 0000000..a2e438f
--- /dev/null
+++ b/tools/bzl/plugin.bzl
@@ -0,0 +1,6 @@
+load(
+    "@com_googlesource_gerrit_bazlets//:gerrit_plugin.bzl",
+    "gerrit_plugin",
+    "PLUGIN_DEPS",
+    "PLUGIN_TEST_DEPS",
+)
diff --git a/tools/eclipse/BUILD b/tools/eclipse/BUILD
new file mode 100644
index 0000000..c2fa474
--- /dev/null
+++ b/tools/eclipse/BUILD
@@ -0,0 +1,9 @@
+load("//tools/bzl:classpath.bzl", "classpath_collector")
+
+classpath_collector(
+    name = "main_classpath_collect",
+    testonly = 1,
+    deps = [
+        "//:events-log__plugin_test_deps",
+    ],
+)
diff --git a/tools/eclipse/project.sh b/tools/eclipse/project.sh
new file mode 100755
index 0000000..d8a854d
--- /dev/null
+++ b/tools/eclipse/project.sh
@@ -0,0 +1,19 @@
+#!/bin/bash
+#Copyright (C) 2017 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.
+
+`bazel query @com_googlesource_gerrit_bazlets//tools/eclipse:project --output location | sed s/BUILD:.*//`project.py -n events-log -r .
+
+
diff --git a/tools/sonar/sonar.sh b/tools/sonar/sonar.sh
new file mode 100755
index 0000000..39df185
--- /dev/null
+++ b/tools/sonar/sonar.sh
@@ -0,0 +1,15 @@
+#!/bin/bash
+# Copyright (C) 2018 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.
+`bazel query @com_googlesource_gerrit_bazlets//tools/sonar:sonar --output location | sed s/BUILD:.*//`sonar.py
diff --git a/tools/workspace-status.sh b/tools/workspace-status.sh
new file mode 100755
index 0000000..4e63364
--- /dev/null
+++ b/tools/workspace-status.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+#This script will be run by bazel when the build process starts to
+# generate key-value information that represents the status of the
+# workspace. The output should be like
+#
+# KEY1 VALUE1
+# KEY2 VALUE2
+#
+# If the script exits with non-zero code, it's considered as a failure
+# and the output will be discarded.
+
+function rev() {
+  cd $1; git describe --always --match "v[0-9].*" --dirty
+}
+
+echo STABLE_BUILD_EVENTS-LOG_LABEL $(rev .)