diff --git a/BUILD b/BUILD
index 273cf24..38fcfd6 100644
--- a/BUILD
+++ b/BUILD
@@ -1,5 +1,7 @@
-load("//tools/bzl:plugin.bzl", "gerrit_plugin", "PLUGIN_DEPS", "PLUGIN_TEST_DEPS")
+load("//tools/bzl:genrule2.bzl", "genrule2")
+load("//tools/bzl:js.bzl", "polygerrit_plugin")
 load("//tools/bzl:junit.bzl", "junit_tests")
+load("//tools/bzl:plugin.bzl", "gerrit_plugin", "PLUGIN_DEPS", "PLUGIN_TEST_DEPS")
 
 gerrit_plugin(
     name = "simple-submit-rules",
@@ -9,6 +11,7 @@
         "Gerrit-Module: com.googlesource.gerrit.plugins.simplesubmitrules.Module",
         "Gerrit-BatchModule: com.googlesource.gerrit.plugins.simplesubmitrules.BatchModule",
     ],
+    resource_jars = [":ssr-static"],
     resources = glob(["src/main/resources/**/*"]),
 )
 
@@ -36,3 +39,24 @@
         ":simple-submit-rules__plugin",
     ],
 )
+
+genrule2(
+    name = "ssr-static",
+    srcs = [":ssr"],
+    outs = ["ssr-static.jar"],
+    cmd = " && ".join([
+        "mkdir $$TMP/static",
+        "cp -rp $(locations :ssr) $$TMP/static",
+        "cd $$TMP",
+        "zip -Drq $$ROOT/$@ -g .",
+    ]),
+)
+
+polygerrit_plugin(
+    name = "ssr",
+    srcs = glob([
+        "**/*.html",
+        "**/*.js",
+    ]),
+    app = "plugin.html",
+)
diff --git a/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.html b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.html
new file mode 100644
index 0000000..3e1ade1
--- /dev/null
+++ b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.html
@@ -0,0 +1,49 @@
+<!--
+@license
+Copyright (C) 2018 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="gr-simple-submit-rules-repo-config">
+  <template>
+    <style include="shared-styles"></style>
+    <style include="gr-form-styles"></style>
+
+    <main class="gr-form-styles">
+      <h3 id="options">Simple Submit Rules</h3>
+
+      <fieldset id="unresolved_comments">
+        <section>
+          <span class="title">Allow submission with unresolved comments</span>
+          <span class="value">
+            <gr-select id="allowUnresolvedComments"
+              bind-value="{{_repoConfig.comments.block_if_unresolved_comments}}">
+              <select disabled$="[[_readOnly]]">
+                <option value="true">Yes</option>
+                <option value="false">No</option>
+              </select>
+            </gr-select>
+          </span>
+        </section>
+      </fieldset>
+
+      <gr-button on-tap="_handleSaveRepoConfig"
+        disabled$="[[_computeButtonDisabled(_readOnly, _configChanged)]]">
+        Save Changes
+      </gr-button>
+
+    </main>
+  </template>
+  <script src="./gr-simple-submit-rules-repo-config.js"></script>
+</dom-module>
diff --git a/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.js b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.js
new file mode 100644
index 0000000..960d654
--- /dev/null
+++ b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.js
@@ -0,0 +1,124 @@
+/**
+ * @license
+ * Copyright (C) 2018 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';
+  Polymer({
+    is: 'gr-simple-submit-rules-repo-config',
+
+    properties: {
+      repoName: String,
+      /** @type {?} */
+      _repoConfig: Object,
+      _configChanged: {
+        type: Boolean,
+        value: false,
+      },
+      _readOnly: {
+        type: Boolean,
+        value: true,
+      },
+      _pluginRestApi: Object,
+    },
+
+    observers: [
+      '_handleConfigChanged(_repoConfig.*)',
+    ],
+
+    attached() {
+      return this._loadRepo();
+    },
+
+    _isLoading() {
+      return this._loading || this._loading === undefined;
+    },
+
+    _handleConfigChanged() {
+      if (this._isLoading()) { return; }
+      this._configChanged = true;
+    },
+
+    _computeButtonDisabled(readOnly, configChanged) {
+      return readOnly || !configChanged;
+    },
+
+    _loadRepo() {
+      this.repoConfig = {};
+      if (!this.repoName) { return; }
+      const promises = [];
+
+      promises.push(this._pluginRestApi().getLoggedIn().then(loggedIn => {
+        this._loggedIn = loggedIn;
+        if (loggedIn) {
+          this._getRepoAccess(this.repoName).then(access => {
+            if (!access) { return; }
+            // If the user is not an owner, is_owner is not a property.
+            this._readOnly = !access[this.repoName].is_owner;
+          });
+        }
+      }));
+
+      promises.push(this._pluginRestApi().get(this._endpointUrl())
+        .then(config => {
+          if (!config) { return; }
+          this._repoConfig = config;
+          this._loading = false;
+        }));
+
+      return Promise.all(promises);
+    },
+
+    _formatRepoConfigForSave(repoConfig) {
+      return repoConfig;
+    },
+
+    _endpointUrl() {
+      return "projects/" + encodeURIComponent(this.repoName) + "/simple-submit-rules";
+    },
+
+    _handleSaveRepoConfig() {
+      this._loading = true;
+      return this._pluginRestApi().put(this._endpointUrl(), this._repoConfig)
+        .then(config => {
+          if (!config) { return Promise.resolve(); }
+
+          this.dispatchEvent(new CustomEvent('show-alert', {
+            detail: {
+              message: "Simple submit rules: configuration updated."
+            },
+            bubbles: true
+          }));
+
+          this._repoConfig = config;
+          this._loading = false;
+          this._configChanged = false;
+        })
+    },
+
+    _pluginRestApi() {
+      if (this._pluginRestApi === undefined) {
+        this._pluginRestApi = this.plugin.restApi();
+      }
+      return this._pluginRestApi;
+    },
+
+    _getRepoAccess(repoName) {
+      return this._pluginRestApi().get('/access/?project=' + encodeURIComponent(repoName));
+    },
+
+  });
+})();
diff --git a/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config_test.html b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config_test.html
new file mode 100644
index 0000000..4e35e86
--- /dev/null
+++ b/gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config_test.html
@@ -0,0 +1,139 @@
+<!DOCTYPE html>
+<!--
+@license
+Copyright (C) 2016 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.
+-->
+
+<meta name="viewport"
+  content="width=device-width, minimum-scale=1.0, initial-scale=1.0, user-scalable=yes">
+<title>gr-simple-submit-rules-repo-config</title>
+
+<script src="../../../polygerrit-ui/app/bower_components/webcomponentsjs/webcomponents-lite.min.js"></script>
+<script src="../../../polygerrit-ui/app/bower_components/web-component-tester/browser.js"></script>
+<link rel="import"
+  href="../../../polygerrit-ui/app/test/common-test-setup.html" />
+<!-- TODO(maximeg) find if there is a better way to do this, like .. not in tests -->
+<link rel="import"
+  href="../../../polygerrit-ui/app/elements/shared/gr-select/gr-select.html" />
+<link rel="import"
+  href="../../../polygerrit-ui/app/styles/shared-styles.html" />
+<link rel="import"
+  href="../../../polygerrit-ui/app/styles/gr-form-styles.html" />
+
+<link rel="import"
+  href="gr-simple-submit-rules-repo-config.html">
+
+<script>void (0);</script>
+
+<test-fixture id="basic">
+  <template>
+    <gr-simple-submit-rules-repo-config repo-name="test-repo"></gr-simple-submit-rules-repo-config>
+  </template>
+</test-fixture>
+
+<script>
+  suite('gr-simple-submit-rules-repo-config tests', () => {
+    let element;
+    let sandbox;
+    let unresolvedCommentsEl;
+
+    setup(() => {
+      sandbox = sinon.sandbox.create();
+
+      stub('gr-simple-submit-rules-repo-config', {
+        _pluginRestApi() {
+          return {
+            get(url) {
+              return Promise.resolve({
+                comments: {
+                  block_if_unresolved_comments: false,
+                },
+              });
+            },
+            getLoggedIn() { return Promise.resolve(true); },
+          }
+        },
+
+        _getRepoAccess(repoName) {
+          return Promise.resolve({
+            'test-repo': {
+              is_owner: true,
+            },
+          });
+        },
+
+      });
+
+      element = fixture('basic');
+      unresolvedCommentsEl = element.$$('#unresolved_comments select');
+      return element._loadRepo();
+    });
+
+    teardown(() => {
+      sandbox.restore();
+    });
+
+    test('unresolved comments option exists', () => {
+      const unresolvedCommentsEl = element.$$('#unresolved_comments');
+      assert.ok(unresolvedCommentsEl);
+    });
+
+    test('readOnly disables fields', () => {
+      element._readOnly = false;
+      assert.equal(unresolvedCommentsEl.disabled, false);
+
+      element._readOnly = true;
+      assert.equal(unresolvedCommentsEl.disabled, true);
+    });
+
+    test('unresolved comment uses the repoConfig value (false)', done => {
+      element.set('_repoConfig.comments.block_if_unresolved_comments', false);
+
+      flush(function () {
+        assert.equal(unresolvedCommentsEl.value, 'false');
+        done();
+      });
+    });
+
+    test('unresolved comment uses the repoConfig value (true)', done => {
+      element.set('_repoConfig.comments.block_if_unresolved_comments', true);
+
+      flush(function () {
+        assert.equal(unresolvedCommentsEl.value, 'true');
+        done();
+      });
+    });
+
+    test('unresolved comment sets the repoConfig value (true)', done => {
+      unresolvedCommentsEl.value = 'true';
+      element.$$('#allowUnresolvedComments').dispatchEvent(new Event('change'));
+
+      flush(function () {
+        assert.equal(element._repoConfig.comments.block_if_unresolved_comments, 'true');
+        done();
+      });
+    });
+
+    test('unresolved comment sets the repoConfig value (false)', done => {
+      unresolvedCommentsEl.value = 'false';
+      element.$$('#allowUnresolvedComments').dispatchEvent(new Event('change'));
+
+      flush(function () {
+        assert.equal(element._repoConfig.comments.block_if_unresolved_comments, 'false');
+        done();
+      });
+    });
+  });
+</script>
diff --git a/plugin.html b/plugin.html
new file mode 100644
index 0000000..ab42d17
--- /dev/null
+++ b/plugin.html
@@ -0,0 +1,27 @@
+<!--
+@license
+Copyright (C) 2018 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="./gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config.html">
+
+<dom-module id="simple-submit-rules">
+  <script>
+    Gerrit.install(plugin => {
+      plugin.registerCustomComponent('repo-config', 'gr-simple-submit-rules-repo-config');
+    });
+  </script>
+</dom-module>
diff --git a/src/main/java/com/googlesource/gerrit/plugins/simplesubmitrules/Module.java b/src/main/java/com/googlesource/gerrit/plugins/simplesubmitrules/Module.java
index 5aa4cb0..f8721e6 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/simplesubmitrules/Module.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/simplesubmitrules/Module.java
@@ -14,7 +14,10 @@
 
 package com.googlesource.gerrit.plugins.simplesubmitrules;
 
+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.gerrit.server.project.ProjectResource;
 import com.google.inject.AbstractModule;
 import com.googlesource.gerrit.plugins.simplesubmitrules.config.ConfigServlet;
@@ -33,6 +36,8 @@
             put(ProjectResource.PROJECT_KIND, API_ENDPOINT).to(ConfigServlet.class);
           }
         });
+
+    DynamicSet.bind(binder(), WebUiPlugin.class).toInstance(new JavaScriptPlugin("ssr.html"));
     install(new BatchModule());
   }
 }
diff --git a/tests.html b/tests.html
new file mode 100644
index 0000000..e4dbfc4
--- /dev/null
+++ b/tests.html
@@ -0,0 +1,18 @@
+<!doctype html>
+<html>
+
+<head>
+  <meta charset="utf-8">
+  <script src="../../polygerrit-ui/app//bower_components/webcomponentsjs/webcomponents-lite.js"></script>
+  <script src="../../polygerrit-ui/app/bower_components/web-component-tester/browser.js"></script>
+</head>
+
+<body>
+  <script>
+    WCT.loadSuites([
+      'gr-simple-submit-rules-repo-config/gr-simple-submit-rules-repo-config_test.html',
+    ]);
+  </script>
+</body>
+
+</html>
