diff --git a/java/com/google/gerrit/plugins/checks/Checks.java b/java/com/google/gerrit/plugins/checks/Checks.java
index 747d81b..84d19cd 100644
--- a/java/com/google/gerrit/plugins/checks/Checks.java
+++ b/java/com/google/gerrit/plugins/checks/Checks.java
@@ -18,6 +18,7 @@
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gwtorm.server.OrmException;
+import java.io.IOException;
 import java.util.List;
 import java.util.Optional;
 
@@ -39,13 +40,14 @@
    * @param patchSetId the ID of the patch set
    * @return the checks, {@link Optional#empty()} if no checks with the given UUID exists
    * @throws OrmException if the checks couldn't be retrieved from the storage
+   * @throws IOException if the checks couldn't be retrieved from the storage
    */
   ImmutableList<Check> getChecks(Project.NameKey projectName, PatchSet.Id patchSetId)
-      throws OrmException;
+      throws OrmException, IOException;
 
   /**
    * Returns a {@link Optional} holding a single check. {@code Optional.empty()} if the check does
    * not exist.
    */
-  Optional<Check> getCheck(CheckKey checkKey) throws OrmException;
+  Optional<Check> getCheck(CheckKey checkKey) throws OrmException, IOException;
 }
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckOperationsImpl.java b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckOperationsImpl.java
index b289b13..ea7bf03 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckOperationsImpl.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckOperationsImpl.java
@@ -18,6 +18,7 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.gerrit.plugins.checks.Check;
+import com.google.gerrit.plugins.checks.CheckJson;
 import com.google.gerrit.plugins.checks.CheckKey;
 import com.google.gerrit.plugins.checks.CheckUpdate;
 import com.google.gerrit.plugins.checks.CheckerRef;
@@ -39,13 +40,18 @@
 public final class CheckOperationsImpl implements CheckOperations {
   private final Checks checks;
   private final ChecksUpdate checksUpdate;
+  private final CheckJson checkJson;
   private final GitRepositoryManager repoManager;
 
   @Inject
   public CheckOperationsImpl(
-      Checks checks, GitRepositoryManager repoManager, @ServerInitiated ChecksUpdate checksUpdate) {
+      Checks checks,
+      GitRepositoryManager repoManager,
+      CheckJson checkJson,
+      @ServerInitiated ChecksUpdate checksUpdate) {
     this.checks = checks;
     this.repoManager = repoManager;
+    this.checkJson = checkJson;
     this.checksUpdate = checksUpdate;
   }
 
@@ -105,8 +111,8 @@
     }
 
     @Override
-    public CheckInfo asInfo() {
-      throw new UnsupportedOperationException("todo");
+    public CheckInfo asInfo() throws Exception {
+      return checkJson.format(get());
     }
 
     @Override
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
index fbb0994..c16b5a5 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/CheckerOperationsImpl.java
@@ -233,7 +233,7 @@
       CheckerUpdate checkerUpdate = toCheckerUpdate(testCheckerUpdate);
       checkersUpdate.updateChecker(checkerUuid, checkerUpdate);
 
-      if (testCheckerUpdate.forceInvalidConfig().orElse(false)) {
+      if (testCheckerUpdate.forceInvalidConfig()) {
         try (Repository repo = repoManager.openRepository(allProjectsName)) {
           new TestRepository<>(repo)
               .branch(CheckerRef.refsCheckers(checkerUuid))
diff --git a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerUpdate.java b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerUpdate.java
index 0ee62b3..447a6df 100644
--- a/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerUpdate.java
+++ b/java/com/google/gerrit/plugins/checks/acceptance/testsuite/TestCheckerUpdate.java
@@ -43,12 +43,14 @@
 
   public abstract Optional<String> query();
 
-  public abstract Optional<Boolean> forceInvalidConfig();
+  public abstract boolean forceInvalidConfig();
 
   abstract ThrowingConsumer<TestCheckerUpdate> checkerUpdater();
 
   public static Builder builder(ThrowingConsumer<TestCheckerUpdate> checkerUpdater) {
-    return new AutoValue_TestCheckerUpdate.Builder().checkerUpdater(checkerUpdater);
+    return new AutoValue_TestCheckerUpdate.Builder()
+        .checkerUpdater(checkerUpdater)
+        .forceInvalidConfig(false);
   }
 
   @AutoValue.Builder
diff --git a/java/com/google/gerrit/plugins/checks/api/ApiModule.java b/java/com/google/gerrit/plugins/checks/api/ApiModule.java
index 72d94da..7713717 100644
--- a/java/com/google/gerrit/plugins/checks/api/ApiModule.java
+++ b/java/com/google/gerrit/plugins/checks/api/ApiModule.java
@@ -15,6 +15,7 @@
 package com.google.gerrit.plugins.checks.api;
 
 import static com.google.gerrit.plugins.checks.api.CheckResource.CHECK_KIND;
+import static com.google.gerrit.plugins.checks.api.CheckerResource.CHECKER_KIND;
 import static com.google.gerrit.server.change.RevisionResource.REVISION_KIND;
 
 import com.google.gerrit.extensions.config.FactoryModule;
@@ -29,10 +30,18 @@
 public class ApiModule extends AbstractModule {
   @Override
   protected void configure() {
+    bind(CheckersCollection.class);
+    bind(Checkers.class).to(CheckersImpl.class);
+
     install(
         new RestApiModule() {
           @Override
           public void configure() {
+            DynamicMap.mapOf(binder(), CHECKER_KIND);
+            postOnCollection(CHECKER_KIND).to(CreateChecker.class);
+            get(CHECKER_KIND).to(GetChecker.class);
+            post(CHECKER_KIND).to(UpdateChecker.class);
+
             DynamicMap.mapOf(binder(), CHECK_KIND);
             child(REVISION_KIND, "checks").to(ChecksCollection.class);
             postOnCollection(CHECK_KIND).to(PostCheck.class);
@@ -44,6 +53,7 @@
         new FactoryModule() {
           @Override
           public void configure() {
+            factory(CheckerApiImpl.Factory.class);
             factory(CheckApiImpl.Factory.class);
             factory(ChecksImpl.Factory.class);
           }
diff --git a/java/com/google/gerrit/plugins/checks/api/ChecksImpl.java b/java/com/google/gerrit/plugins/checks/api/ChecksImpl.java
index 88a019b..b0edeec 100644
--- a/java/com/google/gerrit/plugins/checks/api/ChecksImpl.java
+++ b/java/com/google/gerrit/plugins/checks/api/ChecksImpl.java
@@ -44,6 +44,7 @@
 
   private final Checks checks;
   private final Provider<ChecksUpdate> checksUpdate;
+  private final Checkers checkers;
   private final CheckJson checkJson;
   private final CheckApiImpl.Factory checkApiImplFactory;
   private final RevisionResource revisionResource;
@@ -53,11 +54,13 @@
       Checks checks,
       CheckApiImpl.Factory checkApiImplFactory,
       CheckJson checkJson,
+      Checkers checkers,
       @UserInitiated Provider<ChecksUpdate> checksUpdate,
       @Assisted RevisionResource revisionResource) {
     this.checks = checks;
     this.checkApiImplFactory = checkApiImplFactory;
     this.checkJson = checkJson;
+    this.checkers = checkers;
     this.checksUpdate = checksUpdate;
     this.revisionResource = revisionResource;
   }
@@ -67,10 +70,12 @@
     if (checkerUuid == null || checkerUuid.isEmpty()) {
       throw new BadRequestException("checkerUuid is required");
     }
+    // Check that the checker exists and throw a RestApiException if not.
+    CheckerInfo checker = checkers.id(checkerUuid).get();
 
     CheckKey checkKey =
         CheckKey.create(
-            revisionResource.getProject(), revisionResource.getPatchSet().getId(), checkerUuid);
+            revisionResource.getProject(), revisionResource.getPatchSet().getId(), checker.uuid);
     Optional<Check> check = checks.getCheck(checkKey);
     return checkApiImplFactory.create(
         new CheckResource(
@@ -89,12 +94,12 @@
     if (input.state == null) {
       throw new BadRequestException("state is required");
     }
+    // Check that the checker exists and throw a BadRequestException if not.
+    CheckerInfo checker = checkers.id(input.checkerUuid).get();
 
     CheckKey checkKey =
         CheckKey.create(
-            revisionResource.getProject(),
-            revisionResource.getPatchSet().getId(),
-            input.checkerUuid);
+            revisionResource.getProject(), revisionResource.getPatchSet().getId(), checker.uuid);
     CheckUpdate checkUpdate =
         CheckUpdate.builder()
             .setState(input.state)
@@ -111,7 +116,7 @@
     return getChecks().stream().map(checkJson::format).collect(toImmutableList());
   }
 
-  private List<Check> getChecks() throws IOException, OrmException {
+  private List<Check> getChecks() throws OrmException, IOException {
     return checks.getChecks(revisionResource.getProject(), revisionResource.getPatchSet().getId());
   }
 }
diff --git a/java/com/google/gerrit/plugins/checks/api/HttpModule.java b/java/com/google/gerrit/plugins/checks/api/HttpModule.java
index 92b9e30..f48ec72 100644
--- a/java/com/google/gerrit/plugins/checks/api/HttpModule.java
+++ b/java/com/google/gerrit/plugins/checks/api/HttpModule.java
@@ -14,10 +14,6 @@
 
 package com.google.gerrit.plugins.checks.api;
 
-import static com.google.gerrit.plugins.checks.api.CheckerResource.CHECKER_KIND;
-
-import com.google.gerrit.extensions.config.FactoryModule;
-import com.google.gerrit.extensions.registration.DynamicMap;
 import com.google.gerrit.extensions.restapi.RestApiModule;
 import com.google.inject.servlet.ServletModule;
 
@@ -25,10 +21,6 @@
 
   @Override
   protected void configureServlets() {
-    bind(CheckersCollection.class);
-
-    bind(Checkers.class).to(CheckersImpl.class);
-
     serveRegex("^/checkers/(.*)$").with(CheckersRestApiServlet.class);
 
     install(
@@ -36,18 +28,7 @@
           @Override
           public void configure() {
             // Checkers
-            DynamicMap.mapOf(binder(), CHECKER_KIND);
-            postOnCollection(CHECKER_KIND).to(CreateChecker.class);
-            get(CHECKER_KIND).to(GetChecker.class);
-            post(CHECKER_KIND).to(UpdateChecker.class);
-          }
-        });
 
-    install(
-        new FactoryModule() {
-          @Override
-          public void configure() {
-            factory(CheckerApiImpl.Factory.class);
           }
         });
   }
diff --git a/java/com/google/gerrit/plugins/checks/db/NoteDbChecks.java b/java/com/google/gerrit/plugins/checks/db/NoteDbChecks.java
index 0f846c2..1bc0195 100644
--- a/java/com/google/gerrit/plugins/checks/db/NoteDbChecks.java
+++ b/java/com/google/gerrit/plugins/checks/db/NoteDbChecks.java
@@ -15,11 +15,18 @@
 package com.google.gerrit.plugins.checks.db;
 
 import static com.google.common.collect.ImmutableList.toImmutableList;
+import static com.google.common.collect.ImmutableSet.toImmutableSet;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.flogger.FluentLogger;
 import com.google.gerrit.plugins.checks.Check;
 import com.google.gerrit.plugins.checks.CheckKey;
+import com.google.gerrit.plugins.checks.Checker;
+import com.google.gerrit.plugins.checks.CheckerUuid;
+import com.google.gerrit.plugins.checks.Checkers;
 import com.google.gerrit.plugins.checks.Checks;
+import com.google.gerrit.plugins.checks.api.CheckerStatus;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.PatchSetUtil;
@@ -27,34 +34,42 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
+import java.io.IOException;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Stream;
+import org.eclipse.jgit.errors.ConfigInvalidException;
 
 /** Class to read checks from NoteDb. */
 @Singleton
 class NoteDbChecks implements Checks {
+  private static final FluentLogger logger = FluentLogger.forEnclosingClass();
+
   private final ChangeNotes.Factory changeNotesFactory;
   private final PatchSetUtil psUtil;
   private final CheckNotes.Factory checkNotesFactory;
+  private final Checkers checkers;
 
   @Inject
   NoteDbChecks(
       ChangeNotes.Factory changeNotesFactory,
       PatchSetUtil psUtil,
-      CheckNotes.Factory checkNotesFactory) {
+      CheckNotes.Factory checkNotesFactory,
+      Checkers checkers) {
     this.changeNotesFactory = changeNotesFactory;
     this.psUtil = psUtil;
     this.checkNotesFactory = checkNotesFactory;
+    this.checkers = checkers;
   }
 
   @Override
   public ImmutableList<Check> getChecks(Project.NameKey projectName, PatchSet.Id psId)
-      throws OrmException {
+      throws OrmException, IOException {
     return getChecksAsStream(projectName, psId).collect(toImmutableList());
   }
 
   @Override
-  public Optional<Check> getCheck(CheckKey checkKey) throws OrmException {
+  public Optional<Check> getCheck(CheckKey checkKey) throws OrmException, IOException {
     // TODO(gerrit-team): Instead of reading the complete notes map, read just one note.
     return getChecksAsStream(checkKey.project(), checkKey.patchSet())
         .filter(c -> c.key().checkerUuid().equals(checkKey.checkerUuid()))
@@ -62,18 +77,38 @@
   }
 
   private Stream<Check> getChecksAsStream(Project.NameKey projectName, PatchSet.Id psId)
-      throws OrmException {
+      throws OrmException, IOException {
     // TODO(gerrit-team): Instead of reading the complete notes map, read just one note.
     ChangeNotes notes = changeNotesFactory.create(projectName, psId.getParentKey());
     PatchSet patchSet = psUtil.get(notes, psId);
     CheckNotes checkNotes = checkNotesFactory.create(notes.getChange());
+
     checkNotes.load();
+    Set<CheckerUuid> checkerUuids = activeAndValidCheckersForProject(projectName);
     return checkNotes
         .getChecks()
         .getOrDefault(patchSet.getRevision(), NoteDbCheckMap.empty())
         .checks
         .entrySet()
         .stream()
-        .map(e -> e.getValue().toCheck(projectName, psId, e.getKey()));
+        .map(e -> e.getValue().toCheck(projectName, psId, e.getKey()))
+        .filter(c -> checkerUuids.contains(CheckerUuid.parse(c.key().checkerUuid())));
+  }
+
+  /** Get all checkers that apply to a project. Might return a superset of checkers that apply. */
+  private ImmutableSet<CheckerUuid> activeAndValidCheckersForProject(Project.NameKey projectName)
+      throws IOException {
+    Stream<Checker> checkerStream;
+    try {
+      checkerStream = checkers.checkersOf(projectName).stream();
+    } catch (ConfigInvalidException e) {
+      logger.atInfo().withCause(e).log(
+          "can't bulk-load checkers for " + projectName + " will do one-by-one");
+      checkerStream = checkers.listCheckers().stream();
+    }
+    return checkerStream
+        .filter(c -> c.getStatus() == CheckerStatus.ENABLED)
+        .map(Checker::getUuid)
+        .collect(toImmutableSet());
   }
 }
diff --git a/java/com/google/gerrit/plugins/checks/db/NoteDbChecksUpdate.java b/java/com/google/gerrit/plugins/checks/db/NoteDbChecksUpdate.java
index e74d51e..2701052 100644
--- a/java/com/google/gerrit/plugins/checks/db/NoteDbChecksUpdate.java
+++ b/java/com/google/gerrit/plugins/checks/db/NoteDbChecksUpdate.java
@@ -25,8 +25,11 @@
 import com.google.gerrit.plugins.checks.Check;
 import com.google.gerrit.plugins.checks.CheckKey;
 import com.google.gerrit.plugins.checks.CheckUpdate;
+import com.google.gerrit.plugins.checks.Checker;
 import com.google.gerrit.plugins.checks.CheckerRef;
+import com.google.gerrit.plugins.checks.Checkers;
 import com.google.gerrit.plugins.checks.ChecksUpdate;
+import com.google.gerrit.plugins.checks.api.CheckerStatus;
 import com.google.gerrit.reviewdb.client.RevId;
 import com.google.gerrit.server.GerritPersonIdent;
 import com.google.gerrit.server.IdentifiedUser;
@@ -72,6 +75,7 @@
   private final RetryHelper retryHelper;
   private final ChangeNoteUtil noteUtil;
   private final Optional<IdentifiedUser> currentUser;
+  private final Checkers checkers;
 
   @AssistedInject
   NoteDbChecksUpdate(
@@ -79,8 +83,10 @@
       GitReferenceUpdated gitRefUpdated,
       RetryHelper retryHelper,
       ChangeNoteUtil noteUtil,
+      Checkers checkers,
       @GerritPersonIdent PersonIdent personIdent) {
-    this(repoManager, gitRefUpdated, retryHelper, noteUtil, personIdent, Optional.empty());
+    this(
+        repoManager, gitRefUpdated, retryHelper, noteUtil, checkers, personIdent, Optional.empty());
   }
 
   @AssistedInject
@@ -89,9 +95,17 @@
       GitReferenceUpdated gitRefUpdated,
       RetryHelper retryHelper,
       ChangeNoteUtil noteUtil,
+      Checkers checkers,
       @GerritPersonIdent PersonIdent personIdent,
       @Assisted IdentifiedUser currentUser) {
-    this(repoManager, gitRefUpdated, retryHelper, noteUtil, personIdent, Optional.of(currentUser));
+    this(
+        repoManager,
+        gitRefUpdated,
+        retryHelper,
+        noteUtil,
+        checkers,
+        personIdent,
+        Optional.of(currentUser));
   }
 
   private NoteDbChecksUpdate(
@@ -99,12 +113,14 @@
       GitReferenceUpdated gitRefUpdated,
       RetryHelper retryHelper,
       ChangeNoteUtil noteUtil,
+      Checkers checkers,
       @GerritPersonIdent PersonIdent personIdent,
       Optional<IdentifiedUser> currentUser) {
     this.repoManager = repoManager;
     this.gitRefUpdated = gitRefUpdated;
     this.retryHelper = retryHelper;
     this.noteUtil = noteUtil;
+    this.checkers = checkers;
     this.currentUser = currentUser;
     this.personIdent = personIdent;
   }
@@ -141,6 +157,8 @@
 
   private Check upsertCheckInNoteDb(CheckKey checkKey, CheckUpdate checkUpdate, Operation operation)
       throws IOException, ConfigInvalidException, OrmDuplicateKeyException {
+    assertCheckerPresentAndEnabled(checkKey.checkerUuid());
+
     try (Repository repo = repoManager.openRepository(checkKey.project());
         ObjectInserter objectInserter = repo.newObjectInserter();
         RevWalk rw = new RevWalk(repo)) {
@@ -181,6 +199,17 @@
     }
   }
 
+  private void assertCheckerPresentAndEnabled(String checkerUuid)
+      throws ConfigInvalidException, IOException {
+    Checker checker =
+        checkers
+            .getChecker(checkerUuid)
+            .orElseThrow(() -> new IOException(checkerUuid + " missing"));
+    if (checker.getStatus() != CheckerStatus.ENABLED) {
+      throw new IOException("checker " + checkerUuid + " unknown");
+    }
+  }
+
   private boolean updateNotesMap(
       CheckKey checkKey,
       CheckUpdate checkUpdate,
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/ChecksRestApiBindingsIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/ChecksRestApiBindingsIT.java
index c708c16..96886ed 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/ChecksRestApiBindingsIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/ChecksRestApiBindingsIT.java
@@ -61,7 +61,7 @@
 
   @Test
   public void scopedCheckEndpoints() throws Exception {
-    CheckerUuid checkerUuid = checkerOperations.newChecker().create();
+    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();
     CheckKey key = CheckKey.create(project, createChange().getPatchSetId(), checkerUuid.toString());
     checkOperations.newCheck(key).setState(CheckState.RUNNING).upsert();
     RestApiCallHelper.execute(
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/GetCheckIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/GetCheckIT.java
index ac5843d..2124aa2 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/GetCheckIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/GetCheckIT.java
@@ -17,7 +17,9 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.plugins.checks.CheckKey;
+import com.google.gerrit.plugins.checks.CheckerUuid;
 import com.google.gerrit.plugins.checks.api.CheckInfo;
 import com.google.gerrit.plugins.checks.api.CheckState;
 import com.google.gerrit.reviewdb.client.PatchSet;
@@ -35,17 +37,38 @@
 
   @Test
   public void getCheck() throws Exception {
-    String name = "my-checker";
-    CheckKey key = CheckKey.create(project, patchSetId, name);
+    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();
+    CheckKey key = CheckKey.create(project, patchSetId, checkerUuid.toString());
     checkOperations.newCheck(key).setState(CheckState.RUNNING).upsert();
 
-    CheckInfo info = checksApiFactory.revision(patchSetId).id(name).get();
-    assertThat(info.checkerUuid).isEqualTo(name);
-    assertThat(info.state).isEqualTo(CheckState.RUNNING);
-    assertThat(info.started).isNull();
-    assertThat(info.finished).isNull();
-    assertThat(info.created).isNotNull();
-    assertThat(info.updated).isNotNull();
+    CheckInfo info = checksApiFactory.revision(patchSetId).id(checkerUuid.toString()).get();
+    assertThat(info).isEqualTo(checkOperations.check(key).asInfo());
+  }
+
+  @Test
+  public void getCheckForDisabledCheckerThrowsNotFound() throws Exception {
+    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();
+    CheckKey key = CheckKey.create(project, patchSetId, checkerUuid.toString());
+    checkOperations.newCheck(key).setState(CheckState.RUNNING).upsert();
+
+    checkerOperations.checker(checkerUuid).forUpdate().disable().update();
+
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: " + checkerUuid);
+    checksApiFactory.revision(patchSetId).id(checkerUuid.toString()).get();
+  }
+
+  @Test
+  public void getCheckForInvalidCheckerThrowsNotFound() throws Exception {
+    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();
+    CheckKey key = CheckKey.create(project, patchSetId, checkerUuid.toString());
+    checkOperations.newCheck(key).setState(CheckState.RUNNING).upsert();
+
+    checkerOperations.checker(checkerUuid).forUpdate().forceInvalidConfig().update();
+
+    exception.expect(RestApiException.class);
+    exception.expectMessage("Cannot retrieve checker " + checkerUuid);
+    checksApiFactory.revision(patchSetId).id(checkerUuid.toString()).get();
   }
 
   @Test
@@ -55,4 +78,12 @@
 
     checksApiFactory.revision(patchSetId).id("non-existing").get();
   }
+
+  @Test
+  public void getNonExistingCheckWithInvalidUuidFails() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: n0n-e#isting");
+
+    checksApiFactory.revision(patchSetId).id("n0n-e#isting").get();
+  }
 }
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/CreateCheckIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/CreateCheckIT.java
index 7291a69..77550be 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/CreateCheckIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/CreateCheckIT.java
@@ -17,6 +17,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.gerrit.plugins.checks.CheckKey;
+import com.google.gerrit.plugins.checks.CheckerUuid;
 import com.google.gerrit.plugins.checks.acceptance.AbstractCheckersTest;
 import com.google.gerrit.plugins.checks.acceptance.testsuite.CheckOperations.PerCheckOperations;
 import com.google.gerrit.plugins.checks.api.CheckInfo;
@@ -53,38 +54,40 @@
 
   @Test
   public void createCheck() throws Exception {
-    String checkerUuid = "my-checker";
+    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();
 
     CheckInput input = new CheckInput();
-    input.checkerUuid = checkerUuid;
+    input.checkerUuid = checkerUuid.toString();
     input.state = CheckState.RUNNING;
 
     CheckInfo info = checksApiFactory.revision(patchSetId).create(input).get();
-    assertThat(info.checkerUuid).isEqualTo(checkerUuid);
+    assertThat(info.checkerUuid).isEqualTo(checkerUuid.toString());
     assertThat(info.state).isEqualTo(CheckState.RUNNING);
     assertThat(info.started).isNull();
     assertThat(info.finished).isNull();
     assertThat(info.created).isNotNull();
     assertThat(info.updated).isNotNull();
 
-    CheckKey key = CheckKey.create(project, patchSetId, checkerUuid);
+    CheckKey key = CheckKey.create(project, patchSetId, checkerUuid.toString());
     PerCheckOperations perCheckOps = checkOperations.check(key);
 
     // TODO(gerrit-team) Add a Truth subject for the notes map
     Map<RevId, String> notes = perCheckOps.notesAsText();
-    assertThat(notes).containsExactly(revId, noteDbContent());
+    assertThat(notes).containsExactly(revId, noteDbContent(checkerUuid.toString()));
   }
 
   // TODO(gerrit-team) More tests, especially for multiple checkers and PS and how commits behave
 
-  private String noteDbContent() {
+  private String noteDbContent(String uuid) {
     return ""
         + "{\n"
         + "  \"checks\": {\n"
-        + "    \"my-checker\": {\n"
+        + "    \""
+        + uuid
+        + "\": {\n"
         + "      \"state\": \"RUNNING\",\n"
-        + "      \"created\": \"1970-01-01T00:00:22Z\",\n"
-        + "      \"updated\": \"1970-01-01T00:00:22Z\"\n"
+        + "      \"created\": \"1970-01-01T00:00:25Z\",\n"
+        + "      \"updated\": \"1970-01-01T00:00:25Z\"\n"
         + "    }\n"
         + "  }\n"
         + "}";
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java
index cf69ca1..9f4b267 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListCheckersIT.java
@@ -21,15 +21,11 @@
 import com.google.common.collect.ImmutableList;
 import com.google.gerrit.acceptance.testsuite.request.RequestScopeOperations;
 import com.google.gerrit.extensions.restapi.AuthException;
-import com.google.gerrit.plugins.checks.CheckerRef;
 import com.google.gerrit.plugins.checks.CheckerUuid;
 import com.google.gerrit.plugins.checks.acceptance.AbstractCheckersTest;
 import com.google.gerrit.plugins.checks.api.CheckerInfo;
-import com.google.gerrit.plugins.checks.db.CheckerConfig;
 import com.google.inject.Inject;
 import java.util.List;
-import org.eclipse.jgit.junit.TestRepository;
-import org.eclipse.jgit.lib.Repository;
 import org.junit.Test;
 
 public class ListCheckersIT extends AbstractCheckersTest {
@@ -80,19 +76,10 @@
   public void listIgnoresInvalidCheckers() throws Exception {
     CheckerUuid checkerUuid =
         checkerOperations.newChecker().name("checker-with-name-only").create();
-    createInvalidChecker();
+    CheckerUuid invalidCheckerUuid = checkerOperations.newChecker().create();
+    checkerOperations.checker(invalidCheckerUuid).forUpdate().forceInvalidConfig().update();
 
     List<CheckerInfo> allCheckers = checkersApi.all();
     assertThat(allCheckers).containsExactly(checkerOperations.checker(checkerUuid).asInfo());
   }
-
-  private void createInvalidChecker() throws Exception {
-    try (Repository repo = repoManager.openRepository(allProjects)) {
-      new TestRepository<>(repo)
-          .branch(CheckerRef.refsCheckers(CheckerUuid.parse("test:checker")))
-          .commit()
-          .add(CheckerConfig.CHECKER_CONFIG_FILE, "invalid-config")
-          .create();
-    }
-  }
 }
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListChecksIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListChecksIT.java
index 1555e20..2a1c4ae 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListChecksIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/ListChecksIT.java
@@ -17,6 +17,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.gerrit.plugins.checks.CheckKey;
+import com.google.gerrit.plugins.checks.CheckerUuid;
 import com.google.gerrit.plugins.checks.acceptance.AbstractCheckersTest;
 import com.google.gerrit.plugins.checks.api.CheckInfo;
 import com.google.gerrit.plugins.checks.api.CheckState;
@@ -27,22 +28,44 @@
 
 public class ListChecksIT extends AbstractCheckersTest {
   private PatchSet.Id patchSetId;
+  private CheckKey checkKey1;
+  private CheckKey checkKey2;
 
   @Before
   public void setTimeForTesting() throws Exception {
     patchSetId = createChange().getPatchSetId();
+
+    CheckerUuid checker1Uuid = checkerOperations.newChecker().repository(project).create();
+    CheckerUuid checker2Uuid = checkerOperations.newChecker().repository(project).create();
+
+    checkKey1 = CheckKey.create(project, patchSetId, checker1Uuid.toString());
+    checkOperations.newCheck(checkKey1).setState(CheckState.RUNNING).upsert();
+
+    checkKey2 = CheckKey.create(project, patchSetId, checker2Uuid.toString());
+    checkOperations.newCheck(checkKey2).setState(CheckState.RUNNING).upsert();
   }
 
   @Test
   public void listAll() throws Exception {
-    CheckKey key1 = CheckKey.create(project, patchSetId, "my-checker-1");
-    checkOperations.newCheck(key1).setState(CheckState.RUNNING).upsert();
-
-    CheckKey key2 = CheckKey.create(project, patchSetId, "my-checker-2");
-    checkOperations.newCheck(key2).setState(CheckState.RUNNING).upsert();
-
-    // TODO(gerrit-team): Use a truth subject to make this assertation proper
     Collection<CheckInfo> info = checksApiFactory.revision(patchSetId).list();
-    assertThat(info).hasSize(2);
+    assertThat(info)
+        .containsExactly(
+            checkOperations.check(checkKey1).asInfo(), checkOperations.check(checkKey2).asInfo());
+  }
+
+  @Test
+  public void listExcludesCheckFromDisabledChecker() throws Exception {
+    checkerOperations.checker(checkKey2.checkerUuid()).forUpdate().disable().update();
+
+    Collection<CheckInfo> info = checksApiFactory.revision(patchSetId).list();
+    assertThat(info).containsExactly(checkOperations.check(checkKey1).asInfo());
+  }
+
+  @Test
+  public void listExcludesCheckFromInvalidChecker() throws Exception {
+    checkerOperations.checker(checkKey2.checkerUuid()).forUpdate().forceInvalidConfig().update();
+
+    Collection<CheckInfo> info = checksApiFactory.revision(patchSetId).list();
+    assertThat(info).containsExactly(checkOperations.check(checkKey1).asInfo());
   }
 }
diff --git a/javatests/com/google/gerrit/plugins/checks/acceptance/api/UpdateCheckIT.java b/javatests/com/google/gerrit/plugins/checks/acceptance/api/UpdateCheckIT.java
index 768dfd9..6b5db88 100644
--- a/javatests/com/google/gerrit/plugins/checks/acceptance/api/UpdateCheckIT.java
+++ b/javatests/com/google/gerrit/plugins/checks/acceptance/api/UpdateCheckIT.java
@@ -16,7 +16,10 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
+import com.google.gerrit.extensions.restapi.RestApiException;
 import com.google.gerrit.plugins.checks.CheckKey;
+import com.google.gerrit.plugins.checks.CheckerUuid;
 import com.google.gerrit.plugins.checks.acceptance.AbstractCheckersTest;
 import com.google.gerrit.plugins.checks.api.CheckInfo;
 import com.google.gerrit.plugins.checks.api.CheckInput;
@@ -27,21 +30,48 @@
 
 public class UpdateCheckIT extends AbstractCheckersTest {
   private PatchSet.Id patchSetId;
+  private CheckKey checkKey;
 
   @Before
   public void setTimeForTesting() throws Exception {
     patchSetId = createChange().getPatchSetId();
+
+    CheckerUuid checkerUuid = checkerOperations.newChecker().repository(project).create();
+    checkKey = CheckKey.create(project, patchSetId, checkerUuid.toString());
+    checkOperations.newCheck(checkKey).setState(CheckState.RUNNING).upsert();
   }
 
   @Test
   public void updateCheckState() throws Exception {
-    CheckKey key = CheckKey.create(project, patchSetId, "my-checker-1");
-    checkOperations.newCheck(key).setState(CheckState.RUNNING).upsert();
-
     CheckInput input = new CheckInput();
     input.state = CheckState.FAILED;
 
-    CheckInfo info = checksApiFactory.revision(patchSetId).id("my-checker-1").update(input);
+    CheckInfo info = checksApiFactory.revision(patchSetId).id(checkKey.checkerUuid()).update(input);
     assertThat(info.state).isEqualTo(CheckState.FAILED);
   }
+
+  @Test
+  public void updateCheckStateForDisabledChecker() throws Exception {
+    checkerOperations.checker(checkKey.checkerUuid()).forUpdate().disable().update();
+
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: " + checkKey.checkerUuid());
+    checksApiFactory.revision(patchSetId).id(checkKey.checkerUuid()).update(new CheckInput());
+  }
+
+  @Test
+  public void updateCheckStateForInvalidChecker() throws Exception {
+    checkerOperations.checker(checkKey.checkerUuid()).forUpdate().forceInvalidConfig().update();
+
+    exception.expect(RestApiException.class);
+    exception.expectMessage("Cannot retrieve checker " + checkKey.checkerUuid());
+    checksApiFactory.revision(patchSetId).id(checkKey.checkerUuid()).update(new CheckInput());
+  }
+
+  @Test
+  public void updateCheckStateWithInvalidUuid() throws Exception {
+    exception.expect(ResourceNotFoundException.class);
+    exception.expectMessage("Not found: in#alid");
+    checksApiFactory.revision(patchSetId).id("in#alid").update(new CheckInput());
+  }
 }
