diff --git a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
index 6c93e91..98df366 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/HealthCheckConfig.java
@@ -18,10 +18,16 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Strings;
 import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.reviewdb.client.Project;
+import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 import org.eclipse.jgit.errors.ConfigInvalidException;
 import org.eclipse.jgit.lib.Config;
 
@@ -32,12 +38,20 @@
   private static final long HEALTHCHECK_TIMEOUT_DEFAULT = 500L;
   private static final String QUERY_DEFAULT = "status:open";
   private static final int LIMIT_DEFAULT = 10;
+  private final AllProjectsName allProjectsName;
+  private final AllUsersName allUsersName;
 
   private final Config config;
 
   @Inject
-  public HealthCheckConfig(PluginConfigFactory configFactory, @PluginName String pluginName) {
+  public HealthCheckConfig(
+      PluginConfigFactory configFactory,
+      @PluginName String pluginName,
+      AllProjectsName allProjectsName,
+      AllUsersName allUsersName) {
     config = configFactory.getGlobalPluginConfig(pluginName);
+    this.allProjectsName = allProjectsName;
+    this.allUsersName = allUsersName;
   }
 
   @VisibleForTesting
@@ -50,6 +64,8 @@
         throw new IllegalArgumentException("Invalid configuration " + configText, e);
       }
     }
+    allProjectsName = new AllProjectsName("All-Projects");
+    allUsersName = new AllUsersName("All-Users");
   }
 
   public long getTimeout() {
@@ -72,4 +88,14 @@
     int defaultLimit = healthCheckName == null ? LIMIT_DEFAULT : getLimit(null);
     return config.getInt(HEALTHCHECK, healthCheckName, "limit", defaultLimit);
   }
+
+  public Set<Project.NameKey> getJGITRepositories(String healthCheckName) {
+    Set<Project.NameKey> repos =
+        Stream.of(config.getStringList(HEALTHCHECK, healthCheckName, "project"))
+            .map(Project.NameKey::new)
+            .collect(Collectors.toSet());
+    repos.add(allProjectsName);
+    repos.add(allUsersName);
+    return repos;
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/JGitHealthCheck.java b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/JGitHealthCheck.java
index 73fa88d..fe59bbb 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/JGitHealthCheck.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/healthcheck/check/JGitHealthCheck.java
@@ -17,37 +17,37 @@
 import static com.googlesource.gerrit.plugins.healthcheck.check.HealthCheckNames.JGIT;
 
 import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.healthcheck.HealthCheckConfig;
-import org.eclipse.jgit.lib.ObjectId;
+import java.util.Set;
 import org.eclipse.jgit.lib.Repository;
 
 @Singleton
 public class JGitHealthCheck extends AbstractHealthCheck {
   private final GitRepositoryManager repositoryManager;
-  private final AllProjectsName allProjectsName;
+  private final Set<Project.NameKey> repositoryNameKeys;
 
   @Inject
   public JGitHealthCheck(
       ListeningExecutorService executor,
       HealthCheckConfig config,
-      GitRepositoryManager repositoryManager,
-      AllProjectsName allProjectsName) {
+      GitRepositoryManager repositoryManager) {
     super(executor, config, JGIT);
 
     this.repositoryManager = repositoryManager;
-    this.allProjectsName = allProjectsName;
+    this.repositoryNameKeys = config.getJGITRepositories(JGIT);
   }
 
   @Override
   protected Result doCheck() throws Exception {
-    try (Repository allProjects = repositoryManager.openRepository(allProjectsName)) {
-      ObjectId headObj = allProjects.resolve("refs/meta/config");
-      allProjects.open(headObj).getType();
-      return Result.PASSED;
+    for (Project.NameKey repoNameKey : repositoryNameKeys) {
+      try (Repository repo = repositoryManager.openRepository(repoNameKey)) {
+        repo.open(repo.resolve("refs/meta/config")).getType();
+      }
     }
+    return Result.PASSED;
   }
 }
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index 74ad62c..c064bc3 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -63,4 +63,10 @@
 - `healthcheck.<checkName>.limit` : Maximum number of elements to retrieve from
   the the check results.
 
-  Default: 10
\ No newline at end of file
+  Default: 10
+
+- `healthcheck.jgit.project` : A project name to check for accessibility of its refs/meta/config.
+   Multiple occurrences are allowed to configure more projects, in addition
+   to the default ones that are always included.
+
+  Default: All-Projects, All-Users
\ No newline at end of file
diff --git a/src/test/java/com/googlesource/gerrit/plugins/healthcheck/JGitHealthCheckTest.java b/src/test/java/com/googlesource/gerrit/plugins/healthcheck/JGitHealthCheckTest.java
index b44ca9a..f41d33f 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/healthcheck/JGitHealthCheckTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/healthcheck/JGitHealthCheckTest.java
@@ -16,11 +16,13 @@
 
 import static com.google.common.truth.Truth.assertThat;
 import static com.googlesource.gerrit.plugins.healthcheck.HealthCheckConfig.DEFAULT_CONFIG;
+import static com.googlesource.gerrit.plugins.healthcheck.check.HealthCheckNames.JGIT;
 import static org.eclipse.jgit.lib.RefUpdate.Result.NEW;
 
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.config.AllProjectsName;
+import com.google.gerrit.server.config.AllUsersName;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gerrit.server.git.RepositoryCaseMismatchException;
 import com.google.gerrit.testutil.InMemoryRepositoryManager;
@@ -44,6 +46,7 @@
 
 public class JGitHealthCheckTest {
   private AllProjectsName allProjectsName = new AllProjectsName("All-Projects");
+  private AllUsersName allUsersName = new AllUsersName("All-Users");
   private InMemoryRepositoryManager inMemoryRepositoryManager = new InMemoryRepositoryManager();
   private PersonIdent personIdent = new PersonIdent("Gerrit Rietveld", "gerrit@rietveld.nl");
 
@@ -53,24 +56,40 @@
   public void setupAllProjects() throws Exception {
     Guice.createInjector(new HealthCheckModule()).injectMembers(this);
 
-    InMemoryRepositoryManager.Repo repo =
+    InMemoryRepositoryManager.Repo allProjects =
         inMemoryRepositoryManager.createRepository(allProjectsName);
-    createCommit(repo, "refs/meta/config");
+    createCommit(allProjects, "refs/meta/config");
+
+    InMemoryRepositoryManager.Repo allUsers =
+        inMemoryRepositoryManager.createRepository(allUsersName);
+    createCommit(allUsers, "refs/meta/config");
   }
 
   @Test
   public void shouldBeHealthyWhenJGitIsWorking() {
     JGitHealthCheck reviewDbCheck =
-        new JGitHealthCheck(
-            executor, DEFAULT_CONFIG, getWorkingRepositoryManager(), allProjectsName);
+        new JGitHealthCheck(executor, DEFAULT_CONFIG, getWorkingRepositoryManager());
     assertThat(reviewDbCheck.run().result).isEqualTo(Result.PASSED);
   }
 
   @Test
-  public void shouldBeUnhealthyWhenJGitIsFailing() {
+  public void shouldBeUnhealthyWhenJGitIsFailingForAllRepos() {
     JGitHealthCheck jGitHealthCheck =
-        new JGitHealthCheck(
-            executor, DEFAULT_CONFIG, getFailingGitRepositoryManager(), allProjectsName);
+        new JGitHealthCheck(executor, DEFAULT_CONFIG, getFailingGitRepositoryManager());
+    assertThat(jGitHealthCheck.run().result).isEqualTo(Result.FAILED);
+  }
+
+  @Test
+  public void shouldBeUnhealthyWhenJGitIsFailingSomeRepos() {
+    HealthCheckConfig config =
+        new HealthCheckConfig(
+            "[healthcheck \""
+                + JGIT
+                + "\"]\n"
+                + "  project = All-Users\n"
+                + "  project = Not-Existing-Repo");
+    JGitHealthCheck jGitHealthCheck =
+        new JGitHealthCheck(executor, config, getWorkingRepositoryManager());
     assertThat(jGitHealthCheck.run().result).isEqualTo(Result.FAILED);
   }
 
@@ -80,7 +99,7 @@
       @Override
       public Repository openRepository(Project.NameKey name)
           throws RepositoryNotFoundException, IOException {
-        throw new RepositoryNotFoundException("Can't fine repository " + name);
+        throw new RepositoryNotFoundException("Can't find repository " + name);
       }
 
       @Override
