diff --git a/BUILD b/BUILD
index 2c38d9e..7370013 100644
--- a/BUILD
+++ b/BUILD
@@ -15,7 +15,6 @@
     manifest_entries = [
         "Gerrit-PluginName: git-repo-metrics",
         "Gerrit-Module: com.googlesource.gerrit.plugins.gitrepometrics.Module",
-        "Gerrit-ReloadMode: restart",
         "Implementation-Title: git-repo-metrics plugin",
         "Implementation-URL: https://review.gerrithub.io/admin/repos/GerritForge/git-repo-metrics",
         "Implementation-Vendor: GerritForge",
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/Module.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/Module.java
index fa024bd..c501bb6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/Module.java
@@ -19,12 +19,10 @@
 import com.google.gerrit.server.events.EventListener;
 import com.google.inject.Inject;
 import com.google.inject.Scopes;
-import com.google.inject.name.Names;
 import com.googlesource.gerrit.plugins.gitrepometrics.collectors.FSMetricsCollector;
 import com.googlesource.gerrit.plugins.gitrepometrics.collectors.GitRefsMetricsCollector;
 import com.googlesource.gerrit.plugins.gitrepometrics.collectors.GitStatsMetricsCollector;
 import com.googlesource.gerrit.plugins.gitrepometrics.collectors.MetricsCollector;
-import com.googlesource.gerrit.plugins.gitrepometrics.collectors.NumberOfProjectsCollector;
 import java.util.concurrent.ScheduledExecutorService;
 
 public class Module extends LifecycleModule {
@@ -54,10 +52,5 @@
     DynamicSet.bind(binder(), MetricsCollector.class).to(FSMetricsCollector.class);
     DynamicSet.bind(binder(), MetricsCollector.class).to(GitRefsMetricsCollector.class);
     install(new UpdateGitMetricsTaskModule());
-
-    bind(Long.class)
-        .annotatedWith(Names.named(NumberOfProjectsCollector.NUM_PROJECTS))
-        .toProvider(NumberOfProjectsCollector.class);
-    listener().to(RepoCountMetricRegister.class);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/RepoCountMetricRegister.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/RepoCountMetricRegister.java
deleted file mode 100644
index 8b54fef..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/RepoCountMetricRegister.java
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (C) 2024 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.gitrepometrics;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.extensions.events.LifecycleListener;
-import com.google.gerrit.metrics.Description;
-import com.google.gerrit.metrics.MetricMaker;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.google.inject.name.Named;
-import com.googlesource.gerrit.plugins.gitrepometrics.collectors.NumberOfProjectsCollector;
-import javax.inject.Inject;
-
-@Singleton
-public class RepoCountMetricRegister implements LifecycleListener {
-  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
-  protected static final String REPO_COUNT_METRIC_NAME = "numberofprojects";
-  private final MetricMaker metricMaker;
-  private final Provider<Long> numberOfProjectsProvider;
-
-  @VisibleForTesting
-  @Inject
-  RepoCountMetricRegister(
-      @Named(NumberOfProjectsCollector.NUM_PROJECTS) Provider<Long> numberOfProjectsProvider,
-      MetricMaker metricMaker) {
-    this.metricMaker = metricMaker;
-    this.numberOfProjectsProvider = numberOfProjectsProvider;
-  }
-
-  @Override
-  public void start() {
-    logger.atInfo().log("Registering metric " + REPO_COUNT_METRIC_NAME);
-
-    metricMaker.newCallbackMetric(
-        REPO_COUNT_METRIC_NAME,
-        Long.class,
-        new Description("Number of existing projects.").setGauge().setUnit("Count"),
-        numberOfProjectsProvider::get);
-  }
-
-  @Override
-  public void stop() {}
-}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/NumberOfProjectsCollector.java b/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/NumberOfProjectsCollector.java
deleted file mode 100644
index 8a42900..0000000
--- a/src/main/java/com/googlesource/gerrit/plugins/gitrepometrics/collectors/NumberOfProjectsCollector.java
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (C) 2024 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.gitrepometrics.collectors;
-
-import com.google.common.base.Supplier;
-import com.google.common.base.Suppliers;
-import com.google.common.flogger.FluentLogger;
-import com.google.gerrit.extensions.api.GerritApi;
-import com.google.gerrit.extensions.restapi.RestApiException;
-import com.google.gerrit.server.util.ManualRequestContext;
-import com.google.gerrit.server.util.OneOffRequestContext;
-import com.google.inject.Inject;
-import com.google.inject.Provider;
-import com.google.inject.Singleton;
-import com.googlesource.gerrit.plugins.gitrepometrics.GitRepoMetricsConfig;
-import java.util.concurrent.TimeUnit;
-
-@Singleton
-public class NumberOfProjectsCollector implements Provider<Long> {
-  public static final String NUM_PROJECTS = "num-projects";
-  public static final long MIN_NUM_PROJECTS_GRACE_PERIOD_MS = 1000L;
-
-  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
-  private final Supplier<Long> numberOfProjects;
-
-  @Inject
-  NumberOfProjectsCollector(GerritApi api, OneOffRequestContext ctx, GitRepoMetricsConfig config) {
-    numberOfProjects =
-        Suppliers.memoizeWithExpiration(
-            () -> queryNumberOfProjects(ctx, api),
-            Math.max(MIN_NUM_PROJECTS_GRACE_PERIOD_MS, config.getGracePeriodMs()),
-            TimeUnit.MILLISECONDS);
-  }
-
-  private static long queryNumberOfProjects(OneOffRequestContext ctx, GerritApi api) {
-    try (ManualRequestContext c = ctx.open()) {
-      return api.projects().query("(state:active OR state:read-only)").get().size();
-    } catch (RestApiException e) {
-      logger.atWarning().withCause(e).log("Unable to query Gerrit projects list");
-      throw new IllegalStateException(e);
-    }
-  }
-
-  @Override
-  public Long get() {
-    return numberOfProjects.get();
-  }
-}
diff --git a/src/resources/Documentation/config.md b/src/resources/Documentation/config.md
index 57d2acf..2c0f39c 100644
--- a/src/resources/Documentation/config.md
+++ b/src/resources/Documentation/config.md
@@ -2,14 +2,9 @@
 ======================
 
 The @PLUGIN@ allows a systematic collection of repository metrics.
+Metrics are updated upon a `ref-update` receive.
 
-The following exposed metric is available on request with the current status:
-
-```bash
-plugins_git_repo_metrics_numberOfProjects
-```
-
-The following exposed metrics are updated upon a `ref-update` receive:
+Currently, the metrics exposed are the following:
 
 ```bash
 plugins_git_repo_metrics_numberofbitmaps_<repo_name>
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/FakeMetricMaker.java b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/FakeMetricMaker.java
index 0eb1778..6faaf99 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/FakeMetricMaker.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/FakeMetricMaker.java
@@ -14,13 +14,8 @@
 
 package com.googlesource.gerrit.plugins.gitrepometrics;
 
-import java.util.HashMap;
-import java.util.Optional;
-
 import com.codahale.metrics.Meter;
 import com.codahale.metrics.MetricRegistry;
-import com.google.common.base.Supplier;
-import com.google.gerrit.extensions.registration.RegistrationHandle;
 import com.google.gerrit.metrics.CallbackMetric0;
 import com.google.gerrit.metrics.Description;
 import com.google.gerrit.metrics.DisabledMetricMaker;
@@ -28,19 +23,16 @@
 class FakeMetricMaker extends DisabledMetricMaker {
   Integer callsCounter;
   private MetricRegistry metricRegistry;
-  HashMap<String, Supplier<?>> actionMap;
 
-  @SuppressWarnings({"rawtypes", "unchecked"})
   FakeMetricMaker(MetricRegistry metricRegistry) {
-    this.callsCounter = 0;
+    callsCounter = 0;
     this.metricRegistry = metricRegistry;
-    this.actionMap = new HashMap();
   }
 
-  @SuppressWarnings("unused")
   @Override
   public <V> CallbackMetric0<V> newCallbackMetric(
       String name, Class<V> valueClass, Description desc) {
+
     callsCounter += 1;
     metricRegistry.register(
         String.format("%s/%s/%s", "plugins", "git-repo-metrics", name), new Meter());
@@ -53,25 +45,4 @@
       public void remove() {}
     };
   }
-
-  @Override
-  public <V> RegistrationHandle newCallbackMetric(
-      String name, Class<V> valueClass, Description desc, Supplier<V> trigger) {
-    callsCounter += 1;
-
-    String metricName = String.format("%s/%s/%s", "plugins", "git-repo-metrics", name);
-
-    metricRegistry.register(metricName, new Meter());
-
-    actionMap.put(metricName, trigger);
-
-    return null;
-  }
-
-  @SuppressWarnings("rawtypes")
-  public Optional<Supplier> getValueForMetric(String metric) {
-    if (actionMap.containsKey(metric)) return Optional.of(actionMap.get(metric));
-
-    return Optional.empty();
-  }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheIT.java b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheIT.java
index b72fb9c..4eee736 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/GitRepoMetricsCacheIT.java
@@ -37,7 +37,7 @@
     sysModule = "com.googlesource.gerrit.plugins.gitrepometrics.Module")
 public class GitRepoMetricsCacheIT extends LightweightPluginDaemonTest {
 
-  private final int MAX_WAIT_TIME_FOR_METRICS_SECS = 10;
+  private final int MAX_WAIT_TIME_FOR_METRICS_SECS = 5;
 
   @Inject MetricRegistry metricRegistry;
   private FSMetricsCollector fsMetricsCollector;
@@ -77,10 +77,8 @@
             + gitRefsMetricsCollector.availableMetrics().size();
 
     try {
-      // One additional is added for the numberofprojects metric
       WaitUtil.waitUntil(
-          () ->
-              getPluginMetricsCount() == (long) (availableProjects.size() * expectedMetricsCount) + 1,
+          () -> getPluginMetricsCount() == (long) availableProjects.size() * expectedMetricsCount,
           Duration.ofSeconds(MAX_WAIT_TIME_FOR_METRICS_SECS));
     } catch (InterruptedException e) {
       fail(
diff --git a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/RepoCountMetricTest.java b/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/RepoCountMetricTest.java
deleted file mode 100644
index 725e8b7..0000000
--- a/src/test/java/com/googlesource/gerrit/plugins/gitrepometrics/RepoCountMetricTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (C) 2024 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.gitrepometrics;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import com.codahale.metrics.MetricRegistry;
-import com.google.common.base.Supplier;
-import java.util.Optional;
-import java.util.concurrent.atomic.AtomicLong;
-import org.junit.Before;
-import org.junit.Test;
-
-public class RepoCountMetricTest {
-  private FakeMetricMaker fakeMetricMaker;
-  private MetricRegistry metricRegistry;
-  private String repoCountMetricName;
-
-  @Before
-  public void setup() {
-    metricRegistry = new MetricRegistry();
-    fakeMetricMaker = new FakeMetricMaker(metricRegistry);
-    repoCountMetricName =
-        String.format(
-            "%s/%s/%s",
-            "plugins", "git-repo-metrics", RepoCountMetricRegister.REPO_COUNT_METRIC_NAME);
-  }
-
-  @Test
-  public void metricIsCorrectlyRegistered() {
-    RepoCountMetricRegister repoCountMetricRegister =
-        new RepoCountMetricRegister(() -> 1L, fakeMetricMaker);
-
-    repoCountMetricRegister.start();
-
-    assertTrue(metricRegistry.getMetrics().containsKey(repoCountMetricName));
-
-    metricRegistry.remove(repoCountMetricName);
-  }
-
-  @Test
-  public void metricIsUpdated() {
-    AtomicLong numProjects = new AtomicLong();
-    RepoCountMetricRegister repoCountMetricRegister =
-        new RepoCountMetricRegister(numProjects::get, fakeMetricMaker);
-
-    repoCountMetricRegister.start();
-
-    assertEquals(1, fakeMetricMaker.actionMap.size());
-
-    @SuppressWarnings("rawtypes")
-    Optional<Supplier> obj = fakeMetricMaker.getValueForMetric(repoCountMetricName);
-
-    assertTrue(!obj.isEmpty());
-    assertEquals(0, ((Long) obj.get().get()).longValue());
-
-    numProjects.set(2);
-    assertEquals(2, ((Long) obj.get().get()).longValue());
-  }
-}
