Leverage GlobalRefDatabase interface

Use the external definition of the GlobalRefDatabase
provided by the GerritForge's library instead of one defined
internally.

Using a well-defined external interface allows to use
other non-Zookeeper based implementation of the global ref-db.

Change-Id: I753e1fc3be78f2b34c55187a605bdc0d9edafbf4
diff --git a/BUILD b/BUILD
index 0e88858..0615d17 100644
--- a/BUILD
+++ b/BUILD
@@ -22,6 +22,7 @@
         "@curator-recipes//jar",
         "@kafka-client//jar",
         "@zookeeper//jar",
+        "@global-refdb//jar",
         "//plugins/replication",
     ],
 )
@@ -54,5 +55,6 @@
         "@curator-test//jar",
         "@curator-client//jar",
         "@zookeeper//jar",
+        "@global-refdb//jar",
     ],
 )
diff --git a/external_plugin_deps.bzl b/external_plugin_deps.bzl
index eb53541..f97cfd3 100644
--- a/external_plugin_deps.bzl
+++ b/external_plugin_deps.bzl
@@ -50,3 +50,9 @@
         artifact = "org.apache.zookeeper:zookeeper:3.4.14",
         sha1 = "c114c1e1c8172a7cd3f6ae39209a635f7a06c1a1",
     )
+
+    maven_jar(
+        name = "global-refdb",
+        artifact = "com.gerritforge:global-refdb:0.1.1",
+        sha1 = "d6ab59906db7b20a52c8994502780b2a6ab23872",
+    )
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
index 89c2253..9a8c4c4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
@@ -14,6 +14,7 @@
 
 package com.googlesource.gerrit.plugins.multisite;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
 import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.lifecycle.LifecycleModule;
 import com.google.gerrit.server.config.SitePaths;
@@ -33,7 +34,6 @@
 import com.googlesource.gerrit.plugins.multisite.forwarder.router.RouterModule;
 import com.googlesource.gerrit.plugins.multisite.index.IndexModule;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.NoopSharedRefDatabase;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
 import java.io.IOException;
@@ -64,8 +64,8 @@
       throw new CreationException(validationErrors);
     }
 
-    DynamicItem.itemOf(binder(), SharedRefDatabase.class);
-    DynamicItem.bind(binder(), SharedRefDatabase.class)
+    DynamicItem.itemOf(binder(), GlobalRefDatabase.class);
+    DynamicItem.bind(binder(), GlobalRefDatabase.class)
         .to(NoopSharedRefDatabase.class)
         .in(Scopes.SINGLETON);
     log.info("Shared ref-db engine: none");
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/SharedRefDatabaseWrapper.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/SharedRefDatabaseWrapper.java
index eda8d7c..9d55e43 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/SharedRefDatabaseWrapper.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/SharedRefDatabaseWrapper.java
@@ -14,19 +14,20 @@
 
 package com.googlesource.gerrit.plugins.multisite;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.inject.Inject;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedLockException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
-import java.io.IOException;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
 
-public class SharedRefDatabaseWrapper implements SharedRefDatabase {
+public class SharedRefDatabaseWrapper implements GlobalRefDatabase {
 
   @Inject(optional = true)
-  private DynamicItem<SharedRefDatabase> sharedRefDbDynamicItem;
+  private DynamicItem<GlobalRefDatabase> sharedRefDbDynamicItem;
 
   private final SharedRefLogger sharedRefLogger;
 
@@ -37,45 +38,46 @@
 
   @VisibleForTesting
   public SharedRefDatabaseWrapper(
-      DynamicItem<SharedRefDatabase> sharedRefDbDynamicItem, SharedRefLogger sharedRefLogger) {
+      DynamicItem<GlobalRefDatabase> sharedRefDbDynamicItem, SharedRefLogger sharedRefLogger) {
     this.sharedRefLogger = sharedRefLogger;
     this.sharedRefDbDynamicItem = sharedRefDbDynamicItem;
   }
 
   @Override
-  public boolean isUpToDate(String project, Ref ref) throws SharedLockException {
+  public boolean isUpToDate(Project.NameKey project, Ref ref) throws GlobalRefDbLockException {
     return sharedRefDb().isUpToDate(project, ref);
   }
 
   @Override
-  public boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue)
-      throws IOException {
+  public boolean compareAndPut(Project.NameKey project, Ref currRef, ObjectId newRefValue)
+      throws GlobalRefDbSystemError {
     boolean succeeded = sharedRefDb().compareAndPut(project, currRef, newRefValue);
     if (succeeded) {
-      sharedRefLogger.logRefUpdate(project, currRef, newRefValue);
+      sharedRefLogger.logRefUpdate(project.get(), currRef, newRefValue);
     }
     return succeeded;
   }
 
   @Override
-  public AutoCloseable lockRef(String project, String refName) throws SharedLockException {
+  public AutoCloseable lockRef(Project.NameKey project, String refName)
+      throws GlobalRefDbLockException {
     AutoCloseable locker = sharedRefDb().lockRef(project, refName);
-    sharedRefLogger.logLockAcquisition(project, refName);
+    sharedRefLogger.logLockAcquisition(project.get(), refName);
     return locker;
   }
 
   @Override
-  public boolean exists(String project, String refName) {
+  public boolean exists(Project.NameKey project, String refName) {
     return sharedRefDb().exists(project, refName);
   }
 
   @Override
-  public void removeProject(String project) throws IOException {
-    sharedRefDb().removeProject(project);
-    sharedRefLogger.logProjectDelete(project);
+  public void remove(Project.NameKey project) throws GlobalRefDbSystemError {
+    sharedRefDb().remove(project);
+    sharedRefLogger.logProjectDelete(project.get());
   }
 
-  private SharedRefDatabase sharedRefDb() {
+  private GlobalRefDatabase sharedRefDb() {
     return sharedRefDbDynamicItem.get();
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidator.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidator.java
index 4e6bef5..932f0c4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidator.java
@@ -19,7 +19,6 @@
 import com.google.inject.assistedinject.Assisted;
 import com.googlesource.gerrit.plugins.multisite.LockWrapper;
 import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement.EnforcePolicy;
 import java.io.IOException;
@@ -29,6 +28,8 @@
 import java.util.stream.Stream;
 import org.eclipse.jgit.lib.BatchRefUpdate;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
+import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.transport.ReceiveCommand;
 
@@ -124,7 +125,7 @@
     try {
       switch (command.getType()) {
         case CREATE:
-          return new RefPair(SharedRefDatabase.nullRef(command.getRefName()), getNewRef(command));
+          return new RefPair(nullRef(command.getRefName()), getNewRef(command));
 
         case UPDATE:
         case UPDATE_NONFASTFORWARD:
@@ -155,4 +156,8 @@
     }
     return latestRefsToUpdate;
   }
+
+  private static final Ref nullRef(String refName) {
+    return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, ObjectId.zeroId());
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
index 5f25607..42f7194 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationPushFilter.java
@@ -14,16 +14,18 @@
 
 package com.googlesource.gerrit.plugins.multisite.validation;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedLockException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import com.googlesource.gerrit.plugins.replication.ReplicationPushFilter;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
+import org.eclipse.jgit.lib.ObjectIdRef;
+import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.transport.RemoteRefUpdate;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -52,13 +54,15 @@
                   String ref = refUpdate.getSrcRef();
                   try {
                     if (sharedRefDb.isUpToDate(
-                        projectName, SharedRefDatabase.newRef(ref, refUpdate.getNewObjectId()))) {
+                        new Project.NameKey(projectName),
+                        new ObjectIdRef.Unpeeled(
+                            Ref.Storage.NETWORK, ref, refUpdate.getNewObjectId()))) {
                       return true;
                     }
                     repLog.warn(
                         "{} is not up-to-date with the shared-refdb and thus will NOT BE replicated",
                         refUpdate);
-                  } catch (SharedLockException e) {
+                  } catch (GlobalRefDbLockException e) {
                     repLog.warn(
                         "{} is locked on shared-refdb and thus will NOT BE replicated", refUpdate);
                   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectDeletedSharedDbCleanup.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectDeletedSharedDbCleanup.java
index 78e1cea..9c93793 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectDeletedSharedDbCleanup.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ProjectDeletedSharedDbCleanup.java
@@ -14,11 +14,12 @@
 
 package com.googlesource.gerrit.plugins.multisite.validation;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.extensions.events.ProjectDeletedListener;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
-import java.io.IOException;
 
 public class ProjectDeletedSharedDbCleanup implements ProjectDeletedListener {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@@ -41,8 +42,8 @@
         "Deleting project '%s'. Will perform a cleanup in Shared-Ref database.", projectName);
 
     try {
-      sharedDb.removeProject(projectName);
-    } catch (IOException e) {
+      sharedDb.remove(new Project.NameKey(projectName));
+    } catch (GlobalRefDbSystemError e) {
       validationMetrics.incrementSplitBrain();
       logger.atSevere().withCause(e).log(
           "Project '%s' deleted from GIT but it was not able to cleanup"
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidator.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidator.java
index 82d4ff0..a63c00b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidator.java
@@ -14,10 +14,10 @@
 
 package com.googlesource.gerrit.plugins.multisite.validation;
 
-import static com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase.nullRef;
-
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
 import com.google.common.base.MoreObjects;
 import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import com.googlesource.gerrit.plugins.multisite.LockWrapper;
@@ -25,12 +25,12 @@
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.OutOfSyncException;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedDbSplitBrainException;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedLockException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement.EnforcePolicy;
 import java.io.IOException;
 import java.util.HashMap;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate;
@@ -144,8 +144,10 @@
             projectName, refPair.getName(), refPair.putValue);
     boolean succeeded;
     try {
-      succeeded = sharedRefDb.compareAndPut(projectName, refPair.compareRef, refPair.putValue);
-    } catch (IOException e) {
+      succeeded =
+          sharedRefDb.compareAndPut(
+              new Project.NameKey(projectName), refPair.compareRef, refPair.putValue);
+    } catch (GlobalRefDbSystemError e) {
       throw new SharedDbSplitBrainException(errorMessage, e);
     }
 
@@ -166,14 +168,17 @@
         String.format("%s-%s", projectName, refName),
         () ->
             lockWrapperFactory.create(
-                projectName, refName, sharedRefDb.lockRef(projectName, refName)));
+                projectName,
+                refName,
+                sharedRefDb.lockRef(new Project.NameKey(projectName), refName)));
 
     RefPair latestRefPair = getLatestLocalRef(refPair);
-    if (sharedRefDb.isUpToDate(projectName, latestRefPair.compareRef)) {
+    if (sharedRefDb.isUpToDate(new Project.NameKey(projectName), latestRefPair.compareRef)) {
       return latestRefPair;
     }
 
-    if (isNullRef(latestRefPair.compareRef) || sharedRefDb.exists(projectName, refName)) {
+    if (isNullRef(latestRefPair.compareRef)
+        || sharedRefDb.exists(new Project.NameKey(projectName), refName)) {
       validationMetrics.incrementSplitBrainPrevention();
 
       softFailBasedOnEnforcement(
@@ -193,6 +198,10 @@
         latestRef == null ? nullRef(refPair.getName()) : latestRef, refPair.putValue);
   }
 
+  private Ref nullRef(String name) {
+    return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, name, ObjectId.zeroId());
+  }
+
   protected boolean isSuccessful(RefUpdate.Result result) {
     switch (result) {
       case NEW:
@@ -219,7 +228,7 @@
   }
 
   protected Ref getCurrentRef(String refName) throws IOException {
-    return MoreObjects.firstNonNull(refDb.getRef(refName), SharedRefDatabase.nullRef(refName));
+    return MoreObjects.firstNonNull(refDb.getRef(refName), nullRef(refName));
   }
 
   public static class CloseableSet<T extends AutoCloseable> implements AutoCloseable {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/NoopSharedRefDatabase.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/NoopSharedRefDatabase.java
index e40688f..886eecf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/NoopSharedRefDatabase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/NoopSharedRefDatabase.java
@@ -14,30 +14,36 @@
 
 package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
 
-public class NoopSharedRefDatabase implements SharedRefDatabase {
-  @Override
-  public boolean isUpToDate(String project, Ref ref) {
-    return true;
-  }
+public class NoopSharedRefDatabase implements GlobalRefDatabase {
 
   @Override
-  public boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue) {
-    return true;
-  }
-
-  @Override
-  public AutoCloseable lockRef(String project, String refName) {
-    return () -> {};
-  }
-
-  @Override
-  public boolean exists(String project, String refName) {
+  public boolean isUpToDate(NameKey project, Ref ref) throws GlobalRefDbLockException {
     return false;
   }
 
   @Override
-  public void removeProject(String project) {}
+  public boolean compareAndPut(NameKey project, Ref currRef, ObjectId newRefValue)
+      throws GlobalRefDbSystemError {
+    return false;
+  }
+
+  @Override
+  public AutoCloseable lockRef(NameKey project, String refName) throws GlobalRefDbLockException {
+    return () -> {};
+  }
+
+  @Override
+  public boolean exists(NameKey project, String refName) {
+    return false;
+  }
+
+  @Override
+  public void remove(NameKey project) throws GlobalRefDbSystemError {}
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/SharedRefDatabase.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/SharedRefDatabase.java
deleted file mode 100644
index a93efcf..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/SharedRefDatabase.java
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (C) 2019 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.
-
-package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb;
-
-import java.io.IOException;
-import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectIdRef;
-import org.eclipse.jgit.lib.Ref;
-
-public interface SharedRefDatabase {
-
-  /** A null ref that isn't associated to any name. */
-  Ref NULL_REF = nullRef(null);
-
-  /**
-   * Create a new in-memory ref name associated with an NULL object id.
-   *
-   * @param refName ref name
-   * @return the new NULL ref object
-   */
-  static Ref nullRef(String refName) {
-    return new Ref() {
-
-      @Override
-      public String getName() {
-        return refName;
-      }
-
-      @Override
-      public boolean isSymbolic() {
-        return false;
-      }
-
-      @Override
-      public Ref getLeaf() {
-        return null;
-      }
-
-      @Override
-      public Ref getTarget() {
-        return null;
-      }
-
-      @Override
-      public ObjectId getObjectId() {
-        return ObjectId.zeroId();
-      }
-
-      @Override
-      public ObjectId getPeeledObjectId() {
-        return ObjectId.zeroId();
-      }
-
-      @Override
-      public boolean isPeeled() {
-        return false;
-      }
-
-      @Override
-      public Storage getStorage() {
-        return Storage.NEW;
-      }
-    };
-  }
-
-  /**
-   * Create a new in-memory Ref name associated with an objectId.
-   *
-   * @param refName ref name
-   * @param objectId object id
-   */
-  static Ref newRef(String refName, ObjectId objectId) {
-    return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
-  }
-
-  /**
-   * Verify in shared db if Ref is the most recent
-   *
-   * @param project project name of the ref
-   * @param ref to be checked against shared-ref db
-   * @return true if it is; false otherwise
-   * @throws SharedLockException if there was a problem locking the resource
-   */
-  boolean isUpToDate(String project, Ref ref) throws SharedLockException;
-
-  /**
-   * Compare a reference, and put if it matches.
-   *
-   * <p>Two reference match if and only if they satisfy the following:
-   *
-   * <ul>
-   *   <li>If one reference is a symbolic ref, the other one should be a symbolic ref.
-   *   <li>If both are symbolic refs, the target names should be same.
-   *   <li>If both are object ID refs, the object IDs should be same.
-   * </ul>
-   *
-   * @param project project name of the ref
-   * @param currRef old value to compare to. If the reference is expected to not exist the old value
-   *     has a storage of {@link org.eclipse.jgit.lib.Ref.Storage#NEW} and an ObjectId value of
-   *     {@code null}.
-   * @param newRefValue new reference to store.
-   * @return true if the put was successful; false otherwise.
-   * @throws java.io.IOException the reference cannot be put due to a system error.
-   */
-  boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue) throws IOException;
-
-  /**
-   * Lock a reference for writing.
-   *
-   * @param project project name
-   * @param refName ref to lock
-   * @return lock object
-   * @throws SharedLockException if the lock cannot be obtained
-   */
-  AutoCloseable lockRef(String project, String refName) throws SharedLockException;
-
-  /**
-   * Verify if the DB contains a value for the specific project and ref name
-   *
-   * @param project
-   * @param refName
-   * @return true if the ref exists on the project
-   */
-  boolean exists(String project, String refName);
-
-  /**
-   * Clean project path from SharedRefDatabase
-   *
-   * @param project project name
-   * @throws IOException
-   */
-  void removeProject(String project) throws IOException;
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
index 1179045..1da1ceb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabase.java
@@ -16,12 +16,13 @@
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
 import com.google.common.flogger.FluentLogger;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.multisite.validation.ZkConnectionConfig;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedLockException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
-import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import org.apache.curator.RetryPolicy;
 import org.apache.curator.framework.CuratorFramework;
@@ -32,7 +33,7 @@
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.Ref;
 
-public class ZkSharedRefDatabase implements SharedRefDatabase {
+public class ZkSharedRefDatabase implements GlobalRefDatabase {
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final CuratorFramework client;
@@ -48,7 +49,7 @@
   }
 
   @Override
-  public boolean isUpToDate(String project, Ref ref) throws SharedLockException {
+  public boolean isUpToDate(Project.NameKey project, Ref ref) throws GlobalRefDbLockException {
     if (!exists(project, ref.getName())) {
       return true;
     }
@@ -75,21 +76,22 @@
 
       return isUpToDate;
     } catch (Exception e) {
-      throw new SharedLockException(project, ref.getName(), e);
+      throw new GlobalRefDbLockException(project.get(), ref.getName(), e);
     }
   }
 
   @Override
-  public void removeProject(String project) throws IOException {
+  public void remove(Project.NameKey project) throws GlobalRefDbSystemError {
     try {
       client.delete().deletingChildrenIfNeeded().forPath("/" + project);
     } catch (Exception e) {
-      throw new IOException(String.format("Not able to delete project '%s'", project), e);
+      throw new GlobalRefDbSystemError(
+          String.format("Not able to delete project '%s'", project), e);
     }
   }
 
   @Override
-  public boolean exists(String project, String refName) throws ZookeeperRuntimeException {
+  public boolean exists(Project.NameKey project, String refName) throws GlobalRefDbSystemError {
     try {
       return client.checkExists().forPath(pathFor(project, refName)) != null;
     } catch (Exception e) {
@@ -98,25 +100,26 @@
   }
 
   @Override
-  public Locker lockRef(String project, String refName) throws SharedLockException {
+  public Locker lockRef(Project.NameKey project, String refName) throws GlobalRefDbLockException {
     InterProcessMutex refPathMutex =
         new InterProcessMutex(client, "/locks" + pathFor(project, refName));
     try {
       return new Locker(refPathMutex, transactionLockTimeOut, MILLISECONDS);
     } catch (Exception e) {
-      throw new SharedLockException(project, refName, e);
+      throw new GlobalRefDbLockException(project.get(), refName, e);
     }
   }
 
   @Override
-  public boolean compareAndPut(String projectName, Ref oldRef, ObjectId newRefValue)
-      throws IOException {
+  public boolean compareAndPut(Project.NameKey projectName, Ref oldRef, ObjectId newRefValue)
+      throws GlobalRefDbSystemError {
 
     final DistributedAtomicValue distributedRefValue =
         new DistributedAtomicValue(client, pathFor(projectName, oldRef), retryPolicy);
 
     try {
-      if (oldRef == NULL_REF) {
+      if ((oldRef.getObjectId() == null || oldRef.getObjectId().equals(ObjectId.zeroId()))
+          && !distributedRefValue.get().succeeded()) {
         return distributedRefValue.initialize(writeObjectId(newRefValue));
       }
       final ObjectId newValue = newRefValue == null ? ObjectId.zeroId() : newRefValue;
@@ -132,20 +135,20 @@
     } catch (Exception e) {
       logger.atWarning().withCause(e).log(
           "Error trying to perform CAS at path %s", pathFor(projectName, oldRef));
-      throw new IOException(
+      throw new GlobalRefDbSystemError(
           String.format("Error trying to perform CAS at path %s", pathFor(projectName, oldRef)), e);
     }
   }
 
-  private boolean refNotInZk(String projectName, Ref oldRef) throws Exception {
+  private boolean refNotInZk(Project.NameKey projectName, Ref oldRef) throws Exception {
     return client.checkExists().forPath(pathFor(projectName, oldRef)) == null;
   }
 
-  static String pathFor(String projectName, Ref oldRef) {
+  static String pathFor(Project.NameKey projectName, Ref oldRef) {
     return pathFor(projectName, oldRef.getName());
   }
 
-  static String pathFor(String projectName, String refName) {
+  static String pathFor(Project.NameKey projectName, String refName) {
     return "/" + projectName + "/" + refName;
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkValidationModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkValidationModule.java
index 60b148d..f0bdbdb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkValidationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkValidationModule.java
@@ -14,13 +14,13 @@
 
 package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
 import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Scopes;
 import com.googlesource.gerrit.plugins.multisite.ZookeeperConfig;
 import com.googlesource.gerrit.plugins.multisite.validation.ZkConnectionConfig;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import org.apache.curator.framework.CuratorFramework;
 
 public class ZkValidationModule extends AbstractModule {
@@ -34,7 +34,7 @@
 
   @Override
   protected void configure() {
-    DynamicItem.bind(binder(), SharedRefDatabase.class)
+    DynamicItem.bind(binder(), GlobalRefDatabase.class)
         .to(ZkSharedRefDatabase.class)
         .in(Scopes.SINGLETON);
     bind(CuratorFramework.class).toInstance(cfg.buildCurator());
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidatorTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidatorTest.java
index 5c18e4f..f5f532f 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidatorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/BatchRefUpdateValidatorTest.java
@@ -18,11 +18,12 @@
 import static junit.framework.TestCase.assertFalse;
 import static org.eclipse.jgit.transport.ReceiveCommand.Type.UPDATE;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
 import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.metrics.DisabledMetricMaker;
+import com.google.gerrit.reviewdb.client.Project;
 import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper.RefFixture;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper.ZkSharedRefDatabase;
@@ -83,7 +84,7 @@
     zkSharedRefDatabase =
         new SharedRefDatabaseWrapper(
             DynamicItem.itemOf(
-                SharedRefDatabase.class,
+                GlobalRefDatabase.class,
                 new ZkSharedRefDatabase(
                     zookeeperContainer.getCurator(),
                     new ZkConnectionConfig(
@@ -104,13 +105,14 @@
     BatchRefUpdateValidator.executeBatchUpdateWithValidation(
         batchRefUpdate, () -> execute(batchRefUpdate));
 
-    assertFalse(zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME, AN_IMMUTABLE_REF));
+    assertFalse(zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME_KEY, AN_IMMUTABLE_REF));
   }
 
   @Test
   public void compareAndPutShouldSucceedIfTheObjectionHasNotTheExpectedValueWithDesiredEnforcement()
       throws Exception {
     String projectName = "All-Users";
+    Project.NameKey projectNameKey = new Project.NameKey("All-Users");
     String externalIds = "refs/meta/external-ids";
 
     List<ReceiveCommand> cmds = Arrays.asList(new ReceiveCommand(A, B, externalIds, UPDATE));
@@ -118,13 +120,13 @@
     BatchRefUpdate batchRefUpdate = newBatchUpdate(cmds);
     BatchRefUpdateValidator batchRefUpdateValidator = newDefaultValidator(projectName);
 
-    Ref zkExistingRef = SharedRefDatabase.newRef(externalIds, B.getId());
-    zookeeperContainer.createRefInZk(projectName, zkExistingRef);
+    Ref zkExistingRef = newRef(externalIds, B.getId());
+    zookeeperContainer.createRefInZk(projectNameKey, zkExistingRef);
 
     batchRefUpdateValidator.executeBatchUpdateWithValidation(
         batchRefUpdate, () -> execute(batchRefUpdate));
 
-    assertThat(zookeeperContainer.readRefValueFromZk(projectName, zkExistingRef)).isEqualTo(B);
+    assertThat(zookeeperContainer.readRefValueFromZk(projectNameKey, zkExistingRef)).isEqualTo(B);
   }
 
   @Test
@@ -138,7 +140,7 @@
     BatchRefUpdateValidator.executeBatchUpdateWithValidation(
         batchRefUpdate, () -> execute(batchRefUpdate));
 
-    assertFalse(zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME, DRAFT_COMMENT));
+    assertFalse(zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME_KEY, DRAFT_COMMENT));
   }
 
   private BatchRefUpdateValidator newDefaultValidator(String projectName) {
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteBatchRefUpdateTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteBatchRefUpdateTest.java
index 730e558..e89e50e 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteBatchRefUpdateTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteBatchRefUpdateTest.java
@@ -110,13 +110,13 @@
     setMockRequiredReturnValues();
 
     // When compareAndPut against sharedDb succeeds
-    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
     doReturn(true)
         .when(sharedRefDb)
-        .compareAndPut(eq(A_TEST_PROJECT_NAME), refEquals(oldRef), eq(newRef.getObjectId()));
+        .compareAndPut(eq(A_TEST_PROJECT_NAME_KEY), refEquals(oldRef), eq(newRef.getObjectId()));
     multiSiteRefUpdate.execute(revWalk, progressMonitor, Collections.emptyList());
     verify(sharedRefDb)
-        .compareAndPut(eq(A_TEST_PROJECT_NAME), refEquals(oldRef), eq(newRef.getObjectId()));
+        .compareAndPut(eq(A_TEST_PROJECT_NAME_KEY), refEquals(oldRef), eq(newRef.getObjectId()));
   }
 
   private Ref refEquals(Ref oldRef) {
@@ -126,8 +126,8 @@
   @Test
   public void executeAndFailsWithExceptions() throws IOException {
     setMockRequiredReturnValues();
-    doReturn(true).when(sharedRefDb).exists(A_TEST_PROJECT_NAME, A_TEST_REF_NAME);
-    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(true).when(sharedRefDb).exists(A_TEST_PROJECT_NAME_KEY, A_TEST_REF_NAME);
+    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
     try {
       multiSiteRefUpdate.execute(revWalk, progressMonitor, Collections.emptyList());
       fail("Expecting an IOException to be thrown");
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteRefUpdateTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteRefUpdateTest.java
index a9d8e76..433a462 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteRefUpdateTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultiSiteRefUpdateTest.java
@@ -65,10 +65,10 @@
   @Test
   public void newUpdateShouldValidateAndSucceed() throws Exception {
 
-    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
     doReturn(true)
         .when(sharedRefDb)
-        .compareAndPut(A_TEST_PROJECT_NAME, oldRef, newRef.getObjectId());
+        .compareAndPut(A_TEST_PROJECT_NAME_KEY, oldRef, newRef.getObjectId());
 
     RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
 
@@ -82,7 +82,7 @@
   @Test(expected = Exception.class)
   public void newUpdateShouldValidateAndFailWithIOException() throws Exception {
 
-    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
 
     RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
 
@@ -94,7 +94,7 @@
   @Test
   public void newUpdateShouldIncreaseRefUpdateFailureCountWhenFailing() throws IOException {
 
-    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
 
     RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
 
@@ -113,10 +113,10 @@
   public void newUpdateShouldNotIncreaseSplitBrainPreventedCounterIfFailingSharedDbPostUpdate()
       throws IOException {
 
-    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
     doReturn(false)
         .when(sharedRefDb)
-        .compareAndPut(A_TEST_PROJECT_NAME, oldRef, newRef.getObjectId());
+        .compareAndPut(A_TEST_PROJECT_NAME_KEY, oldRef, newRef.getObjectId());
 
     RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
 
@@ -135,10 +135,10 @@
   public void newUpdateShouldtIncreaseSplitBrainCounterIfFailingSharedDbPostUpdate()
       throws IOException {
 
-    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
     doReturn(false)
         .when(sharedRefDb)
-        .compareAndPut(A_TEST_PROJECT_NAME, oldRef, newRef.getObjectId());
+        .compareAndPut(A_TEST_PROJECT_NAME_KEY, oldRef, newRef.getObjectId());
 
     RefUpdate refUpdate = RefUpdateStub.forSuccessfulUpdate(oldRef, newRef.getObjectId());
 
@@ -155,9 +155,11 @@
 
   @Test
   public void deleteShouldValidateAndSucceed() throws IOException {
-    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
 
-    doReturn(true).when(sharedRefDb).compareAndPut(A_TEST_PROJECT_NAME, oldRef, ObjectId.zeroId());
+    doReturn(true)
+        .when(sharedRefDb)
+        .compareAndPut(A_TEST_PROJECT_NAME_KEY, oldRef, ObjectId.zeroId());
 
     RefUpdate refUpdate = RefUpdateStub.forSuccessfulDelete(oldRef);
 
@@ -171,7 +173,7 @@
   @Test
   public void deleteShouldIncreaseRefUpdateFailureCountWhenFailing() throws IOException {
 
-    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, oldRef);
+    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, oldRef);
 
     RefUpdate refUpdate = RefUpdateStub.forSuccessfulDelete(oldRef);
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidatorTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidatorTest.java
index f0677b8..db4138a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidatorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/RefUpdateValidatorTest.java
@@ -16,20 +16,18 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.lenient;
 import static org.mockito.Mockito.never;
 import static org.mockito.Mockito.verify;
 
+import com.google.gerrit.reviewdb.client.Project;
 import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.OutOfSyncException;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedDbSplitBrainException;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper.RefFixture;
 import org.eclipse.jgit.lib.ObjectId;
-import org.eclipse.jgit.lib.ObjectIdRef;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.RefDatabase;
 import org.eclipse.jgit.lib.RefUpdate;
@@ -86,15 +84,18 @@
 
   @Test
   public void validationShouldSucceedWhenLocalRefDbIsUpToDate() throws Exception {
-    lenient().doReturn(false).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
-    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, localRef);
     lenient()
         .doReturn(false)
         .when(sharedRefDb)
-        .compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+        .isUpToDate(any(Project.NameKey.class), any(Ref.class));
+    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
+    lenient()
+        .doReturn(false)
+        .when(sharedRefDb)
+        .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
     doReturn(true)
         .when(sharedRefDb)
-        .compareAndPut(A_TEST_PROJECT_NAME, localRef, newUpdateRef.getObjectId());
+        .compareAndPut(A_TEST_PROJECT_NAME_KEY, localRef, newUpdateRef.getObjectId());
 
     Result result = refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.NEW);
 
@@ -104,14 +105,14 @@
   @Test
   public void sharedRefDbShouldBeUpdatedWithRefDeleted() throws Exception {
     doReturn(ObjectId.zeroId()).when(refUpdate).getNewObjectId();
-    doReturn(true).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
+    doReturn(true).when(sharedRefDb).isUpToDate(any(Project.NameKey.class), any(Ref.class));
     lenient()
         .doReturn(false)
         .when(sharedRefDb)
-        .compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+        .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
     doReturn(true)
         .when(sharedRefDb)
-        .compareAndPut(A_TEST_PROJECT_NAME, localRef, ObjectId.zeroId());
+        .compareAndPut(A_TEST_PROJECT_NAME_KEY, localRef, ObjectId.zeroId());
     doReturn(localRef).doReturn(null).when(localRefDb).getRef(refName);
 
     Result result = refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.FORCED);
@@ -121,16 +122,16 @@
 
   @Test
   public void sharedRefDbShouldBeUpdatedWithNewRefCreated() throws Exception {
-    Ref localNullRef = SharedRefDatabase.nullRef(refName);
+    Ref localNullRef = nullRef(refName);
 
-    doReturn(true).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
+    doReturn(true).when(sharedRefDb).isUpToDate(any(Project.NameKey.class), any(Ref.class));
     lenient()
         .doReturn(false)
         .when(sharedRefDb)
-        .compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+        .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
     doReturn(true)
         .when(sharedRefDb)
-        .compareAndPut(A_TEST_PROJECT_NAME, localNullRef, newUpdateRef.getObjectId());
+        .compareAndPut(A_TEST_PROJECT_NAME_KEY, localNullRef, newUpdateRef.getObjectId());
     doReturn(localNullRef).doReturn(newUpdateRef).when(localRefDb).getRef(refName);
 
     Result result = refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.NEW);
@@ -140,9 +141,12 @@
 
   @Test(expected = OutOfSyncException.class)
   public void validationShouldFailWhenLocalRefDbIsNotUpToDate() throws Exception {
-    lenient().doReturn(true).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
-    doReturn(true).when(sharedRefDb).exists(A_TEST_PROJECT_NAME, refName);
-    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, localRef);
+    lenient()
+        .doReturn(true)
+        .when(sharedRefDb)
+        .isUpToDate(any(Project.NameKey.class), any(Ref.class));
+    doReturn(true).when(sharedRefDb).exists(A_TEST_PROJECT_NAME_KEY, refName);
+    doReturn(false).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
 
     refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.NEW);
   }
@@ -150,32 +154,35 @@
   @Test(expected = SharedDbSplitBrainException.class)
   public void shouldTrowSplitBrainWhenLocalRefDbIsUpToDateButFinalCompareAndPutIsFailing()
       throws Exception {
-    lenient().doReturn(false).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
-    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, localRef);
+    lenient()
+        .doReturn(false)
+        .when(sharedRefDb)
+        .isUpToDate(any(Project.NameKey.class), any(Ref.class));
+    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
     lenient()
         .doReturn(true)
         .when(sharedRefDb)
-        .compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+        .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
     doReturn(false)
         .when(sharedRefDb)
-        .compareAndPut(A_TEST_PROJECT_NAME, localRef, newUpdateRef.getObjectId());
+        .compareAndPut(A_TEST_PROJECT_NAME_KEY, localRef, newUpdateRef.getObjectId());
 
     refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.NEW);
   }
 
   @Test
   public void shouldNotUpdateSharedRefDbWhenFinalCompareAndPutIsFailing() throws Exception {
-    lenient().doReturn(false).when(sharedRefDb).isUpToDate(anyString(), any(Ref.class));
-    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME, localRef);
+    lenient()
+        .doReturn(false)
+        .when(sharedRefDb)
+        .isUpToDate(any(Project.NameKey.class), any(Ref.class));
+    doReturn(true).when(sharedRefDb).isUpToDate(A_TEST_PROJECT_NAME_KEY, localRef);
 
     Result result =
         refUpdateValidator.executeRefUpdate(refUpdate, () -> RefUpdate.Result.LOCK_FAILURE);
 
-    verify(sharedRefDb, never()).compareAndPut(anyString(), any(Ref.class), any(ObjectId.class));
+    verify(sharedRefDb, never())
+        .compareAndPut(any(Project.NameKey.class), any(Ref.class), any(ObjectId.class));
     assertThat(result).isEqualTo(RefUpdate.Result.LOCK_FAILURE);
   }
-
-  private Ref newRef(String refName, ObjectId objectId) {
-    return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
-  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
index caf0d69..526f5ab 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/MultisiteReplicationPushFilterTest.java
@@ -19,7 +19,12 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.doReturn;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbLockException;
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDbSystemError;
 import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
 import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
 import com.googlesource.gerrit.plugins.multisite.validation.DisabledSharedRefLogger;
 import com.googlesource.gerrit.plugins.multisite.validation.MultisiteReplicationPushFilter;
@@ -43,12 +48,13 @@
   @Mock SharedRefDatabaseWrapper sharedRefDatabaseMock;
 
   String project = "fooProject";
+  NameKey projectName = new Project.NameKey(project);
 
   @Test
   public void shouldReturnAllRefUpdatesWhenAllUpToDate() throws Exception {
     List<RemoteRefUpdate> refUpdates =
         Arrays.asList(refUpdate("refs/heads/foo"), refUpdate("refs/heads/bar"));
-    doReturn(true).when(sharedRefDatabaseMock).isUpToDate(eq(project), any());
+    doReturn(true).when(sharedRefDatabaseMock).isUpToDate(eq(projectName), any());
 
     MultisiteReplicationPushFilter pushFilter =
         new MultisiteReplicationPushFilter(sharedRefDatabaseMock);
@@ -92,35 +98,37 @@
     Set<String> rejectedSet = new HashSet<>();
     rejectedSet.addAll(Arrays.asList(rejectedRefs));
 
-    SharedRefDatabase sharedRefDatabase =
-        new SharedRefDatabase() {
+    GlobalRefDatabase sharedRefDatabase =
+        new GlobalRefDatabase() {
 
           @Override
-          public void removeProject(String project) throws IOException {}
-
-          @Override
-          public AutoCloseable lockRef(String project, String refName) throws SharedLockException {
-            return null;
-          }
-
-          @Override
-          public boolean isUpToDate(String project, Ref ref) throws SharedLockException {
+          public boolean isUpToDate(Project.NameKey project, Ref ref)
+              throws GlobalRefDbLockException {
             return !rejectedSet.contains(ref.getName());
           }
 
           @Override
-          public boolean exists(String project, String refName) {
+          public boolean exists(Project.NameKey project, String refName) {
             return true;
           }
 
           @Override
-          public boolean compareAndPut(String project, Ref currRef, ObjectId newRefValue)
-              throws IOException {
+          public boolean compareAndPut(NameKey project, Ref currRef, ObjectId newRefValue)
+              throws GlobalRefDbSystemError {
             return false;
           }
+
+          @Override
+          public AutoCloseable lockRef(NameKey project, String refName)
+              throws GlobalRefDbLockException {
+            return null;
+          }
+
+          @Override
+          public void remove(NameKey project) throws GlobalRefDbSystemError {}
         };
     return new SharedRefDatabaseWrapper(
-        DynamicItem.itemOf(SharedRefDatabase.class, sharedRefDatabase),
+        DynamicItem.itemOf(GlobalRefDatabase.class, sharedRefDatabase),
         new DisabledSharedRefLogger());
   }
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/RefSharedDatabaseTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/RefSharedDatabaseTest.java
index 57ab5e0..0867010 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/RefSharedDatabaseTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/RefSharedDatabaseTest.java
@@ -18,6 +18,7 @@
 
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper.RefFixture;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
 import org.eclipse.jgit.lib.Ref;
 import org.eclipse.jgit.lib.Ref.Storage;
 import org.junit.Rule;
@@ -38,7 +39,7 @@
     ObjectId objectId = AN_OBJECT_ID_1;
     String refName = aBranchRef();
 
-    Ref aNewRef = SharedRefDatabase.newRef(refName, objectId);
+    Ref aNewRef = new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
 
     assertThat(aNewRef.getName()).isEqualTo(refName);
     assertThat(aNewRef.getObjectId()).isEqualTo(objectId);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/CustomSharedRefEnforcementByProjectTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/CustomSharedRefEnforcementByProjectTest.java
index d63436c..16ac0a7 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/CustomSharedRefEnforcementByProjectTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/CustomSharedRefEnforcementByProjectTest.java
@@ -15,7 +15,6 @@
 package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper;
 
 import static com.google.common.truth.Truth.assertThat;
-import static com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase.newRef;
 
 import com.googlesource.gerrit.plugins.multisite.Configuration;
 import com.googlesource.gerrit.plugins.multisite.Configuration.SharedRefDatabase;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/DefaultSharedRefEnforcementTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/DefaultSharedRefEnforcementTest.java
index 83fcf52..35072ff 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/DefaultSharedRefEnforcementTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/DefaultSharedRefEnforcementTest.java
@@ -15,7 +15,6 @@
 package com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.zookeeper;
 
 import static com.google.common.truth.Truth.assertThat;
-import static com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase.newRef;
 
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/RefFixture.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/RefFixture.java
index 72ea236..609c940 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/RefFixture.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/RefFixture.java
@@ -17,6 +17,8 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
 import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.ObjectIdRef;
+import org.eclipse.jgit.lib.Ref;
 import org.junit.Ignore;
 
 @Ignore
@@ -41,4 +43,12 @@
   default String testBranch() {
     return "aTestBranch";
   }
+
+  default Ref newRef(String refName, ObjectId objectId) {
+    return new ObjectIdRef.Unpeeled(Ref.Storage.NETWORK, refName, objectId);
+  }
+
+  default Ref nullRef(String refName) {
+    return newRef(refName, ObjectId.zeroId());
+  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseIT.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseIT.java
index e2bdfbc..5ca214a 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseIT.java
@@ -18,6 +18,7 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
 import com.google.gerrit.acceptance.AbstractDaemonTest;
 import com.google.gerrit.extensions.registration.DynamicItem;
 import com.google.gerrit.metrics.DisabledMetricMaker;
@@ -29,7 +30,6 @@
 import com.googlesource.gerrit.plugins.multisite.validation.ValidationMetrics;
 import com.googlesource.gerrit.plugins.multisite.validation.ZkConnectionConfig;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
 import org.apache.curator.retry.RetryNTimes;
 import org.eclipse.jgit.internal.storage.dfs.InMemoryRepository;
@@ -65,7 +65,7 @@
     zkSharedRefDatabase =
         new SharedRefDatabaseWrapper(
             DynamicItem.itemOf(
-                SharedRefDatabase.class,
+                GlobalRefDatabase.class,
                 new ZkSharedRefDatabase(
                     zookeeperContainer.getCurator(),
                     new ZkConnectionConfig(
@@ -174,7 +174,7 @@
   }
 
   private boolean existsDataInZkForCommand(ReceiveCommand firstCommand) throws Exception {
-    return zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME, firstCommand.getRefName());
+    return zkSharedRefDatabase.exists(A_TEST_PROJECT_NAME_KEY, firstCommand.getRefName());
   }
 
   private MultiSiteBatchRefUpdate newBatchRefUpdate(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
index bff41f1..18087e6 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZkSharedRefDatabaseTest.java
@@ -17,16 +17,17 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.Mockito.mock;
 
+import com.gerritforge.gerrit.globalrefdb.GlobalRefDatabase;
 import com.google.gerrit.extensions.api.changes.NotifyHandling;
 import com.google.gerrit.extensions.events.ProjectDeletedListener;
 import com.google.gerrit.extensions.registration.DynamicItem;
+import com.google.gerrit.reviewdb.client.Project.NameKey;
 import com.googlesource.gerrit.plugins.multisite.SharedRefDatabaseWrapper;
 import com.googlesource.gerrit.plugins.multisite.validation.DisabledSharedRefLogger;
 import com.googlesource.gerrit.plugins.multisite.validation.ProjectDeletedSharedDbCleanup;
 import com.googlesource.gerrit.plugins.multisite.validation.ValidationMetrics;
 import com.googlesource.gerrit.plugins.multisite.validation.ZkConnectionConfig;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.DefaultSharedRefEnforcement;
-import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefDatabase;
 import com.googlesource.gerrit.plugins.multisite.validation.dfsrefdb.SharedRefEnforcement;
 import org.apache.curator.retry.RetryNTimes;
 import org.eclipse.jgit.lib.ObjectId;
@@ -57,7 +58,7 @@
     zkSharedRefDatabase =
         new SharedRefDatabaseWrapper(
             DynamicItem.itemOf(
-                SharedRefDatabase.class,
+                GlobalRefDatabase.class,
                 new ZkSharedRefDatabase(
                     zookeeperContainer.getCurator(),
                     new ZkConnectionConfig(
@@ -77,11 +78,11 @@
   public void shouldCompareAndPutSuccessfully() throws Exception {
     Ref oldRef = refOf(AN_OBJECT_ID_1);
     Ref newRef = refOf(AN_OBJECT_ID_2);
-    String projectName = A_TEST_PROJECT_NAME;
+    NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
 
-    zookeeperContainer.createRefInZk(projectName, oldRef);
+    zookeeperContainer.createRefInZk(projectNameKey, oldRef);
 
-    assertThat(zkSharedRefDatabase.compareAndPut(projectName, oldRef, newRef.getObjectId()))
+    assertThat(zkSharedRefDatabase.compareAndPut(projectNameKey, oldRef, newRef.getObjectId()))
         .isTrue();
   }
 
@@ -89,59 +90,55 @@
   public void shouldFetchLatestObjectIdInZk() throws Exception {
     Ref oldRef = refOf(AN_OBJECT_ID_1);
     Ref newRef = refOf(AN_OBJECT_ID_2);
-    String projectName = A_TEST_PROJECT_NAME;
+    NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
 
-    zookeeperContainer.createRefInZk(projectName, oldRef);
+    zookeeperContainer.createRefInZk(projectNameKey, oldRef);
 
-    assertThat(zkSharedRefDatabase.compareAndPut(projectName, oldRef, newRef.getObjectId()))
+    assertThat(zkSharedRefDatabase.compareAndPut(projectNameKey, oldRef, newRef.getObjectId()))
         .isTrue();
 
-    assertThat(zkSharedRefDatabase.isUpToDate(projectName, newRef)).isTrue();
-    assertThat(zkSharedRefDatabase.isUpToDate(projectName, oldRef)).isFalse();
+    assertThat(zkSharedRefDatabase.isUpToDate(projectNameKey, newRef)).isTrue();
+    assertThat(zkSharedRefDatabase.isUpToDate(projectNameKey, oldRef)).isFalse();
   }
 
   @Test
   public void shouldCompareAndPutWithNullOldRefSuccessfully() throws Exception {
     Ref oldRef = refOf(null);
     Ref newRef = refOf(AN_OBJECT_ID_2);
-    String projectName = A_TEST_PROJECT_NAME;
+    NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
 
-    zookeeperContainer.createRefInZk(projectName, oldRef);
+    zookeeperContainer.createRefInZk(projectNameKey, oldRef);
 
-    assertThat(zkSharedRefDatabase.compareAndPut(projectName, oldRef, newRef.getObjectId()))
+    assertThat(zkSharedRefDatabase.compareAndPut(projectNameKey, oldRef, newRef.getObjectId()))
         .isTrue();
   }
 
   @Test
   public void compareAndPutShouldFailIfTheObjectionHasNotTheExpectedValue() throws Exception {
-    String projectName = A_TEST_PROJECT_NAME;
+    NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
 
     Ref oldRef = refOf(AN_OBJECT_ID_1);
     Ref expectedRef = refOf(AN_OBJECT_ID_2);
 
-    zookeeperContainer.createRefInZk(projectName, oldRef);
+    zookeeperContainer.createRefInZk(projectNameKey, oldRef);
 
-    assertThat(zkSharedRefDatabase.compareAndPut(projectName, expectedRef, AN_OBJECT_ID_3))
+    assertThat(zkSharedRefDatabase.compareAndPut(projectNameKey, expectedRef, AN_OBJECT_ID_3))
         .isFalse();
   }
 
-  private Ref refOf(ObjectId objectId) {
-    return SharedRefDatabase.newRef(aBranchRef(), objectId);
-  }
-
   @Test
   public void removeProjectShouldRemoveTheWholePathInZk() throws Exception {
-    String projectName = A_TEST_PROJECT_NAME;
+    NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
     Ref someRef = refOf(AN_OBJECT_ID_1);
 
-    zookeeperContainer.createRefInZk(projectName, someRef);
+    zookeeperContainer.createRefInZk(projectNameKey, someRef);
 
-    assertThat(zookeeperContainer.readRefValueFromZk(projectName, someRef))
+    assertThat(zookeeperContainer.readRefValueFromZk(projectNameKey, someRef))
         .isEqualTo(AN_OBJECT_ID_1);
 
     assertThat(getNumChildrenForPath("/")).isEqualTo(1);
 
-    zkSharedRefDatabase.removeProject(projectName);
+    zkSharedRefDatabase.remove(projectNameKey);
 
     assertThat(getNumChildrenForPath("/")).isEqualTo(0);
   }
@@ -149,6 +146,7 @@
   @Test
   public void aDeleteProjectEventShouldCleanupProjectFromZk() throws Exception {
     String projectName = A_TEST_PROJECT_NAME;
+    NameKey projectNameKey = A_TEST_PROJECT_NAME_KEY;
     Ref someRef = refOf(AN_OBJECT_ID_1);
     ProjectDeletedSharedDbCleanup projectDeletedSharedDbCleanup =
         new ProjectDeletedSharedDbCleanup(zkSharedRefDatabase, mockValidationMetrics);
@@ -166,7 +164,7 @@
           }
         };
 
-    zookeeperContainer.createRefInZk(projectName, someRef);
+    zookeeperContainer.createRefInZk(projectNameKey, someRef);
 
     assertThat(getNumChildrenForPath("/")).isEqualTo(1);
 
@@ -187,4 +185,8 @@
         .forPath(String.format(path))
         .getNumChildren();
   }
+
+  private Ref refOf(ObjectId objectId) {
+    return newRef(aBranchRef(), objectId);
+  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZookeeperTestContainerSupport.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZookeeperTestContainerSupport.java
index f7db92f..57e2d34 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZookeeperTestContainerSupport.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/dfsrefdb/zookeeper/ZookeeperTestContainerSupport.java
@@ -19,6 +19,7 @@
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.googlesource.gerrit.plugins.multisite.ZookeeperConfig;
 import org.apache.curator.framework.CuratorFramework;
@@ -79,12 +80,12 @@
     this.container.stop();
   }
 
-  public ObjectId readRefValueFromZk(String projectName, Ref ref) throws Exception {
+  public ObjectId readRefValueFromZk(Project.NameKey projectName, Ref ref) throws Exception {
     final byte[] bytes = curator.getData().forPath(pathFor(projectName, ref));
     return ZkSharedRefDatabase.readObjectId(bytes);
   }
 
-  public void createRefInZk(String projectName, Ref ref) throws Exception {
+  public void createRefInZk(Project.NameKey projectName, Ref ref) throws Exception {
     curator
         .create()
         .creatingParentContainersIfNeeded()