diff --git a/Jenkinsfile b/Jenkinsfile
index a090baf..deb1d46 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -19,7 +19,7 @@
         stage('build') {
             steps {
                 gerritReview labels: [Verified: 0], message: "Build started: ${env.BUILD_URL}"
-                sh 'mvn test'
+                sh "bash -c '. set-java.sh 11 && mvn test'"
             }
         }
     }
diff --git a/pom.xml b/pom.xml
index 844c33c..c67aee8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
 
     <groupId>com.gerritforge</groupId>
     <artifactId>global-refdb</artifactId>
-    <version>3.2.0-rc0</version>
+    <version>3.3.0-rc1</version>
     <packaging>jar</packaging>
 
     <name>global-refdb</name>
@@ -38,7 +38,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
-        <gerrit.version>3.2.3</gerrit.version>
+        <gerrit.version>3.3.0-rc1</gerrit.version>
     </properties>
 
     <dependencies>
@@ -75,8 +75,8 @@
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>3.6.1</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                    <source>11</source>
+                    <target>11</target>
                 </configuration>
             </plugin>
             <plugin>
@@ -95,7 +95,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-javadoc-plugin</artifactId>
-                <version>3.1.1</version>
+                <version>3.2.0</version>
                 <executions>
                     <execution>
                         <id>attach-javadocs</id>
diff --git a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepository.java b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepository.java
index 8758a14..cdb65da 100644
--- a/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepository.java
+++ b/src/main/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepository.java
@@ -14,48 +14,17 @@
 
 package com.gerritforge.gerrit.globalrefdb.validation;
 
+import com.google.gerrit.server.git.DelegateRepository;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
-import java.io.File;
 import java.io.IOException;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import org.eclipse.jgit.attributes.AttributesNodeProvider;
-import org.eclipse.jgit.dircache.DirCache;
-import org.eclipse.jgit.errors.AmbiguousObjectException;
-import org.eclipse.jgit.errors.CorruptObjectException;
-import org.eclipse.jgit.errors.IncorrectObjectTypeException;
-import org.eclipse.jgit.errors.MissingObjectException;
-import org.eclipse.jgit.errors.NoWorkTreeException;
-import org.eclipse.jgit.errors.RevisionSyntaxException;
-import org.eclipse.jgit.events.ListenerList;
-import org.eclipse.jgit.events.RepositoryEvent;
-import org.eclipse.jgit.lib.AnyObjectId;
-import org.eclipse.jgit.lib.BaseRepositoryBuilder;
-import org.eclipse.jgit.lib.ObjectDatabase;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectInserter;
-import org.eclipse.jgit.lib.ObjectLoader;
-import org.eclipse.jgit.lib.ObjectReader;
-import org.eclipse.jgit.lib.ProgressMonitor;
-import org.eclipse.jgit.lib.RebaseTodoLine;
-import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.RefDatabase;
-import org.eclipse.jgit.lib.RefRename;
 import org.eclipse.jgit.lib.RefUpdate;
-import org.eclipse.jgit.lib.ReflogReader;
 import org.eclipse.jgit.lib.Repository;
-import org.eclipse.jgit.lib.RepositoryState;
-import org.eclipse.jgit.lib.StoredConfig;
-import org.eclipse.jgit.revwalk.RevCommit;
-import org.eclipse.jgit.util.FS;
 
-public class SharedRefDbRepository extends Repository {
+public class SharedRefDbRepository extends DelegateRepository {
 
-  private final Repository repository;
-  private final RefDatabase refDatabase;
-  private final SharedRefDbRefDatabase sharedRefDbRefDatabase;
+  private final SharedRefDbRefDatabase sharedRefDatabase;
 
   public interface Factory {
     public SharedRefDbRepository create(String projectName, Repository repository);
@@ -63,345 +32,25 @@
 
   @Inject
   public SharedRefDbRepository(
-      SharedRefDbRefDatabase.Factory sharedRefDbRefDbFactory,
+      SharedRefDbRefDatabase.Factory refDbFactory,
       @Assisted String projectName,
       @Assisted Repository repository) {
-    super(new BaseRepositoryBuilder());
-    this.repository = repository;
-    this.refDatabase = repository.getRefDatabase();
-    this.sharedRefDbRefDatabase = sharedRefDbRefDbFactory.create(projectName, refDatabase);
-  }
-
-  @Override
-  public void create(boolean b) throws IOException {}
-
-  @Override
-  public ObjectDatabase getObjectDatabase() {
-    return repository.getObjectDatabase();
+    super(repository);
+    this.sharedRefDatabase = refDbFactory.create(projectName, repository.getRefDatabase());
   }
 
   @Override
   public RefDatabase getRefDatabase() {
-    return sharedRefDbRefDatabase;
-  }
-
-  @Override
-  public StoredConfig getConfig() {
-    return repository.getConfig();
-  }
-
-  @Override
-  public AttributesNodeProvider createAttributesNodeProvider() {
-    return repository.createAttributesNodeProvider();
-  }
-
-  @Override
-  public void scanForRepoChanges() throws IOException {
-    repository.scanForRepoChanges();
-  }
-
-  @Override
-  public void notifyIndexChanged(boolean b) {
-    repository.notifyIndexChanged(b);
-  }
-
-  @Override
-  public ReflogReader getReflogReader(String s) throws IOException {
-    return repository.getReflogReader(s);
-  }
-
-  @Override
-  public int hashCode() {
-    return repository.hashCode();
-  }
-
-  @Override
-  public boolean equals(Object obj) {
-    return repository.equals(obj);
-  }
-
-  @Override
-  public ListenerList getListenerList() {
-    return repository.getListenerList();
-  }
-
-  @Override
-  public void fireEvent(RepositoryEvent<?> event) {
-    repository.fireEvent(event);
-  }
-
-  @Override
-  public void create() throws IOException {
-    repository.create();
-  }
-
-  @Override
-  public File getDirectory() {
-    return repository.getDirectory();
-  }
-
-  @Override
-  public ObjectInserter newObjectInserter() {
-    return repository.newObjectInserter();
-  }
-
-  @Override
-  public ObjectReader newObjectReader() {
-    return repository.newObjectReader();
-  }
-
-  @Override
-  public FS getFS() {
-    return repository.getFS();
-  }
-
-  @SuppressWarnings("deprecation")
-  @Override
-  public boolean hasObject(AnyObjectId objectId) {
-    return repository.hasObject(objectId);
-  }
-
-  @Override
-  public ObjectLoader open(AnyObjectId objectId) throws MissingObjectException, IOException {
-    return repository.open(objectId);
-  }
-
-  @Override
-  public ObjectLoader open(AnyObjectId objectId, int typeHint)
-      throws MissingObjectException, IncorrectObjectTypeException, IOException {
-    return repository.open(objectId, typeHint);
+    return sharedRefDatabase;
   }
 
   @Override
   public RefUpdate updateRef(String ref) throws IOException {
-    return sharedRefDbRefDatabase.wrapRefUpdate(repository.updateRef(ref));
+    return sharedRefDatabase.wrapRefUpdate(delegate.updateRef(ref));
   }
 
   @Override
   public RefUpdate updateRef(String ref, boolean detach) throws IOException {
-    return sharedRefDbRefDatabase.wrapRefUpdate(repository.updateRef(ref, detach));
-  }
-
-  @Override
-  public RefRename renameRef(String fromRef, String toRef) throws IOException {
-    return repository.renameRef(fromRef, toRef);
-  }
-
-  @Override
-  public ObjectId resolve(String revstr)
-      throws AmbiguousObjectException, IncorrectObjectTypeException, RevisionSyntaxException,
-          IOException {
-    return repository.resolve(revstr);
-  }
-
-  @Override
-  public String simplify(String revstr) throws AmbiguousObjectException, IOException {
-    return repository.simplify(revstr);
-  }
-
-  @Override
-  public void incrementOpen() {
-    repository.incrementOpen();
-  }
-
-  @Override
-  public void close() {
-    repository.close();
-  }
-
-  @Override
-  public String toString() {
-    return repository.toString();
-  }
-
-  @Override
-  public String getFullBranch() throws IOException {
-    return repository.getFullBranch();
-  }
-
-  @Override
-  public String getBranch() throws IOException {
-    return repository.getBranch();
-  }
-
-  @Override
-  public Set<ObjectId> getAdditionalHaves() {
-    return repository.getAdditionalHaves();
-  }
-
-  @SuppressWarnings("deprecation")
-  @Override
-  public Map<String, Ref> getAllRefs() {
-    return repository.getAllRefs();
-  }
-
-  @SuppressWarnings("deprecation")
-  @Override
-  public Map<String, Ref> getTags() {
-    return repository.getTags();
-  }
-
-  @SuppressWarnings("deprecation")
-  @Override
-  public Ref peel(Ref ref) {
-    return repository.peel(ref);
-  }
-
-  @Override
-  public Map<AnyObjectId, Set<Ref>> getAllRefsByPeeledObjectId() {
-    return repository.getAllRefsByPeeledObjectId();
-  }
-
-  @Override
-  public File getIndexFile() throws NoWorkTreeException {
-    return repository.getIndexFile();
-  }
-
-  @Override
-  public RevCommit parseCommit(AnyObjectId id)
-      throws IncorrectObjectTypeException, IOException, MissingObjectException {
-    return repository.parseCommit(id);
-  }
-
-  @Override
-  public DirCache readDirCache() throws NoWorkTreeException, CorruptObjectException, IOException {
-    return repository.readDirCache();
-  }
-
-  @Override
-  public DirCache lockDirCache() throws NoWorkTreeException, CorruptObjectException, IOException {
-    return repository.lockDirCache();
-  }
-
-  @Override
-  public RepositoryState getRepositoryState() {
-    return repository.getRepositoryState();
-  }
-
-  @Override
-  public boolean isBare() {
-    return repository.isBare();
-  }
-
-  @Override
-  public File getWorkTree() throws NoWorkTreeException {
-    return repository.getWorkTree();
-  }
-
-  @Override
-  public String shortenRemoteBranchName(String refName) {
-    return repository.shortenRemoteBranchName(refName);
-  }
-
-  @Override
-  public String getRemoteName(String refName) {
-    return repository.getRemoteName(refName);
-  }
-
-  @Override
-  public String getGitwebDescription() throws IOException {
-    return repository.getGitwebDescription();
-  }
-
-  @Override
-  public void setGitwebDescription(String description) throws IOException {
-    repository.setGitwebDescription(description);
-  }
-
-  @Override
-  public String readMergeCommitMsg() throws IOException, NoWorkTreeException {
-    return repository.readMergeCommitMsg();
-  }
-
-  @Override
-  public void writeMergeCommitMsg(String msg) throws IOException {
-    repository.writeMergeCommitMsg(msg);
-  }
-
-  @Override
-  public String readCommitEditMsg() throws IOException, NoWorkTreeException {
-    return repository.readCommitEditMsg();
-  }
-
-  @Override
-  public void writeCommitEditMsg(String msg) throws IOException {
-    repository.writeCommitEditMsg(msg);
-  }
-
-  @Override
-  public List<ObjectId> readMergeHeads() throws IOException, NoWorkTreeException {
-    return repository.readMergeHeads();
-  }
-
-  @Override
-  public void writeMergeHeads(List<? extends ObjectId> heads) throws IOException {
-    repository.writeMergeHeads(heads);
-  }
-
-  @Override
-  public ObjectId readCherryPickHead() throws IOException, NoWorkTreeException {
-    return repository.readCherryPickHead();
-  }
-
-  @Override
-  public ObjectId readRevertHead() throws IOException, NoWorkTreeException {
-    return repository.readRevertHead();
-  }
-
-  @Override
-  public void writeCherryPickHead(ObjectId head) throws IOException {
-    repository.writeCherryPickHead(head);
-  }
-
-  @Override
-  public void writeRevertHead(ObjectId head) throws IOException {
-    repository.writeRevertHead(head);
-  }
-
-  @Override
-  public void writeOrigHead(ObjectId head) throws IOException {
-    repository.writeOrigHead(head);
-  }
-
-  @Override
-  public ObjectId readOrigHead() throws IOException, NoWorkTreeException {
-    return repository.readOrigHead();
-  }
-
-  @Override
-  public String readSquashCommitMsg() throws IOException {
-    return repository.readSquashCommitMsg();
-  }
-
-  @Override
-  public void writeSquashCommitMsg(String msg) throws IOException {
-    repository.writeSquashCommitMsg(msg);
-  }
-
-  @Override
-  public List<RebaseTodoLine> readRebaseTodo(String path, boolean includeComments)
-      throws IOException {
-    return repository.readRebaseTodo(path, includeComments);
-  }
-
-  @Override
-  public void writeRebaseTodoFile(String path, List<RebaseTodoLine> steps, boolean append)
-      throws IOException {
-    repository.writeRebaseTodoFile(path, steps, append);
-  }
-
-  @Override
-  public Set<String> getRemoteNames() {
-    return repository.getRemoteNames();
-  }
-
-  @Override
-  public void autoGC(ProgressMonitor monitor) {
-    repository.autoGC(monitor);
-  }
-
-  @Override
-  public String getIdentifier() {
-    return repository.getIdentifier();
+    return sharedRefDatabase.wrapRefUpdate(delegate.updateRef(ref, detach));
   }
 }
diff --git a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepositoryTest.java b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepositoryTest.java
index 7cb4c83..5bb4fb4 100644
--- a/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepositoryTest.java
+++ b/src/test/java/com/gerritforge/gerrit/globalrefdb/validation/SharedRefDbRepositoryTest.java
@@ -20,6 +20,7 @@
 
 import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.RefFixture;
 import java.io.IOException;
+import org.eclipse.jgit.lib.ObjectDatabase;
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate.Result;
 import org.eclipse.jgit.lib.Repository;
@@ -34,6 +35,7 @@
   @Mock SharedRefDbRefDatabase.Factory sharedRefDbRefDbFactory;
   @Mock SharedRefDbRefDatabase sharedRefDb;
   @Mock RefDatabase genericRefDb;
+  @Mock ObjectDatabase objectDatabase;
 
   @Mock SharedRefDbRefUpdate sharedRefDbRefUpdate;
 
@@ -48,7 +50,9 @@
   }
 
   private void setMockitoCommon() {
+    doReturn(true).when(repository).isBare();
     doReturn(genericRefDb).when(repository).getRefDatabase();
+    doReturn(objectDatabase).when(repository).getObjectDatabase();
     doReturn(sharedRefDb).when(sharedRefDbRefDbFactory).create(PROJECT_NAME, genericRefDb);
   }
 
