diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..499784b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+/.classpath
+/.project
+/.settings/org.maven.ide.eclipse.prefs
+/.settings/org.eclipse.m2e.core.prefs
diff --git a/BUILD b/BUILD
new file mode 100644
index 0000000..4a94772
--- /dev/null
+++ b/BUILD
@@ -0,0 +1,23 @@
+load("//tools/bzl:plugin.bzl", "gerrit_plugin")
+load("//tools/bzl:js.bzl", "polygerrit_plugin")
+
+gerrit_plugin(
+    name = "zuul-status",
+    srcs = glob(["src/main/java/**/*.java"]),
+    manifest_entries = [
+        "Gerrit-PluginName: zuul-status",
+        "Gerrit-Module: com.googlesource.gerrit.plugins.zuulstatus.Module",
+        "Implementation-Title: Zuul status plugin",
+        "Implementation-Vendor: Wikimedia Foundation",
+    ],
+    resources = glob(["src/main/**/*"]),
+)
+
+polygerrit_plugin(
+    name = "zuul_status_ui",
+    srcs = glob([
+        "src/main/resources/static/*.html",
+        "src/main/resources/static/*.js",
+    ]),
+    app = "src/main/resources/static/zuul-status.html",
+)
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..11069ed
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                              Apache License
+                        Version 2.0, January 2004
+                     http://www.apache.org/licenses/
+
+TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+1. Definitions.
+
+   "License" shall mean the terms and conditions for use, reproduction,
+   and distribution as defined by Sections 1 through 9 of this document.
+
+   "Licensor" shall mean the copyright owner or entity authorized by
+   the copyright owner that is granting the License.
+
+   "Legal Entity" shall mean the union of the acting entity and all
+   other entities that control, are controlled by, or are under common
+   control with that entity. For the purposes of this definition,
+   "control" means (i) the power, direct or indirect, to cause the
+   direction or management of such entity, whether by contract or
+   otherwise, or (ii) ownership of fifty percent (50%) or more of the
+   outstanding shares, or (iii) beneficial ownership of such entity.
+
+   "You" (or "Your") shall mean an individual or Legal Entity
+   exercising permissions granted by this License.
+
+   "Source" form shall mean the preferred form for making modifications,
+   including but not limited to software source code, documentation
+   source, and configuration files.
+
+   "Object" form shall mean any form resulting from mechanical
+   transformation or translation of a Source form, including but
+   not limited to compiled object code, generated documentation,
+   and conversions to other media types.
+
+   "Work" shall mean the work of authorship, whether in Source or
+   Object form, made available under the License, as indicated by a
+   copyright notice that is included in or attached to the work
+   (an example is provided in the Appendix below).
+
+   "Derivative Works" shall mean any work, whether in Source or Object
+   form, that is based on (or derived from) the Work and for which the
+   editorial revisions, annotations, elaborations, or other modifications
+   represent, as a whole, an original work of authorship. For the purposes
+   of this License, Derivative Works shall not include works that remain
+   separable from, or merely link (or bind by name) to the interfaces of,
+   the Work and Derivative Works thereof.
+
+   "Contribution" shall mean any work of authorship, including
+   the original version of the Work and any modifications or additions
+   to that Work or Derivative Works thereof, that is intentionally
+   submitted to Licensor for inclusion in the Work by the copyright owner
+   or by an individual or Legal Entity authorized to submit on behalf of
+   the copyright owner. For the purposes of this definition, "submitted"
+   means any form of electronic, verbal, or written communication sent
+   to the Licensor or its representatives, including but not limited to
+   communication on electronic mailing lists, source code control systems,
+   and issue tracking systems that are managed by, or on behalf of, the
+   Licensor for the purpose of discussing and improving the Work, but
+   excluding communication that is conspicuously marked or otherwise
+   designated in writing by the copyright owner as "Not a Contribution."
+
+   "Contributor" shall mean Licensor and any individual or Legal Entity
+   on behalf of whom a Contribution has been received by Licensor and
+   subsequently incorporated within the Work.
+
+2. Grant of Copyright License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   copyright license to reproduce, prepare Derivative Works of,
+   publicly display, publicly perform, sublicense, and distribute the
+   Work and such Derivative Works in Source or Object form.
+
+3. Grant of Patent License. Subject to the terms and conditions of
+   this License, each Contributor hereby grants to You a perpetual,
+   worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+   (except as stated in this section) patent license to make, have made,
+   use, offer to sell, sell, import, and otherwise transfer the Work,
+   where such license applies only to those patent claims licensable
+   by such Contributor that are necessarily infringed by their
+   Contribution(s) alone or by combination of their Contribution(s)
+   with the Work to which such Contribution(s) was submitted. If You
+   institute patent litigation against any entity (including a
+   cross-claim or counterclaim in a lawsuit) alleging that the Work
+   or a Contribution incorporated within the Work constitutes direct
+   or contributory patent infringement, then any patent licenses
+   granted to You under this License for that Work shall terminate
+   as of the date such litigation is filed.
+
+4. Redistribution. You may reproduce and distribute copies of the
+   Work or Derivative Works thereof in any medium, with or without
+   modifications, and in Source or Object form, provided that You
+   meet the following conditions:
+
+   (a) You must give any other recipients of the Work or
+       Derivative Works a copy of this License; and
+
+   (b) You must cause any modified files to carry prominent notices
+       stating that You changed the files; and
+
+   (c) You must retain, in the Source form of any Derivative Works
+       that You distribute, all copyright, patent, trademark, and
+       attribution notices from the Source form of the Work,
+       excluding those notices that do not pertain to any part of
+       the Derivative Works; and
+
+   (d) If the Work includes a "NOTICE" text file as part of its
+       distribution, then any Derivative Works that You distribute must
+       include a readable copy of the attribution notices contained
+       within such NOTICE file, excluding those notices that do not
+       pertain to any part of the Derivative Works, in at least one
+       of the following places: within a NOTICE text file distributed
+       as part of the Derivative Works; within the Source form or
+       documentation, if provided along with the Derivative Works; or,
+       within a display generated by the Derivative Works, if and
+       wherever such third-party notices normally appear. The contents
+       of the NOTICE file are for informational purposes only and
+       do not modify the License. You may add Your own attribution
+       notices within Derivative Works that You distribute, alongside
+       or as an addendum to the NOTICE text from the Work, provided
+       that such additional attribution notices cannot be construed
+       as modifying the License.
+
+   You may add Your own copyright statement to Your modifications and
+   may provide additional or different license terms and conditions
+   for use, reproduction, or distribution of Your modifications, or
+   for any such Derivative Works as a whole, provided Your use,
+   reproduction, and distribution of the Work otherwise complies with
+   the conditions stated in this License.
+
+5. Submission of Contributions. Unless You explicitly state otherwise,
+   any Contribution intentionally submitted for inclusion in the Work
+   by You to the Licensor shall be under the terms and conditions of
+   this License, without any additional terms or conditions.
+   Notwithstanding the above, nothing herein shall supersede or modify
+   the terms of any separate license agreement you may have executed
+   with Licensor regarding such Contributions.
+
+6. Trademarks. This License does not grant permission to use the trade
+   names, trademarks, service marks, or product names of the Licensor,
+   except as required for reasonable and customary use in describing the
+   origin of the Work and reproducing the content of the NOTICE file.
+
+7. Disclaimer of Warranty. Unless required by applicable law or
+   agreed to in writing, Licensor provides the Work (and each
+   Contributor provides its Contributions) on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+   implied, including, without limitation, any warranties or conditions
+   of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+   PARTICULAR PURPOSE. You are solely responsible for determining the
+   appropriateness of using or redistributing the Work and assume any
+   risks associated with Your exercise of permissions under this License.
+
+8. Limitation of Liability. In no event and under no legal theory,
+   whether in tort (including negligence), contract, or otherwise,
+   unless required by applicable law (such as deliberate and grossly
+   negligent acts) or agreed to in writing, shall any Contributor be
+   liable to You for damages, including any direct, indirect, special,
+   incidental, or consequential damages of any character arising as a
+   result of this License or out of the use or inability to use the
+   Work (including but not limited to damages for loss of goodwill,
+   work stoppage, computer failure or malfunction, or any and all
+   other commercial damages or losses), even if such Contributor
+   has been advised of the possibility of such damages.
+
+9. Accepting Warranty or Additional Liability. While redistributing
+   the Work or Derivative Works thereof, You may choose to offer,
+   and charge a fee for, acceptance of support, warranty, indemnity,
+   or other liability obligations and/or rights consistent with this
+   License. However, in accepting such obligations, You may act only
+   on Your own behalf and on Your sole responsibility, not on behalf
+   of any other Contributor, and only if You agree to indemnify,
+   defend, and hold each Contributor harmless for any liability
+   incurred by, or claims asserted against, such Contributor by reason
+   of your accepting any such warranty or additional liability.
+
+END OF TERMS AND CONDITIONS
+
+APPENDIX: How to apply the Apache License to your work.
+
+   To apply the Apache License to your work, attach the following
+   boilerplate notice, with the fields enclosed by brackets "[]"
+   replaced with your own identifying information. (Don't include
+   the brackets!)  The text should be enclosed in the appropriate
+   comment syntax for the file format. We also recommend that a
+   file or class name and description of purpose be included on the
+   same "printed page" as the copyright notice for easier
+   identification within third-party archives.
+
+Copyright [yyyy] [name of copyright owner]
+
+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.
diff --git a/src/main/java/com/googlesource/gerrit/plugins/zuulstatus/GetConfig.java b/src/main/java/com/googlesource/gerrit/plugins/zuulstatus/GetConfig.java
new file mode 100644
index 0000000..dae676d
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/zuulstatus/GetConfig.java
@@ -0,0 +1,43 @@
+// Copyright (C) 2019 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.zuulstatus;
+
+import com.google.gerrit.extensions.annotations.PluginName;
+import com.google.gerrit.extensions.restapi.RestReadView;
+import com.google.gerrit.server.config.ConfigResource;
+import com.google.gerrit.server.config.PluginConfig;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.inject.Inject;
+
+public class GetConfig implements RestReadView<ConfigResource> {
+
+  private final PluginConfig cfg;
+
+  @Inject
+  public GetConfig(PluginConfigFactory cfgFactory, @PluginName String pluginName) {
+    this.cfg = cfgFactory.getFromGerritConfig(pluginName);
+  }
+
+  @Override
+  public ConfigInfo apply(ConfigResource resource) {
+    ConfigInfo info = new ConfigInfo();
+    info.zuulUrl = cfg.getString("zuulUrl", null);
+    return info;
+  }
+
+  public static class ConfigInfo {
+    String zuulUrl;
+  }
+}
diff --git a/src/main/java/com/googlesource/gerrit/plugins/zuulstatus/Module.java b/src/main/java/com/googlesource/gerrit/plugins/zuulstatus/Module.java
new file mode 100644
index 0000000..e2e3d91
--- /dev/null
+++ b/src/main/java/com/googlesource/gerrit/plugins/zuulstatus/Module.java
@@ -0,0 +1,39 @@
+// Copyright (C) 2019 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.zuulstatus;
+
+import static com.google.gerrit.server.config.ConfigResource.CONFIG_KIND;
+
+import com.google.gerrit.extensions.registration.DynamicSet;
+import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.gerrit.extensions.webui.JavaScriptPlugin;
+import com.google.gerrit.extensions.webui.WebUiPlugin;
+import com.google.inject.AbstractModule;
+
+public class Module extends AbstractModule {
+  @Override
+  protected void configure() {
+    install(
+        new RestApiModule() {
+          @Override
+          protected void configure() {
+            get(CONFIG_KIND, "config").to(GetConfig.class);
+          }
+        });
+
+    DynamicSet.bind(binder(), WebUiPlugin.class)
+        .toInstance(new JavaScriptPlugin("zuul-status.html"));
+  }
+}
diff --git a/src/main/resources/Documentation/build.md b/src/main/resources/Documentation/build.md
new file mode 100644
index 0000000..78d89af
--- /dev/null
+++ b/src/main/resources/Documentation/build.md
@@ -0,0 +1,23 @@
+@PLUGIN@ Build
+==============
+
+This plugin can be built with Bazel.
+
+Bazel
+----
+
+This plugin is built with Bazel. Only the Gerrit in-tree build is
+supported.
+
+Clone or link this plugin to the plugins directory of Gerrit's source
+tree, and issue the command:
+
+```
+  bazel build plugins/@PLUGIN@
+```
+
+The output is created in
+
+```
+  bazel-genfiles/plugins/@PLUGIN@/@PLUGIN@.jar
+```
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
new file mode 100644
index 0000000..3dacbe1
--- /dev/null
+++ b/src/main/resources/Documentation/config.md
@@ -0,0 +1,15 @@
+Configuration
+=============
+
+The configuration of the @PLUGIN@ plugin is done in the `gerrit.config`
+file.
+
+```
+[plugin "@PLUGIN@"]
+zuulUrl = https://example.org/zuul/status/change/
+```
+
+<a id="show-zuul-url">
+`plugin.@PLUGIN@.zuulUrl`
+:    Url to zuul api.
+By default not set.
diff --git a/src/main/resources/static/zuul-status-view.html b/src/main/resources/static/zuul-status-view.html
new file mode 100644
index 0000000..82d8d8d
--- /dev/null
+++ b/src/main/resources/static/zuul-status-view.html
@@ -0,0 +1,184 @@
+<!--
+@license
+Copyright (C) 2019 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.
+-->
+
+<dom-module id="zuul-status-view">
+  <template>
+    <style>
+      #view-container {
+        display: block;
+      }
+      .container {
+        align-items: center;
+        display: flex;
+        flex-wrap: wrap;
+      }
+      .header {
+        background-color: var(--table-header-background-color);
+        justify-content: space-between;
+        min-height: 3.2em;
+        padding: .5em var(--default-horizontal-margin, 1rem);
+        border-top: 1px solid var(--border-color);
+        border-bottom: 1px solid var(--border-color);
+      }
+      .header .label {
+        font: inherit;
+        font-family: var(--font-family-bold);
+        font-size: 1.17em;
+        margin-right: 1em;
+      }
+      .progress {
+        overflow: hidden;
+        height: 20px;
+        margin-bottom: 20px;
+        background-color: #f5f5f5;
+        border-radius: 4px;
+        -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1);
+        box-shadow: inset 0 1px 2px rgba(0,0,0,.1);
+      }
+      .progress-bar {
+        float: left;
+        width: 0;
+        height: 100%;
+        font-size: 12px;
+        line-height: 20px;
+        color: #fff;
+        text-align: center;
+        background-color: #428bca;
+        -webkit-box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);
+        box-shadow: inset 0 -1px 0 rgba(0,0,0,.15);
+        -webkit-transition: width .6s ease;
+        transition: width .6s ease;
+      }
+      .zuul-job-result {
+        float: right;
+        width: 70px;
+        height: 15px;
+        margin: 2px 0 0 0;
+      }
+      #progressBar {
+        width: var(--progress-bar-width, 0%);
+      }
+      .genericList th {
+        white-space: nowrap;
+      }
+      .genericList th,
+      .genericList td {
+        padding-right: 1rem;
+      }
+      .genericList tr th:first-of-type,
+      .genericList tr td:first-of-type {
+        padding-left: 1rem;
+      }
+      .genericList td {
+        flex-shrink: 0;
+      }
+      .genericList a {
+        color: var(--primary-text-color);
+        text-decoration: none;
+      }
+      .genericList a:hover {
+        text-decoration: underline;
+      }
+      #list {
+        padding-bottom: 1em;
+      }
+      .zuul-job-result {
+        float: right;
+        width: 70px;
+        height: 15px;
+        margin: 2px 0 0 0;
+      }
+      .label {
+        display: inline;
+        padding: .2em .6em .3em;
+        font-size: 75%;
+        font-weight: 700;
+        line-height: 1;
+        color: #fff;
+        text-align: center;
+        white-space: nowrap;
+        vertical-align: baseline;
+        border-radius: .25em;
+      }
+      .label-danger {
+        background-color: #d9534f;
+      }
+      .label-default {
+        background-color: #999;
+      }
+      .label-info {
+        background-color: #5bc0de;
+      }
+      .label-success {
+        background-color: #5cb85c;
+      }
+      .label-warning {
+        background-color: #f0ad4e;
+      }
+    </style>
+    <template is="dom-if" if="[[zuulUrl]]">
+      <div id="view-container">
+        <div class="header container">
+          <div class="container">
+            <h3 class="labelName">[[_computeTitle(_response)]]</h3>
+          </div>
+        </div>
+        <div class="bottom container">
+          <table id="list" class="genericList">
+            <tr class="headerRow">
+              <th class="pipeline topHeader">Pipeline</th>
+              <th class="jobName topHeader">Job Name</th>
+              <th class="progressName topHeader">Progress</th>
+            </tr>
+            <tbody>
+              <template is="dom-repeat" items=[[_response]] as="response">
+                <template is="dom-repeat" items=[[response.jobs]] as="jobs">
+                  <tr class="table">
+                    <td class="pipeline">
+                      [[jobs.pipeline]]
+                    </td>
+                    <td class="jobName">
+                      <a href="[[_computeReportURL(jobs)]]" target="_blank"
+                         hidden$="[[!jobs.name]]">
+                        [[jobs.name]]
+                      </a>
+                    </td>
+                    <td class="progressName">
+                      <template is="dom-if" if="[[_getResults(jobs, 'true', 'in progress')]]">
+                        <div class="progress zuul-job-result">
+                          <div class="progress-bar"
+                            id="progressBar"
+                            role="progressbar"
+                            aria-valuenow$="[[_progressPercent(jobs)]]"
+                            aria-valuemin="0"
+                            aria-valuemax="100"></div>
+                        </div>
+                      </template>
+                      <template is="dom-if" if="[[!_getResults(jobs, 'true', 'in progress')]]">
+                        <span class$="zuul-job-result label [[_renderJobStatusLabel(jobs)]]">
+                          [[_getResults(jobs)]]
+                        </span>
+                      </template>
+                    </td>
+                  </tr>
+                </template>
+              </template>
+            </tbody>
+          </table>
+        </div>
+      </div>
+    </template>
+  </template>
+  <script src="zuul-status-view.js"></script>
+</dom-module>
diff --git a/src/main/resources/static/zuul-status-view.js b/src/main/resources/static/zuul-status-view.js
new file mode 100644
index 0000000..3ed6f1c
--- /dev/null
+++ b/src/main/resources/static/zuul-status-view.js
@@ -0,0 +1,270 @@
+/**
+ * @license
+ * Copyright (C) 2019 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.
+ */
+ (function() {
+  'use strict';
+
+  const DEFAULT_UPDATE_INTERVAL_MS = 1000 * 1;
+  const MAX_UPDATE_INTERVAL_MS = 1000 * 30 * 1;
+
+  Polymer({
+    is: 'zuul-status-view',
+    properties: {
+      zuulUrl: String,
+      plugin: Object,
+      change: Object,
+      revision: {
+        type: Object,
+        observer: 'reload',
+      },
+      _needsUpdate: {
+        type: Boolean,
+        value: false,
+      },
+      _response: Array,
+      _updateIntervalMs: {
+        type: Number,
+        value: DEFAULT_UPDATE_INTERVAL_MS,
+      },
+      // Start time is the time that this element was loaded,
+      // used to determine how long we've been trying to update.
+      _startTime: Date,
+      _updateTimeoutID: Number,
+    },
+
+    attached() {
+      this.listen(document, 'visibilitychange', '_handleVisibilityChange');
+      if (!this.change || !this.revision) {
+        console.warn('element attached without change and revision set.');
+        return;
+      }
+    },
+
+    detached() {
+      this._clearUpdateTimeout();
+    },
+
+    /**
+     * Reset the state of the element, then fetch and display progress.
+     *
+     * @return {Promise} Resolves upon completion.
+     */
+    async reload() {
+      this._response = null;
+      this._startTime = new Date();
+
+      const config = await this.getConfig();
+      if (config && config.zuul_url) {
+        this.zuulUrl = config.zuul_url;
+      } else {
+        console.info("No config found for plugin zuul-status at endpoint " +
+            "/config/server/info");
+      }
+      if (this.zuulUrl) {
+        await this._update();
+      }
+    },
+
+    /**
+     * Fetch the config for this plugin
+     *
+     * @return {Promise} Resolves to the fetched config object,
+     *     or rejects if the response is non-OK.
+     */
+    async getConfig() {
+      return await this.plugin.restApi().get('/config/server/config');
+    },
+
+    /**
+     * Fetch current progress state and update properties.
+     *
+     * If not all Tricium analyzers are finished yet, this will
+     * set a timeout to update again later.
+     *
+     * It is assumed that this will only be called if the Tricium
+     * host is configured.
+     *
+     * @return {Promise} Resolves upon completion.
+     */
+    async _update() {
+      try {
+        const response = await this.getZuulStatus(this.change, this.revision);
+        console.log(response);
+        this._response = response;
+        this._updateIntervalMs = DEFAULT_UPDATE_INTERVAL_MS;
+      } catch (err) {
+        this._updateIntervalMs = Math.min(
+            MAX_UPDATE_INTERVAL_MS,
+            (1 + Math.random()) * this._updateIntervalMs * 2);
+        console.warn(err);
+      }
+      this._resetTimeout();
+    },
+
+    /**
+     * Makes a request to the zuul server to get the status on the change.
+     *
+     * @param {ChangeInfo} change The current CL.
+     * @param {RevisionInfo} revision The current patchset.
+     * @return {Promise} Resolves to a fetch Response object.
+     */
+    async getZuulStatus(change, revision) {
+      const response = await this._getReponse(change, revision);
+
+      if (response && response.status && response.status === 200) {
+        const text = await response.text();
+        return await JSON.parse(text);
+      }
+
+      return [];
+    },
+
+    /**
+     * Makes a GET request to the zuul server.
+     *
+     * @param {ChangeInfo} change change The current CL.
+     * @param {RevisionInfo} revision The current patchset.
+     * @return {Promise} Resolves to a fetch Response object.
+     */
+    async _getReponse(change, revision) {
+      const url = `${this.zuulUrl}${change._number},${revision._number}`
+      const options = {method: 'GET'};
+      options.headers = new Headers();
+      options.headers.set('Content-Type', 'application/json');
+
+      return await fetch(url, options);
+    },
+
+    /**
+     * Set a timeout to update again if applicable.
+     */
+    _resetTimeout() {
+      this._clearUpdateTimeout();
+
+      if (this._response === []) {
+        return;
+      }
+
+      this._updateTimeoutID = window.setTimeout(
+          this._updateTimeoutFired.bind(this),
+          this._updateIntervalMs);
+    },
+
+    _clearUpdateTimeout() {
+      if (this._updateTimeoutID) {
+        window.clearTimeout(this._updateTimeoutID);
+        this._updateTimeoutID = null;
+      }
+    },
+
+    _handleVisibilityChange(e) {
+      if (!document.hidden && this._needsUpdate) {
+        this._update();
+        this._needsUpdate = false;
+      }
+    },
+
+    _updateTimeoutFired() {
+      if (document.hidden) {
+        this._needsUpdate = true;
+        return;
+      }
+
+      this._update();
+    },
+
+    /**
+     * Return a string to show as the bold title in the UI.
+     */
+    _computeTitle(response) {
+      if (!response) {
+        return 'No Zuul Status Results';
+      }
+
+      return 'Zuul Status';
+    },
+
+    /**
+     * Check whether the response contains report_url.
+     *
+     * @return {String} True when we are done requesting results.
+     */
+    _computeReportURL(response) {
+      if (!response || !response.report_url) { return ''; }
+
+      return response.report_url;
+    },
+
+    _progressPercent(jobs) {
+      if (!jobs || !jobs.elapsed_time && !jobs.remaining_time) {
+          return '';
+      }
+
+      let progressPercent = 100 * (jobs.elapsed_time / (jobs.elapsed_time +
+          jobs.remaining_time));
+
+      this.customStyle['--progress-bar-width'] = `${progressPercent}%;`;
+      this.updateStyles();
+
+      return progressPercent;
+    },
+
+    _getResults(jobs, equals, name) {
+      let result = jobs.result ? jobs.result.toLowerCase() : null;
+      if (result === null) {
+        if (jobs.url === null) {
+          result = 'queued'
+        } else if (jobs.paused !== null && jobs.paused) {
+          result = 'paused'
+        } else {
+          result = 'in progress'
+        }
+      }
+
+      if (equals) {
+        return result === name;
+      } else {
+        return result;
+      }
+    },
+
+    _renderJobStatusLabel (jobs) {
+      let result = jobs.result ? jobs.result.toLowerCase() : null;
+
+      let className;
+
+      switch (result) {
+        case 'success':
+          className = 'label-success'
+          break;
+        case 'failure':
+          className = 'label-danger'
+          break;
+        case 'unstable':
+          className = 'label-warning'
+          break;
+        case 'skipped':
+          className = 'label-info'
+          break;
+        // 'in progress' 'queued' 'lost' 'aborted' ...
+        default:
+          className = 'label-default'
+      }
+
+      return className;
+    },
+  });
+})();
diff --git a/src/main/resources/static/zuul-status.html b/src/main/resources/static/zuul-status.html
new file mode 100644
index 0000000..3979d5a
--- /dev/null
+++ b/src/main/resources/static/zuul-status.html
@@ -0,0 +1,29 @@
+<!--
+@license
+Copyright (C) 2019 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.
+-->
+
+<link rel="import" href="zuul-status-view.html">
+
+<script>
+(function() {
+  'use strict';
+
+  Gerrit.install((plugin) => {
+  	// Only supported in PolyGerrit in gerrit 2.16+.
+    if (!window.Polymer) { return; }
+
+    plugin.registerCustomComponent(
+        'change-view-integration', 'zuul-status-view');
+  });
+})();
+</script>
