diff --git a/.gitignore b/.gitignore
index f3a0d53..a832ec3 100644
--- a/.gitignore
+++ b/.gitignore
@@ -3,3 +3,4 @@
 /.settings
 /bazel-*
 /eclipse-out
+/.apt_generated/
diff --git a/WORKSPACE b/WORKSPACE
index f07c98f..175e61d 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -3,24 +3,24 @@
 load("//:bazlets.bzl", "load_bazlets")
 
 load_bazlets(
-    commit = "f4a0de709185c5447fed6fdce124dc5d33065ca1",
+    commit = "d826d85285bb22d3fe817fe165a7e1d3472f65fa",
     #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",
+    "@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()
+#gerrit_api()
diff --git a/src/main/java/com/ericsson/gerrit/plugins/goimport/GoImportFilter.java b/src/main/java/com/ericsson/gerrit/plugins/goimport/GoImportFilter.java
index 3675d92..f1cf9d7 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/goimport/GoImportFilter.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/goimport/GoImportFilter.java
@@ -17,7 +17,7 @@
 import com.google.common.base.Strings;
 import com.google.gerrit.httpd.AllRequestFilter;
 import com.google.gerrit.httpd.HtmlDomUtil;
-import com.google.gerrit.reviewdb.client.Branch;
+import com.google.gerrit.reviewdb.client.BranchNameKey;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.AnonymousUser;
@@ -173,14 +173,13 @@
 
   private boolean allowsAnonymousAccess(String projectName) {
     AnonymousUser anonymous = anonProvider.get();
-    Branch.NameKey heads =
-        new Branch.NameKey(new Project.NameKey(projectName), RefNames.REFS_HEADS);
+    BranchNameKey heads = BranchNameKey.create(Project.nameKey(projectName), RefNames.REFS_HEADS);
 
     return permissions.user(anonymous).ref(heads).testOrFalse(RefPermission.READ);
   }
 
   private boolean projectExists(String projectName) {
-    ProjectState p = projectCache.get(new Project.NameKey(projectName));
+    ProjectState p = projectCache.get(Project.nameKey(projectName));
     return p != null;
   }
 }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/goimport/GoImportFilterTest.java b/src/test/java/com/ericsson/gerrit/plugins/goimport/GoImportFilterTest.java
index 3b24f18..713e71b 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/goimport/GoImportFilterTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/goimport/GoImportFilterTest.java
@@ -15,7 +15,7 @@
 package com.ericsson.gerrit.plugins.goimport;
 
 import static com.google.common.truth.Truth.assertThat;
-import static org.junit.Assert.fail;
+import static com.google.gerrit.testing.GerritJUnit.assertThrows;
 import static org.mockito.Mockito.any;
 import static org.mockito.Mockito.doThrow;
 import static org.mockito.Mockito.times;
@@ -138,7 +138,7 @@
   public void testDoFilterWithExistingProject() throws Exception {
     when(mockRequest.getServletPath()).thenReturn("/projectName");
     when(mockRequest.getParameter("go-get")).thenReturn("1");
-    when(mockProjectCache.get(new Project.NameKey("projectName"))).thenReturn(mockProjectState);
+    when(mockProjectCache.get(Project.nameKey("projectName"))).thenReturn(mockProjectState);
     when(mockPermsForRef.testOrFalse(RefPermission.READ)).thenReturn(false);
     unitUnderTest.doFilter(mockRequest, mockResponse, mockChain);
     verify(mockOutputStream, times(1)).write(PAGE_200_AUTH.getBytes());
@@ -152,7 +152,7 @@
   public void testDoFilterWithExistingProjectAndPackage() throws Exception {
     when(mockRequest.getServletPath()).thenReturn("/projectName/my/package");
     when(mockRequest.getParameter("go-get")).thenReturn("1");
-    when(mockProjectCache.get(new Project.NameKey("projectName"))).thenReturn(mockProjectState);
+    when(mockProjectCache.get(Project.nameKey("projectName"))).thenReturn(mockProjectState);
     when(mockPermsForRef.testOrFalse(RefPermission.READ)).thenReturn(false);
     unitUnderTest.doFilter(mockRequest, mockResponse, mockChain);
     verify(mockOutputStream, times(1)).write(PAGE_200_AUTH.getBytes());
@@ -166,7 +166,7 @@
   public void testDoFilterWithAnonymousAccessibleProject() throws Exception {
     when(mockRequest.getServletPath()).thenReturn("/projectName");
     when(mockRequest.getParameter("go-get")).thenReturn("1");
-    when(mockProjectCache.get(new Project.NameKey("projectName"))).thenReturn(mockProjectState);
+    when(mockProjectCache.get(Project.nameKey("projectName"))).thenReturn(mockProjectState);
     when(mockPermsForRef.testOrFalse(RefPermission.READ)).thenReturn(true);
     unitUnderTest.doFilter(mockRequest, mockResponse, mockChain);
     verify(mockOutputStream, times(1)).write(PAGE_200_ANON.getBytes());
@@ -195,25 +195,20 @@
     when(mockRequest.getParameter("go-get")).thenReturn("1");
     doThrow(new IOException(msg)).when(mockOutputStream).write(any(byte[].class));
     when(mockProjectCache.get(any(Project.NameKey.class))).thenReturn(mockProjectState);
-    try {
-      unitUnderTest.doFilter(mockRequest, mockResponse, mockChain);
-      fail("IOException should occur!");
-    } catch (IOException e) {
-      assertThat(msg).isEqualTo(e.getMessage());
-      verify(mockOutputStream, times(1)).write(any(byte[].class));
-    }
+    IOException thrown =
+        assertThrows(
+            IOException.class, () -> unitUnderTest.doFilter(mockRequest, mockResponse, mockChain));
+    assertThat(thrown).hasMessageThat().isEqualTo(msg);
+    verify(mockOutputStream, times(1)).write(any(byte[].class));
   }
 
   @Test
   public void testDoFilterWithServletException() throws Exception {
     String msg = "test-serv-error";
     doThrow(new ServletException(msg)).when(mockChain).doFilter(null, null);
-    try {
-      unitUnderTest.doFilter(null, null, mockChain);
-      fail("ServletException should occur!");
-    } catch (ServletException e) {
-      assertThat(msg).isEqualTo(e.getMessage());
-      verify(mockChain, times(1)).doFilter(null, null);
-    }
+    ServletException thrown =
+        assertThrows(ServletException.class, () -> unitUnderTest.doFilter(null, null, mockChain));
+    assertThat(thrown).hasMessageThat().isEqualTo(msg);
+    verify(mockChain, times(1)).doFilter(null, null);
   }
 }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/goimport/HttpModuleTest.java b/src/test/java/com/ericsson/gerrit/plugins/goimport/HttpModuleTest.java
index a0a107d..021c154 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/goimport/HttpModuleTest.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/goimport/HttpModuleTest.java
@@ -51,7 +51,7 @@
     GoImportFilter filter1 = injector.getInstance(GoImportFilter.class);
     assertThat(filter1).isNotNull();
     GoImportFilter filter2 = injector.getInstance(GoImportFilter.class);
-    assertThat(filter1).isSameAs(filter2);
+    assertThat(filter1).isSameInstanceAs(filter2);
   }
 
   public class TestModule extends AbstractModule {
