diff --git a/README.md b/README.md
index 2e13f45..87d2dac 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,11 @@
-# Gerrit multi-site plugin
+# DEPRECATION NOTICE
+
+GerritForge has decided to [change the license to BSL](https://gitenterprise.me/2025/09/30/re-licensing-gerritforge-plugins-welcome-to-gerrit-enterprise/)
+therefore the Apache 2.0 version of this plugin is deprecated.
+The recommended version of the multi-site plugin is on [GitHub](https://github.com/GerritForge/multi-site)
+and the development continues on [GerritHub.io](https://review.gerrithub.io/admin/repos/GerritForge/multi-site,general).
+
+# Gerrit multi-site plugin (DEPRECATED)
 
 This plugin allows to deploy a distributed cluster of multiple Gerrit masters
 each using a separate site without sharing any storage. The alignment between
diff --git a/setup_local_env/setup.sh b/setup_local_env/setup.sh
index d7ab200..2fd8f42 100755
--- a/setup_local_env/setup.sh
+++ b/setup_local_env/setup.sh
@@ -16,7 +16,7 @@
 
 
 SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
-GERRIT_BRANCH=stable-3.12
+GERRIT_BRANCH=master
 GERRIT_CI=https://gerrit-ci.gerritforge.com/view/Plugins-$GERRIT_BRANCH/job
 LAST_BUILD=lastSuccessfulBuild/artifact/bazel-bin/plugins
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
index 1be09aa..e6f3533 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Configuration.java
@@ -22,20 +22,34 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Strings;
 import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.server.config.ConfigUtil;
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.google.inject.spi.Message;
+import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexAccountHandler;
+import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexChangeHandler;
+import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexGroupHandler;
+import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexProjectHandler;
+import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.AccountIndexEvent;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.ChangeIndexEvent;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.GroupIndexEvent;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.ProjectIndexEvent;
 import java.io.IOException;
 import java.time.Duration;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Random;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
 import org.eclipse.jgit.storage.file.FileBasedConfig;
@@ -83,8 +97,8 @@
   private final Config multiSiteConfig;
   private final Supplier<Duration> replicationLagRefreshInterval;
   private final Supplier<Boolean> replicationLagEnabled;
-  private final Supplier<Boolean> pushReplicationFilterEnabled;
-  private final Supplier<Boolean> pullReplicationFilterEnabled;
+  private Supplier<Boolean> pushReplicationFilterEnabled;
+  private Supplier<Boolean> pullReplicationFilterEnabled;
   private final Supplier<Long> localRefLockTimeoutMsec;
 
   @Inject
@@ -122,10 +136,10 @@
     replicationLagEnabled =
         memoize(
             () ->
-                lazyMultiSiteCfg
-                    .get()
-                    .getBoolean(REF_DATABASE, null, REPLICATION_LAG_ENABLED, true));
-
+                !pullReplicationFilterEnabled.get()
+                    && lazyMultiSiteCfg
+                        .get()
+                        .getBoolean(REF_DATABASE, null, REPLICATION_LAG_ENABLED, true));
     pushReplicationFilterEnabled =
         memoize(
             () ->
@@ -194,10 +208,18 @@
     return pushReplicationFilterEnabled.get();
   }
 
-  public boolean pullRepllicationFilterEnabled() {
+  public void disablePushReplicationFilter() {
+    pushReplicationFilterEnabled = Suppliers.ofInstance(false);
+  }
+
+  public boolean pullReplicationFilterEnabled() {
     return pullReplicationFilterEnabled.get();
   }
 
+  public void disablePullReplicationFilter() {
+    pullReplicationFilterEnabled = Suppliers.ofInstance(false);
+  }
+
   public long localRefLockTimeoutMsec() {
     return localRefLockTimeoutMsec.get();
   }
@@ -221,9 +243,9 @@
           null,
           SharedRefDbConfiguration.SharedRefDatabase.ENABLE_KEY,
           true);
-      if (cfg instanceof FileBasedConfig) {
+      if (cfg instanceof FileBasedConfig fileBasedConfig) {
         try {
-          ((FileBasedConfig) cfg).save();
+          fileBasedConfig.save();
         } catch (IOException e) {
           throw new IllegalStateException("Error while enabling global-refdb by default", e);
         }
@@ -233,10 +255,9 @@
   }
 
   private Supplier<Config> lazyLoad(Config config) {
-    if (config instanceof FileBasedConfig) {
+    if (config instanceof FileBasedConfig fileConfig) {
       return memoize(
           () -> {
-            FileBasedConfig fileConfig = (FileBasedConfig) config;
             String fileConfigFileName = fileConfig.getFile().getPath();
             try {
               log.info("Loading configuration from {}", fileConfigFileName);
@@ -251,8 +272,7 @@
   }
 
   private Supplier<Collection<Message>> lazyValidateReplicatioConfig(Config replicationConfig) {
-    if (replicationConfig instanceof FileBasedConfig) {
-      FileBasedConfig fileConfig = (FileBasedConfig) replicationConfig;
+    if (replicationConfig instanceof FileBasedConfig fileConfig) {
       try {
         fileConfig.load();
         return memoize(() -> validateReplicationConfig(replicationConfig));
@@ -357,11 +377,12 @@
     }
   }
 
-  public static class Index extends Forwarding {
+  public static class Index {
     static final String INDEX_SECTION = "index";
     static final String MAX_TRIES_KEY = "maxTries";
     static final String RETRY_INTERVAL_KEY = "retryInterval";
     static final String SYNCHRONIZE_FORCED_KEY = "synchronizeForced";
+    static final String SYNCHRONIZE_KEY = "synchronize";
     static final boolean DEFAULT_SYNCHRONIZE_FORCED = true;
 
     private final int threadPoolSize;
@@ -369,10 +390,39 @@
     private final int maxTries;
 
     private final int numStripedLocks;
+    private final Map<String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>>
+        synchronize;
     private final boolean synchronizeForced;
 
+    private static final Map<
+            String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>>
+        SYNCHRONIZE_ALL_EVENTS_HANDLERS =
+            Map.of(
+                ChangeIndexEvent.TYPE, ForwardedIndexChangeHandler.class,
+                GroupIndexEvent.TYPE, ForwardedIndexGroupHandler.class,
+                AccountIndexEvent.TYPE, ForwardedIndexAccountHandler.class,
+                ProjectIndexEvent.TYPE, ForwardedIndexProjectHandler.class);
+
+    public Map<String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>>
+        getSynchronizeIndex(Supplier<Config> cfg) {
+      Set<String> syncIndexTypes =
+          Arrays.stream(cfg.get().getStringList(INDEX_SECTION, null, SYNCHRONIZE_KEY))
+              .map(String::toLowerCase)
+              .collect(Collectors.toSet());
+
+      if (syncIndexTypes.contains("false")) {
+        return Map.of();
+      }
+
+      Map<String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>> synchIndex =
+          SYNCHRONIZE_ALL_EVENTS_HANDLERS.entrySet().stream()
+              .filter(entry -> syncIndexTypes.contains(entry.getKey()))
+              .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+
+      return synchIndex.isEmpty() ? SYNCHRONIZE_ALL_EVENTS_HANDLERS : synchIndex;
+    }
+
     private Index(Supplier<Config> cfg) {
-      super(cfg, INDEX_SECTION);
       threadPoolSize =
           getInt(cfg, INDEX_SECTION, null, THREAD_POOL_SIZE_KEY, DEFAULT_THREAD_POOL_SIZE);
       retryInterval =
@@ -382,6 +432,7 @@
           getInt(cfg, INDEX_SECTION, null, NUM_STRIPED_LOCKS, DEFAULT_NUM_STRIPED_LOCKS);
       synchronizeForced =
           getBoolean(cfg, INDEX_SECTION, null, SYNCHRONIZE_FORCED_KEY, DEFAULT_SYNCHRONIZE_FORCED);
+      synchronize = getSynchronizeIndex(cfg);
     }
 
     public int threadPoolSize() {
@@ -403,6 +454,11 @@
     public boolean synchronizeForced() {
       return synchronizeForced;
     }
+
+    public Map<String, Class<? extends ForwardedIndexingHandler<?, ? extends IndexEvent>>>
+        synchronize() {
+      return synchronize;
+    }
   }
 
   public static class Broker {
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 c161a6d..0e5ae15 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/Module.java
@@ -54,14 +54,14 @@
     if (config.event().synchronize()) {
       brokerRouterNeeded = true;
     }
-    if (config.index().synchronize()) {
+    if (!config.index().synchronize().isEmpty()) {
       install(new IndexModule());
       brokerRouterNeeded = true;
     }
 
     if (brokerRouterNeeded) {
       install(new BrokerModule());
-      install(new RouterModule());
+      install(new RouterModule(config.index()));
     }
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java
index 3ced8c6..dd0b98d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/PluginModule.java
@@ -53,7 +53,7 @@
 
   @Override
   protected void configure() {
-    if (config.index().synchronize()
+    if (!config.index().synchronize().isEmpty()
         || config.cache().synchronize()
         || config.event().synchronize()) {
       install(new EventModule(config));
@@ -86,16 +86,20 @@
     ImmutableList.Builder<AbstractModule> filterModulesBuilder = ImmutableList.builder();
 
     if (config.pushReplicationFilterEnabled()) {
-      bindReplicationFilterClass(PUSH_REPLICATION_FILTER_MODULE, filterModulesBuilder);
+      if (!bindReplicationFilterClass(PUSH_REPLICATION_FILTER_MODULE, filterModulesBuilder)) {
+        config.disablePushReplicationFilter();
+      }
     }
-    if (config.pullRepllicationFilterEnabled()) {
-      bindReplicationFilterClass(PULL_REPLICATION_FILTER_MODULE, filterModulesBuilder);
+    if (config.pullReplicationFilterEnabled()) {
+      if (!bindReplicationFilterClass(PULL_REPLICATION_FILTER_MODULE, filterModulesBuilder)) {
+        config.disablePullReplicationFilter();
+      }
     }
 
     return filterModulesBuilder.build();
   }
 
-  private void bindReplicationFilterClass(
+  private boolean bindReplicationFilterClass(
       String filterClassName, ImmutableList.Builder<AbstractModule> filterModulesBuilder) {
     try {
       @SuppressWarnings("unchecked")
@@ -106,9 +110,11 @@
       parentInjector.createChildInjector(filterModule);
 
       filterModulesBuilder.add(filterModule);
+      return true;
     } catch (NoClassDefFoundError | ClassNotFoundException e) {
       log.atWarning().withCause(e).log(
           "Not loading %s because of missing the associated replication plugin", filterClassName);
+      return false;
     } catch (Exception e) {
       throw new ProvisionException(
           "Unable to instantiate replication filter " + filterClassName, e);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java
index 15d756b..045aded 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/BatchIndexEventSubscriber.java
@@ -51,11 +51,11 @@
 
   @Override
   protected Boolean shouldConsumeEvent(Event event) {
-    if (event instanceof ChangeIndexEvent) {
-      return projectsFilter.matches(((ChangeIndexEvent) event).projectName);
+    if (event instanceof ChangeIndexEvent changeIndexEvent) {
+      return projectsFilter.matches(changeIndexEvent.projectName);
     }
-    if (event instanceof ProjectIndexEvent) {
-      return projectsFilter.matches(((ProjectIndexEvent) event).projectName);
+    if (event instanceof ProjectIndexEvent projectIndexEvent) {
+      return projectsFilter.matches(projectIndexEvent.projectName);
     }
     return true;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java
index a632618..7220cd5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/IndexEventSubscriber.java
@@ -57,16 +57,15 @@
 
   @Override
   protected Boolean shouldConsumeEvent(Event event) {
-    if (event instanceof ChangeIndexEvent) {
-      ChangeIndexEvent changeIndexEvent = (ChangeIndexEvent) event;
+    if (event instanceof ChangeIndexEvent changeIndexEvent) {
       String projectName = changeIndexEvent.projectName;
       if (isDeletedChangeWithEmptyProject(changeIndexEvent)) {
         projectName = findProjectFromChangeId(changeIndexEvent.changeId).orElse(projectName);
       }
       return projectsFilter.matches(projectName);
     }
-    if (event instanceof ProjectIndexEvent) {
-      return projectsFilter.matches(((ProjectIndexEvent) event).projectName);
+    if (event instanceof ProjectIndexEvent projectIndexEvent) {
+      return projectsFilter.matches(projectIndexEvent.projectName);
     }
     return true;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java
index 63fc29a..3450c38 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/StreamEventSubscriber.java
@@ -50,8 +50,8 @@
 
   @Override
   protected Boolean shouldConsumeEvent(Event event) {
-    if (event instanceof ProjectEvent) {
-      return projectsFilter.matches(((ProjectEvent) event).getProjectNameKey().get());
+    if (event instanceof ProjectEvent projectEvent) {
+      return projectsFilter.matches(projectEvent.getProjectNameKey().get());
     }
     return true;
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
index ef71862..2801d5b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetrics.java
@@ -144,9 +144,7 @@
         || event instanceof RefUpdatedEvent) {
       ProjectEvent projectEvent = (ProjectEvent) event;
       replicationStatus.updateReplicationLag(projectEvent.getProjectNameKey());
-    } else if (event instanceof ProjectDeletionReplicationSucceededEvent) {
-      ProjectDeletionReplicationSucceededEvent projectDeletion =
-          (ProjectDeletionReplicationSucceededEvent) event;
+    } else if (event instanceof ProjectDeletionReplicationSucceededEvent projectDeletion) {
       replicationStatus.removeProjectFromReplicationLagMetrics(projectDeletion.getProjectNameKey());
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandler.java
index 5212aa4..6d5e7bd 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexAccountHandler.java
@@ -14,12 +14,15 @@
 
 package com.googlesource.gerrit.plugins.multisite.forwarder;
 
+import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX;
+
 import com.google.gerrit.entities.Account;
 import com.google.gerrit.server.index.account.AccountIndexer;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.multisite.Configuration;
 import com.googlesource.gerrit.plugins.multisite.forwarder.events.AccountIndexEvent;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
@@ -48,6 +51,13 @@
   }
 
   @Override
+  public void handle(IndexEvent sourceEvent) throws IOException {
+    if (sourceEvent instanceof AccountIndexEvent accountIndexEvent) {
+      indexAsync(Account.id(accountIndexEvent.accountId), INDEX);
+    }
+  }
+
+  @Override
   protected void doIndex(Account.Id id, Optional<AccountIndexEvent> event) {
     indexer.index(id);
     log.debug("Account {} successfully indexed", id);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandler.java
index 8a52eb5..8e98359 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandler.java
@@ -14,6 +14,9 @@
 
 package com.googlesource.gerrit.plugins.multisite.forwarder;
 
+import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.DELETE;
+import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX;
+
 import com.google.common.base.Splitter;
 import com.google.gerrit.entities.Change;
 import com.google.gerrit.entities.Project;
@@ -25,9 +28,11 @@
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.multisite.Configuration;
 import com.googlesource.gerrit.plugins.multisite.forwarder.events.ChangeIndexEvent;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
 import com.googlesource.gerrit.plugins.multisite.index.ChangeChecker;
 import com.googlesource.gerrit.plugins.multisite.index.ChangeCheckerImpl;
 import com.googlesource.gerrit.plugins.multisite.index.ForwardedIndexExecutor;
+import java.io.IOException;
 import java.util.Optional;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -56,8 +61,24 @@
   }
 
   @Override
+  public void handle(IndexEvent sourceEvent) throws IOException {
+    if (sourceEvent instanceof ChangeIndexEvent changeIndexEvent) {
+      ForwardedIndexingHandler.Operation operation = changeIndexEvent.deleted ? DELETE : INDEX;
+      index(
+          changeIndexEvent.projectName + "~" + changeIndexEvent.changeId,
+          operation,
+          Optional.of(changeIndexEvent));
+    }
+  }
+
+  @Override
   protected void doIndex(String id, Optional<ChangeIndexEvent> indexEvent) {
-    scheduleIndexing(id, indexEvent, this::indexIfConsistent);
+    if (indexEvent.isPresent()
+        && ChangeIndexEvent.isAllChangesDeletedForProject(indexEvent.get())) {
+      indexer.deleteAllForProject(Project.nameKey(indexEvent.get().projectName));
+    } else {
+      scheduleIndexing(id, indexEvent, this::indexIfConsistent);
+    }
   }
 
   private void indexIfConsistent(String id) {
@@ -104,28 +125,6 @@
     }
   }
 
-  /**
-   * Deletes all change index entries associated with the given project.
-   *
-   * <p>This method is invoked when a project-wide deletion event is received from a peer in a
-   * multi-site setup. It removes all changes for the specified project from the local index.
-   *
-   * <p>The method temporarily marks the execution context as a forwarded event to prevent the
-   * resulting index updates from being re-forwarded to other peers, which would otherwise create
-   * event loops.
-   *
-   * @param projectName the name of the project whose changes should be removed from the index
-   */
-  public void deleteAllForProject(String projectName) {
-    try {
-      Context.setForwardedEvent(true);
-      log.debug("Deleting all change indexes for project {}", projectName);
-      indexer.deleteAllForProject(Project.nameKey(projectName));
-    } finally {
-      Context.unsetForwardedEvent();
-    }
-  }
-
   @Override
   protected void reindex(String id) {
     try (ManualRequestContext ctx = oneOffCtx.open()) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandler.java
index d05405f..953be7b 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexGroupHandler.java
@@ -14,6 +14,8 @@
 
 package com.googlesource.gerrit.plugins.multisite.forwarder;
 
+import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX;
+
 import com.google.gerrit.entities.AccountGroup;
 import com.google.gerrit.server.index.group.GroupIndexer;
 import com.google.gerrit.server.util.OneOffRequestContext;
@@ -21,8 +23,10 @@
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.multisite.Configuration;
 import com.googlesource.gerrit.plugins.multisite.forwarder.events.GroupIndexEvent;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
 import com.googlesource.gerrit.plugins.multisite.index.ForwardedIndexExecutor;
 import com.googlesource.gerrit.plugins.multisite.index.GroupChecker;
+import java.io.IOException;
 import java.util.Optional;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -51,6 +55,13 @@
   }
 
   @Override
+  public void handle(IndexEvent sourceEvent) throws IOException {
+    if (sourceEvent instanceof GroupIndexEvent groupIndexEvent) {
+      index(groupIndexEvent.groupUUID, INDEX, Optional.of(groupIndexEvent));
+    }
+  }
+
+  @Override
   protected void doIndex(String uuid, Optional<GroupIndexEvent> event) {
     scheduleIndexing(uuid, event, this::reindex);
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandler.java
index 2054f10..191e273 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexProjectHandler.java
@@ -14,15 +14,19 @@
 
 package com.googlesource.gerrit.plugins.multisite.forwarder;
 
+import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX;
+
 import com.google.gerrit.entities.Project;
 import com.google.gerrit.index.project.ProjectIndexer;
 import com.google.gerrit.server.util.OneOffRequestContext;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.multisite.Configuration;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
 import com.googlesource.gerrit.plugins.multisite.forwarder.events.ProjectIndexEvent;
 import com.googlesource.gerrit.plugins.multisite.index.ForwardedIndexExecutor;
 import com.googlesource.gerrit.plugins.multisite.index.ProjectChecker;
+import java.io.IOException;
 import java.util.Optional;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -51,6 +55,13 @@
   }
 
   @Override
+  public void handle(IndexEvent sourceEvent) throws IOException {
+    if (sourceEvent instanceof ProjectIndexEvent projectIndexEvent) {
+      index(projectIndexEvent.projectName, INDEX, Optional.of(projectIndexEvent));
+    }
+  }
+
+  @Override
   protected void doIndex(String projectName, Optional<ProjectIndexEvent> event) {
     scheduleIndexing(projectName, event, this::reindex);
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexingHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexingHandler.java
index de6b836..a6440e4 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexingHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexingHandler.java
@@ -15,6 +15,7 @@
 package com.googlesource.gerrit.plugins.multisite.forwarder;
 
 import com.google.common.util.concurrent.Striped;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
 import java.io.IOException;
 import java.util.Optional;
 import java.util.concurrent.locks.Lock;
@@ -40,6 +41,8 @@
     }
   }
 
+  public abstract void handle(IndexEvent sourceEvent) throws IOException;
+
   private final Striped<Lock> idLocks;
 
   protected abstract void doIndex(T id, Optional<E> indexEvent);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java
index 065ef7e..31333e7 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/AccountIndexEvent.java
@@ -17,7 +17,7 @@
 import com.google.common.base.Objects;
 
 public class AccountIndexEvent extends IndexEvent {
-  static final String TYPE = "account-index";
+  public static final String TYPE = "account-index";
 
   public int accountId;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java
index af4c0bc..3acd288 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ChangeIndexEvent.java
@@ -21,7 +21,7 @@
 import java.time.format.DateTimeFormatter;
 
 public class ChangeIndexEvent extends IndexEvent {
-  static final String TYPE = "change-index";
+  public static final String TYPE = "change-index";
   private static final int ALL_CHANGES_FOR_PROJECT = 0;
 
   public String projectName;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java
index 05ac198..63adeb6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/GroupIndexEvent.java
@@ -19,7 +19,7 @@
 import org.eclipse.jgit.lib.ObjectId;
 
 public class GroupIndexEvent extends IndexEvent {
-  static final String TYPE = "group-index";
+  public static final String TYPE = "group-index";
 
   public final String groupUUID;
   public final ObjectId sha1;
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java
index 954befb..00cca2e 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/events/ProjectIndexEvent.java
@@ -17,7 +17,7 @@
 import com.google.common.base.Objects;
 
 public class ProjectIndexEvent extends IndexEvent {
-  static final String TYPE = "project-index";
+  public static final String TYPE = "project-index";
 
   public String projectName;
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java
index a23ca33..238db51 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/IndexEventRouter.java
@@ -14,12 +14,13 @@
 
 package com.googlesource.gerrit.plugins.multisite.forwarder.router;
 
-import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.DELETE;
+import static com.google.gerrit.extensions.registration.PluginName.GERRIT;
 import static com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler.Operation.INDEX;
 
 import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.entities.Account;
 import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.server.config.AllUsersName;
 import com.google.gerrit.server.config.GerritInstanceId;
 import com.google.gerrit.server.events.Event;
@@ -27,15 +28,8 @@
 import com.google.gerrit.server.events.RefEvent;
 import com.google.inject.Inject;
 import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexAccountHandler;
-import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexChangeHandler;
-import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexGroupHandler;
-import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexProjectHandler;
 import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler;
-import com.googlesource.gerrit.plugins.multisite.forwarder.events.AccountIndexEvent;
-import com.googlesource.gerrit.plugins.multisite.forwarder.events.ChangeIndexEvent;
-import com.googlesource.gerrit.plugins.multisite.forwarder.events.GroupIndexEvent;
 import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
-import com.googlesource.gerrit.plugins.multisite.forwarder.events.ProjectIndexEvent;
 import java.io.IOException;
 import java.util.Optional;
 import java.util.Set;
@@ -45,55 +39,30 @@
   private static final FluentLogger logger = FluentLogger.forEnclosingClass();
 
   private final ForwardedIndexAccountHandler indexAccountHandler;
-  private final ForwardedIndexChangeHandler indexChangeHandler;
-  private final ForwardedIndexGroupHandler indexGroupHandler;
-  private final ForwardedIndexProjectHandler indexProjectHandler;
   private final AllUsersName allUsersName;
   private final String gerritInstanceId;
+  private final DynamicMap<ForwardedIndexingHandler<?, ? extends IndexEvent>> indexHandlers;
 
   @Inject
   public IndexEventRouter(
       ForwardedIndexAccountHandler indexAccountHandler,
-      ForwardedIndexChangeHandler indexChangeHandler,
-      ForwardedIndexGroupHandler indexGroupHandler,
-      ForwardedIndexProjectHandler indexProjectHandler,
+      DynamicMap<ForwardedIndexingHandler<?, ? extends IndexEvent>> indexHandlers,
       AllUsersName allUsersName,
       @GerritInstanceId String gerritInstanceId) {
     this.indexAccountHandler = indexAccountHandler;
-    this.indexChangeHandler = indexChangeHandler;
-    this.indexGroupHandler = indexGroupHandler;
-    this.indexProjectHandler = indexProjectHandler;
+    this.indexHandlers = indexHandlers;
     this.allUsersName = allUsersName;
     this.gerritInstanceId = gerritInstanceId;
   }
 
   @Override
   public void route(IndexEvent sourceEvent) throws IOException {
-    if (sourceEvent instanceof ChangeIndexEvent) {
-      ChangeIndexEvent changeIndexEvent = (ChangeIndexEvent) sourceEvent;
-
-      if (ChangeIndexEvent.isAllChangesDeletedForProject(changeIndexEvent)) {
-        indexChangeHandler.deleteAllForProject(changeIndexEvent.projectName);
-      } else {
-        ForwardedIndexingHandler.Operation operation = changeIndexEvent.deleted ? DELETE : INDEX;
-        indexChangeHandler.index(
-            changeIndexEvent.projectName + "~" + changeIndexEvent.changeId,
-            operation,
-            Optional.of(changeIndexEvent));
-      }
-    } else if (sourceEvent instanceof AccountIndexEvent) {
-      AccountIndexEvent accountIndexEvent = (AccountIndexEvent) sourceEvent;
-      indexAccountHandler.indexAsync(Account.id(accountIndexEvent.accountId), INDEX);
-    } else if (sourceEvent instanceof GroupIndexEvent) {
-      GroupIndexEvent groupIndexEvent = (GroupIndexEvent) sourceEvent;
-      indexGroupHandler.index(groupIndexEvent.groupUUID, INDEX, Optional.of(groupIndexEvent));
-    } else if (sourceEvent instanceof ProjectIndexEvent) {
-      ProjectIndexEvent projectIndexEvent = (ProjectIndexEvent) sourceEvent;
-      indexProjectHandler.index(
-          projectIndexEvent.projectName, INDEX, Optional.of(projectIndexEvent));
+    ForwardedIndexingHandler<?, ? extends IndexEvent> handler =
+        indexHandlers.get(GERRIT, sourceEvent.getType());
+    if (handler != null) {
+      handler.handle(sourceEvent);
     } else {
-      throw new UnsupportedOperationException(
-          String.format("Cannot route event %s", sourceEvent.getType()));
+      logger.atInfo().log("No registered handlers to route event %s", sourceEvent.getType());
     }
   }
 
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java
index 2193034..b5af428 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/forwarder/router/RouterModule.java
@@ -14,17 +14,41 @@
 
 package com.googlesource.gerrit.plugins.multisite.forwarder.router;
 
+import com.google.gerrit.extensions.annotations.Exports;
+import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.gerrit.lifecycle.LifecycleModule;
 import com.google.gerrit.server.events.EventListener;
+import com.google.inject.Inject;
 import com.google.inject.Scopes;
+import com.google.inject.TypeLiteral;
+import com.googlesource.gerrit.plugins.multisite.Configuration;
+import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexingHandler;
+import com.googlesource.gerrit.plugins.multisite.forwarder.events.IndexEvent;
 
 public class RouterModule extends LifecycleModule {
+
+  private final Configuration.Index indexConfig;
+
+  @Inject
+  public RouterModule(Configuration.Index indexConfig) {
+    this.indexConfig = indexConfig;
+  }
+
+  public static final TypeLiteral<ForwardedIndexingHandler<?, ? extends IndexEvent>> INDEX_HANDLER =
+      new TypeLiteral<>() {};
+
   @Override
   protected void configure() {
     bind(IndexEventRouter.class).in(Scopes.SINGLETON);
     listener().to(IndexEventRouter.class).in(Scopes.SINGLETON);
     DynamicSet.bind(binder(), EventListener.class).to(IndexEventRouter.class);
+    DynamicMap.mapOf(binder(), INDEX_HANDLER);
+
+    indexConfig
+        .synchronize()
+        .forEach(
+            (type, handler) -> bind(INDEX_HANDLER).annotatedWith(Exports.named(type)).to(handler));
 
     bind(CacheEvictionEventRouter.class).in(Scopes.SINGLETON);
     bind(ProjectListUpdateRouter.class).in(Scopes.SINGLETON);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/index/FetchRefReplicatedEventHandler.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/index/FetchRefReplicatedEventHandler.java
index 69cdb06..1e00452 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/index/FetchRefReplicatedEventHandler.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/index/FetchRefReplicatedEventHandler.java
@@ -55,8 +55,7 @@
     try {
       Context.setForwardedEvent(true);
 
-      if (event instanceof FetchRefReplicatedEvent && isLocalEvent(event)) {
-        FetchRefReplicatedEvent fetchRefReplicatedEvent = (FetchRefReplicatedEvent) event;
+      if (event instanceof FetchRefReplicatedEvent fetchRefReplicatedEvent && isLocalEvent(event)) {
         // This removal of the ':' prefix is needed because of Issue 426470297 in the
         // pull-replication plugin
         // that may leave the deleted refs notification as a ref-spec instead of the deleted
diff --git a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java
index 958f265..1971c35 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/multisite/validation/ValidationModule.java
@@ -26,9 +26,6 @@
 import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbRefUpdate;
 import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbRepository;
 import com.gerritforge.gerrit.globalrefdb.validation.SharedRefLogger;
-import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.CustomSharedRefEnforcementByProject;
-import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.DefaultSharedRefEnforcement;
-import com.gerritforge.gerrit.globalrefdb.validation.dfsrefdb.SharedRefEnforcement;
 import com.google.common.collect.ImmutableSet;
 import com.google.gerrit.extensions.config.FactoryModule;
 import com.google.gerrit.extensions.registration.DynamicSet;
@@ -69,14 +66,6 @@
                 ProjectVersionRefUpdate.MULTI_SITE_VERSIONING_VALUE_REF));
     install(new RepositoryManagerModule(repoConfig));
 
-    if (cfg.getSharedRefDbConfiguration().getSharedRefDb().getEnforcementRules().isEmpty()) {
-      bind(SharedRefEnforcement.class).to(DefaultSharedRefEnforcement.class).in(Scopes.SINGLETON);
-    } else {
-      bind(SharedRefEnforcement.class)
-          .to(CustomSharedRefEnforcementByProject.class)
-          .in(Scopes.SINGLETON);
-    }
-
     DynamicSet.bind(binder(), ExceptionHook.class).to(SharedRefDbExceptionHook.class);
   }
 }
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index ed72405..95cb2ca 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -42,10 +42,27 @@
     Defaults to 10
 
 ```index.synchronize```
-:   Whether to synchronize secondary indexes. Set to false when using multi-site
-    on Gerrit replicas that do not have an index, or when using an external
-    service such as ElasticSearch.
-    Defaults to true.
+:   Controls which types of index events should be synchronized across sites.
+    It supports the following values:
+
+    - `true`: shortcut for including all index types
+    - `false`: disable index synchronization
+    - A list of specific index types to synchronize:
+      - `change-index`
+      - `account-index`
+      - `group-index`
+      - `project-index`
+
+    Example to synchronize only change and project indexes:
+    ```
+    [index]
+      synchronize = change-index
+      synchronize = project-index
+    ```
+
+> NOTE: All unknown index types are ignored.
+
+Defaults: all index types are enabled.
 
 ```index.synchronizeForced```
 :   Whether to synchronize forced index events. E.g. on-line reindex
@@ -95,12 +112,12 @@
 :   Enable the use of a shared ref-database
     Defaults: true
 
-```ref-database.pushReplicationFilterClassEnabled```
+```ref-database.pushReplicationFilterEnabled```
 :   Enable the filtering of push replication events checking their
     up-to-date status with the global-refdb.
     Defaults: true
 
-```ref-database.pullReplicationFilterClassEnabled```
+```ref-database.pullReplicationFilterEnabled```
 :   Enable the filtering of pull replication events checking their
     up-to-date status with the global-refdb.
     Defaults: true
@@ -115,7 +132,8 @@
     updating the `refs/multi-site/version/*` to the _epoch_ timestamp in
     milliseconds. Please note that the `replication-lag` REST-API is also
     disabled if this setting is false.
-    Defaults: true
+    Defaults: true unless `pullReplicationFilterEnabled` is enabled and the pull-replication plugin
+    is available, in which case replicationLag is always disabled.
 
 ```ref-database.replicationLagRefreshInterval```
 :   Enable the auto-refresh of the metrics to trace the auto-replication
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/ConfigurationTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/ConfigurationTest.java
index 3a24773..4f0d373 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/ConfigurationTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/ConfigurationTest.java
@@ -65,16 +65,16 @@
 
   @Test
   public void testGetIndexSynchronize() throws Exception {
-    assertThat(getConfiguration().index().synchronize()).isEqualTo(DEFAULT_SYNCHRONIZE);
+    assertThat(getConfiguration().index().synchronize()).isNotEmpty();
 
     globalPluginConfig.setBoolean(INDEX_SECTION, null, SYNCHRONIZE_KEY, false);
-    assertThat(getConfiguration().index().synchronize()).isFalse();
+    assertThat(getConfiguration().index().synchronize()).isEmpty();
 
     globalPluginConfig.setBoolean(INDEX_SECTION, null, SYNCHRONIZE_KEY, true);
-    assertThat(getConfiguration().index().synchronize()).isTrue();
+    assertThat(getConfiguration().index().synchronize()).isNotEmpty();
 
     globalPluginConfig.setString(INDEX_SECTION, null, SYNCHRONIZE_KEY, INVALID_BOOLEAN);
-    assertThat(getConfiguration().index().synchronize()).isTrue();
+    assertThat(getConfiguration().index().synchronize()).isNotEmpty();
   }
 
   @Test
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java
index 6a03a6c..191d7fd 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/consumer/SubscriberMetricsTest.java
@@ -57,6 +57,8 @@
 
   @Before
   public void setup() throws Exception {
+    Config multiSiteConfig = new Config();
+    multiSiteConfig.setBoolean("ref-database", null, "pullReplicationFilterEnabled", false);
     replicationStatus =
         new ReplicationStatus(
             CacheBuilder.newBuilder().build(),
@@ -64,7 +66,8 @@
             verLogger,
             projectCache,
             Executors.newScheduledThreadPool(1),
-            new com.googlesource.gerrit.plugins.multisite.Configuration(new Config(), new Config()),
+            new com.googlesource.gerrit.plugins.multisite.Configuration(
+                multiSiteConfig, new Config()),
             new DisabledMetricMaker());
     metrics = new SubscriberMetrics(metricMaker, replicationStatus);
   }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java
index 8239cf2..7c398f8 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/event/IndexEventRouterTest.java
@@ -14,12 +14,14 @@
 
 package com.googlesource.gerrit.plugins.multisite.event;
 
-import static com.google.gerrit.testing.GerritJUnit.assertThrows;
+import static com.google.gerrit.extensions.registration.PluginName.GERRIT;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.verifyNoInteractions;
 
-import com.google.gerrit.entities.Account;
+import com.google.gerrit.extensions.registration.DynamicMap;
+import com.google.gerrit.extensions.registration.PrivateInternals_DynamicMapImpl;
 import com.google.gerrit.server.config.AllUsersName;
+import com.google.inject.util.Providers;
 import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedEventDispatcher;
 import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexAccountHandler;
 import com.googlesource.gerrit.plugins.multisite.forwarder.ForwardedIndexChangeHandler;
@@ -34,7 +36,6 @@
 import com.googlesource.gerrit.plugins.multisite.forwarder.router.IndexEventRouter;
 import com.googlesource.gerrit.plugins.multisite.forwarder.router.StreamEventRouter;
 import com.googlesource.gerrit.plugins.replication.events.RefReplicationDoneEvent;
-import java.util.Optional;
 import org.eclipse.jgit.lib.ObjectId;
 import org.junit.Before;
 import org.junit.Test;
@@ -52,17 +53,16 @@
   @Mock private ForwardedIndexProjectHandler indexProjectHandler;
   @Mock private ForwardedEventDispatcher forwardedEventDispatcher;
   private AllUsersName allUsersName = new AllUsersName("All-Users");
+  PrivateInternals_DynamicMapImpl<ForwardedIndexingHandler<?, ? extends IndexEvent>> indexHandlers;
 
   @Before
   public void setUp() {
-    router =
-        new IndexEventRouter(
-            indexAccountHandler,
-            indexChangeHandler,
-            indexGroupHandler,
-            indexProjectHandler,
-            allUsersName,
-            INSTANCE_ID);
+    indexHandlers = (PrivateInternals_DynamicMapImpl) DynamicMap.emptyMap();
+    indexHandlers.put(GERRIT, AccountIndexEvent.TYPE, Providers.of(indexAccountHandler));
+    indexHandlers.put(GERRIT, GroupIndexEvent.TYPE, Providers.of(indexGroupHandler));
+    indexHandlers.put(GERRIT, ChangeIndexEvent.TYPE, Providers.of(indexChangeHandler));
+    indexHandlers.put(GERRIT, ProjectIndexEvent.TYPE, Providers.of(indexProjectHandler));
+    router = new IndexEventRouter(indexAccountHandler, indexHandlers, allUsersName, INSTANCE_ID);
   }
 
   @Test
@@ -70,22 +70,19 @@
     final AccountIndexEvent event = new AccountIndexEvent(1, INSTANCE_ID);
     router.route(event);
 
-    verify(indexAccountHandler)
-        .indexAsync(Account.id(event.accountId), ForwardedIndexingHandler.Operation.INDEX);
+    verify(indexAccountHandler).handle(event);
 
     verifyNoInteractions(indexChangeHandler, indexGroupHandler, indexProjectHandler);
   }
 
   @Test
   public void streamEventRouterShouldTriggerAccountIndexFlush() throws Exception {
-
     StreamEventRouter streamEventRouter = new StreamEventRouter(forwardedEventDispatcher, router);
 
     final AccountIndexEvent event = new AccountIndexEvent(1, INSTANCE_ID);
     router.route(event);
 
-    verify(indexAccountHandler)
-        .indexAsync(Account.id(event.accountId), ForwardedIndexingHandler.Operation.INDEX);
+    verify(indexAccountHandler).handle(event);
 
     verifyNoInteractions(indexChangeHandler, indexGroupHandler, indexProjectHandler);
 
@@ -100,8 +97,7 @@
     final GroupIndexEvent event = new GroupIndexEvent(groupId, ObjectId.zeroId(), INSTANCE_ID);
     router.route(event);
 
-    verify(indexGroupHandler)
-        .index(groupId, ForwardedIndexingHandler.Operation.INDEX, Optional.of(event));
+    verify(indexGroupHandler).handle(event);
 
     verifyNoInteractions(indexAccountHandler, indexChangeHandler, indexProjectHandler);
   }
@@ -112,8 +108,7 @@
     final ProjectIndexEvent event = new ProjectIndexEvent(projectName, INSTANCE_ID);
     router.route(event);
 
-    verify(indexProjectHandler)
-        .index(projectName, ForwardedIndexingHandler.Operation.INDEX, Optional.of(event));
+    verify(indexProjectHandler).handle(event);
 
     verifyNoInteractions(indexAccountHandler, indexChangeHandler, indexGroupHandler);
   }
@@ -123,11 +118,7 @@
     final ChangeIndexEvent event = new ChangeIndexEvent("projectName", 3, false, INSTANCE_ID);
     router.route(event);
 
-    verify(indexChangeHandler)
-        .index(
-            event.projectName + "~" + event.changeId,
-            ForwardedIndexingHandler.Operation.INDEX,
-            Optional.of(event));
+    verify(indexChangeHandler).handle(event);
 
     verifyNoInteractions(indexAccountHandler, indexGroupHandler, indexProjectHandler);
   }
@@ -137,33 +128,17 @@
     final ChangeIndexEvent event = new ChangeIndexEvent("projectName", 3, true, INSTANCE_ID);
     router.route(event);
 
-    verify(indexChangeHandler)
-        .index(
-            event.projectName + "~" + event.changeId,
-            ForwardedIndexingHandler.Operation.DELETE,
-            Optional.of(event));
+    verify(indexChangeHandler).handle(event);
 
     verifyNoInteractions(indexAccountHandler, indexGroupHandler, indexProjectHandler);
   }
 
   @Test
-  public void routerShouldFailForNotRecognisedEvents() throws Exception {
+  public void routerShouldIgnoreNotRecognisedEvents() throws Exception {
     final IndexEvent newEventType = new IndexEvent("new-type", INSTANCE_ID) {};
 
-    assertThrows(UnsupportedOperationException.class, () -> router.route(newEventType));
+    router.route(newEventType);
     verifyNoInteractions(
         indexAccountHandler, indexChangeHandler, indexGroupHandler, indexProjectHandler);
   }
-
-  @Test
-  public void routerShouldSendEventsToTheAppropriateHandler_allChangesDeletedForProject()
-      throws Exception {
-    ChangeIndexEvent event =
-        ChangeIndexEvent.allChangesDeletedForProject("projectName", INSTANCE_ID);
-    router.route(event);
-
-    verify(indexChangeHandler).deleteAllForProject(event.projectName);
-
-    verifyNoInteractions(indexAccountHandler, indexGroupHandler, indexProjectHandler);
-  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java
index 6ca1a7a..3233baf 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedCacheEvictionHandlerIT.java
@@ -35,6 +35,7 @@
 import com.google.inject.AbstractModule;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import com.googlesource.gerrit.plugins.multisite.Configuration;
 import com.googlesource.gerrit.plugins.multisite.ExecutorProvider;
 import com.googlesource.gerrit.plugins.multisite.cache.CacheModule;
 import com.googlesource.gerrit.plugins.multisite.forwarder.events.CacheEvictionEvent;
@@ -72,11 +73,13 @@
   private RegistrationHandle cacheEvictionRegistrationHandle;
 
   public static class TestModule extends AbstractModule {
+    @Inject Configuration config;
+
     @Override
     protected void configure() {
       install(new ForwarderModule());
       install(new CacheModule(TestForwardingExecutorProvider.class));
-      install(new RouterModule());
+      install(new RouterModule(config.index()));
       install(new IndexModule());
       SharedRefDbConfiguration sharedRefDbConfig =
           new SharedRefDbConfiguration(new Config(), "multi-site");
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java
index 984e39f..7133a0d 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/forwarder/ForwardedIndexChangeHandlerTest.java
@@ -203,13 +203,6 @@
     verify(indexerMock, times(1)).index(any(ChangeNotes.class));
   }
 
-  @Test
-  public void shouldDeleteAllForProject() {
-    handler.deleteAllForProject(TEST_PROJECT);
-
-    verify(indexerMock, times(1)).deleteAllForProject(Project.nameKey(TEST_PROJECT));
-  }
-
   private void setupChangeAccessRelatedMocks(boolean changeExist, boolean changeUpToDate)
       throws Exception {
     setupChangeAccessRelatedMocks(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java b/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java
index f940fc4..f11ee26 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/multisite/http/ReplicationStatusServletIT.java
@@ -17,6 +17,7 @@
 import static com.google.common.net.HttpHeaders.CONTENT_TYPE;
 import static com.google.common.truth.Truth.assertThat;
 import static com.googlesource.gerrit.plugins.multisite.http.HttpModule.LAG_ENDPOINT_SEGMENT;
+import static org.junit.Assume.assumeTrue;
 
 import com.gerritforge.gerrit.globalrefdb.validation.Log4jSharedRefLogger;
 import com.gerritforge.gerrit.globalrefdb.validation.SharedRefDbConfiguration;
@@ -32,6 +33,7 @@
 import com.google.inject.Inject;
 import com.google.inject.Scopes;
 import com.google.inject.multibindings.OptionalBinder;
+import com.googlesource.gerrit.plugins.multisite.Configuration;
 import com.googlesource.gerrit.plugins.multisite.Log4jProjectVersionLogger;
 import com.googlesource.gerrit.plugins.multisite.ProjectVersionLogger;
 import com.googlesource.gerrit.plugins.multisite.cache.CacheModule;
@@ -57,15 +59,17 @@
   private static final String LAG_ENDPOINT =
       String.format("/plugins/multi-site/%s", LAG_ENDPOINT_SEGMENT);
   private ReplicationStatus replicationStatus;
+  private Configuration multiSiteConfig;
 
   public static class TestModule extends AbstractModule {
     @Inject WorkQueue workQueue;
+    @Inject Configuration config;
 
     @Override
     protected void configure() {
       install(new ForwarderModule());
       install(new CacheModule());
-      install(new RouterModule());
+      install(new RouterModule(config.index()));
       install(new IndexModule());
       install(new ReplicationStatusModule(workQueue));
       SharedRefDbConfiguration sharedRefDbConfig =
@@ -83,11 +87,13 @@
   @Before
   public void setUp() throws IOException {
     replicationStatus = plugin.getSysInjector().getInstance(ReplicationStatus.class);
+    multiSiteConfig = plugin.getSysInjector().getInstance(Configuration.class);
   }
 
   @Test
   @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
   public void shouldSucceedForAdminUsers() throws Exception {
+    assumeReplicationLagEnabled();
     RestResponse result = adminRestSession.get(LAG_ENDPOINT);
 
     result.assertOK();
@@ -97,6 +103,7 @@
   @Test
   @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
   public void shouldFailWhenUserHasNoAdminServerCapability() throws Exception {
+    assumeReplicationLagEnabled();
     RestResponse result = userRestSession.get(LAG_ENDPOINT);
     result.assertForbidden();
     assertThat(result.getEntityContent()).contains("not permitted");
@@ -105,6 +112,7 @@
   @Test
   @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
   public void shouldReturnCurrentProjectLag() throws Exception {
+    assumeReplicationLagEnabled();
     replicationStatus.doUpdateLag(Project.nameKey("foo"), 123L);
 
     RestResponse result = adminRestSession.get(LAG_ENDPOINT);
@@ -116,6 +124,7 @@
   @Test
   @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
   public void shouldReturnProjectsOrderedDescendinglyByLag() throws Exception {
+    assumeReplicationLagEnabled();
     replicationStatus.doUpdateLag(Project.nameKey("bar"), 123L);
     replicationStatus.doUpdateLag(Project.nameKey("foo"), 3L);
     replicationStatus.doUpdateLag(Project.nameKey("baz"), 52300L);
@@ -129,6 +138,7 @@
   @Test
   @GerritConfig(name = "gerrit.instanceId", value = "testInstanceId")
   public void shouldHonourTheLimitParameter() throws Exception {
+    assumeReplicationLagEnabled();
     replicationStatus.doUpdateLag(Project.nameKey("bar"), 1L);
     replicationStatus.doUpdateLag(Project.nameKey("foo"), 2L);
     replicationStatus.doUpdateLag(Project.nameKey("baz"), 3L);
@@ -142,4 +152,10 @@
   private String contentWithoutMagicJson(RestResponse response) throws IOException {
     return response.getEntityContent().substring(RestApiServlet.JSON_MAGIC.length);
   }
+
+  private void assumeReplicationLagEnabled() {
+    assumeTrue(
+        "Replication status skipped as replication lag is disabled",
+        multiSiteConfig.replicationLagEnabled());
+  }
 }
