diff --git a/gr-checks/BUILD b/gr-checks/BUILD
index e2dd6bd..e8f2e82 100644
--- a/gr-checks/BUILD
+++ b/gr-checks/BUILD
@@ -10,7 +10,7 @@
 polygerrit_plugin(
     name = "gr-checks",
     app = "gr-checks.html",
-    plugin_name = "checks",
+    plugin_name = "checks-pg",
     externs = ["externs.js"],
     srcs = glob([
             "*.html",
diff --git a/gr-checks/gr-checks-all-statuses.js b/gr-checks/gr-checks-all-statuses.js
index 9f76441..17a7bee 100644
--- a/gr-checks/gr-checks-all-statuses.js
+++ b/gr-checks/gr-checks-all-statuses.js
@@ -1,72 +1,64 @@
 (function() {
-'use strict';
+  'use strict';
 
-window.Gerrit = (window.Gerrit || {});
-window.Gerrit.Checks = (window.Gerrit.Checks || {});
+  window.Gerrit = (window.Gerrit || {});
+  window.Gerrit.Checks = (window.Gerrit.Checks || {});
 
-// Prevent redefinition.
-if (window.Gerrit.Checks.Statuses) return;
+  // Prevent redefinition.
+  if (window.Gerrit.Checks.Statuses) return;
 
-const Statuses = {
-  // non-terminal statuses
-  STATUS_UNKNOWN: 'STATUS_UNKNOWN',
-  QUEUING: 'QUEUING',
-  QUEUED: 'QUEUED',
-  WORKING: 'WORKING',
+  const Statuses = {
+    // non-terminal statuses
+    NOT_STARTED: 'NOT_STARTED',
+    SCHEDULED: 'SCHEDULED',
+    RUNNING: 'RUNNING',
 
-  // terminal statuses
-  SUCCESS: 'SUCCESS',
-  FAILURE: 'FAILURE',
-  INTERNAL_ERROR: 'INTERNAL_ERROR',
-  TIMEOUT: 'TIMEOUT',
-  CANCELLED: 'CANCELLED',
-};
+    // terminal statuses
+    SUCCESSFUL: 'SUCCESSFUL',
+    FAILED: 'FAILED',
+    NOT_RELEVANT: 'NOT_RELEVANT',
+  };
 
+  function isStatus(status, includedStatuses) {
+    return includedStatuses.includes(status);
+  }
 
-function isStatus(status, includedStatuses) {
-  return includedStatuses.includes(status);
-}
+  function isUnevaluated(status) {
+    return isStatus(status, [Statuses.NOT_STARTED, Statuses.NOT_RELEVANT]);
+  }
 
+  function isInProgress(status) {
+    return isStatus(status, [Statuses.SCHEDULED, Statuses.RUNNING]);
+  }
 
-function isUnevaluated(status) {
-  return isStatus(status, [Statuses.STATUS_UNKNOWN, Statuses.CANCELLED]);
-}
+  function isSuccessful(status) {
+    return isStatus(status, [Statuses.SUCCESSFUL]);
+  }
 
-function isInProgress(status) {
-  return isStatus(
-      status, [Statuses.QUEUING, Statuses.QUEUED, Statuses.WORKING]);
-}
+  function isFailed(status) {
+    return isStatus(status, [Statuses.FAILED]);
+  }
 
-function isSuccessful(status) {
-  return isStatus(status, [Statuses.SUCCESS]);
-}
-
-function isFailed(status) {
-  return isStatus(
-      status, [Statuses.FAILURE, Statuses.INTERNAL_ERROR, Statuses.TIMEOUT]);
-}
-
-
-function statusClass(status) {
-  if (isUnevaluated(status)) {
+  function statusClass(status) {
+    if (isUnevaluated(status)) {
+      return 'unevaluated';
+    }
+    if (isInProgress(status)) {
+      return 'in-progress';
+    }
+    if (isSuccessful(status)) {
+      return 'successful';
+    }
+    if (isFailed(status)) {
+      return 'failed';
+    }
     return 'unevaluated';
   }
-  if (isInProgress(status)) {
-    return 'in-progress';
-  }
-  if (isSuccessful(status)) {
-    return 'successful';
-  }
-  if (isFailed(status)) {
-    return 'failed';
-  }
-  return 'unevaluated';
-}
 
-window.Gerrit.Checks.Statuses = Statuses;
-window.Gerrit.Checks.isUnevaluated = isUnevaluated;
-window.Gerrit.Checks.isInProgress = isInProgress;
-window.Gerrit.Checks.isSuccessful = isSuccessful;
-window.Gerrit.Checks.isFailed = isFailed;
-window.Gerrit.Checks.statusClass = statusClass;
+  window.Gerrit.Checks.Statuses = Statuses;
+  window.Gerrit.Checks.isUnevaluated = isUnevaluated;
+  window.Gerrit.Checks.isInProgress = isInProgress;
+  window.Gerrit.Checks.isSuccessful = isSuccessful;
+  window.Gerrit.Checks.isFailed = isFailed;
+  window.Gerrit.Checks.statusClass = statusClass;
 })();
diff --git a/gr-checks/gr-checks-chip-view.js b/gr-checks/gr-checks-chip-view.js
index 415bc1f..778f87d 100644
--- a/gr-checks/gr-checks-chip-view.js
+++ b/gr-checks/gr-checks-chip-view.js
@@ -1,124 +1,114 @@
 (function() {
-'use strict';
-const Statuses = window.Gerrit.Checks.Statuses;
+  'use strict';
+  const Statuses = window.Gerrit.Checks.Statuses;
 
-const StatusPriorityOrder = [
-  Statuses.INTERNAL_ERROR, Statuses.TIMEOUT, Statuses.FAILURE,
-  Statuses.STATUS_UNKNOWN, Statuses.CANCELLED, Statuses.QUEUED,
-  Statuses.QUEUING, Statuses.WORKING, Statuses.SUCCESS
-];
+  const StatusPriorityOrder = [
+    Statuses.FAILED,
+    Statuses.SCHEDULED,
+    Statuses.RUNNING,
+    Statuses.SUCCESSFUL,
+    Statuses.NOT_STARTED,
+    Statuses.NOT_RELEVANT,
+  ];
 
-const HumanizedStatuses = {
-  // non-terminal statuses
-  STATUS_UNKNOWN: 'unevaluated',
-  QUEUING: 'in progress',
-  QUEUED: 'in progress',
-  WORKING: 'in progress',
+  const HumanizedStatuses = {
+    // non-terminal statuses
+    NOT_STARTED: 'in progress',
+    NOT_RELEVANT: 'not relevant',
+    SCHEDULED: 'in progress',
+    RUNNING: 'in progress',
 
-  // terminal statuses
-  SUCCESS: 'successful',
-  FAILURE: 'failed',
-  INTERNAL_ERROR: 'failed',
-  TIMEOUT: 'failed',
-  CANCELLED: 'unevaluated',
-};
+    // terminal statuses
+    SUCCESSFUL: 'successful',
+    FAILED: 'failed',
+  };
 
+  const Defs = {};
+  /**
+   * @typedef {{
+   *   _number: number,
+   * }}
+   */
+  Defs.Change;
+  /**
+   * @typedef {{
+   *   _number: number,
+   * }}
+   */
+  Defs.Revision;
 
-const Defs = {};
-/**
- * @typedef {{
- *   revisions: !Object<string, !Object>,
- * }}
- */
-Defs.Change;
+  function computeCheckStatuses(checks) {
+    return checks.reduce((accum, check) => {
+      accum[check.state] || (accum[check.state] = 0);
+      accum[check.state]++;
+      return accum;
+    }, {total: checks.length});
+  }
 
-/**
- * @param {!Defs.Change} change The current CL.
- * @param {!Object} revision The current patchset.
- * @return {string|undefined}
- */
-function currentRevisionSha(change, revision) {
-  return Object.keys(change.revisions)
-      .find(sha => change.revisions[sha] === revision);
-}
+  Polymer({
+    is: 'gr-checks-chip-view',
 
-function computeCheckStatuses(checks) {
-  return checks.reduce((accum, check) => {
-    accum[check.state] || (accum[check.state] = 0);
-    accum[check.state]++;
-    return accum;
-  }, {total: checks.length});
-}
-
-Polymer({
-  is: 'gr-checks-chip-view',
-
-  properties: {
-    revision: Object,
-    change: Object,
-    // TODO(brohlfs): Implement getChecks based on new Rest APIs.
-    /** @type {function(string, (string|undefined)): !Promise<!Object>} */
-    getChecks: Function,
-    _checkStatuses: Object,
-    _hasChecks: Boolean,
-    _status: {type: String, computed: '_computeStatus(_checkStatuses)'},
-    _statusString: {
-      type: String,
-      computed: '_computeStatusString(_status, _checkStatuses)'
+    properties: {
+      revision: Object,
+      change: Object,
+      /** @type {function(number, number): !Promise<!Object>} */
+      getChecks: Function,
+      _checkStatuses: Object,
+      _hasChecks: Boolean,
+      _status: {type: String, computed: '_computeStatus(_checkStatuses)'},
+      _statusString: {
+        type: String,
+        computed: '_computeStatusString(_status, _checkStatuses)',
+      },
+      _chipClasses: {type: String, computed: '_computeChipClass(_status)'},
     },
-    _chipClasses: {type: String, computed: '_computeChipClass(_status)'},
-  },
 
-  observers: [
-    '_fetchChecks(change, revision, getChecks)',
-  ],
+    observers: [
+      '_fetchChecks(change, revision, getChecks)',
+    ],
 
-  /**
-   * @param {!Defs.Change} change The current CL.
-   * @param {!Object} revision The current patchset.
-   * @param {function(string, (string|undefined)): !Promise<!Object>}
-   *     getChecks function to get checks.
-   */
-  _fetchChecks(change, revision, getChecks) {
-    const repository = change['project'];
-    const gitSha = currentRevisionSha(change, revision);
+    /**
+     * @param {!Defs.Change} change
+     * @param {!Defs.Revision} revision
+     * @param {function(number, number): !Promise<!Object>} getChecks
+     */
+    _fetchChecks(change, revision, getChecks) {
+      getChecks(change._number, revision._number).then(checks => {
+        this.set('_hasChecks', checks.length > 0);
+        if (checks.length > 0) {
+          this.set(
+              '_checkStatuses', computeCheckStatuses(checks));
+        }
+      });
+    },
 
-    getChecks(repository, gitSha).then(checks => {
-      this.set('_hasChecks', checks.length > 0);
-      if (checks.length > 0) {
-        this.set(
-            '_checkStatuses', computeCheckStatuses(checks));
-      }
-    });
-  },
+    /**
+     * @param {!Object} checkStatuses The number of checks in each status.
+     * @return {string}
+     */
+    _computeStatus(checkStatuses) {
+      return StatusPriorityOrder.find(
+          status => checkStatuses[status] > 0) ||
+          Statuses.STATUS_UNKNOWN;
+    },
 
-  /**
-   * @param {!Object} checkStatuses The number of checks in each status.
-   * @return {string}
-   */
-  _computeStatus(checkStatuses) {
-    return StatusPriorityOrder.find(
-               status => checkStatuses[status] > 0) ||
-        Statuses.STATUS_UNKNOWN;
-  },
+    /**
+     * @param {string} status The overall status of the checks.
+     * @param {!Object} checkStatuses The number of checks in each status.
+     * @return {string}
+     */
+    _computeStatusString(status, checkStatuses) {
+      if (checkStatuses.total === 0) return 'No checks';
+      return `${checkStatuses[status]} of ${
+          checkStatuses.total} checks ${HumanizedStatuses[status]}`;
+    },
 
-  /**
-   * @param {string} status The overall status of the checks.
-   * @param {!Object} checkStatuses The number of checks in each status.
-   * @return {string}
-   */
-  _computeStatusString(status, checkStatuses) {
-    if (checkStatuses.total === 0) return 'No checks';
-    return `${checkStatuses[status]} of ${
-        checkStatuses.total} checks ${HumanizedStatuses[status]}`;
-  },
-
-  /**
-   * @param {string} status The overall status of the checks.
-   * @return {string}
-   */
-  _computeChipClass(status) {
-    return `chip ${window.Gerrit.Checks.statusClass(status)}`;
-  },
-});
+    /**
+     * @param {string} status The overall status of the checks.
+     * @return {string}
+     */
+    _computeChipClass(status) {
+      return `chip ${window.Gerrit.Checks.statusClass(status)}`;
+    },
+  });
 })();
diff --git a/gr-checks/gr-checks-chip-view_test.html b/gr-checks/gr-checks-chip-view_test.html
index fb1c67a..e8decce 100644
--- a/gr-checks/gr-checks-chip-view_test.html
+++ b/gr-checks/gr-checks-chip-view_test.html
@@ -19,7 +19,7 @@
     logUrl: 'http://example.com/test-log-url',
     startTime: "2019-02-06T22:25:19.269Z",
     finishTime: "2019-02-06T22:25:44.574Z",
-    status: 'SUCCESS',
+    status: 'SUCCESSFUL',
   };
 
   const CHECK2 = {
@@ -27,7 +27,7 @@
     logUrl: 'http://example.com/test-log-url',
     startTime: "2019-02-06T22:25:19.269Z",
     finishTime: "2019-02-06T22:25:44.574Z",
-    status: 'FAILURE',
+    status: 'FAILED',
   };
 
   suite('gr-checks-chip-view tests', () => {
@@ -44,13 +44,11 @@
       element = fixture('basic', {
         getChecks: getChecksSpy,
         change: {
-          'project': 'test-repository',
-          'revisions': {
-            'first-sha': "test-revision",
-            'second-sha': "test-revision2",
-          }
+          '_number': 314,
         },
-        revision: 'test-revision2',
+        revision: {
+          '_number': 271,
+        },
       });
       flush(done);
     });
@@ -64,7 +62,7 @@
     suite('builds chip contents', () => {
       test('queries the checks', () => {
         assert.isTrue(getChecksSpy.called);
-        assert.isTrue(getChecksSpy.calledWith('test-repository', 'second-sha'));
+        assert.isTrue(getChecksSpy.calledWith(314, 271));
       });
 
       test('renders the text of failed checks', () => {
diff --git a/gr-checks/gr-checks-configure-link.html b/gr-checks/gr-checks-configure-link.html
deleted file mode 100644
index 23cbb6e..0000000
--- a/gr-checks/gr-checks-configure-link.html
+++ /dev/null
@@ -1,18 +0,0 @@
-<dom-module id="gr-checks-configure-link">
-  <template>
-    <style>
-      iron-icon {
-        height: 1.2rem;
-        margin-right: 4px;
-        width: 1.2rem;
-      }
-    </style>
-    <a href$="[[configurePath]]">
-      <gr-button link no-uppercase>
-        <iron-icon icon="gr-icons:settings"></iron-icon>
-        Configure checks
-      </gr-button>
-    </a>
-  </template>
-  <script src="gr-checks-configure-link.js"></script>
-</dom-module>
diff --git a/gr-checks/gr-checks-configure-link.js b/gr-checks/gr-checks-configure-link.js
deleted file mode 100644
index 0eb1571..0000000
--- a/gr-checks/gr-checks-configure-link.js
+++ /dev/null
@@ -1,11 +0,0 @@
-(function() {
-'use strict';
-
-Polymer({
-  is: 'gr-checks-configure-link',
-
-  properties: {
-    configurePath: String,
-  },
-});
-})();
diff --git a/gr-checks/gr-checks-configure-link_test.html b/gr-checks/gr-checks-configure-link_test.html
deleted file mode 100644
index 3c8f314..0000000
--- a/gr-checks/gr-checks-configure-link_test.html
+++ /dev/null
@@ -1,37 +0,0 @@
-<!DOCTYPE html>
-<meta name="viewport" content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
-<script src="imports.js"></script>
-<script src="webcomponentsjs/webcomponents-lite.js"></script>
-<link rel="import" href="polymer/polymer.html">
-
-<title>gr-checks-configure-link</title>
-<link rel="import" href="webcomponent_lib/gr-checks-configure-link.html">
-
-<test-fixture id="basic">
-  <template is="dom-template">
-    <gr-checks-configure-link configure-path="[[configurePath]]"></gr-checks-configure-link>
-  </template>
-</test-fixture>
-
-<script>
-  suite('gr-checks-configure-link tests', () => {
-    let element;
-    let sandbox;
-
-    setup((done) => {
-      sandbox = sinon.sandbox.create();
-      element = fixture('basic', {
-        configurePath: 'http://example.com/test-configure',
-      });
-      flush(done);
-    });
-
-    teardown(() => { sandbox.restore(); });
-
-    test('renders the link to configure a check', () => {
-      const configureLink = element.$$('a');
-      assert.equal(configureLink.getAttribute('href'), 'http://example.com/test-configure');
-      assert.equal(configureLink.textContent.trim(), 'Configure checks');
-    });
-  });
-</script>
diff --git a/gr-checks/gr-checks-item.html b/gr-checks/gr-checks-item.html
index 436f65b..9037772 100644
--- a/gr-checks/gr-checks-item.html
+++ b/gr-checks/gr-checks-item.html
@@ -20,12 +20,12 @@
         }
       </style>
 
-      <td>[[_checkerDescription]]</td>
+      <td>[[check.checker_name]]</td>
       <td><!-- required for merge--></td>
       <td>
         <gr-checks-status show-text status="[[check.state]]"></gr-checks-status>
       </td>
-      <td>Check System</td>
+      <td><!--Check System--></td>
       <td>[[_startTime]]</td>
       <td>[[_duration]]</td>
       <td>
diff --git a/gr-checks/gr-checks-item.js b/gr-checks/gr-checks-item.js
index 272f82c..7777f75 100644
--- a/gr-checks/gr-checks-item.js
+++ b/gr-checks/gr-checks-item.js
@@ -4,12 +4,20 @@
   const Defs = {};
   /**
    * @typedef {{
- *   id: string,
- *   projectId: string,
- *   checkerId: string,
- *   startTime: string,
- *   finishTime: string,
- * }}
+   *   project: string,
+   *   change_number: number,
+   *   patch_set_id: number,
+   *   checker_uuid: string,
+   *   state: string,
+   *   url: string,
+   *   started: string,
+   *   finished: string,
+   *   created: string,
+   *   updated: string,
+   *   checker_name: string,
+   *   checker_status: string,
+   *   blocking: Array<Object>,
+   * }}
    */
   Defs.Check;
 
@@ -17,12 +25,10 @@
     is: 'gr-checks-item',
 
     properties: {
+      /** @type {Defs.Check} */
       check: Object,
       /** @type {function(string): !Promise<!Object>} */
-      getChecker: Function,
-      /** @type {function(string): !Promise<!Object>} */
       retryCheck: Function,
-      _checkerDescription: String,
       _startTime: {
         type: String,
         computed: '_computeStartTime(check)',
@@ -33,29 +39,12 @@
       },
     },
 
-    observers: [
-      '_updateCheckerName(check, getChecker)',
-    ],
-
-    /**
-     * @param {!Defs.Check} check
-     * @param {function(string): !Promise<!Object>} getChecker
-     */
-    _updateCheckerName(check, getChecker) {
-      const checkerId = check.checker_uuid;
-      getChecker(checkerId).then(
-          checker => checker && checker.description || checkerId,
-          () => checkerId).then(checkerDescription => {
-        this.set('_checkerDescription', checkerDescription);
-      });
-    },
-
     /**
      * @param {!Defs.Check} check
      * @return {string}
      */
     _computeStartTime(check) {
-      return moment(check.created).format('l');
+      return moment(check.started).format('LTS');
     },
 
     /**
@@ -63,8 +52,8 @@
      * @return {string}
      */
     _computeDuration(check) {
-      const startTime = moment(check.created);
-      const finishTime = moment(check.updated);
+      const startTime = moment(check.started);
+      const finishTime = check.finished ? moment(check.finished) : moment();
       return generateDurationString(
           moment.duration(finishTime.diff(startTime)));
     },
@@ -87,25 +76,25 @@
     }
 
     const durationSegments = [];
-    if (duration.seconds()) {
-      durationSegments.push(`${duration.seconds()} sec`);
-    }
-    if (duration.minutes()) {
-      durationSegments.push(`${duration.minutes()} min`);
-    }
-    if (duration.hours()) {
-      const hours = pluralize(duration.hours(), 'hour', 'hours');
-      durationSegments.push(`${duration.hours()} ${hours}`);
+    if (duration.months()) {
+      const months = pluralize(duration.months(), 'month', 'months');
+      durationSegments.push(`${duration.months()} ${months}`);
     }
     if (duration.days()) {
       const days = pluralize(duration.days(), 'day', 'days');
       durationSegments.push(`${duration.days()} ${days}`);
     }
-    if (duration.months()) {
-      const months = pluralize(duration.months(), 'month', 'months');
-      durationSegments.push(`${duration.months()} ${months}`);
+    if (duration.hours()) {
+      const hours = pluralize(duration.hours(), 'hour', 'hours');
+      durationSegments.push(`${duration.hours()} ${hours}`);
     }
-    return durationSegments.join(' ');
+    if (duration.minutes()) {
+      durationSegments.push(`${duration.minutes()} min`);
+    }
+    if (duration.seconds()) {
+      durationSegments.push(`${duration.seconds()} sec`);
+    }
+    return durationSegments.slice(0, 2).join(' ');
   }
 
   /**
diff --git a/gr-checks/gr-checks-item_test.html b/gr-checks/gr-checks-item_test.html
index 0495d52..ef133aa 100644
--- a/gr-checks/gr-checks-item_test.html
+++ b/gr-checks/gr-checks-item_test.html
@@ -11,7 +11,6 @@
   <template is="dom-template">
     <gr-checks-item
       check="{{check}}"
-      get-checker="[[getChecker]]"
       retry-check="[[retryCheck]]">
     </gr-checks-item>
   </template>
@@ -21,24 +20,14 @@
   suite('gr-checks-item tests', () => {
     let element;
     let sandbox;
-    let getCheckerSpy;
-    let resolveGetChecker;
-    let rejectGetChecker;
     let retryCheckSpy;
 
     setup((done) => {
       sandbox = sinon.sandbox.create();
-      const getCheckerPromise = new Promise((resolve, reject) => {
-        resolveGetChecker = resolve;
-        rejectGetChecker = reject;
-      });
-      getCheckerSpy = sinon.stub();
-      getCheckerSpy.returns(getCheckerPromise);
       retryCheckSpy = sinon.stub();
       retryCheckSpy.returns(Promise.resolve());
 
       element = fixture('basic', {
-        getChecker: getCheckerSpy,
         retryCheck: retryCheckSpy,
         check: {
           checkId: 'test-check-id',
@@ -52,51 +41,6 @@
 
     teardown(() => { sandbox.restore(); });
 
-    suite('checker name', () => {
-      test('calls getChecker', () => {
-        assert.isTrue(getCheckerSpy.called);
-        assert.isTrue(getCheckerSpy.calledWith('test-check-id'));
-      });
-
-      function assertCheckerText(text) {
-        const name = element.$$('td:nth-child(1)');
-        assert.equal(name.textContent.trim(), text);
-      }
-
-      suite('on success', () => {
-        setup(done => {
-          resolveGetChecker({description: 'test checker name'});
-          flush(done);
-        });
-
-        test('renders the checker name on success', () => {
-          assertCheckerText('test checker name');
-        });
-      });
-
-      suite('on empty response', () => {
-        setup(done => {
-          resolveGetChecker();
-          flush(done);
-        });
-
-        test('renders the id when there is no description', () => {
-          assertCheckerText('test-check-id');
-        });
-      });
-
-      suite('on error', () => {
-        setup(done => {
-          rejectGetChecker(new Error('broken'));
-          flush(done);
-        });
-
-        test('renders the id when the call fails', () => {
-          assertCheckerText('test-check-id');
-        });
-      });
-    });
-
     test('renders the status', () => {
       const status = element.$$('td:nth-child(3) > gr-checks-status');
       assert.exists(status);
diff --git a/gr-checks/gr-checks-status.html b/gr-checks/gr-checks-status.html
index ef4a02a..ba5eef0 100644
--- a/gr-checks/gr-checks-status.html
+++ b/gr-checks/gr-checks-status.html
@@ -29,7 +29,7 @@
       </style>
     <span class$="[[_className]]">
       <template is="dom-if" if="[[_isUnevaluated(status)]]">
-        <i>⏹</i>
+        <i>&#x23F9;</i>
         <template is="dom-if" if="[[showText]]">
           <span>
             Unevaluated
diff --git a/gr-checks/gr-checks-status_test.html b/gr-checks/gr-checks-status_test.html
index 19957a3..6f6a98c 100644
--- a/gr-checks/gr-checks-status_test.html
+++ b/gr-checks/gr-checks-status_test.html
@@ -56,9 +56,8 @@
       });
     }
 
-    testStatus('successful', 'Successful', ['SUCCESS']);
-    testStatus('failed', 'Failed', ['FAILURE', 'INTERNAL_ERROR', 'TIMEOUT']);
-    testStatus('in-progress', 'In progress', ['QUEUING', 'QUEUED', 'WORKING']);
-    testStatus('unevaluated', 'Unevaluated', ['STATUS_UNKNOWN', 'CANCELLED']);
+    testStatus('successful', 'Successful', ['SUCCESSFUL']);
+    testStatus('failed', 'Failed', ['FAILED']);
+    testStatus('in-progress', 'In progress', ['NOT_STARTED', 'SCHEDULED', 'RUNNING']);
   });
 </script>
diff --git a/gr-checks/gr-checks-view.html b/gr-checks/gr-checks-view.html
index 5f1b94e..b4efaa4 100644
--- a/gr-checks/gr-checks-view.html
+++ b/gr-checks/gr-checks-view.html
@@ -70,8 +70,6 @@
       <div class="no-content">
         <h2>No checks ran for this code review</h2>
         <p>Configure checkers to view the results here.</p>
-        <gr-checks-configure-link configure-path="[[configurePath]]">
-        </gr-checks-configure-link>
       </div>
     </template>
 
@@ -79,16 +77,12 @@
       <div class="no-content">
         <h2>Code review checks not configured</h2>
         <p>Configure checkers to view the results here.</p>
-        <gr-checks-configure-link configure-path="[[configurePath]]">
-        </gr-checks-configure-link>
       </div>
     </template>
 
     <template is="dom-if" if="[[_hasResults(_status)]]">
       <header>
         <h3>Latest checks for Patchset [[revision._number]]</h3>
-        <gr-checks-configure-link configure-path="[[configurePath]]">
-        </gr-checks-configure-link>
       </header>
 
       <table>
@@ -97,7 +91,7 @@
             <th class="topHeader">Name</th>
             <th class="topHeader"><!-- required for merge --></th>
             <th class="topHeader">Status</th>
-            <th class="topHeader">Checking system</th>
+            <th class="topHeader"><!--Checking system--></th>
             <th class="topHeader">Started</th>
             <th class="topHeader">Duration</th>
             <th class="topHeader"><!-- actions --></th>
@@ -105,7 +99,7 @@
         </thead>
         <tbody>
           <template is="dom-repeat" items="[[_checks]]" as="check">
-            <gr-checks-item check="[[check]]" retry-check="[[retryCheck]]" get-checker="[[getChecker]]"></gr-checks-item>
+            <gr-checks-item check="[[check]]" retry-check="[[retryCheck]]"></gr-checks-item>
           </template>
         </tbody>
       </table>
diff --git a/gr-checks/gr-checks-view.js b/gr-checks/gr-checks-view.js
index 3f53f61..7bee91a 100644
--- a/gr-checks/gr-checks-view.js
+++ b/gr-checks/gr-checks-view.js
@@ -1,103 +1,86 @@
 (function() {
-'use strict';
+  'use strict';
 
-const Defs = {};
-/**
- * @typedef {{
- *   revisions: !Object<string, !Object>,
- * }}
- */
-Defs.Change;
-
-/**
- * @param {!Defs.Change} change The current CL.
- * @param {!Object} revision The current patchset.
- * @return {string|undefined}
- */
-function currentRevisionSha(change, revision) {
-  return Object.keys(change.revisions)
-      .find(sha => change.revisions[sha] === revision);
-}
-
-const LoadingStatus = {
-  LOADING: 0,
-  EMPTY: 1,
-  RESULTS: 2,
-  NOT_CONFIGURED: 3,
-};
-
-Polymer({
-  is: 'gr-checks-view',
-
-  properties: {
-    revision: Object,
-    change: Object,
-    // TODO(brohlfs): Implement getChecks based on Checks Rest API.
-    /** @type {function(string, (string|undefined)): !Promise<!Object>} */
-    getChecks: Function,
-    // TODO(brohlfs): Implement isConfigured based on Checks Rest API.
-    /** @type {function(string): !Promise<!Object>} */
-    isConfigured: Function,
-    // TODO(brohlfs): Implement getChecker based on Checks Rest API.
-    /** @type {function(string, string): !Promise<!Object>} */
-    getChecker: Function,
-    // TODO(brohlfs): Implement retryCheck based on Checks Rest API.
-    /** @type {function(string, string): !Promise<!Object>} */
-    retryCheck: Function,
-    // TODO(brohlfs): Implement configurePath based on Checks Rest API.
-    // The url path to configure checkers.
-    configurePath: String,
-    _checks: Object,
-    _status: {
-      type: Object,
-      value: LoadingStatus.LOADING,
-    },
-  },
-
-  observers: [
-    '_fetchChecks(change, revision, getChecks)',
-  ],
-
+  const Defs = {};
   /**
-   * @param {!Defs.Change} change The current CL.
-   * @param {!Object} revision The current patchset.
-   * @param {function(string, (string|undefined)): !Promise<!Object>}
-   *     getChecks function to get checks.
+   * @typedef {{
+   *   _number: number,
+   * }}
    */
-  _fetchChecks(change, revision, getChecks) {
-    const repository = change['project'];
-    const gitSha = currentRevisionSha(change, revision);
+  Defs.Change;
+  /**
+   * @typedef {{
+   *   _number: number,
+   * }}
+   */
+  Defs.Revision;
 
-    getChecks(repository, gitSha).then(checks => {
-      if (checks && checks.length) {
-        this.set('_checks', checks);
-        this.set('_status', LoadingStatus.RESULTS);
-      } else {
-        this._checkConfigured();
-      }
-    });
-  },
+  const LoadingStatus = {
+    LOADING: 0,
+    EMPTY: 1,
+    RESULTS: 2,
+    NOT_CONFIGURED: 3,
+  };
 
-  _checkConfigured() {
-    const repository = this.change['project'];
-    this.isConfigured(repository).then(configured => {
-      const status =
-          configured ? LoadingStatus.EMPTY : LoadingStatus.NOT_CONFIGURED;
-      this.set('_status', status);
-    });
-  },
+  Polymer({
+    is: 'gr-checks-view',
 
-  _isLoading(status) {
-    return status === LoadingStatus.LOADING;
-  },
-  _isEmpty(status) {
-    return status === LoadingStatus.EMPTY;
-  },
-  _hasResults(status) {
-    return status === LoadingStatus.RESULTS;
-  },
-  _isNotConfigured(status) {
-    return status === LoadingStatus.NOT_CONFIGURED;
-  },
-});
+    properties: {
+      revision: Object,
+      change: Object,
+      /** @type {function(number, number): !Promise<!Object>} */
+      getChecks: Function,
+      /** @type {function(string): !Promise<Boolean>} */
+      isConfigured: Function,
+      /** @type {function(string, string): !Promise<!Object>} */
+      retryCheck: Function,
+      _checks: Object,
+      _status: {
+        type: Object,
+        value: LoadingStatus.LOADING,
+      },
+    },
+
+    observers: [
+      '_fetchChecks(change, revision, getChecks)',
+    ],
+
+    /**
+     * @param {!Defs.Change} change
+     * @param {!Defs.Revision} revision
+     * @param {function(number, number): !Promise<!Object>} getChecks
+     */
+    _fetchChecks(change, revision, getChecks) {
+      getChecks(change._number, revision._number).then(checks => {
+        if (checks && checks.length) {
+          this.set('_checks', checks);
+          this.set('_status', LoadingStatus.RESULTS);
+        } else {
+          this._checkConfigured();
+        }
+      });
+    },
+
+    _checkConfigured() {
+      const repository = this.change['project'];
+      this.isConfigured(repository).then(configured => {
+        const status =
+            configured ? LoadingStatus.EMPTY : LoadingStatus.NOT_CONFIGURED;
+        this.set('_status', status);
+      });
+    },
+
+    _isLoading(status) {
+      return status === LoadingStatus.LOADING;
+    },
+    _isEmpty(status) {
+      return status === LoadingStatus.EMPTY;
+    },
+    _hasResults(status) {
+      return status === LoadingStatus.RESULTS;
+    },
+    _isNotConfigured(status) {
+      return status === LoadingStatus.NOT_CONFIGURED;
+    },
+  });
 })();
diff --git a/gr-checks/gr-checks-view_test.html b/gr-checks/gr-checks-view_test.html
index 6affa9c..6607e66 100644
--- a/gr-checks/gr-checks-view_test.html
+++ b/gr-checks/gr-checks-view_test.html
@@ -12,10 +12,8 @@
     <gr-checks-view
       change="[[change]]"
       revision="[[revision]]"
-      configure-path="[[configurePath]]"
       get-checks="[[getChecks]]"
       is-configured="[[isConfigured]]"
-      get-checker="[[getChecker]]"
       retry-check="[[retryCheck]]">
     </gr-checks-view>
   </template>
@@ -49,7 +47,6 @@
   let sandbox;
   let getChecksSpy;
   let getChecksResolve;
-  let getCheckerSpy;
   let retryCheckSpy;
   let isConfiguredSpy;
   let isConfiguredResolve;
@@ -69,17 +66,13 @@
     });
     isConfiguredSpy.returns(isConfiguredPromise);
 
-    getCheckerSpy = sinon.stub();
-    getCheckerSpy.returns(Promise.resolve({description: 'test checker name'}));
     retryCheckSpy = sinon.stub();
     retryCheckSpy.returns(Promise.resolve());
 
     element = fixture('basic', {
-      getChecker: getCheckerSpy,
       retryCheck: retryCheckSpy,
       getChecks: getChecksSpy,
       isConfigured: isConfiguredSpy,
-      configurePath: 'http://example.com/test-configure',
       change: {
         'project': 'test-repository',
         'revisions': {
@@ -124,11 +117,6 @@
         const header = element.$$('h2');
         assert.equal(header.textContent.trim(), 'Code review checks not configured');
       });
-
-      test('renders the link to configure a check', () => {
-        const configureLink = element.$$('gr-checks-configure-link');
-        assert.exists(configureLink);
-      });
     });
 
     suite('no checks ran', () => {
@@ -141,11 +129,6 @@
         const header = element.$$('h2');
         assert.equal(header.textContent.trim(), 'No checks ran for this code review');
       });
-
-      test('renders the link to configure a check', () => {
-        const configureLink = element.$$('gr-checks-configure-link');
-        assert.exists(configureLink);
-      });
     });
   });
 
@@ -164,11 +147,6 @@
       assert.equal(header.textContent.trim(), 'Latest checks for Patchset 3');
     });
 
-    test('renders the link to configure a check', () => {
-      const configureLink = element.$$('header > gr-checks-configure-link');
-      assert.exists(configureLink);
-    });
-
     test('renders a table of all the checks', () => {
       const tbody = element.$$('table > tbody');
       assert.lengthOf(tbody.querySelectorAll('gr-checks-item'), 3)
diff --git a/gr-checks/gr-checks.html b/gr-checks/gr-checks.html
index 4efdf97..cc4f6ca 100644
--- a/gr-checks/gr-checks.html
+++ b/gr-checks/gr-checks.html
@@ -5,24 +5,42 @@
 <link rel="import" href="gr-checks-change-list-item-cell-view.html">
 <link rel="import" href="gr-checks-change-list-header-view.html">
 <link rel="import" href="gr-checks-change-view-tab-header-view.html">
-<link rel="import" href="gr-checks-configure-link.html">
 
 <dom-module id="gr-checks">
   <script>
     Gerrit.install(plugin => {
-      plugin.registerDynamicCustomComponent(
-          'change-list-header',
-          'gr-checks-change-list-header-view');
-      plugin.registerDynamicCustomComponent(
-          'change-list-item-cell',
-          'gr-checks-change-list-item-cell-view');
+
+      const getChecks = (change, revision) => {
+        return plugin.restApi().get(
+            '/changes/' + change + '/revisions/' + revision + '/checks?o=CHECKER');
+      };
+
+      // TODO(brohlfs): Enable this dashboard column when search queries start
+      // returning checks.
+      // plugin.registerDynamicCustomComponent(
+      //     'change-list-header',
+      //     'gr-checks-change-list-header-view');
+      // plugin.registerDynamicCustomComponent(
+      //     'change-list-item-cell',
+      //     'gr-checks-change-list-item-cell-view');
+      plugin.registerCustomComponent(
+          'commit-container',
+          'gr-checks-chip-view').onAttached(
+          view => {
+            view['getChecks'] = getChecks;
+          });
       plugin.registerDynamicCustomComponent(
           'change-view-tab-header',
           'gr-checks-change-view-tab-header-view');
       plugin.registerDynamicCustomComponent(
           'change-view-tab-content',
           'gr-checks-view').onAttached(
-          view => console.log('gr-checks-view attached'));
+          view => {
+            view['isConfigured'] = (repository) => Promise.resolve(true);
+            // TODO(brohlfs): Implement retry.
+            view['retryCheck'] = (buildId) => undefined;
+            view['getChecks'] = getChecks;
+          });
     });
   </script>
 </dom-module>
