diff --git a/WORKSPACE b/WORKSPACE
index 6ff88c5..081393f 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "ae1cd231b0262b2738e6c0593eb3c504209ad4f5",
+    commit = "ec989bb514e39447764057c60d3f9959bff8e153",
     #local_path = "/home/<user>/projects/bazlets",
 )
 
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 15f830a..6a020c5 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventHandler.java
@@ -14,8 +14,8 @@
 
 package com.ericsson.gerrit.plugins.eventslog;
 
-import com.google.gerrit.common.EventListener;
 import com.google.gerrit.server.events.Event;
+import com.google.gerrit.server.events.EventListener;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.inject.Inject;
 import java.util.concurrent.ScheduledExecutorService;
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 b888425..3f905c7 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventModule.java
@@ -15,10 +15,10 @@
 package com.ericsson.gerrit.plugins.eventslog;
 
 import com.ericsson.gerrit.plugins.eventslog.sql.EventsLogCleaner;
-import com.google.gerrit.common.EventListener;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.extensions.events.ProjectDeletedListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.server.events.EventListener;
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 import com.google.inject.Scopes;
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 f05e33d..c04d6ac 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/eventslog/EventsRestApiServlet.java
@@ -14,6 +14,7 @@
 
 package com.ericsson.gerrit.plugins.eventslog;
 
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.restapi.Url;
 import com.google.gerrit.server.CurrentUser;
 import com.google.inject.Inject;
@@ -27,12 +28,10 @@
 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 FluentLogger log = FluentLogger.forEnclosingClass();
   private static final long serialVersionUID = 1L;
 
   private final EventStore store;
@@ -63,13 +62,13 @@
         out.write(event + "\n");
       }
     } catch (MalformedQueryException e) {
-      log.error("Bad Request", e);
+      log.atSevere().withCause(e).log("Bad Request");
       rsp.sendError(HttpServletResponse.SC_BAD_REQUEST);
     } catch (ServiceUnavailableException e) {
-      log.error("Service Unavailable", e);
+      log.atSevere().withCause(e).log("Service Unavailable");
       rsp.sendError(HttpServletResponse.SC_SERVICE_UNAVAILABLE);
     } catch (EventsLogException e) {
-      log.error("Could not query from request parameters", e);
+      log.atSevere().withCause(e).log("Could not query from request parameters");
     }
   }
 
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 9e538e6..b554ecd 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
@@ -29,6 +29,7 @@
 import com.google.common.base.Supplier;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ListMultimap;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.gerrit.server.events.SupplierSerializer;
 import com.google.gson.Gson;
@@ -42,11 +43,9 @@
 import java.sql.Timestamp;
 import java.util.ArrayList;
 import java.util.List;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 class SQLClient {
-  private static final Logger log = LoggerFactory.getLogger(SQLClient.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
   private final Gson gson;
   private final SQLDialect databaseDialect;
 
@@ -144,9 +143,11 @@
               TABLE_NAME,
               DATE_ENTRY,
               new Timestamp(System.currentTimeMillis() - MILLISECONDS.convert(maxAge, DAYS))));
-      log.info("Events older than {} days were removed from database {}", maxAge, ds.getPoolName());
+      log.atInfo().log(
+          "Events older than %d days were removed from database %s", maxAge, ds.getPoolName());
     } catch (SQLException e) {
-      log.warn("Cannot remove old event entries from database {}", ds.getPoolName(), e);
+      log.atWarning().withCause(e).log(
+          "Cannot remove old event entries from database %s", ds.getPoolName());
     }
   }
 
@@ -159,7 +160,7 @@
     try {
       execute(format("DELETE FROM %s WHERE project = '%s'", TABLE_NAME, project));
     } catch (SQLException e) {
-      log.warn("Cannot remove project {} events from database", project, e);
+      log.atWarning().withCause(e).log("Cannot remove project %s events from database", project);
     }
   }
 
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 8a06904..6289c2d 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
@@ -22,17 +22,16 @@
 import com.ericsson.gerrit.plugins.eventslog.EventsLogConfig;
 import com.ericsson.gerrit.plugins.eventslog.EventsLogException;
 import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
-import com.google.gerrit.common.TimeUtil;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.events.LifecycleListener;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.permissions.ProjectPermission;
+import com.google.gerrit.server.util.time.TimeUtil;
 import com.google.inject.Inject;
-import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import java.io.IOException;
 import java.net.ConnectException;
@@ -46,15 +45,12 @@
 import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 @Singleton
 class SQLStore implements EventStore, LifecycleListener {
-  private static final Logger log = LoggerFactory.getLogger(SQLStore.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
   private static final String H2_DB_SUFFIX = ".h2.db";
 
-  private final Provider<CurrentUser> userProvider;
   private final EventsLogCleaner eventsLogCleaner;
   private SQLClient eventsDb;
   private SQLClient localEventsDb;
@@ -71,7 +67,6 @@
 
   @Inject
   SQLStore(
-      Provider<CurrentUser> userProvider,
       EventsLogConfig cfg,
       @EventsDb SQLClient eventsDb,
       @LocalEventsDb SQLClient localEventsDb,
@@ -83,7 +78,6 @@
     this.waitTime = cfg.getWaitTime();
     this.connectTime = cfg.getConnectTime();
     this.copyLocal = cfg.getCopyLocal();
-    this.userProvider = userProvider;
     this.eventsDb = eventsDb;
     this.localEventsDb = localEventsDb;
     this.eventsLogCleaner = eventsLogCleaner;
@@ -121,14 +115,14 @@
       String projectName = entry.getKey();
       try {
         permissionBackend
-            .user(userProvider)
+            .currentUser()
             .project(new Project.NameKey(projectName))
             .check(ProjectPermission.ACCESS);
         entries.addAll(entry.getValue());
       } catch (AuthException e) {
         // Ignore
       } catch (PermissionBackendException e) {
-        log.warn("Cannot check project access permission", e);
+        log.atWarning().withCause(e).log("Cannot check project access permission");
       }
     }
     return entries.stream().sorted().map(SQLEntry::getEvent).collect(toList());
@@ -152,14 +146,14 @@
       try {
         getEventsDb().storeEvent(event);
       } catch (SQLException e) {
-        log.warn("Cannot store ChangeEvent for: {}", projectName.get(), e);
+        log.atWarning().withCause(e).log("Cannot store ChangeEvent for: %s}", projectName.get());
         if (e.getCause() instanceof ConnectException
             || e.getMessage().contains("terminating connection")) {
           done = false;
           try {
             retryIfAllowed(failedConnections);
           } catch (InterruptedException e1) {
-            log.warn("Cannot store ChangeEvent for {}: Interrupted", projectName.get());
+            log.atWarning().log("Cannot store ChangeEvent for %s: Interrupted", projectName.get());
             Thread.currentThread().interrupt();
             return;
           }
@@ -171,10 +165,10 @@
 
   private void retryIfAllowed(int failedConnections) throws InterruptedException {
     if (failedConnections < maxTries - 1) {
-      log.info("Retrying store event");
+      log.atInfo().log("Retrying store event");
       Thread.sleep(waitTime);
     } else {
-      log.error("Failed to store event {} times", maxTries);
+      log.atSevere().log("Failed to store event %d times", maxTries);
       setOnline(false);
     }
   }
@@ -183,10 +177,9 @@
     try {
       getEventsDb().createDBIfNotCreated();
     } catch (SQLException e) {
-      log.warn(
+      log.atWarning().withCause(e).log(
           "Cannot start the database. Events will be stored locally"
-              + " until database connection can be established",
-          e);
+              + " until database connection can be established");
       setOnline(false);
     }
     if (online) {
@@ -223,14 +216,14 @@
     try {
       List<SQLEntry> entries = localEventsDb.getAll();
       if (entries.isEmpty()) {
-        log.debug("No events to restore from local");
+        log.atFine().log("No events to restore from local");
         return;
       }
       for (SQLEntry entry : entries) {
         restoreEvent(entry);
       }
     } catch (SQLException e) {
-      log.warn("Could not query all events from local", e);
+      log.atWarning().withCause(e).log("Could not query all events from local");
     }
     copyFile(copyLocal);
     localEventsDb.removeOldEvents(0);
@@ -240,7 +233,7 @@
     try {
       eventsDb.storeEvent(entry.getName(), entry.getTimestamp(), entry.getEvent());
     } catch (SQLException e) {
-      log.warn("Could not restore events from local", e);
+      log.atWarning().withCause(e).log("Could not restore events from local");
     }
   }
 
@@ -251,7 +244,7 @@
     public void run() {
       if (checkConnection()) {
         setOnline(true);
-        log.info("Connected to database");
+        log.atInfo().log("Connected to database");
       }
     }
 
@@ -261,12 +254,12 @@
     }
 
     private boolean checkConnection() {
-      log.debug("Checking database connection...");
+      log.atFine().log("Checking database connection...");
       try {
         eventsDb.queryOne();
         return true;
       } catch (SQLException e) {
-        log.error("Problem checking database connection", e);
+        log.atSevere().withCause(e).log("Problem checking database connection");
         return false;
       }
     }
@@ -277,7 +270,8 @@
     try {
       exists = localEventsDb.dbExists();
     } catch (SQLException e) {
-      log.warn("Could not check existence of local database, assume that it doesn't exist", e);
+      log.atWarning().withCause(e).log(
+          "Could not check existence of local database, assume that it doesn't exist");
     }
     return exists;
   }
@@ -293,7 +287,7 @@
     try {
       Files.copy(file, copyFile);
     } catch (IOException e) {
-      log.warn("Could not copy local database file with timestamp", e);
+      log.atWarning().withCause(e).log("Could not copy local database file with timestamp");
     }
   }
 }
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 96ce35d..68b9801 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
@@ -28,14 +28,13 @@
 import com.ericsson.gerrit.plugins.eventslog.MalformedQueryException;
 import com.ericsson.gerrit.plugins.eventslog.ServiceUnavailableException;
 import com.google.common.collect.ImmutableList;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.CurrentUser;
 import com.google.gerrit.server.events.ProjectEvent;
 import com.google.gerrit.server.permissions.PermissionBackend;
 import com.google.gerrit.server.permissions.PermissionBackendException;
 import com.google.gerrit.server.permissions.ProjectPermission;
 import com.google.gson.Gson;
-import com.google.inject.Provider;
 import com.zaxxer.hikari.HikariConfig;
 import java.net.ConnectException;
 import java.sql.Connection;
@@ -57,12 +56,10 @@
 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 {
-  private static final Logger log = LoggerFactory.getLogger(SQLStoreTest.class);
+  private static final FluentLogger log = FluentLogger.forEnclosingClass();
   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_OPTIONS = "DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=false";
@@ -70,7 +67,6 @@
   private static final String MSG = "message";
   private static final String GENERIC_QUERY = "SELECT * FROM " + TABLE_NAME;
 
-  @Mock private Provider<CurrentUser> userProviderMock;
   @Mock private EventsLogConfig cfgMock;
   @Mock private PermissionBackend permissionBackendMock;
   @Mock private PermissionBackend.ForProject forProjectMock;
@@ -110,7 +106,7 @@
 
   @Test
   public void storeThenQueryVisible() throws Exception {
-    when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+    when(permissionBackendMock.currentUser()).thenReturn(withUserMock);
     when(withUserMock.project(any(Project.NameKey.class))).thenReturn(forProjectMock);
     doNothing().when(forProjectMock).check(ProjectPermission.ACCESS);
     setUpClient();
@@ -122,7 +118,7 @@
 
   @Test
   public void storeThenQueryNotVisible() throws Exception {
-    when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+    when(permissionBackendMock.currentUser()).thenReturn(withUserMock);
     when(withUserMock.project(any(Project.NameKey.class))).thenReturn(forProjectMock);
     doThrow(new PermissionBackendException(""))
         .when(forProjectMock)
@@ -142,7 +138,7 @@
 
   @Test
   public void notReturnEventWithNoVisibilityInfo() throws Exception {
-    when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+    when(permissionBackendMock.currentUser()).thenReturn(withUserMock);
     when(withUserMock.project(any(Project.NameKey.class))).thenReturn(forProjectMock);
     doThrow(new PermissionBackendException(""))
         .when(forProjectMock)
@@ -163,13 +159,7 @@
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     store.storeEvent(mockEvent);
@@ -185,15 +175,10 @@
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     store.storeEvent(mockEvent);
@@ -206,15 +191,10 @@
     when(cfgMock.getMaxTries()).thenReturn(3);
     setUpClientMock();
     doThrow(new SQLException(MSG)).when(eventsDb).storeEvent(mockEvent);
+
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     store.storeEvent(mockEvent);
@@ -229,15 +209,10 @@
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     store.storeEvent(mockEvent);
@@ -249,15 +224,10 @@
     setUpClientMock();
     doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     store.storeEvent(mockEvent);
@@ -268,7 +238,8 @@
   public void restoreEventsFromLocalDb() throws Exception {
     MockEvent mockEvent = new MockEvent();
     MockEvent mockEvent2 = new MockEvent("proj");
-    when(permissionBackendMock.user(userProviderMock)).thenReturn(withUserMock);
+
+    when(permissionBackendMock.currentUser()).thenReturn(withUserMock);
     when(withUserMock.project(any(Project.NameKey.class))).thenReturn(forProjectMock);
     doNothing().when(forProjectMock).check(ProjectPermission.ACCESS);
 
@@ -278,13 +249,7 @@
     localEventsDb = new SQLClient(config);
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     localEventsDb.createDBIfNotCreated();
     localEventsDb.storeEvent(mockEvent);
@@ -295,6 +260,9 @@
     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();
   }
 
@@ -303,15 +271,10 @@
     setUpClientMock();
     doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     verify(localEventsDb).createDBIfNotCreated();
@@ -322,15 +285,10 @@
     setUpClientMock();
     doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     store.storeEvent(mockEvent);
@@ -343,15 +301,10 @@
     when(cfgMock.getMaxTries()).thenReturn(0);
     doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     store.storeEvent(mockEvent);
@@ -359,17 +312,13 @@
   }
 
   private void setUpClient() {
+
     eventsDb = new SQLClient(config);
     localEventsDb = new SQLClient(config);
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
+
     store.start();
   }
 
@@ -391,15 +340,10 @@
     localEventsDb = mock(SQLClient.class);
     when(localEventsDb.dbExists()).thenReturn(true);
     when(localEventsDb.getAll()).thenReturn(ImmutableList.of(mock(SQLEntry.class)));
+
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     poolMock.scheduleWithFixedDelay(store.new CheckConnectionTask(), 0, 0, TimeUnit.MILLISECONDS);
@@ -433,13 +377,7 @@
 
     store =
         new SQLStore(
-            userProviderMock,
-            cfgMock,
-            eventsDb,
-            localEventsDb,
-            poolMock,
-            permissionBackendMock,
-            logCleanerMock);
+            cfgMock, eventsDb, localEventsDb, poolMock, permissionBackendMock, logCleanerMock);
 
     store.start();
     verify(eventsDb).queryOne();
@@ -474,7 +412,7 @@
     @Override
     public ScheduledFuture<?> scheduleWithFixedDelay(
         Runnable command, long initialDelay, long delay, TimeUnit unit) {
-      log.info(command.toString());
+      log.atInfo().log(command.toString());
       command.run();
       return null;
     }
