diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilter.java
index c5571c0..03e0a6e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilter.java
@@ -20,7 +20,6 @@
 import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDatabaseWrapper;
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Project;
-import com.google.gerrit.entities.Project.NameKey;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
@@ -62,7 +61,6 @@
         gitRepositoryManager.openRepository(Project.nameKey(projectName))) {
       RefDatabase refDb = repository.getRefDatabase();
       return refs.stream()
-          .filter(ref -> !hasBeenRemovedFromGlobalRefDb(projectName, ref))
           .filter(
               ref -> {
                 if (shouldNotBeTrackedAnymoreOnGlobalRefDb(ref)) {
@@ -91,31 +89,6 @@
     }
   }
 
-  /* If the ref to fetch has been set to all zeros on the global-refdb, it means
-   * that whatever is the situation locally, we do not need to fetch it:
-   * - If the remote still has it, fetching it will be useless because the global
-   *   state is that the ref should be removed.
-   * - If the remote doesn't have it anymore, trying to fetch the ref won't do
-   *   anything because you can't just remove local refs by fetching.
-   */
-  private boolean hasBeenRemovedFromGlobalRefDb(String projectName, String ref) {
-    if (foundAsZeroInSharedRefDb(Project.nameKey(projectName), ref)) {
-      repLog.info(
-          "{}:{} is found as zeros (removed) in shared-refdb thus will NOT BE fetched",
-          projectName,
-          ref);
-      return true;
-    }
-    return false;
-  }
-
-  private boolean foundAsZeroInSharedRefDb(NameKey projectName, String ref) {
-    return sharedRefDb
-        .get(projectName, ref, String.class)
-        .map(r -> ZERO_ID_NAME.equals(r))
-        .orElse(false);
-  }
-
   private Optional<ObjectId> getLocalSha1IfEqualsToExistingGlobalRefDb(
       Repository repository,
       String projectName,
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilterTest.java
index e09f6f6..b9ec588 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/validation/MultisiteReplicationFetchFilterTest.java
@@ -17,6 +17,7 @@
 import static com.google.common.truth.Truth.assertThat;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
@@ -147,7 +148,7 @@
     Set<String> filteredRefsToFetch = fetchFilter.filter(project, refsToFetch);
 
     assertThat(filteredRefsToFetch).hasSize(1);
-    verify(sharedRefDatabaseMock, times(3))
+    verify(sharedRefDatabaseMock, atLeastOnce())
         .get(eq(projectName), eq(temporaryOutdated), eq(String.class));
   }
 
@@ -172,12 +173,6 @@
   @Test
   public void shouldNotFilterOutWhenRefsMultisiteVersionIsPresentInSharedRefDb() throws Exception {
     String refsMultisiteVersionRef = ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_REF;
-    RevCommit multiSiteVersionRef = newRef(refsMultisiteVersionRef);
-
-    doReturn(Optional.of(multiSiteVersionRef.getId().getName()))
-        .when(sharedRefDatabaseMock)
-        .get(eq(projectName), eq(refsMultisiteVersionRef), eq(String.class));
-
     Set<String> refsToFetch = Set.of(refsMultisiteVersionRef);
 
     MultisiteReplicationFetchFilter fetchFilter =
@@ -188,7 +183,7 @@
   }
 
   @Test
-  public void shouldFilterOutWhenRefIsDeletedInTheSharedRefDb() throws Exception {
+  public void shouldNotFilterOutWhenRefIsDeletedInTheSharedRefDb() throws Exception {
     String temporaryOutdated = "refs/heads/temporaryOutdated";
     newRef(temporaryOutdated);
 
@@ -201,25 +196,8 @@
         new MultisiteReplicationFetchFilter(sharedRefDatabaseMock, gitRepositoryManager, config);
     Set<String> filteredRefsToFetch = fetchFilter.filter(project, refsToFetch);
 
-    assertThat(filteredRefsToFetch).hasSize(0);
-    verify(sharedRefDatabaseMock).get(eq(projectName), any(), any());
-  }
-
-  @Test
-  public void shouldNotFilterOutWhenRefIsMissingOnlyInTheLocalRepository() throws Exception {
-    String refObjectId = "0000000000000000000000000000000000000001";
-    String nonExistingLocalRef = "refs/heads/temporaryOutdated";
-
-    Set<String> refsToFetch = Set.of(nonExistingLocalRef);
-    doReturn(Optional.of(refObjectId))
-        .when(sharedRefDatabaseMock)
-        .get(eq(projectName), any(), any());
-
-    MultisiteReplicationFetchFilter fetchFilter =
-        new MultisiteReplicationFetchFilter(sharedRefDatabaseMock, gitRepositoryManager, config);
-    Set<String> filteredRefsToFetch = fetchFilter.filter(project, refsToFetch);
-
     assertThat(filteredRefsToFetch).hasSize(1);
+    verify(sharedRefDatabaseMock, atLeastOnce()).get(eq(projectName), any(), any());
   }
 
   @Test
@@ -235,23 +213,6 @@
     assertThat(filteredRefsToFetch).hasSize(1);
   }
 
-  @Test
-  public void shouldFilterOutRefMissingInTheLocalRepositoryAndDeletedInSharedRefDb()
-      throws Exception {
-    String nonExistingLocalRef = "refs/heads/temporaryOutdated";
-
-    Set<String> refsToFetch = Set.of(nonExistingLocalRef);
-    doReturn(Optional.of(ObjectId.zeroId().getName()))
-        .when(sharedRefDatabaseMock)
-        .get(eq(projectName), any(), any());
-
-    MultisiteReplicationFetchFilter fetchFilter =
-        new MultisiteReplicationFetchFilter(sharedRefDatabaseMock, gitRepositoryManager, config);
-    Set<String> filteredRefsToFetch = fetchFilter.filter(project, refsToFetch);
-
-    assertThat(filteredRefsToFetch).hasSize(0);
-  }
-
   private RevCommit newRef(String refName) throws Exception {
     return repo.branch(refName).commit().create();
   }
