diff --git a/WORKSPACE b/WORKSPACE
index 4b33be3..9adceb4 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,7 +3,7 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "ec949feac1b9dae6cc2c8c25d254f34924c54296",
+    commit = "e1360b49f90930e280f6a43380ab533705c85446",
     #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 ba38c4e..1717570 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,18 +22,17 @@
 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.annotations.PluginName;
 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;
@@ -47,15 +46,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;
@@ -73,7 +69,6 @@
 
   @Inject
   SQLStore(
-      Provider<CurrentUser> userProvider,
       EventsLogConfig cfg,
       @EventsDb SQLClient eventsDb,
       @LocalEventsDb SQLClient localEventsDb,
@@ -86,7 +81,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;
@@ -125,14 +119,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());
@@ -156,14 +150,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;
           }
@@ -175,10 +169,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);
     }
   }
@@ -187,10 +181,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) {
@@ -227,14 +220,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);
@@ -244,7 +237,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");
     }
   }
 
@@ -259,7 +252,7 @@
     public void run() {
       if (checkConnection()) {
         setOnline(true);
-        log.info("Connected to database");
+        log.atInfo().log("Connected to database");
       }
     }
 
@@ -269,12 +262,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;
       }
     }
@@ -285,7 +278,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;
   }
@@ -301,7 +295,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 e759637..89448e4 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";
@@ -71,7 +68,6 @@
   private static final String GENERIC_QUERY = "SELECT * FROM " + TABLE_NAME;
   private static final String PLUGIN_NAME = "events-log";
 
-  @Mock private Provider<CurrentUser> userProviderMock;
   @Mock private EventsLogConfig cfgMock;
   @Mock private PermissionBackend permissionBackendMock;
   @Mock private PermissionBackend.ForProject forProjectMock;
@@ -111,7 +107,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();
@@ -123,7 +119,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)
@@ -143,7 +139,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)
@@ -164,7 +160,6 @@
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -187,9 +182,9 @@
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -209,9 +204,9 @@
     when(cfgMock.getMaxTries()).thenReturn(3);
     setUpClientMock();
     doThrow(new SQLException(MSG)).when(eventsDb).storeEvent(mockEvent);
+
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -233,9 +228,9 @@
     setUpClientMock();
     doThrow(exceptions).doNothing().when(eventsDb).storeEvent(mockEvent);
     doThrow(exceptions).doNothing().when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -254,9 +249,9 @@
     setUpClientMock();
     doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -274,7 +269,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);
 
@@ -284,7 +280,6 @@
     localEventsDb = new SQLClient(config);
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -302,6 +297,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();
   }
 
@@ -310,9 +308,9 @@
     setUpClientMock();
     doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -330,9 +328,9 @@
     setUpClientMock();
     doThrow(new SQLException(new ConnectException())).when(eventsDb).createDBIfNotCreated();
     doThrow(new SQLException()).when(eventsDb).queryOne();
+
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -352,9 +350,9 @@
     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,
@@ -369,11 +367,11 @@
   }
 
   private void setUpClient() {
+
     eventsDb = new SQLClient(config);
     localEventsDb = new SQLClient(config);
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -381,6 +379,7 @@
             permissionBackendMock,
             logCleanerMock,
             PLUGIN_NAME);
+
     store.start();
   }
 
@@ -402,9 +401,9 @@
     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,
@@ -446,7 +445,6 @@
 
     store =
         new SQLStore(
-            userProviderMock,
             cfgMock,
             eventsDb,
             localEventsDb,
@@ -488,7 +486,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;
     }
